머신러닝/FAQ
Scaling - MinMaxScaler
Stevelee_HMC
2022. 9. 1. 06:34
이번 포스팅에서는 자주 문의가 들어오는 scaling에 대해 알아보고자 한다.
MinMaxScaler는 모든 value를 0~1 (0:min , 1:max)로 변환하여 scaling이 상대적으로 큰 feature에 의해
나머지 feature가 무시되는 bias한 상황을 방지하기 위한 전처리방법 중 하나이다.
일반적으로 데이터의 분포도가 한쪽으로 쏠려있는 경우에도 종종 사용한다.
1개의 feature(columns)에 대해서만 scaling 하는 경우
train["Columns_A"] ### train데이터가 있다고 가정하고 Columns_A 컬럼을 MinMax Scaling 해보자
from sklearn.preprocessing import MinMaxScaler ### 스케일러를 불러온다
scaler = MinMaxScaler()
scaler.fit(train["Columns_A"]) ## 컬럼 1개의 경우엔 바로 scaling 하면 shape가 1차원이라서 에러가 발생한다. 따라서 이럴땐 차원을 추가해준다.
## 차원 변경 방법 1
train_cols = train["Columns_A"]
train_cols.reshape(-1, 1) ### 2차원으로 변경 (reshape을 활용)
## 차원 변경 방법 2
train_cols = pd.DataFrame(train["Columns_A"]) ## 데이터프레임으로 덮어씌우면 2차원이 된다.
## 차원 변경 후
scaler.fit(train_cols)
result = scaler.transform(train_cols)
train["Columns_A_scaled"] = result ### 스케일된 결과를 신규 컬럼을 만들어 추가한다. 원본을 덮어씌우는건 비추천
result = scaler.fit_transform(train_cols) ### 이렇게 한줄로도 가능하다.
주의할 것은 항상 train데이터를 스케일링 해주면 test데이터도 해주어야한다.
fit_transform을 train데이터로 하게되면 test데이터는 transform만 해주도록 하자
(항상 기준은 train데이터로 삼아서 scaling해야 같은 수준의 값으로 스케일링된다. 왜냐하면 train , test 데이터의 min값과 max값이 다를테니까)
2개 이상의 컬럼을 scaling 하는 경우
(더 간단함)
train[["Columns_A" , "Columns_B"]] ### train데이터가 있다고 가정하고 Columns_A ,B 컬럼을 MinMax Scaling 해보자
### 잊지말자 두개이상의 컬럼은 리스트로 한번 묶은 다음에 데이터프레임에서 슬라이싱 해야해서 대괄호가 2개다.
from sklearn.preprocessing import MinMaxScaler ### 스케일러를 불러온다
scaler = MinMaxScaler()
scaler.fit(train[["Columns_A" , "Columns_B"]]) ## 컬럼 2개면 2차원이라서 추가적인 차원 변경 불요
result = scaler.transform(train[["Columns_A" , "Columns_B"]])
### 마지막에 result 값이 2차원으로 들어오기때문에 dataframe으로 변경해주어야한다.
train_scaled = pd.DataFrame(result , columns = ["Colums_A_Scaled" , "Columns_B_Scaled"])
## 컬럼 이름을 적당히 지정해주고 ,
train_total = pd.concat([train , train_scaled] , axis = 1)
## 기존 train 원본데이터와 concat해서 합친후 활용하는것을 추천한다.