보통 학습에 사용될 데이터들은 각 특성마다 데이터가 가질 수 있는 값의 범위가 다르다. 그리고 대부분의 학습 알고리즘은 특성 간 데이터 범위가 다를 경우 잘 동작하지 않는다. 그 이유는 간단한다. 예를 들어, 나이와 재산이라는 특성이 있을 때, 재산의 값이 나이보다 훨씬 크기 때문에 재산에 치중한 학습을 하게 된다. 따라서 학습을 진행하기에 앞서 데이터 스케일링은 필수적이다. 참고로 decision tree 계열의 알고리즘들은 스케일링이 필수는 아니다.


Min-Max Scaling

  • Normalization(정규화)이라는 용어도 많이 쓰임.
  • 아래 식과 같은 변환을 통해 값의 범위를 0~1로 제한 (=좁은 범위로 압축)
    xscaled=xxminxmaxxminx_{scaled} = \frac{x-x_{min}}{x_{max}-x_{min}}
  • Outlier에 매우 민감
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(train_data)
train_data_scaled = scaler.transform(train_data)
test_data_scaled = scaler.transform(test_data)

Standardization

  • 우리말로 표준화라고 부르며, Z-score라고도 함. (통계학 용어, 둘 다 많이 쓰임.)
    xscaled=xμσx_{scaled}=\frac{x-\mu}{\sigma}
  • 여기서, μ\muxx의 평균이고, σ\sigmaxx의 표준편차
  • Min-Max Scaling과 달리 상한과 하한의 범위가 없어 종종 이미지 분류 등에는 적합하지 않음.
  • Outlier에 대한 영향을 덜 받음.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(train_data)
train_data_scaled = scaler.transform(train_data)
test_data_scaled = scaler.transform(test_data)

Max-Abs Scaling

  • 데이터의 절대 값을 0~1 범위로 제한 (즉, 데이터의 값은 -1~+1로 제한)
    xscaled=2(xxminxmaxxmin0.5)x_{scaled} = 2\left(\frac{x-x_{min}}{x_{max}-x_{min}} - 0.5 \right)
  • 참고로 [a,b] 범위 내로 데이터를 스케일링 하고 싶다면 아래 수식을 사용하여야 함.
    xscaled=a+(xxmin)(ba)xmaxxminx_{scaled} = a + \frac{(x-x_{min})(b-a)}{x_{max}-x_{min}}
  • Outlier에 민감
from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
scaler.fit(train_data)
train_data_scaled = scaler.transform(train_data)
test_data_scaled = scaler.transform(test_data)

Robust Scaling

  • Outlier의 영향을 최소화하기 위해 고안됨.
  • 평균과 표준편차를 사용한 표준화와 달리 median과 IQR(Q3-Q1)를 사용
    xscaled=xxmedianxQ3xQ1x_{scaled}=\frac{x-x_{median}}{x_{Q3} - x_{Q1}}
  • 사분위수를 사용하기 때문에 아주 동떨어진 데이터, 즉, outlier 제거에 효과적
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
scaler.fit(train_data)
train_data_scaled = scaler.transform(train_data)
test_data_scaled = scaler.transform(test_data)

Normal Scaling

  • 벡터의 길이가 1이 되도록 데이터 값 변경
  • 벡터의 길이는 관심이 없고, 방향(각도)만 중요하게 생각할 때 사용
  • 앞에서의 scaling들은 각 feature 단위로 수행되지만, normal scaling은 각 샘플 단위로 수행됨.
    xi,scaled=xixi2+yi2+zi2x_{i, scaled}=\frac{x_i}{\sqrt{x_{i}^2 + y_{i}^2 + z_{i}^2}}
from sklearn.preprocessing import Normalizer
scaler = Normalizer()
scaler.fit(data)
data_scaled = scaler.transform(data)

마치며

  • 데이터 스케일리을 통해 특성별 크기 편차를 최소화하는 것은 중요하지만 반드시 모든 특성들의 분포를 동일하게 만들 필요는 없다. 특성에 따라 원래의 분포를 유지하는 것이 학습에 유리할 수도 있다. 왜냐하면 variance가 매우 작은 특성과 매우 큰 특성이 있을 때, variance가 작은 특성의 작은 변화가 출력에는 큰 영향을 미칠 수 있기 때문이다. (다른 블로그의 내용을 거의 그대로 옮겼습니다.)
  • 데이터 표준화를 먼저 적용한 후, min-max scaling을 하면 outlier에 대한 영향도 줄이면서 데이터의 범위를 제한할 수 있다.
  • Mean normalization이라는 것도 있는데 잘 쓰이는지는 모르겠다. 방법은 Min-Max Scaling에서 분자 값의 xminx_{min} 대신 평균 값을 사용하는 것이다. (WiKi 참고)

참고자료

[1] 핸즈온 머신러닝: 사이킷런, 케라스, 텐서플로 2를 활용한 머신러닝, 딥러닝 완벽 실무
[2] https://soo-jjeong.tistory.com/123
[3] https://hwiyong.tistory.com/91
[4] https://mkjjo.github.io/python/2019/01/10/scaler.html
[5] https://wikidocs.net/89704
[6] https://en.wikipedia.org/wiki/Feature_scaling

profile
연구와 개발의 중간 어디쯤

0개의 댓글