KT AIVLE SCHOOL/review

Data Scaling (데이터 스케일링)

하웅이 2023. 10. 24. 01:48

Data Scaling?

크기 차이로 인한 이슈는, 알고리즘도 못피해가~

데이터 스케일링은 "데이터의 범위를 조정하는 방법" 입니다. feature을 대상으로 진행하기 때문에, feature scaling이라고 부르기도 해요. (일반적으로 target에는 scaling을 적용하지 않기 때문)

 

데이터 스케일링은 다양한 크기와 범위의 feature를 비슷한 수준으로 맞추어 모델의 성능을 향상시키기 위해 사용합니다. 특히 거리 기반 또는 기울기 기반의 알고리즘에서 데이터 포인트 간 거리나 기울기를 계산해야 하므로, 모든 feature간 동일한 scale을 맞추어 주는 것이 중요합니다.

 

 

이럴 때 쓰면 좋다-!

• k-NN : 데이터 포인트와 가장 가까운 k개의 이웃을 찾을 때, feature간 scale 차이가 크면 거리 계산에 왜곡 발생.

• k-Means Clustering : 각 데이터 포인트와 클러스터 중심 사이의 거리를 계산할 때, feature간 scale 차이가 크면 거리 계산에 왜곡 발생.

• PCA : 데이터 분산을 최대화하며 차원을 축소. 분산 계산을 위해 feature가 동일한 스케일을 갖도록 만드는 것이 중요.

• SVM : 클래스 간 마진을 최대화하여 데이터를 분류. feature간 scale 차이가 크면 마진 계산에 왜곡 발생.

• 경사하강법 알고리즘 : scale이 다른   feature는 경사의 크기를 왜곡시켜 학습 속도 저하나 수렴 시 방해.


Scaling  사용 전, 주의 사항

데이터를 스케일링할 때, 훈련 데이터에는 fit_transform을 사용하고, 테스트 데이터에는 transform를 사용해야 합니다.

✅ fit_transform 

1. fit

데이터의 min, max, mean 등 필요한 통계치를 계산하는 단계. 즉 현재 상태를 학습하는 과정.

2. transform

fit 단계에서 구한 통계치를 활용하여 실제 데이터 스케일링 수행.

3. fit_transform

fit + tansform 단계로, 훈련 데이터에 사용된다.

✅ transform 

fit 단계에서 '이미 학습한' 통계치를 사용하여 데이터 스케일링 수행하는 단계.

테스트 데이터에 사용되는 경우, 훈련 데이터의 통계치를 사용하여 테스트 데이터를 변환함.

transform을 바로 적용함으로써, 모델이 새로운 데이터에 대해 예측을 수행할 때, 훈련 데이터와 동일한 기준을 유지하여 모델의 성능을 일관되고 예측 가능하도록 함. (+ data leakage 방지)


1. 표준화 (Standardization)

- feature의 평균을 0, 표준편차를 1로 변환 (Z-score normalization)

- feature의 scale이 서로 다르고, 데이터가 정규분포를 따르는 경우 효과적

- 이상치에 민감

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_X_train = scaler.fit_transform(X_train)
scaled_X_test = scaler.transform(X_test)

 

2. 정규화 (Normalization)

- 주의 : 행 단위로 scaling 수행

- 각 행에 독립적으로 작용하여, 각 행의 벡터 길이(또는 L2 norm)를 1로 만듦

- 텍스트 분석, 이미지 분석과 같은 딥러닝 수행에 효과

- 텍스트 분석 : 길이가 다른 문서 비교 가능

- 이미지 분석 : 행 단위의 픽셀 값을 정규화하면, 전체 밝기에 덜 민감한 모델 생성 가능

- feature간 비교 분석 불가, 통계적 정보 손실 : 일반적인 데이터 전처리에서는 사용하지 않음

from sklearn.preprocessing import Normalizer

normalizer = Normalizer()
# normalizer = Normalizer(norm='l1') 또는 normalizer = Normalizer(norm='l2') 가능
normalized_X_train = normalizer.fit_transform(X_train)
normalized_X_test = normalizer.fit_transform(X_test)

 

3. 최소-최대 스케일링 (Min-Max Scaling)

- feature를 사용자가 지정한 두 값(a,b) 사이의 값으로 변환

- 데이터의 최소/최대값이 명확한 경우 효과적

- 이상치에 민감

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
# scaler = MinMaxScaler(feature_range=(a,b)) : a(최소), b(최대) 지정 가능
scaled_X_train = scaler.fit_transform(X_train)
scaled_X_test = scaler.fit_transform(X_test)

 

4. 로버스트 스케일링 (Robust Scaling)

- feature의 중앙값(median)을 0으로, IQR(사분위값)을 1로 변환

- 이상치가 있는 데이터에 효과적인 처리

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
scaled_X_train = scaler.fit_transform(X_train)
scaled_X_test = scaler.fit_transform(X_test)

 

5. 최대 절대값 스케일링 (Max Abs Scaling)

- feature의 최대 절대값을 1로 변환

- 이상치 영향을 줄이면서 데이터를 scaling하고 싶은 경우 사용

from sklearn.preprocessing import MaxAbsScaler

scaler = MaxAbsScaler()
scaled_X_train = scaler.fit_transform(X_train)
scaled_X_test = scaler.fit_transform(X_test)

 

6. Power Transformer

- 데이터가 정규분포를 따르지 않는 경우

- feature의 분포를 정규분포에 가깝게 변환

- Box-Cox나 Yeo-Johnson 변환을 사용할 수 있음

- 데이터의 분포가 비대칭, 왜곡되어 있는 경우 효과적

from sklearn.preprocessing import PowerTransformer

transformer = PowerTransformer(method='yeo-johnson') #box-cox도 가능
transformed_X_train = transformer.fit_transform(X_train)
transformed_X_test = transformer.fit_transform(X_test)

 

7. Quantile Transformer

- 데이터가 정규분포를 따르지 않는 경우

- feature의 분포를 균등하게 하거나 정규 분포에 가깝게 변환

- 이상치 영향이 적음

- 데이터 분포를 특정한 방향으로 바꾸고 싶은 경우 사용

from sklearn.preprocessing import QuantileTransformer

transformer = QuantileTransformer(output_distribution='uniform')
transformed_X_train = transformer.fit_transform(X_train)
transformed_X_test = transformer.fit_transform(X_test)