왜 fit_transform()은 training data에만 사용?
왜 transfrom()은 test data에만 사용?
Data Standardization 과정에서 MinMaxScaler, StandardScaler 등을 사용한다. 이 과정에서 fit, transform, fit_transform 메서드를 사용한다.
scaler_x.fit(df_X)
scaler_x.transform(df_X)
scaler_x.fit_transform(df_X)
※ 즉 학습 데이터 세트로 fit() 된 Scaler를 이용하여 test 데이터를 변환할 경우에는 test 데이터에서 다시 fit()하지 않고 반드시 그대로 이 Scaler를 이용하여 transform()을 사용해야 한다.
학습할 때와 동일한 scaler로 동일하게 테스트 데이터를 변환해야한다. 학습 데이터에서 Scale된 데이터를 기반으로 Classifier가 학습이 되었기 때문에 이렇게 학습된 Classifier가 예측을 할 때에도 학습 데이터의 Scale 기준으로 테스트 데이터를 변환 한 뒤 predict해야 한다.
# Example
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.metrics import accuracy_score
# 데이터 세트를 로딩
X_train, X_test, y_train, y_test = train_test_split(data, label, test_size=0.2, random_state=2)
# MinMaxScaler() Scaler
scaler = MinMaxScaler()
# 학습 데이터에 대해서 fit(), transform()
scaler.fit(X_train)
scaled_X_train = scaler.transform(X_train)
##fit + transform → fit_transform 사용 가능
# 테스트 데이터에서는 transform만 사용
scaled_X_test = scaler.transform(X_test)
lr = LogisticRegression()
lr.fit(scaled_X_train, y_train)
pred = lr.predict(scaled_X_test)
test 데이터에 scaled_X_test = scaler.fit_transform(X_test)를 적용하면 scaler 객체가 기존에 학습 데이터에 fit 했던 기준을 모두 무시하고 다시 test 데이터를 기반으로 기준을 적용해버린다.
따라서 테스트 데이터에 fit_transform()을 적용해서는 안된다.
※ Tip!
이런 번거로움을 피하기 위해 학습과 테스트 데이터로 나누기 전에 먼저 Scaling등의 데이터 전처리를 해주는 것이 좋다