우노
[ML] 데이터 스케일링 (Data Scaling) 이란? 본문
스케일링이란?
- 머신러닝을 위한 데이터셋을 정제할 때, 특성별로 데이터의 스케일이 다르다면 어떤 일이 벌어질까요?
- 예를 들어,
- X1은 0 부터 1 사이의 값을 갖고
- X2 는 1000000 부터 1000000000000 사이의 값을 갖고
- y 는 1000000 부터 100000000 사이의 값을 갖는다고 가정한다면
- X1 특성은 y 를 예측하는데 큰 영향을 주지 않는 것으로 생각할 수 있습니다.
- 때문에 특성별로 데이터의 스케일이 다르다면, 머신러닝이 잘 동작하지 않을 수 있습니다.
- 따라서, 저희는 데이터 스케일링 작업을 통해, 모든 특성의 범위(또는 분포)를 같게 만들어줘야합니다.
주로 사용되는 스케일링 개념
- Standardization (표준화)
- 특성들의 평균을 0, 분산을 1 로 스케일링하는 것입니다.
- 즉, 특성들을 정규분포로 만드는 것입니다.
- Normalization (정규화)
- 특성들을 특정 범위(주로 [0,1]) 로 스케일링 하는 것입니다.
- 가작 작은 값은 0, 가장 큰 값은 1 로 변환되므로, 모든 특성들은 [0, 1] 범위를 갖게됩니다.
scikit-learn 의 scaler 사용 전, 주의 사항
- 우선, scikit-learn 의 scaler 를 사용하기전에, 주의해야할 점을 먼저 살펴보겠습니다.
- scaler 는 fit 과 transform 메서드를 지니고 있습니다.
- fit 메서드는 훈련 데이터에만 적용해, 훈련 데이터의 분포를 먼저 학습하고
- 그 이후, transform 메서드를 훈련 데이터와 테스트 데이터에 적용해 스케일을 조정해야합니다.
- 따라서, 훈련 데이터에는 fit_transform() 메서드를 적용하고, 테스트 데이터에는 transform() 메서드를 적용해야합니다.
- fit_transform() 은 fit 과 transform 이 결합된 단축 메서드입니다.
- 또한, 스케일링할 때, 모든 특성의 범위를 유사하게 만드는 것은 중요하지만, 그렇다고 모두 같은 분포로 만들 필요는 없습니다.
- 특성에 따라 각기 다른 스케일링을 적용하는게 유리할 수도 있기 때문입니다.
- 이제 scikit-learn 에서 제공하는 5가지 스케일링 방법을 알아보겠습니다.
StandardScaler()
- 특성들의 평균을 0, 분산을 1 로 스케일링하는 것입니다.
- 즉, 특성들을 정규분포로 만드는 것입니다.
- 최솟값과 최댓값의 크기를 제한하지 않기 때문에, 어떤 알고리즘에서는 문제가 있을 수 있으며
- 이상치에 매우 민감합니다.
- 회귀보다 분류에 유용합니다.
from sklearn.preprocessing import StandardScaler
# 변형 객체 생성
std_scaler = StandardScaler()
# 훈련데이터의 모수 분포 저장
std_scaler.fit(X_train)
# 훈련 데이터 스케일링
X_train_scaled = std_scaler.transform(X_train)
# 테스트 데이터의 스케일링
X_test_scaled = std_scaler.transform(X_test)
# 스케일링 된 결과 값으로 본래 값을 구할 수도 있다.
# X_origin = std_scaler.inverse_transform(X_train_scaled)
MinMaxScaler()
- Min-Max Normalization 이라고도 불리며,
- 특성들을 특정 범위(주로 [0,1]) 로 스케일링 하는 것입니다.
- 가작 작은 값은 0, 가장 큰 값은 1 로 변환되므로, 모든 특성들은 [0, 1] 범위를 갖게됩니다.
- 이상치에 매우 민감합니다.
- 분류보다 회귀에 유용합니다.
from sklearn.preprocessing import MinMaxScaler
# 변형 객체 생성
minmax_scaler = MinMaxScaler()
# 훈련데이터의 모수 분포 저장
minmax_scaler.fit(X_train)
# 훈련 데이터 스케일링
X_train_scaled = minmax_scaler.transform(X_train)
# 테스트 데이터의 스케일링
X_test_scaled = minmax_scaler.transform(X_test)
# 스케일링 된 결과 값으로 본래 값을 구할 수도 있다.
# X_origin = minmax_scaler.inverse_transform(X_train_scaled)
MaxAbsScaler()
- 각 특성의 절대값이 0 과 1 사이가 되도록 스케일링합니다.
- 즉, 모든 값은 -1 과 1 사이로 표현되며, 데이터가 양수일 경우 MinMaxScaler 와 같습니다.
- 이상치에 매우 민감합니다.
from sklearn.preprocessing import MaxAbsScaler
# 변형 객체 생성
maxabs_scaler = MaxAbsScaler()
# 훈련데이터의 모수 분포 저장
maxabs_scaler.fit(X_train)
# 훈련 데이터 스케일링
X_train_scaled = maxabs_scaler.transform(X_train)
# 테스트 데이터의 스케일링
X_test_scaled = maxabs_scaler.transform(X_test)
# 스케일링 된 결과 값으로 본래 값을 구할 수도 있다.
# X_origin = maxabs_scaler.inverse_transform(X_train_scaled)
RobustScaler()
- 평균과 분산 대신에 중간 값과 사분위 값을 사용합니다.
- 중간 값은 정렬시 중간에 있는 값을 의미하고
- 사분위값은 1/4, 3/4에 위치한 값을 의미합니다.
- 이상치 영향을 최소화할 수 있습니다.
from sklearn.preprocessing import RobustScaler
# 변형 객체 생성
robust_scaler = RobustScaler()
# 훈련데이터의 모수 분포 저장
robust_scaler.fit(X_train)
# 훈련 데이터 스케일링
X_train_scaled = robust_scaler.transform(X_train)
# 테스트 데이터의 스케일링
X_test_scaled = robust_scaler.transform(X_test)
# 스케일링 된 결과 값으로 본래 값을 구할 수도 있다.
# X_origin = robust_scaler.inverse_transform(X_train_scaled)
Normalizer()
- 앞의 4가지 스케일러는 각 특성(열)의 통계치를 이용하여 진행됩니다.
- 그러나 Normalizer 의 경우 각 샘플(행)마다 적용되는 방식입니다.
- 이는 한 행의 모든 특성들 사이의 유클리드 거리(L2 norm)가 1이 되도록 스케일링합니다.
- 일반적인 데이터 전처리의 상황에서 사용되는 것이 아니라
- 모델(특히나 딥러닝) 내 학습 벡터에 적용하며,
- 특히나 피쳐들이 다른 단위(키, 나이, 소득 등)라면 더더욱 사용하지 않습니다.
from sklearn.preprocessing import Normalizer
# 변형 객체 생성
normal_scaler = Normalizer()
# 훈련데이터의 모수 분포 저장
normal_scaler.fit(X_train)
# 훈련 데이터 스케일링
X_train_scaled = normal_scaler.transform(X_train)
# 테스트 데이터의 스케일링
X_test_scaled = normal_scaler.transform(X_test)
# 스케일링 된 결과 값으로 본래 값을 구할 수도 있다.
# X_origin = normal_scaler.inverse_transform(X_train_scaled)
'AI > Machine Learning' 카테고리의 다른 글
[ML] 배깅(Bagging), 부스팅(Boosting), 보팅(Voting) (0) | 2020.08.04 |
---|---|
[ML] XGBoost 개념 이해 (10) | 2020.08.04 |
[ML] Epoch, Batch size, Iterations 용어 정리 (0) | 2020.07.30 |
[ML] 회귀 분석 (Regression Analysis) 의 개념과 학습 흐름 (0) | 2020.07.29 |
[ML] K-최근접 이웃 (K-Nearest Neighbor)이란? (0) | 2020.07.28 |
Comments