[전처리]테스트셋에서 스케일링 적용하는 올바른 방법

Oni·2023년 8월 27일
0

Q. test set은 건들면 안된다고 들었는데, 전처리도 하면 안될까?

A.
test set도 전처리를 해줘야 한다. 다만 train set과 동일하게 처리할 부분과 다르게 처리할 부분을 잘 구분해야 한다.
train set의 전처리에 사용한 수치 관련 규칙을 포함한 모든 규칙은 test set에도 동일하게 적용되어야 한다.


✨point

  • train set의 스케일링에서 사용된 파라미터로 test set에 스케일링 적용.

✨코드 적용

  • fit() 메서드와 transform() 메서드 사용
  • fit_transform()은 fit()과 transform()의 기능을 한번에 적용하는 메서드 (주의! fit_transform()은 test set에서는 사용X)

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에 사용 

✨EX

  • 임의의 한 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에는 없지만 발생할 수 있는 상황을 고려해 규칙 구성이 가능하다. 피처의 테스트 데이터셋에서만 결측값이 발생한다면 오류가 발생할 수도 있으므로 필요한 경우 이에 대한 방어 로직(결측값을 학습데이터의 평균으로 대체 등)을 마련하는 것이 좋다.


Reference

profile
데이터 분석/엔지니어링/ML에 관한 기록

0개의 댓글