데이터과학 유망주의 매일 글쓰기 — 여섯번째 일요일

배우는 자(Learner Of Life)
13 min readOct 18, 2020

--

데이터의 다양한 표준화 방법

#Scaling, #Standardizing, #Normalzing, #표준화

저울의 눈금을 맞추듯, 데이터의 무게를 조절하는 것은 상당히 중요한 문제이다.

오늘 한일:

어제 나는 EDA에 대한 기초를 좀 더 다지기 위한 글을썼다. 오늘은 이번 주 내내 다룬 개념 중에 하나를 좀 더 공부해보고자 했다. 이번 한주 동안 데이터의 표준화(scaling)가 가장 중요한 개념중에 하나로 소개되었다. 이번 주 배운 머신 러닝의 성능이, 이 데이터의 표준화에 상당히 좌우된다는 것을 알게되었다. 그래서 오늘은, 이 주제에 대해 자료를 검색했는데, 정말 감사하게도 머신러닝을 위한 모든 형태의 표준화를 이야기한 블로그가 있어, 이를 공부하고 글을 쓰게 되었다.

머신러닝에는 총 6가지의 알고리즘이 있다. 선형 또는 logistic 회귀, nearest neighbors, neural networks, radial bias kernel function을 사용하는 support vector machines, principal component analysis(PCA), 마지막으로 linear discriminant analysis 등이 있다. 표준화 작업은 데이터의 각 feature들이 알고리즘이 좀 더 처리하기 쉬운 형태로 변환시켜줄 수 있다.

데이터의 표준화는 크게 3가지의 의미로 나뉜다. 주로 scaling, standardizing, 그리고 normalizing으로 나뉜다. 상황에 따라, 사용하는 모델이나 feature에 값들에 따라 가장 효율적인 표준화의 방식은 달라질 수 있다. 물론, 그것을 구분하는 것이 항상 쉽지 많은 않은 것이 사실이다. 이번 글에서는 이해하기 쉬운 예제를 통해 각 표준화 기법이 어떠한 결과를 내는지에 대해 알아볼 곳이다.

각 표준화의 방법에 따라 사용가능한 도구가 다른데, 이 글에서는 주로 아래의 4가지 Scikit-learn 라이브러리의 기능들을 사용하도록 하겠다.

  • MinMaxScaler
  • RobustScaler
  • StandardScaler
  • Normalizer

위 기능들은 주로 아래와 같은 API를 가지고 있는데, X_train과 X_test는 주로 ndarrays(numpy arrays)나 pandas DataFrame의 형태로 입력되어야 한다.

용어정리

1. Scaling

Scaling은 데이터들의 비율을 그대로 유지하는 상태에서 범위만 바꾼다는 의미이다. 그러므로, 데이터의 전체적인 분포는 변하지 않으며, 범위는 주로 0에서 1로 축소된다.

2. Standardizing

평균을 기준으로 계산된 분포의 표준편차가 1이 되도록 feature의 값들을 변형시키는 것을 말한다. 거의 정규분포에 가까운 형태로 데이터들을 변형시키며, 이를 위해 scaling을 같이 적용할 수 있다.

3. Normalizing

이전 scaling이나 standardizing의 의미와 매우 비슷할 수 있다. Normalizing은 매우 광범위한 의미를 가지고 있기 때문에, 사용전 그 정의를 명확히 하는 것이 좋다. 그렇지 않으면 Normalizing이라는 용어의 사용은 권장하지 않는다.

예제 및 설명

그렇다면 구체적으로 예를 통해 Scikit-learn이 지원하는 표준화 기법들에 대해 알아보자. 일단 데이터가 필요한데, 원활한 설명을 위해 아래의 데이터를 준비했다.

예제를 위한 데이터의 분포를 나타낸 kdeplot

normal_big을 제외한 첫 5개의 데이터의 분포를 나타낸 kdeplot이다. 각 데이터의 분포에 대한 설명은 아래와 같다.

  • beta: 음의 왜도를 가지고 있다. (왼쪽으로 기울어짐)
  • exponential: 양의 왜도를 가지고 있다. (오른쪽으로 기울어짐)
  • normal_p: 정규분포, platykurtic 첨도
  • normal_1: 정규분포, leptokurtic 첨도
  • bimodal: 쌍봉분포(bimodal)
  • normal_big: 훨씬 더 큰 스케일의 값의 정규분포 (아래의 kdeplot 참조)

지금까지의 데이터는 상대적으로 비슷한 스케일에 있어 위 kdeplot에서 한눈에 볼 수 있었다. 여기서 상대적으로 훨씬 더 큰 스케일의 normal_big이 들어오면 어떻게 될까?

normal big이 들어오는 순간, 다른 5개의 모든 그래프의 분산이 같아지며, 오른쪽 끝에 녹색 분포가 하나 보인다.

위 그래프를 잘 보면, 가장 오른쪽 하단에 작게 나마 녹색 그래프가 그려진 것을 볼 수 있다. normal_big의 분산은 다른 5개의 그래프에서 매우 크게 떨어져있다.

각 데이터의 기술통계치를 보면 아래와 같다.

모든 데이터의 기술 통계치, normal_big이 거의 모든 통계치에서 훨씬 더 스케일이 큰 것을 알 수 있다.

이러한 데이터들의 스케일을 조정하기 위한 Scikit-learn의 기능들이 각각 어떤 역할을 하는지 알아보자.

1. MinMaxScaler(Scaling)

이 기능은 각 feature들에서 최소값(minimum)을 빼고, 전체 범위로 나눈다. 범위는 데이터의 최대값에서 데이터의 최소값을 뺀 값이 된다.

MinMaxScaler의 표준화 방식

이 방법은 본래 데이터의 분포를 유지한다는 특징이 있다. 즉, 본래 데이터의 정보를 변형시키지 않는다는 장점이 있다. 그러나, 이 방법은 이상치(outliers)의 영향을 줄이지는 못한다. 계산된 값들은 0과 1사이의 범위로 축소된다. 만약, 본래 데이터의 정규분포를 변형시키고 싶지 않거나, 이상치의 영향을 그대로 보고 싶은 경우, 표준화를 위해 가장 먼저 시도해 볼 수 있는 방법이다. 성공적으로 적용이 되었다면, 아래와 같은 kdeplot을 볼 수 있다. 원래 데이터의 kdeplot과 비교해 보더라도, 각 feature들 사이의 상대적인 거리가 유지된 것을 알 수 있다. Scaling의 기법이라 할 수 있다.

MinMaxScaler를 적용한 kdeplot의 모습. 모든 데이터가 상대적으로 비슷한 범위에 있는 것을 볼 수 있다.

2. RobustScaler(Scaling)

각 feature 값에서 중간값(median)을 빼고, IRQ 범위로 나눈 것을 말한다. (IRQ = 75%의 값 — 25%의 값)

RobustScaler의 계산식

MinMaxScaler와 같이, normal_big역시 이 방법을 통해 다른 feature들과 비슷한 스케일로 조정된다. 그러나 차이점이 있다면, RobustScaler는 MinMaxScaler처럼 “미리 정해진 간격에 의해 데이터를 변형시키지는 않는다”는 것이다. 즉, 정확하게 우리가 이야기하는 “스케일링"의 엄격한 기준에는 부합하지는 않는다는 것이다. RobustScaler를 적용한 후, 각 feature의 범위는 MinMaxScaler를 적용했을 때보다 크다. 이 방법은 MinMaxScaler보다 상대적으로 이상치의 효과를 줄이기에 적합하다고 할 수 있다. RobustScaler를 적용한 후의 kdeplot 은 아래와 같다.

RobustScaler를 적용한 이후의 kdeplot. MinMaxScaler와 비교해 스케일이 커져, 거의 모든 데이터가 정규분포화 된 것처럼 보인다.

3. StandardScaler(Standardizing)

각 feature에서 평균값(mean)을 빼고, 분산을 1로 만드는 형태로 표준화하는 기법이다. 그러므로, 이 기법은 Scaling 보다 Standardizing에 가깝다고 할 수 있다.

StandardScaler의 계산식, 표준편차로 나누어 분산을 1로 만든다.

분산이 1이라는 것은 모든 데이터 값을 표준편차로 나눈다는 의미이다, 역시 이전 RobustScaler와 마찬가지로 미리 정의된 간격에 의해 데이터 변형이 이루어지지 않으므로, 엄격한 의미에서 scaling이라고 보기는 힘들다. 분산이 1이 되는 단위 분산(unit variance)이기 때문에, 표준편차가 1인 분포를 가지게 된다. 분산 역시 1이기 때문에 분산과 표준편차가 같다. (분산 = 표준편차 = 1, 분산은 표준 편차의 제곱이므로 1의 제곱은 1이기 때문이다.) 자연스럽게, 분포의 평균은 0이 된다(zero-mean 분포). 결과적으로 68% 정도의 값들이 -1에서 1사이의 범위에 놓이게된다. 아래와 같은 kdeplot을 볼 수 있다.

StandardScaler를 적용한 kdeplot. 분산과 표준편차는 1이며, 분포의 평균은 0이된다.

위 그래프를 보면, 4개의 분포들(normal_p, normal_i, bimodal, normal_big)이 평균이 0이고 단위 분산(분산 = 1)을 가진 것을 볼 수 있다. 값들은 비슷한 스케일에 있지만, MinMaxScaler과 비교해서는 더 큰 범위를 가진 것을 알 수 있다.

딥러닝 알고리즘은 평균이 0(zero-mean)이면서 단위 분산(unit variance)의 분포를 가진 데이터의 입력을 필요로할 때가 있다. 특히, 회귀 모델의 알고리즘이, 이러한 정규분포를 가진 작은 크기의 샘플을 필요로 할 수 있다. StandardScaler는 이러한 목적에 매우 유용한 기법이라고 할 수 있다. 그러나, StandardScaler는 각 feature들 사이의 상대적 거리를 왜곡시킬 수 있는 단점이 있으므로, 다른 형태의 표준화 기법과 비교해서는 주로 차선책으로 활용되는 경우가 많다.

4. Normalizer

마지막으로 소개할 표준화 기법은 Normalizer이다. 주의할 것은, 이 기법은 각 feature의 열(column)값이 아닌 행(row)값에 적용된다는 것이다. L2 normalization 이라는 기법이 모든 데이터값에 적용되어, 행의 모든 값이 단위 노름(unit norm)이 된다. 단위 노름을 가진 L2는, 각 값들이 제곱화되고 합산된다는 것을 의미하며 총 합은 1이 된다는 의미이다.

Normalizer의 계산식 i는 행(row), j는 열(columns)을 나타내며, 열의 총 수 N만큼 합산을 반복한다.

대안으로, L1 normalization(Taxicab 또는 Manhattan이라고도 불린다) 표준화가 사용될 수 있다. Normalize는 모든 값을 -1과 1사이의 범위안에 놓이게 한다. 위 데이터의 normal_big은 Normalizer를 통해 1에 가까운 0.9999999의 값으로 변형된다. 하지만, 대부분의 경우, Normalizer보다는 이전에 언급된 Scaling이나 Standardizing의 방법이 더 효율적일 때가 많다.

Normalizer를 제외한 위의 3가지 방법을 본래 데이터의 분산에 비교하면 아래와 같다.

본래 데이터의 분포와, 3가지의 기법을 적용했을 때의 분포를 각각 비교한 모습

본래 데이터의 분포와 비교해 보면, 3가지의 표준화 기법이 대부분 비슷한 스케일로 데이터들의 분포를 조정한 것을 볼 수 있다. MinMaxScaler는 각 feature들 사이의 거리를 왜곡하지 않는다는 점을 눈여겨 보라. 바로 이러한 특징이, MinMaxScaler가 데이터의 분포와 이상치의 영향을 온전이 보기 위해 가장 많이 사용되는 이유일 것이다. 반대로 분포보다, 이상치의 영향이 얼마나 줄었는지를 보고 싶다면 RobustScaler가 더 유용할 것이다. 또한, 모든 데이터를 정규분포화(normal distribution)하여 보고 싶다면 StandardScaler가 가장 유용할 것이다.

요약

  • 데이터의 왜곡이 없이 순수하게 분포를 비교하고 싶을 때는 MinMaxScaler 사용
  • 이상치가 있고, 그 영향을 줄이고 싶다면 RobustScaler 사용 — 그러나 이상치는 없애는 것이 가장 좋다.
  • 모든 데이터의 분포를 정규분포로 보고 싶다면 StandardScaler를 사용
  • Normalizer에는 L1과 L2기법이 있다. 데이터의 열(columns)이 아닌 행(row)에 사용되므로 사용에 주의가 필요하다.

추가 자료

아래 자료들은 여기서 다룬 내용들을 좀 더 깊게 공부하는데 도움이 될 것이다.

  1. 표준화 방법 Cheat sheet(Jeff Hale) : https://docs.google.com/spreadsheets/d/1woVi7wq13628HJ-tN6ApaRGVZ85OdmHsDBKLAf5ylaQ/edit#gid=0
  2. Scikit-learn doc: http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing-scaler
  3. Outliers scaling: http://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py
  4. Probability distribution: https://medium.com/@srowen/common-probability-distributions-347e6b945ce4
  5. Functions: http://benalexkeen.com/feature-scaling-with-scikit-learn/
  6. 왜도, 첨도와 상관계수: http://blog.naver.com/PostView.nhn?blogId=istech7&logNo=50154573592

7. L1 Regularization, L2 Regularization 의 이해, 용도와 차이 설명: https://light-tree.tistory.com/125

이 글은 Jeff Hale의 Towards Data Science 글인 Scale, Standardize, or Normalize with Scikit-Learn 를 참조하였습니다.

--

--

배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.