해결된 질문
작성
·
422
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()를 적용하시면 될 것 같습니다.
감사합니다.