✔️ 스케일링 방법 중에서 이상치에 가장 덜 민감한 스케일링 방법은?
-> Robust
스케일링을 했을 때 분포가 변하지 않는다. x 축 값을 보면 min-max x값이 0~1 사이에 있고, std => 평균을 빼주고 표준편차로 나눠주고, roubust => 중간값으로 빼고 IQR로 나눠준 결과이다.
트리 알고리즘에서는 절대적인 값보다 상대적인 값에 영향을 받기 때문에(예를 들어 1~10 인 값이 있고 어떤 값은 1 ~1000 인 값이 있다면 여기에서 절대적인 크기보다 그 값의 상대적인 값을 보게 됨. 1~10인 값의 중간값은 5, 1~1000인 값의 중간값은 500 이런식으로 상대적인 값을 보게 됨) 스케일링에 영향을 크게 받지 않는다. 하지만 다른 알고리즘에서는 스케일링 값을 조정해 주면 모델의 성능이 좋아진다.
from sklearn.preprocessing
-> 전처리 스케일 조정
StandardScaler.fit(matrix)
-> matrix(데이터프레임)
StandardScaler.fit(matrix).transform(matrix)
= StandardScaler.fit_transform(matrix)
StandardScaler의 fit 에는 matrix를 넣어주어야 하기 때문에
Series가 아닌 DataFrame 으로 넣어주기 위해 대괄호를 두번 감싸서 데이터프레임으로 넣어주었습니다.
반환값도 matrix 형태이기 때문에 새로운 파생변수를 만들고자 한다면 데이터프레임 형태로 파생변수를 만들어 줍니다.
사이킷런의 다른 기능에서는 fit => predict 를 했었지만 전처리에서는 fit => transform을 사용합니다.
스케일링을 예시로 fit 은 계산하기 위한 평균, 중앙값, 표준편차가 필요하다면 해당 데이터를 기준으로 기술통계값을 구하고
그 값을 기준으로 transform 에서 계산을 적용해서 값을 변환해 줍니다.
fit 은 train 에만 사용하고 transform 은 train, test 에 사용합니다.
fit 은 test 에 사용하지 않습니다. 왜냐하면 기준을 train으로 정하기 위해서 입니다.
test 에는 train을 기준으로 학습한 것을 바탕으로 transform 만 합니다.
❗️주의❗️
cut 함수는 값을 기반으로 이산화를 하게됩니다.
-> 사용자가 이산화를 할 수치를 직접 입력
qcut함수는 샘플의 변위치를 기반으로 이산화를 하게됩니다.
-> 계산한 특정 분위수를 기반으로 해서 이산화를 수행
최근 부스팅3대장(Xgboost, LightGBM, catBoost) 알고리즘 중에는 범주형 데이터를 알아서 처리해 주는 알고리즘도 있지만 사이킷런에서는 범주형 데이터를 피처로 사용하기 위해서는 별도의 변환작업이 필요합니다.
Ordinal Encoding
: from sklearn.preprocessing import OrdinalEncoder
-> .astype('category').cat.codes
-> 결과가 벡터, 1차원 형태
-> 순서가 있는 명목형 데이터에 사용 (ex. 기간의 1분기, 2분기, 3분기, 4분기)
One-hot-encoding
: from sklearn.preprocessing import OneHotEncoder
-> pd.get_dummies()
-> 결과가 matrix, 2차원 행렬 형태
-> 순서가 없는 명목형 데이터에 사용 (ex. 좋아하는 음료, 주택의 종류, 수업의 종류 등) 순서가 없고 크기를 비교할 수 없는 데이터, 범주형 데이터에 사용
판다스로 인코딩 했을때의 단점?
pandas 의 get_dummies 를 사용해서 인코딩 하면 train, test 따로 인코딩을 하게 됩니다.
train 학습한 것을 기반으로 test 와 동일하게 피처를 생성해 주어야 하는데 이게 조금 다를 수 있습니다.
판다스로 train, test 각각 인코딩 했다면 피처의 수, 종류가 다를 수 있습니다.
그런데! 학습, 예측을 할 때는 동일한 피처를 입력해 주어야 합니다. 개수도 동일해야 합니다.
pandas 로 인코딩 한다면 set(train.columns) - (test.columns) 이런식으로 비교해서 맞춰주어야 합니다.
또, train 에만 등장하는 피처가 있다면 test 에도 동일하게 만들어 주어야 합니다.
가장 간단한 것은 concat 을 사용하는 방법입니다. 없는 값은 nan 으로 들어가게 되고 다시 train, test 를 나눠주면 됩니다.
=> 처음부터 concat 을 사용하고 나중에 나눠주면 이런 문제를 해결할 수 있습니다!
=> 그런데 test 에만 등장하는 데이터를 피처로 사용하지 말라는 정책이 있을 때 이 방법은 규칙위반일수 있습니다.
uniform 의 의미?
-> 히스토그램을 그렸을 때 어딘가는 많고 적고인 데이터가 있다면 그것도 특징이 될 수 있는데
-> 특징이 잘 구분되지 않는다면 power transform 등을 통해 값을 제곱을 해주거나 하면 특징이 좀 더 구분되어 보이기도 함.
SOTA (State-of-the-art) : 현재 최고 수준의 결과를 의미
from sklearn.preprocessing import PolynomialFeatures