Ebook

2장:

일반적인 전처리 작업


머신러닝 응용 프로그램에 필요한 전처리 작업은 선택한 알고리즘 유형은 물론 취급하는 데이터의 종류에 따라 달라집니다. 하지만 그중에서도 더 일반적으로 사용되는 몇몇 작업이 있습니다. 이 챕터에서는 가장 일반적인 데이터 전처리 기법 5가지와 MATLAB에서 이를 수행하는 방법을 알아봅니다.

section

데이터 형식 지정

많은 전처리 작업에는 여러 측면에서 균일한 데이터셋을 만드는 작업이 수반됩니다. 데이터의 형식을 균일하게 만드는 것도 해당이 되는데, 타임스탬프가 지정된 데이터의 경우 데이터의 형식이 특히 중요합니다.

형식 문제는 조기에 해결하지 않으면 향후에 해결하기 위해 많은 시간을 낭비하게 되는 중대한 문제로 발전할 수 있습니다. 이러한 문제가 꼭 오류를 발생시키는 것은 아니지만, 명백히 틀린 것으로 보이지 않더라도 모델의 정확도를 떨어뜨릴 수 있습니다. 다음 두 MATLAB 함수를 사용하면 타임스탬프가 지정된 데이터의 형식을 손쉽게 지정할 수 있습니다.

  • datetime
  • duration

시간 표준화와 오프셋

타임스탬프가 지정된 데이터를 다룰 때는 날짜와 시간이 일관된 형식으로 적용되었는지 확인하는 것이 좋습니다. 확인하지 않고 잘 지정되었을 것이라고 단정해서는 안 됩니다.

MATLAB의 datetime 배열은 특정 시점을 나타내며 표준 시간대, 일광절약제, 윤초와 같은 요소를 고려하여 작업하는 수고를 덜어 줍니다.

구문

t = datetime
t = datetime(relativeDay)
t = datetime(DateStrings)
t = datetime(DateVectors)
t = datetime(Y,M,D)

지속 시간

MATLAB에서 지속 시간을 나타내는 데이터는 duration으로 표현됩니다. 서로 다른 데이터 기록 시스템, 시작 시간의 차이, 그리고 그 밖의 요인으로 인해 경과 시간을 측정하는 상대적 타임스탬프에 문제를 일으킬 수 있습니다.

시작 시간이 서로 다른 작업이 얼마나 오래 지속되었는지 비교하거나, 임계값을 설정하거나, 길이가 일정한 시간 값(예: 10초 간격을 갖는 신호 데이터)을 만들려면 duration 을 사용할 수 있습니다.

날짜. 시간 및 달력 기간 데이터로 작업하는 방법에 대해서는여기서 자세히 알아볼 수 있습니다.

구문

D = duration(H,MI,S)
D = duration(H,MI,S,MS)
D = duration(X)

section

병합

서로 다른 출처 또는 데이터셋에서 온 데이터를 잘 결합하면 성공적인 머신러닝 모델 구축의 열쇠가 될 수 있습니다. 예를 들어, 판매 데이터셋에 날씨 데이터를 결합하면 머신러닝 모델의 자외선 차단제 판매 예측률이 크게 높아질 수 있습니다. 데이터셋을 결합하는 방법은 일반적으로 두 가지가 있습니다.

  • 키 값(이메일 주소와 같은 고유한 식별자)을 기준으로 병합
  • 시간을 기준으로 병합

키 값 기준 병합은 원하는 병합 유형에 해당하는 명령 (join, innerjoin, outerjoin)을 사용하거나 테이블 결합 라이브 편집기 작업을 사용하여 수행할 수 있습니다.

Merging table example

시간 기준 병합은 MATLAB에서 timetable형과 synchronize 명령을 사용하여 수행할 수 있습니다. 만약 동기화할 타임테이블이 서로 정확히 같은 시간 스텝을 갖지 않는 경우, 어떤 시간 스텝에서 특정 변수가 측정되지 않았을 때 어떻게 처리할지를 지정해야 합니다. 이런 문제를 해결할 수 있도록 synchronize 명령은 선형 또는 스플라인 보간을 수행하거나, 최근접 측정값의 시간 스텝에서 값을 복사하는 등 여러 가지 방법을 기본적으로 제공합니다.

타임테이블 병합하기

% 파일에서 2개의 샘플 timetable형을 불러옵니다.
% 그런 다음 이 데이터를 새로운 행 시간값으로 구성된 벡터에 동기화합니다.

load smallTT

% timetable형을 표시합니다.
% TT1에는 순서가 뒤바뀐 행 시간값이 있습니다.
% TT1과 TT2는 서로 다른 변수를 갖습니다.

TT1
TT1=3×2 timetable
            Time            Temp
    ____________________    ____

    18-Dec-2015 12:00:00    42.3
    18-Dec-2015 08:00:00    37.3
    18-Dec-2015 10:00:00    39.1

TT2
TT2=3×2 timetable
         Time               Pressure
    ____________________    ________

    18-Dec-2015 09:00:00     30.1 
    18-Dec-2015 11:00:00    30.03 
    18-Dec-2015 13:00:00     29.9 

% TT1과 TT2를 동기화합니다.
% 출력 timetable형인 TT는 두
% timetable형의 모든 행 시간값을 순서대로 정렬합니다.
% TT에서 Temp는 TT2의 행 시간값에 대해
% NaN 값을 가지고 Pressure는
% TT1의 행 시간값에 대해 NaN 값을 가집니다.

TT = synchronize(TT1,TT2)
TT=6×3 timetable

    Time                    Temp    Pressure
    ____________________    ____    ________

    18-Dec-2015 08:00:00    37.3    NaN 
    18-Dec-2015 09:00:00     NaN    30.1 
    18-Dec-2015 10:00:00    39.1    NaN 
    18-Dec-2015 11:00:00     NaN    30.03 
    18-Dec-2015 12:00:00    42.3    NaN 
    18-Dec-2015 13:00:00     NaN    29.9

다음 명령을 MATLAB에 붙여 넣어 이 예제를 직접 실행해 보십시오.

openExample('matlab/SynchronizeTimetablesAndInsertMissingDataIndicatorsExample')

MATLAB 명령 창에 위 명령을 입력하여 실행하십시오. 웹 브라우저에서는 MATLAB 명령을 지원하지 않습니다.

section

누락된 데이터 처리

머신러닝 알고리즘은 데이터 내의 특징, 그리고 이러한 특징들 간의 관계를 바탕으로 예측을 수행합니다. 하나의 관측값에서 데이터가 누락된 경우, 특징들 간의 관계를 찾기는 더 어려워집니다. 데이터가 누락되었을 때 해당 데이터를 제거할지 대체할지에 대한 판단은 관측값의 누락된 변수가 누락되었는지 여부에 따라 달라질 수 있습니다.

머신러닝에 사용할 데이터를 준비할 때는 누락된 데이터를 세 가지 방법으로 처리할 수 있습니다. 하나는 삭제하는 것이고(관측값 또는 열 전체), 다른 하나는 대체하는 것이고, 나머지 하나는 아무것도 하지 않고 모델에서 알아서 처리하도록 두는 것입니다. 어떤 결정을 내려야 하는지는 데이터가 누락된 이유에 따라 달라집니다.

데이터가 무작위적으로 누락되었는지 살펴보려면 각 변수를 플로팅하여 패턴을 찾아보십시오.

MATLAB에서는 누락된 숫자가 데이터형에 따라 다르게 나타납니다. 예를 들어, 누락된 숫자형은 NaN으로 표시되고, 누락된 datetime형은 NaT로 표시되며, 누락된 categorical형은 로, 누락된 string형은 으로 표시됩니다.

다음 예제에서는 500개의 설문 조사 응답으로 구성된 테이블(SurveyAges) 에서 누락된 데이터를 찾아보겠습니다. 이 테이블에는 Respondent ID, Age, Years of Experience라는 3개의 열이 있습니다. 여기에서 누락된 값이 있는지 확인하고 그 위치를 살펴보는 것이 목적입니다.

누락된 데이터 찾기

A = SurveyAges(:,2)
Tf = ismissing(A)
G = sum(Tf)

결과는 1과 0으로 구성된 논리형 배열로 나타나며 여기서 1은 데이터가 누락되었음을 나타냅니다. G = 36이며, 이는 누락된 응답의 총 개수를 나타냅니다.

구문

Tf = ismissing(A)
Tf = ismissing(A,indicator)

Missing data, live task

일반적으로 데이터가 무작위로 누락되었다면 삭제해도 안전합니다. 이 예제의 데이터를 플로팅해 보면 비교적 높은 연령대에서 더 많은 데이터가 누락되었음을 알 수 있습니다.

데이터가 무작위로 누락된 것이 아닌 경우(예: 높은 연령대의 직원들이 자신의 연령을 밝히기를 꺼린 경우), 데이터를 삭제하면 편향이 발생할 수 있습니다. 이 경우에는 데이터를 생성해 공백을 채울 수 있습니다. 값을 채우는 데 어떤 방법을 사용할지는 데이터에 따라 달라집니다. 흔히 사용되는 기법으로는 평균, 중앙값, 최빈값, 선형 회귀 및 K 최근접이웃이 있습니다. 시계열 데이터를 다룰 때는 마지막 관측값을 앞으로 가져오기, 다음 관측값을 뒤로 가져오기 및 선형 보간 등의 추가적인 기법을 사용할 수 있습니다.

MATLAB에는 누락된 값을 삭제하거나 채우는 데 사용할 수 있는 여러 함수가 있습니다. 그중에서도 fillmissing 은 다양한 용도로 사용할 수 있는 함수로, 뒤에서 자세히 설명하겠습니다.

누락된 데이터 정리하기

어떤 한 열에서 상당량의 값이 누락되었다면 데이터셋에서 해당 열 전체를 제거하는 것이 가장 좋은 방법일 수 있습니다.

라이브 편집기에서는 이를 쉽게 처리할 수 있습니다. 다른 작업을 사용할 때와 마찬가지로 홈 툴스트립에서 새 라이브 스크립트를 선택합니다.

New Live Script example

라이브 편집기 탭 아래에서 작업을 선택하고 누락된 데이터 정리를 선택합니다.

Live Task toolstrip example

이렇게 하면 사용자 인터페이스가 열립니다. 데이터를 선택하는 데 사용할 수 있는 옵션은 작업 공간에 있는 변수에 따라 달라집니다.

Clean missing data dialog

드롭다운 메뉴를 사용하여 누락된 데이터가 있는지 검색할 데이터를 선택한 다음 누락된 요소를 채울지 아니면 제거할지 선택합니다.

정리 방법을 누락된 데이터 제거로 설정합니다. 이제 작업 영역에는 원래 테이블, 누락된 요소의 인덱스, 정리된 데이터로 구성된 double형 배열, 이렇게 3개의 변수가 있습니다. 오른쪽의 그래프를 보면 누락된 요소의 개수를 제목으로 하여 누락된 데이터를 플로팅하므로 데이터가 정리된 것을 알 수 있습니다. 작업 창 하단의 아래쪽 화살표를 클릭하면 코드가 노출되어 MATLAB에서 어떤 작업이 이루어지고 있는지 살펴볼 수 있습니다.

% 누락된 데이터 제거
[cleanedData,missingIndices] = rmmissing(offerab.Actions);

% 결과 시각화
clf
plot(find(~missingIndices),cleanedData,'Color',[0 114 189]/255,'LineWidth',1.5,'DisplayName','Cleaned data')
hold on

% 제거된 누락 요소 플로팅
x = repelem(find(missingIndices),3);
y = repmat([ylim(gca) NaN]',nnz(missingIndices),1);
plot(x,y,'Color',[145 145 145]/255,'DisplayName','Removed missing entries')
title(['Number of removed missing entries: ' num2str(nnz(missingIndices))])

hold off
legend
clear x y

이 코드는 전처리 스크립트의 일부로 저장할 수 있습니다.

라이브 편집기에서 누락된 데이터를 교체하는 방법은 데이터를 제거할 때와 같게 시작합니다. 이번에는 방법 지정 아래에서 누락된 데이터 채우기를 선택하면 보이는 10가지 방법 중 하나를 선택합니다.

누락된 요소 채우기를 위해 생성된 코드를 살펴보면(이 예제에서는 이동 평균이 사용됨) 채우기 작업은 단 한 줄의 코드로 처리되고 코드의 나머지 부분은 정리된 데이터와 채워진 요소를 플로팅하는 것임을 알 수 있습니다.

% 누락된 데이터 채우기
[cleanedData,missingIndices] = fillmissing(offerab.Actions,'movmean',3);

% 결과 시각화
clf
plot(cleanedData,'Color',[0 114 189]/255,'LineWidth',1.5,'DisplayName','Cleaned data')
hold on

% 채워진 누락 요소 플로팅
plot(find(missingIndices),cleanedData(missingIndices),'.','MarkerSize',12,...
    'Color',[217 83 25]/255,'DisplayName','Filled missing entries')
title(['Number of filled missing entries: ' num2str(nnz(missingIndices))])

hold off
legend
clear missingIndices
section

이상값 수정

이상값의 존재 여부와 빈도는 데이터의 전체적인 품질에 대해 많은 것을 알려 줍니다. 이상값이 균일하게 분포되었는지, 군집화되었는지 아니면 그 밖의 다른 패턴으로 존재하는지에 따라 이상값을 처리하는 방법이 달라집니다. 이상값이 데이터셋에서 아주 작은 비율을 차지하며 정확하지 않아 보이거나 잘못된 데이터 수집의 결과라면 잘못된 데이터로 간주하고 제거해도 안전할 것입니다. 하지만 이때도 첫 번째 단계는 데이터에서 이상값을 식별하는 것입니다.

데이터에서 이상값을 찾을 때는 몇 가지 통계 모델을 적용할 수 있습니다. 널리 사용되는 방법은 다음과 같습니다.

  • 그럽스 검정(Grubb’s Test)
  • 중앙값
  • 이동 평균
  • 분위수

어떤 방법을 사용하든 데이터의 최솟값, 최댓값, 평균, 표준편차에 대해 잘 알고 있어야 합니다.

MATLAB에는 데이터에서 이상값을 찾을 때 사용할 수 있는 여러 내장 함수가 있으며, File Exchange에서도 Tests to Identify Outliers in Data Series(데이터 계열에서 이상값을 식별하는 테스트)와 같이 이 작업을 간단하게 만들어 주는 파일을 찾을 수 있습니다.

이상값을 제거하는 것은 위험이 수반되는 일이지만, 그대로 두면 결과가 크게 왜곡될 수 있습니다. MATLAB에는 명령줄을 통한 프로그래밍 방식, 라이브 편집기를 통한 대화형 방식과 같이 이상값을 처리하는 몇 가지 방법이 있습니다. 아래에서 각각의 방법을 간략히 살펴보겠습니다.

Outlier Detection Using Qunatile Regression

명령줄

MATLAB의 filloutliers 함수는 이상값을 식별하고 이를 자동으로 교체할 수 있는 유용한 도구입니다.

이상값 채우기 방법 에는 'previous', 'linear''spline'이 있습니다.

다음은 간단한 예제입니다.

Afill = filloutliers(Anoise,'next');
plot(t,Anoise,t,Afill)
axis tight
legend('Noisy Data with Outlier','Noisy Data with Filled
Outlier') 

구문

B = filloutliers(A,fillmethod)
B = filloutliers(A,fillmethod, findmethod)
B = filloutliers(A,fillmethod, 'percentiles', threshold)
B = filloutliers(A,fillmethod, movmethod, window)
B = filloutliers(___,dim)
B = filloutliers(___,Name,Value)
[B,TF,L,U,C] = filloutliers(___)

이처럼 이상값을 채우는 방법에는 여러 가지가 있으므로 채워진 데이터를 머신러닝 알고리즘에 적용하기에 앞서 결과를 눈으로 살펴보는 것이 중요합니다. 데이터를 초기에 잘 정리하면 나중에 알고리즘을 이리저리 변경하는 데 소요되는 시간을 절약할 수 있습니다.

Fill outlier graph

라이브 편집기 작업

라이브 편집기 작업을 통해 이상값 데이터를 정리하는 것이 유용한 이유 중 하나는 사용자가 검출 방법을 선택할 때마다 사용자 인터페이스에 업데이트된 이상값 개수가 표시된다는 것입니다.

다음은 동일한 데이터에 세 가지 검출 방법을 적용한 결과입니다. 그럽스 검정과 평균은 모두 100개 미만의 이상값을 반환하는 반면 분위수는 전체 요소의 사분의 일이 약간 넘는 1103개의 이상값을 반환합니다.

이상값을 정리하려면 정리 방법을 선택해야 합니다. 이는 명령줄에서 사용할 수 있는 옵션과 동일합니다.

사용자가 방법을 변경하면 스크립트가 실행되므로 즉시 그 결과를 확인할 수 있습니다.

사용하려는 이상값 방법을 전처리 스크립트에 추가하고 스크립트를 저장합니다.

section

정규화

정규화는 각 특징의 값의 범위가 서로 다른 경우 각 특징을 동등한 수준으로 고려하고자 할 때 유용한 기법입니다.

예측 유지관리 모델을 만드는 경우를 생각해 봅시다. 결함이 있는 예측 변수를 식별하기 위해 진동 주파수와 압력을 기록하는 센서를 사용합니다. 간단히 말하면, 정상 범위에서 벗어나는 것은 문제가 있음을 의미할 수 있고, 정상에서부터의 거리가 문제의 심각도를 나타낼 수 있습니다. 진동 주파수의 정상 범위는 10~800Hz이고, 압력의 정상 범위는 10~30psi일 수 있습니다. 이러한 측정값에서 파생된 특징을 동일한 모델에서 사용할 수 있으려면 데이터셋을 정규화하여 균일한 데이터를 만들어야 합니다.

어떤 경우에 데이터를 정규화해야 합니까? 일반적으로 서로 다른 변수의 절댓값이나 범위가 한 자릿수 이상이 다른 경우에 정규화가 필요합니다. 하지만 분석에 단위가 필요한지 여부에 따라 달라질 수도 있습니다. 정규화되지 않은 데이터로 데이터에 대한 '판단'을 하기 수월하므로 여타 전처리 단계에서 정규화되지 않은 데이터가 유용할 수 있습니다. 정규화는 특징 공학을 수행하기 전에 거의 마지막으로 진행하는 단계인 경우가 많습니다.

구문

N = normalize(A)
N = normalize(A,dim)
N = normalize(___, method)
N = normalize(___, method, methodtype)
N = normalize(___, 'DataVariables', datavars)