Q. test set은 건들면 안된다고 들었는데, 전처리도 하면 안될까?
A.
test set도 전처리를 해줘야 한다. 다만 train set과 동일하게 처리할 부분과 다르게 처리할 부분을 잘 구분해야 한다.
train set의 전처리에 사용한 수치 관련 규칙을 포함한 모든 규칙은 test set에도 동일하게 적용되어야 한다.
scaler.fit(X_train) -- fit():scaler 학습
X_train_scaled=scaler.transform(X_train) -- transform():적용
= X_train_scaler.fit_transform(X_train) -- transform():적용
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
X,y=np.arange(120).reshape((30,4)), list(range(30))
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=-.33, randomstate=1234)
scaler=MinMaxScaler()
# 학습 데이터에 대해서 fit(), transform() 수행.
scaler.fit(X_train)
X_train_scaled=scaler.transform(X_train)
# 테스트 데이터에서는 transform()만 수행.
X_test_scaled=scaler.transform(X_test) -- train에서 사용된 scailing 파라미터 그대로 test set에 사용
- 임의의 한 feature가 train set에서 min:10, max:90인 경우
- min-max scaling으로 스케일링할 때 각 샘플값에서 10을 뺀 후 90으로 나누어줌.
- test set에서는 test set의 실 분포와 관계없이 10을 뺀 후 90으로 나누어 스케일링하는 것이 바람직하다.
test set 내에서 min-max scaling규칙을 적용하는 것을 '고려할 수도 있으나' 규칙은 수치를 기준으로 사전에 결정하는 것이 좋다.
- 최솟값 0, 최댓값 1로 변경하는 규칙은 test set에서 일부 샘플이 추가되거나 삭제될 경우 기존 샘플이 이에 영향을 받게 됨. 최댓값과 최솟값이 변경될 수 있기 때문
- 테스트 샘플의 수가 적은 경우 feature값이 단일한 경우(상수) 스케일링 오류 발생
필요한 경우 train set에는 없지만 발생할 수 있는 상황을 고려해 규칙 구성이 가능하다. 피처의 테스트 데이터셋에서만 결측값이 발생한다면 오류가 발생할 수도 있으므로 필요한 경우 이에 대한 방어 로직(결측값을 학습데이터의 평균으로 대체 등)을 마련하는 것이 좋다.