scikit-learn fit, transform

이승수·2023년 1월 16일
0

왜 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등의 데이터 전처리를 해주는 것이 좋다

profile
AI/Data Science

0개의 댓글