1. 스케일링 하는 이유
데이터별로 값들의 범위가 다양하게 존재할 수가 있다. 예를 들어, 값이 대체로 큰 데이터와 값이 대체로 작은 데이터가 존재한다. (ex. 키와 몸무게)
이러한 경우에는 같은 값이라도 서로 다른 영향을 미치게 될 것이고 이는 학습에 악영향을 줄 수 있다. 따라서, 스케일링을 통해 각 칼럼이 비슷한 범위를 가지도록 하여 문제를 해결할 수 있다.
2. 스케일링 종류 및 특징
스케일링은 보통 표준화(Standard Scaler) · 최소-최대 스케일링(Min-Max Scaling) · 로버스트 정규화(Robust Scaler) 이렇게 3가지가 있다.
2-1. 표준화(Standard Scaler)
$$Z = \frac{X_i - mean(X)}{sd(X)}$$
데이터를 표준화된 정규분포꼴로 만들어주는 방식이다. 각 데이터에 평균을 빼주고 이를 표준편차로 나눈다. 기존 데이터가 정규분포를 따르고 있고 아웃라이어가 없는 상황에 무난하게 사용된다. 다만, 데이터의 분포가 정규분포와 상당히 거리가 있거나 아웃라이어가 상당수 있는 경우에는 기존 데이터의 특징을 잃어버릴 수 있다.
2-2. 최소-최대 스케일링(Min-Max Scaling)
$$Z = \frac{X_i - min(X)}{max(X) - min(X)}$$
가장 작은 값을 0으로, 가장 큰 값을 1로 처리하여 범위를 0과 1사이로 변환해준다. 표준화와 마찬가지로 아웃라이어의 영향을 많이 받게 된다. 데이터의 기존 분포를 가장 있는 그대로 담아낼 수 있다. 데이터의 분포가 정규분포가 아니거나 음수를 취하면 안될 경우에 사용된다.
2-3. 로버스트 정규화(Robust Scaler)
$$Z = \frac{X_i - Q_2(X)}{Q_3(X) - Q_4(X)}$$
로버스트 정규화는 평균과 표준편차 대신 사분위값을 이용하여 계산된다. 따라서 표준화와 최소-최대 스케일링에 비해서 아웃라이어의 영향을 덜 받는다.
4. 활용
기본적으로 사이킷런 라이브러리를 통해 활용할 수 있다.
from sklearn.preprocessing import StandaredScaler, MinMaxScaler, RobustScaler
# 스케일러 선택
st_scaler = StandardScaler()
# 데이터를 통해 스케일링에 필요한 정보 학습 (표준화이므로 평균, 표준편차가 학습된다.)
st_scaler.fit(data)
# 스케일링 실행
st_scaled = st_scaler.transform(data)
그리고 다음은 타이타닉 데이터에 대한 스케일러별 KNN 알고리즘 적용 결과이다. (x축은 KNN neighbor 수, y축은 정확도)
normal이 스케일러를 적용하지 않은 경우이다. 확실히 스케일러를 적용하면 더 좋은 결과를 얻어낼 수가 있겠다.