• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

캐글데이터에서 스케일링 및 라벨인코딩(pd.factorize) 문의

21.10.05 12:05 작성 조회수 319

0

안녕하세요 강사님!

강의 잘 듣고 있습니다.

캐글에 참여하고있는데, 스케일링 및 라벨인코딩(pd.factorize) 에서 막혀서 질문 드립니다.

 

1. 스케일링 관련 문의

데이터 전처리시, Standard Scaling을 한다 가정하였을 때,

'파이썬 머신러닝 완벽 가이드' 나 기타 다른 자료를 찾아봐도, train_split 후 

X_train, X_test 데이터에 대해서 스케일링을합니다.

저희 데이터에서는 아래와 같은경우에,

마지막 TARGET이 없는 테스트 데이터 셋에 어떻게 스케일링 해야하는지 궁금합니다.

(제 생각엔 train_split 하기 전, apps_all 을 스케일링 하면 될 것같은데, 방법을 모르겠습니다)

 

object_columns = apps_all.dtypes[apps_all.dtypes == 'object'].index.tolist()

for column in object_columns:

    apps_all[column] = pd.factorize(apps_all[column])[0]

 

apps_all_train = apps_all[~apps_all['TARGET'].isnull()]

apps_all_test = apps_all[apps_all['TARGET'].isnull()]

apps_all_test = apps_all_test.drop('TARGET', axis=1)

 

from sklearn.model_selection import train_test_split

ftr_app = apps_all_train.drop(['SK_ID_CURR', 'TARGET'], axis=1)

target_app = apps_all_train['TARGET']

 

train_x, valid_x, train_y, valid_y = train_test_split(ftr_app, target_app, test_size=0.3, random_state=2020)

 

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

scaler.fit(train_x)

train_x = scaler.transform(train_x)

valid_x = scaler.transform(valid_x)

 

이렇게 하면 정말 제출해야하는 마지막 데이터(apps_all_test) 데이터에 대해서는 어떻게 스케일링을 해야하나요?

 

2. 위 코드에서  pd.factorize 를 하게되면 object 칼럼들이 int형 컬럼으로 바뀌게 되는데,

      이 이후 스케일링을 하게되면, 라벨인코더 결과값들마저 스케일링 됩니다.

      이는 뭔가 잘못됐다는 생각이 듭니다.

      혹시 숫자형컬럼(int or float) 들에 대해 스케일링을 먼저하고, object 칼럼들에 대해 라벨인코딩을 해야하나요?

 

감사합니다.

 

답변 1

답변을 작성해보세요.

0

안녕하십니까, 

1. 가장 쉽게 적용할 수 있는 방법은 train과 test를 모두 합한  apps_all 에 scaling을 일괄적으로 적용하는 것입니다. 

 ftr_apps_all = apps_all.drop(['SK_ID_CURR', 'TARGET'], axis=1)

target_apps_all = 

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

scaled_ftr_apps_all = scaler.fit_transform(ftr_apps_all)

scaled_ftr_apps_all['TARGET'] = apps_all['TARGET']

이후에 scaled_ftr_apps_all에 TARGET 값이 Null 여부에 따라서 train과 test를 분리하면 될 것 같습니다. 

2. 1번에서와 같이 먼저 scaling을 number 타입에만 적용한 후에 나중에 object type은 pd.factorize()를 적용하시면 될 것 같습니다. 

감사합니다.