다차원의 값들을 비교 분석 하기 위해서, 오버피팅과 언더피팅을 방지해주기 위해서, 독립 변수의 공분산 행렬의 조건수를 감소시켜 최적화와 수렴 속도를 향상시키기 위해서 스케일링이 필요하다. 특히, K-means 등 거리 기반의 모델에서 스케일링은 매우 중요하다.
고유값Eigenvalue에 대한 조건수condition number 벡터는 left 고유벡터와 right 고유벡터 간의 cosine값의 역수이다.
함수의 조건수condition number는 argment에서 작은 변화의 비율에 대해 함수가 얼마나 변화할 수 있는지에 대한 argment 측정값이다. 조건수condition number가 크면 약간의 오차로도 해가 전혀 다른 값을 가지며 조건수condition number가 작으면 비교적 robust한 모델이 된다. 그렇기 때문에 조건수condition number가 커지면 회귀분석을 사용한 예측값의 오차도 커지게 된다.
회귀분석에서 조건수가 커지는 경우는 크게 두가지가 있는데, 1) 변수들의 단위 차이가 나는 경우로 Scaling으로 해결한다. 2) 다중 공선성, 즉, 변수들끼리 상관관계가 큰 경우로 feature selection이나 PCA를 사용한 차원축소 등으로 해결해야 한다.
더불어 1) 독립변수나 종속변수가 심하게 한쪽으로 치우친 분포를 보이는 경우, 2) 독립변수와 종속변수간의 관계가 곱셈 혹은 나눗셈으로 연결된 경우, 3) 종속 변수와 예측치가 비선형 관계를 보이는 경우에는 로그 함수 혹은 제곱근 함수 등을 사용하여 변환된 변수를 사용하면 회귀 성능이 향상될 수도 있다. 때문에 금액과 같은 수치가 큰 데이터를 다룰 경우 로그를 주로 취한다.
Scaling적용 전에 outlier 제거가 선행되어야 하며, 데이터의 분포 특징에 따라 적절한 스케일링 기법을 적용해 주는 것이 좋다. Scaling을 적용하여 feature별로 크기를 유사하게 만드는 것은 중요하지만, 모든 feature의 분포를 동일하게 만들 필요는 없다. 특성에 따라 어떤 항목은 원본데이터의 분포를 유지하는 것이 좋을 수 있다. 예를 들면 데이터가 한 곳에 집중되어 있는 경우 표준화를 시켜 분포를 같게 만들었을 때 작은 단위의 변화가 큰 차이를 불러 오는 것으로 반영될 수 있다.
- StandardScaler
- 평균과 표준편차 사용하는 기본 스케일러
- 평균을 제거하고 데이터를 단위 분산으로 조정한다.
- 이상치가 있는 경우 데이터의 평균과 분산에 영향을 미쳐 변환된 데이터의 확산이 매우 달라지게 되므로 균형 잡힌 척도를 보장할 수 없다.
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(train_data) train_data_ss = scaler.transform(train_data)
- MinMaxScaler
- feature의 값이 [0, 1]이 되도록 스케일링
- 이상치가 있는 경우 변환된 값이 매우 좁은 범위로 압축될 수 있다.
- 특정값에 집중되어 있는 데이터가 그렇지 않은 데이터 분포보다 표준편차에 의한 스케일 변화값이 커지게 된다. 따라서, 한쪽으로 쏠림 현상이 있는 데이터 분포는 형태가 거의 유지된 채 범위값이 조절되는 결과를 보인다.
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() scaler.fit(train_data) train_data_ss = scaler.transform(train_data)
- MaxAbsScaler
- 절대값이 [0, 1]이 되도록 스케일링, 즉, feature의 값이 [-1, 1]이 되도록 스케일링
- 데이터셋이 모두 양수일 경우 MinMaxScaler와 유사하게 동작, 큰 이상치에 민감할 수 있다.
- MinMaxScaler와 유사하지만 음수와 양수값에 따른 대칭분포를 유지하는 특징을 가지고 있다.
from sklearn.preprocessing import MaxAbsScaler scaler = MaxAbsScaler() scaler.fit(train_data) train_data_ss = scaler.transform(train_data)
- RobustScaler
- 중앙값(median)과 IQR(interquartile range) 사용하기 때문에 StandardScaler와 비교해 보면 표준화 후 동일한 값을 더 넓게 분포시킨다.
IQR(interquartile range) = Q3-Q1- outlier의 영향을 최소화한 기법.
from sklearn.preprocessing import RobustScaler scaler = RobustScaler() scaler.fit(train_data) train_data_ss = scaler.transform(train_data)