머신러닝 관련 서적들을 읽고 나서 기존에 몰랐던 내용들이나 제가 생각했을때 중요하다고 생각되는 내용들 위주로 정리해봤습니다. 데이터 전처리 부분에 관해서 정리하는 중이고, 일부 EDA 측면에서의 내용이 추가되있을 수 있습니다.
개인적으로 생각했을때 기본적인 내용들까지 세세하게 다루진 않았으며 일부 빠져 있는 내용이 있을 수 있습니다.
수치로 표현되는, 연속적인 숫자로 이루어진 데이터들 (ex. 시험 점수, 주행 속도 등)을 다루는 방법을 정리했습니다.
데이터 내의 여러 특성들은 각각 다른 스케일을 가지고 있습니다.
다른 스케일이 머신러닝 모델 학습에 영향을 주는 것을 방지하고자 각 특성들의 스케일을 맞춰줘야 하는데,
주로 Min-Max, Standard 스케일링을 사용합니다.
최솟값, 최댓값을 이용하여 0과 1 사이의 값으로 변환
최솟값, 최댓값을 사용하므로 이상치의 영향을 받습니다.
import numpy as np
from sklearn.preprocessing import MinMaxScaler
arr = np.random.randint(0, 100, 100).reshape(-1, 1)
scaler = MinMaxScaler()
scaler.fit(arr)
scaled = scaler.transform(arr)
print(scaled.min(), scaled.max())
# 0.0 1.0
평균, 표준편차 값을 이용하여 특성의 평균이 0이고, 표준편차가 1이 되도록 값을 변환
Min-Max Scaling과 동일하게, 평균과 표준편차를 사용하므로 이상치의 영향을 받습니다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(arr)
scaled = scaler.transform(arr)
print(round(scaled.mean(), 0), scaled.std())
# 0.0 1.0
데이터에 이상치(Outlier)가 많은 경우, 중간값이나 사분위 범위 등을 이용해서 스케일링을 하는데
Scikit-Learn의 RobustScaler, QuantileTransformer를 사용합니다.
중앙값과 IQR을 사용하여 값을 변환하기 때문에, 이상치로부터의 영향을 줄일 수 있습니다.
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
scaler.fit(arr)
scaled = scaler.transform(arr)
# IQR(Q3 - Q1)의 범위는 RobustScaler 파라미터 수정을 통해서 변경할 수 있음.
데이터를 1000개의 분위로 (또는 N개의 분위) 나눠 0~1 사이의 값으로 변환
이 방법 또한 이상치로부터의 영향을 줄일 수 있습니다.
from sklearn.preprocessing import QuantileTransformer
scaler = QuantileTransformer()
scaler.fit(arr)
scaled = scaler.transform(arr)
# QuantileTransformer 파라미터 수정을 통해 몇개의 분위수로 나눌건지 정할 수 있음. (default: 1000)
위의 내용들은 각 특성별로 스케일링을 하는 방법이고,
샘플(행) 단위로 스케일링을 하는 방법이 있습니다. (Scikit-Learn Normalizer)
※ 데이터 전처리보단 딥러닝의 학습 벡터용으로 사용하기 때문에 사용 방법은 정리하지 않았습니다.