Computer Science/Basics

feature scaling

metamong 2022. 6. 22.

👩‍🍳 data를 요리하기 위해 빈번히 해주는 여러 기법들이 있다. 이 기법들을 배워보는 시간을 가지려 한다. feature scaling은 대표적인 방법 중 하나로, data feature별 제각기 다른 범위를 갖고 있음을 파악하고 동일한 범위, 동일한 선상에 맞게 설정해 scaled된 여러 row별 data를 서로 쉽게 비교할 수 있게끔 해준다. scaling을 안한다면, 범위가 더 넓은 variable이 값 자체만으로 상대적으로 다른 variable에 비해 modeling에서 불공평하게 많은 비중을 차지할 수 있어, 해당 문제점을 방지하기 위해 scaling이 권장된다.

 

👩‍🍳 scaling과 standardization?

scaling은 기존 주어진 value의 range를 바꾸어 다른 분포로 나타내는 것이고 (주로 range는 0 ~ 1), standardization은 scaling의 의미를 내포하고 있고 바뀐 분포의 표준편차가 1로 만들어주는 value 변환을 뜻한다. (normalize 용어는 앞에서 제시한 모든 의미 포함 등 모호한 의미를 담고 있어 추천 x)

 

👩‍🍳 언제 사용? / 언제 사용 x?

 

scaling 사용하는 경우 scaling 사용하지 않는 경우
PCA, clustering, knn, SVM, regression(linear, logistic), ridge & lasso DT, RF, Gradient-Boosting

★k-means★

 

 

★logistic★

 

 


★decision-tree★

 

 

1> standardization & scaling

① StandardScaler (standardization)

 

❄️ 표준화하여 z-score로 나타내며, 평균은 0, 분산은 1이 되는 분포를 따르는 곡선 상의 data로 모든 data를 변환하는 과정이다.

 

❄️ formula>

$x_{new} = \cfrac{x_{old} - \mu}{\sigma}$

 

❄️ 평균은 0, 표준편차는 1인 매우 직관적이고 간단한 분포를 따르는 data로 한 곳에 모여있으므로 이후 data를 가지고 모델링하는 데 매우 편해지는 장점이 존재.

 

❄️ sklearn의 preprocessing.StandardScaler()를 사용

 

from sklearn.preprocessing import StandardScaler

scaled_x = StandardScaler().fit_transform(x)

 

② MinMaxScaler (scaling)

 

❄️ 추가적인 방법으로 min-max scaler를 사용하기도 한다. 가장 작은 값은 0, 가장 큰 값은 1의 값을 가지며 모든 data는 0과 1사이의 값을 가지게 된다. 

 

❄️ formula>

$x_{new} = \cfrac{x_{old} - x_{min}}{x_{max}  - x_{min}}$

 

from sklearn.preprocessing import MinMaxScaler

min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)

 

③ MaxAbsScaler (scaling)

 

❄️ 절댓값이 0~1사이로 mapping되게 하는 scaler이다. -1 ~ 1 사이로 재조정. 양수로 조정된 값은 MinMaxScaler와 유사한 패턴을 보임

 

❄️ formula>

$x_{new} = \cfrac{x_{old}}{abs(x_{max})}$

 

from sklearn.preprocessing import MaxAbsScaler

max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)

 

④ RobustScaler (standardization)

 

❄️ 앞선 세 개의 scaler - standardscaler, minmaxscaler, maxabsscaler는 아웃라이어의 영향을 그대로 받고 출력이 된다. 따라서 이의 단점을 최소화하기 위한 RobustScaler가 존재. 

 

❄️ formula>

$x_{new} = \cfrac{x_{old} - median}{x_{75} -  x_{25}}$

 

❄️ IQR(InterQuartile Range)의 25% ~ 75% 사이의 range를 기준으로 스케일링이 진행. 즉 아웃라이어 data가 고려대상이 될 수 없다. 

🤝 MinMaxScaler, RobustScaler, StandardScaler 비교

 

robust scaler는 outlier의 영향을 고려해서 standardize된 것인지 상대적으로 minmax, standardscaler에 비해 중앙에 집중된 분포로 보인다 (※outlier의 영향을 배제하려면 robust scaler를 사용)

→ robust scaler는 minmax, standard에 비해 range가 더 넓다.

minmax scaler는 0~1 range로 바꾸었지만, standard scaler는 range가 minmax에 비해 월등히 넓다.
(robust, standard는 range가 다양)

→ minmax scaler는 다른 scaler에 비해 상대적으로 light-touched. data 분포를 확연하게 바꾸지 않은 분포이므로, 가볍게 조금만 변환하고자 하면 minmax scaler 사용하기. (기존 분포를 최대한 살린 분포)

2> normalization

❄️ scaling에 비해 거의 사용하지 않으며, L1과 L2 normalizer 존재. range는 다양하며, 평균은 0으로 맞춰주고, sklearn에서 지원해주는 normalizer는 column단위가 아닌, row 단위로 적용된다.

 

- normalization은 이 정도만. 추후 사용하게 된다면 관련 정보 덧붙일 예정! -


* 출처1) scaling 설명 https://syj9700.tistory.com/56

* 출처2) scaler별 차이 설명 https://mkjjo.github.io/python/2019/01/10/scaler.html

* 출처3) scaler별 차이 + 시각화, 자세한 용어 설명 https://towardsdatascience.com/scale-standardize-or-normalize-with-scikit-learn-6ccc7d176a02

* 출처4) sklearn scaling docu https://scikit-learn.org/stable/modules/preprocessing.html#non-linear-transformation%EF%BB%BF

댓글