💡변수 스케일링
StandardScaler()
평균을 제거하고(빼주고) 데이터를 단위분산에 맞게 조정
표준편차가 1이고 0을 중심으로 하는 표준정규분포를 가지게 됨
변수가 왜곡되거나 이상치가 있으면 좁은 범위의 관측치를 압축해 예측력을 손상시킴(평균으로 계산하기 때문에 이상치에 크게 영향 받음)
피처를 지정된 범위로 확장해 변환. 기본값은 [0,1]임
마찬가지로, 변수가 왜곡되거나 이상치가 있으면 좁은 범위의 관측치를 압축해 예측력을 손상시킴(이상치가 있으면 범위 선정에 크게 영향받음)
중앙값을 제거하고(빼주고) 분위수 범위(기본값은 IQR임)에 따라 데이터 크기 조정
편향된 변수에 대한 변환 후 변수의 분산을 더 잘 보존함. 이상치 제거에 효과적(앞의 두 스케일러에 비해 이상치 영향을 덜 받음)
💡그 외 sklearn 스케일러
1) MaxAbsScaler()
2) Normalizer()
💡파이썬 권장 convention은 import할 때 하나씩 불러오는 것
# 이렇게 하면 편하지만
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# 이게 권장 방법
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import RobustScaler
💡스케일러 적용
스케일러의 fit에는 matrix를 넣어주어야 하기 때문에 Series가 아닌 DataFrame 으로 넣어줌
사이킷런의 다른 기능에서는 fit => predict 를 했었지만 전처리에서는 fit => transform을 사용
ss = StandardScaler()
train[["SalePrice_ss"]] = ss.fit(train[["SalePrice"]]).transform(train[["SalePrice"]])
# 같은 컬럼을 fit하고 변환한다면 이런 방법도 가능
train[["SalePrice_ss"]] = ss.fit_transfrom(train[["SalePrice"]])
기준을 train으로 정하기 위해 fit()
은 test 에 사용하지 않음. test에는 transform()
만 사용
fit_transform()
은 train에만 사용. test에는 transform()
사용normal_scaler.inverse_transform()
사용해서 원래 값으로 복원도 가능
스케일링할 때, 모든 특성의 범위를 유사하게 만드는 것은 중요하지만, 그렇다고 모두 같은 분포로 만들 필요는 없음.
💡log transformation
log1p()
를 취했을 때 여전히 0보다 작다면 함수에서 알아서 결측치로 처리하고 진행함(warning message 출력)
💡이산화(discretisation)
pd.cut()
pd.qcut()
💡인코딩
pd.cat.codes
get_dummies
❗ 판다스로 인코딩했을 때 문제점
pandas.get_dummies()
는 train, test 따로 인코딩함sklearn.preprocessing.OneHotEncoder()
는 train 데이터로만 학습해서 진행하기에 test에만 존재하는 데이터를 인코딩하지 않음.그 외 인코딩 방식은 여기 참조
https://techblog-history-younghunjo1.tistory.com/99
💡파생 변수
다항식 전개에 기반한 파생 변수 생성(Polynomial Expansion)
주어진 다항식의 차수 값에 기반하여 파생변수를 생성
머신러닝 모델은 label에 대해서 설명력이 높은 한 두가지 Feature에 의지할 때보다 여러가지 Feature에 기반할 때 성능이 더 뛰어남. 소수의 Feature에 기반하게 되면 과대적합이 일어날 확률이 높기 때문에 사용함.
다항식 전개에 기반해서 파생변수를 만들게 되면 잘 구분되지 않는 피처가 좀 더 구분되게 되고, 머신러닝 모델이 여러 Feature에 기반하게 되어 안정성이 높아짐
SOTA(State-of-the-art) : 현재 최고 수준의 결과