본문 바로가기

머신러닝/[기타]

데이터 스케일링(Data Scaling)

코드

머신러닝을 위한 데이터셋을 정제할 때, 특성별로 데이터의 스케일이 다르다면 어떤 일이 벌어질까요. 예를 들어, X1 특성은 0부터 1사이의 소수값을 갖는다 비해, X2 특성은 1000000부터 1000000000000사이의 소수값을 갖는 상황에서 y 값은 1000000부터 100000000까지의 값을 갖는 다고 가정하면, 사실 X1 특성은 y를 예측하는데 큰 영향을 주지 않는 것으로 생각할 수 있습니다.(이 외에도 overflow, underflow, 발산 수렴 등의 문제가 있습니다.) 때문에 이런 상태에서는 머신러닝이 잘 작동하지 않게 됩니다. 때문에 저희는 데이터 스케일링 작업을 통해, 모든 특성의 범위(또는 분포)를 갖게 만들어줘야합니다. 이를 위한 4가지 스케일링을 정리하겠습니다.

1. StandardScaler

  • 각 특성의 평균을 0, 분산을 1로 스케일링합니다. 즉 데이터를 정규분포로 만듭니다. 하한값과 상한값이 존재하지 않을 수 있기에, 어떤 알고리즘에서는 문제가 있을 수 있습니다. 회귀보다 분류에 유용합니다.

2. RobustScaler

  • 각 특성들의 중앙값을 0, IQR(제3사분위수-제1사분위수,Q3-Q1)을 1로 스케일링합니다. StandardScaler와 비슷하지만, 이상치의 영향을 최소화합니다.

3. MinMaxScaler(a,b)

  • 각 특성의 하한값을 a, 상한값을 b로 스케일링합니다. a=0, b=1일 경우 Normalization으로 표기할 때도 있습니다. 분류보다 회귀에 유용합니다.

4. MaxAbsScaler

  • 각 특성을 절대값이 0과 1사이가 되도록 스케일링합니다. 즉, 모든 값은 -1과 1사이로 표현되며, 데이터가 양수일 경우 MinMaxScaler와 같습니다.

5. Normalizer

  • 앞의 4가지 스케일러는 각 특성(열)의 통계치를 이용하여 진행됩니다. 그러나 Normalizer의 경우 각 샘플(행)마다 적용되는 방식입니다. 이는 한 행의 모든 특성들 사이의 유클리드 거리(L2 norm)가 1이 되도록 스케일링합니다. 일반적인 데이터 전처리의 상황에서 사용되는 것이 아니라, 모델(특히나 딥러닝) 내 학습 벡터에 적용하며, 특히나 피쳐들이 다른 단위(키, 나이, 소득 등)라면 더더욱 사용하지 않습니다. 

중요한 것은

  • 관련 내용을 학습해보면 스케일링(Scaling)과 정규화(Normalization), 표준화(Standardization) 등의 비슷한 것 같으면서 다른가 싶은 여러 용어들이 등장합니다. 제 생각에는 영단어를 번역해오는 과정에서 생긴 차이일 뿐 결국 모두 일종의 스케일링 과정입니다. 대개 Min-Max(0-1) scaling = Nomalization, Standard scaling = Standardization이며, 특히 정규화의 경우는 BatchNormalization, Normalizer, Regularizer 등 다른 용도로 사용되는 경우도 많기에 상황에 맞게 해석하여야합니다.
  • 모든 스케일링은 테스트 데이터가 포함된 전체 데이터셋이 아닌 오로지 훈련 데이터에 대해서만 fit되어야합니다. 이후 훈련 데이터와 테스트 데이터 각각을 스케일링합니다. 머신러닝 모델을 검증할 때, 항상 주의할 것은 자신도 모르게 치트(Cheat)를 쓰는 것입니다. 모델이 학습을 하는 과정에서 어떠한 방식으로든 테스트 데이터를 사용하게 되어서는 안됩니다. 분명 당장 정확도가 높아졌다- 라 생각할 수 있지만, 결국 실전에서는 이런 일이 불가능하기에 실전 정확도는 낮아집니다. 
  • 일반적으로 타겟(y) 데이터에 대한 스케일링은 진행하지 않습니다.
  • 많은 스케일러들이 이상치의 영향을 많이 받습니다. 그나마 영향을 최소화한 RobustScaler가 있습니다만, 이마저도 할 수 있다면 먼저 이상치를 제거해주는 것이 훨씬 좋습니다.
  • 스케일링할 때에, 모든 특성의 범위를 유사하게 만드는 것은 중요하지만, 그렇다고 반드시 같은 분포로 만들 필요는 없습니다. 
  • 스케일링 할 때에, sklearn 모듈을 사용하면 데이터프레임 전체를 한번에 변환가능하나, 특성에 따라 각기 다른 스케일링을 적용하는게 유리할 경우가 있습니다.