본문 바로가기
ML & DL/Machine Learning

[ML] Data Pre-processing : Scaling

by 홍월이_ 2022. 12. 16.

아래 내용들은 제가 혼자 학습하면서 정리한 내용들입니다.

'부족한 내용' 혹은 '잘못된 내용'이 있을 수 있습니다.

댓글 남겨주시면 더욱 공부하고 수정하도록 하겠습니다.

감사합니다.


Data Scaling

  • 데이터 전처리 과정 중 하나인 데이터 스케일링을 다룹니다.
  • 데이터 간의 거리에 영향을 받는 알고리즘을 사용할 때, 특성들의 스케일이 차이가 많이 나면 머신러닝 모델이 잘 작동하지 않을 수 있습니다.
  • 이때, 데이터의 스케일을 일정한 기준으로 맞춰 주는 방법으로 Data Scaling 을 하게됩니다.

 

대표적인 Scaling 개념

  • Standardization(표준화)
    • 특성들의 평균을 0, 분산을 1로 스케일링
    • 표준점수(z-Score)를 활용해 Numpy로 표준화하기
mean = mp.mean(train_input, axis=0)
std = mp.std(train_imput, axis=0)

train_scaled = (train_input - mean) / std
  • Normalization(정규화)
    • 특성들을 특정 범위(주로 0~1)로 스케일링 하는 것

 

Scikit-Learn Scaler 사용하기

  • scaler 는 fit 과 transform 메서드를 가진다
  • fit 메서드는 훈련 데이터에 적용해서 훈련 데이터의 분포를 먼저 학습
  • tranform 메서드를 이용해 훈련 데이터와 테스트 데이터에 적용
  • fit 과 transform이 결합된 fit_transform() 메서드가 있다.  사용시 주의(훈련데이터에만 적용할 것)
  • 테스트 데이터는 훈련 데이터와 같은 Scale로 변환을 해주어야 한다.
  • 특성에 따라 각기 다른 스케일링을 적용하는 것이 유리할 수 있음

StandardScaler()

  • 특성들의 평균을 0, 분산을 1로 스케일링
  • 이상치에 매우 민감하다
  • 회귀보다는 분류에 유용하다
from sklearn.preprocessing import StandardScaler

class sklearn.preprocessing.StandardScaler(*, copy=True, with_mean=True, with_std=True)

# Scaler 객체 생성
# Scaler 종류가 달라져도 학습방법은 비슷하다.
scaler = StandardScaler()

# 훈련 데이터로 학습시키기
scaler.fit(X_train)

# 훈련 데이터스케일링
X_train_Scaled = scaler.transform(X_train)

# 테스트 데이터 스케일링
Y_test_Scaled = scaler.transform(X_test)

# 훈련 - 스케일링 같이 하기
X_train_Scaled = scaler.fit_transform(X_train)
X_test_Scaled = sclaer.transform(X_test)

MinMaxScaler()

  • 가장 작은 값이 0, 가장 큰 값이 1로 변환되므로, 모든 특성들이 [0, 1]의 범위를 갖게 스케일링
  • 이상치에 매우 민감
  • 분류보다 회귀에 유용하다
from sklearn.preprocessing import MinMaxScaler

class sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), *, copy=True, clip=False)

MaxAbsScaler()

  • 각 특성의 절대값이 0과 1사이가 되도록 스케일링
  • 모든 값이 -1 ~ 1의 값으로 표현된다
  • 이상치에 매우 민감
from sklearn.preprocessing import MaxAbsScaler

class sklearn.preprocessing.MaxAbsScaler(*, copy=True)

RobustScaler()

  • 평균과 분산 대신에 중앙값과 사분위값을 사용
  • 이상치의 영향을 최소화할 수 있다.
from sklearn.preprocessing import RobustScaler

class sklearn.preprocessing.RobustScaler(*, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True, unit_variance=False)[source]

Normalizer()

  • Normalizer 의 경우 각 샘플(행)마다 적용되는 방식
  • 한 행의 모든 특성들 사이의 유클리드 거리가 1이 되도록 스케일링
  • 일반적인 데이터 전처리의 상황에서 사용되는 것이 아니라 모델(특히나 딥러닝) 내 학습 벡터에 적용
from sklearn.preprocessing import Normalizer

class sklearn.preprocessing.Normalizer(norm='l2', *, copy=True)[source]

 

 

 

Reference

https://scikit-learn.org/stable/modules/preprocessing.html

https://wooono.tistory.com/96

...끝

 

댓글