• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

데이터 표준화에 대한 질문입니다.

20.04.14 16:12 작성 조회수 611

0

변수들을 표준화 시키는 건 변수간에 단위가 달라 스케일을 맞춰주는 것이라고 알고 있습니다.

학습, 검증, 테스트 데이터들 모두 표준화 시켜서 모델을 평가할텐데 나중에 신규데이터가 들어와서 예측을 해야한다면 신규 데이터들도 표준화를 시켜야 머신러닝 모델이 결과를 예측할 수 있지 않나요?

만약 그렇다면 신규데이터들은 어떻게 표준화를 해야 하나요? 

1. 신규데이터와 기존 학습데이터를 모두 표준화해서 다시 학습을 시켜야하나요?

2. 그렇지 않다면 신규데이터가 두 건 밖에 들어오지 않고, 신규데이터들끼리 min,max 표준화?? 한다면 하나는 0이 되고 하나는 1이 될텐데,  좀 이상한 것 같습니다ㅜ... 그럼 데이터가 하나만 들어올 때는 어떻게 해야하죠??

4. 그리고 피처와 타겟값에 로그변환을 취한다면, 신규데이터가 들어올 때, 그냥 로그변환 취해주면 될까요?

공부할수록 질문이 너무 많아지네요ㅜㅜ

답변 4

·

답변을 작성해보세요.

0

얼마 전 오프라인 교육에서 강사님이 신규데이터끼리 따로 스케일링을 새로 한다길래 의아했었는데, 질문하기 잘했네요.

항상 친절한 답변 정말 감사합니다.

0

안녕하십니까, 아래에 답변을 기재드립니다.

1. 네, 맞습니다.

학습 데이터 기준 최소값 0이 0, 최대값 100이 1로 스케일링 되므로 -10은 -0.1,  200은 2로 변환됩니다.

아래는 테스트용 코드이니 참조하십시요.

from sklearn.preprocessing import MinMaxScaler
import numpy as np

train_data = np.array([100, 0, 10]).reshape(-1, 1)

scaler = MinMaxScaler()
scaler.fit(train_data)
train_scaled_data = scaler.transform(train_data)
print(train_scaled_data)

test_data = np.array([200, 0, -10]).reshape(-1, 1)
test_scaled_data = scaler.transform(test_data)
print(test_scaled_data)

2. 네 모든 scaler에 똑같이 적용됩니다.

3. Scaling 변환은 연속형 feature에만 적용합니다. 카테고리 feature에는 잘 아시다시피 적용할 필요가 없습니다. 따라서 10개 중에 9개가 연속형, 한개가 카테고리 feature이면 9개만 변환한 뒤에 한개의 카테고리 feature를 여기에 concatenation합니다. 

감사합니다

0

1. 만약 범위가 0부터 100까지인 학습 데이터 세트를 min, max 스케일링 하면, x=(x-x.min)/(x.max-x.min)이 적용되어 최소값0은 0, 최대값 100은 1로 스케일링이 되잖아요.

그런데 -10부터, 200까지인 신규 데이터 세트가 들어오면, x=(x-x.min)/(x.max-x.min) 공식에서 x.min과 x.max가 학습데이터의 것이 활용되어 스케일링이 되는건가요?

이렇게 됐을 경우 계산해보면 신규데이터는 -0.1에서 2까지의 범위를 갖게 되는데 제가 이해한 것이 맞는지 확인 부탁드립니다.

2. 위의 개념이 StandardScaler에도 똑같이 적용이 되는 것이죠?? 학습데이터에서 fit한 변수? 객체? (scaler = StandardScaler()일 때 scaler)를 통해 검증데이터와 신규데이터 똑같이 변환하여, mean(x)와 stdev(x)가 학습데이터 셋의 것이 사용되나요?

3. 그리고 이런 데이터 변환들은 피쳐들이 모두 연속형 데이터일때만 사용되나요?? 10개의 피처 중에 하나의 피처가 범주형 데이터일 때는 사용하지 않는건지 아니면 9개의 연속형 데이터에만 적용해서 사용하는지 궁금합니다.

0

안녕하십니까,

1번과 2번 설명입니다.

모델은 학습 데이터 기준으로 스케일된 데이터를 기반으로 학습합니다.  때문에 신규 데이터 및 테스트 데이터는 모두 학습데이터 기준으로  스케일링을 맞춰줘야 합니다. Scikit learn의 Scaler인 MinMaxScaler를 사용하는 예를 들어 보겠습니다.

아래에서 모델은 학습 데이터로 스케일된 데이터를 기반으로 학습합니다. scaler 객체는 학습 데이터의 Min, Max를 가지고 있으며 이를 기반으로 학습 데이터를 스케일링 합니다. scaler 객체는 학습 데이터 기반으로 스케일되어 있지만 이를 이용하여 테스트 또는 신규 데이터를 스케일 변환합니다. 유의하셔야 할 점은 신규 데이터를 단독으로 scale 하면 절대 안됩니다. 이미 모델이 학습 데이터를 기반으로 scale되어 있기 때문에 이 학습 데이터 scaler를 이용하여 신규 데이터를 변환해야 합니다.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

scaler = MinMaxScaler()
scaler.fit(X_train) # fit( )을 수행하면 min과 max의 범위를 정하게 됩니다.
X_train_transformed = scaler.transform(X_train)
clf = LogisticRegression()
clf.fit(X_train_transformed)

# 여기서 테스트 데이터 또는 신규 데이터는 반드시 train 데이터로 fit() 된 scaler 객체를 사용해야 합니다.
# 다시 scaler를 테스트 데이터로 fit( )해서는 안됩니다. 즉 scaler.fit(X_test)를 적용하면 안됩니다.
# 아래와 같이 테스트 데이터 또는 신규 데이터를 변환합니다.

X_test_transformed = scaler.transform(X_test)
preds = clf.predict(X_test_transformed)

데이터가 신규로 들어올 때도
X_test_transformed = scaler.transform(X_test)와 같은 형태로 변환 하고 predict() 수행하면 됩니다.

4.
피처와 타겟값에 로그변환을 취한다면, 신규데이터가 들어올 때도 로그변환을 적용해 줘야 합니다.

감사합니다.