raw data는 결측치 등 노이즈가 포함되어 있기 때문에 분석에 적합하도록 가공하는 과정이 필요한데, 이를 전처리 (pre-processing) 라고 한다.
모든 input 값이 양수이면 backpropagation 과정에서 upstream gradient와 downstream gradient의 부호가 같아지며 학습이 잘 이루어지지 않게 된다.
따라서 데이터가 0을 중심으로 분포하게 만드는 zero-centering을 통해 음수값도 포함시키도록 한다. 또한 normalization을 시켜주면 분산이 줄어들며 더 깔끔하게 데이터를 정리할 수 있다.
이 작업을 통해 weight의 작은 변화에 덜 민감해져서 최적화하기 좋게 데이터를 가공할 수 있다.
X -= np.mean(X, axis=0) # zero-centering
X /= np.std(X, axis=0) # normalization
다차원의 데이터가 있을 때 가장 중요한 차원만 남기고 나머지 차원은 축소시키는 기법
실제로 머신 러닝을 하고자 할 때 유효한 데이터의 양이 적은 경우가 많다. 그래서 데이터의 의미에 영향을 주지 않으면서 데이터를 수정하여 양을 늘리는 방법이 필요하다.
더 다양한 data augmentation 기법에 대해서는 아래 논문을 참고하자.
https://journalofbigdata.springeropen.com/articles/10.1186/s40537-019-0197-0
데이터의 범위를 [0, 1] 또는 [-1, 1]과 같은 특정 범위로 변환하는 것이다. [0, 1]로 변환할 경우, 데이터 전체에서 최소값을 뺀 후, 최소값이 빠진 데이터의 최대값을 데이터 전체에 나눠주면 된다.
def normalize(list1):
min1 = min(list1)
list2 = [x-min1 for x in list1]
max1 = max(list2)
list3 = [x/max1 for x in list2]
return list3
print(normalize([-10, -5, 3, 12, 90])) # [0.0, 0.05, 0.13, 0.22, 1.0]
데이터의 평균을 0, 표준편차를 1로 만들어 데이터를 표준 정규 분포 형태로 변환하는 것이다. 데이터의 평균와 표준편차를 구한 후, 데이터 전체에서 평균을 뺀 후 표준 편차로 나눠주면 된다.
def standardize(list1):
import numpy as np
mean1 = np.mean(list1)
std1 = np.std(list1)
list2 = [(x-mean1)/std1 for x in list1]
return list2
print(standardize([-10, -5, 3, 12, 90]) # [-0.76, -0.63, -0.41, -0.16, 1.96]

이미지 출처 : https://www.managedfuturesinvesting.com/what-is-skewness/
간혹 데이터가 작은 값 혹은 큰 값에 치우쳐진 skewness (왜도) 가 생길 수 있다.
큰 값으로 치우친 negative skewness의 경우 squared transformation, power transformation, exponential transformation 등을 통해 처리할 수 있다.
작은 값으로 치우친 positive skenewss의 경우 log transformation, square-root transformation, box-cox transformation 등을 통해 처리할 수 있다.
다만 부호에 따라 영향을 받을 수 있으므로 표준화 등의 전처리 작업을 한 후에 skewness를 다루어야 한다.
skewness를 다루는 자세한 방법은 아래 링크에서 참고.
https://machinelearningmastery.com/skewness-be-gone-transformative-tricks-for-data-scientists/