悩んでいること
SVMのパラメータをチューニングするために、GridSearchCVを用いています。
GridSearchCVで交差検証を行う前に、データの正規化を行いたいのですが、コードに迷っています。
現状
python
1(一部省略) 2 3X = df_all 4y = df["label"] 5 6(train_X , test_X , train_y , test_y) = train_test_split(X, y, test_size = 0.25, random_state = 0, shuffle=False) 7 8param_dict = { 9 "C": [0.1 * x for x in range(1, 1001)], 10 "gamma": [0.01 * x for x in range(1, 10)] 11} 12 13scalar = MinMaxScaler().fit(train_X) 14train_X_scaled = scalar.transform(train_X) 15test_X_scaled = scalar.transform(test_X) 16 17grid_search = GridSearchCV(SVC(), param_dict, cv=10, return_train_score=False, scoring="roc_auc") 18grid_search.fit(train_X_scaled, train_y) 19 20best_parameters = grid_search.best_params_ 21svc = SVC(**best_parameters, random_state=0, probability=True) 22 23svc.fit(train_X_scaled, train_y) 24pred = svc.predict(test_X_scaled) 25 26print('Test set AUC with best parameters: {}'.format(roc_auc_score(pred, test_y)))
上コード内の
python
1scalar = MinMaxScaler().fit(train_X) 2train_X_scaled = scalar.transform(train_X) 3test_X_scaled = scalar.transform(test_X)
の部分でtrain_X
を利用してtrain_X
とtest_X
を正規化しています。
しかし、自分で調べたとことろ、test_X_scaled = scalar.transform(test_X)
を書かずに、
python
1svc.fit(train_X_scaled, train_y) 2pred = svc.predict(test_X_scaled)
の部分を
python
1svc.fit(train_X_scaled, train_y) 2svc.predict(test_X)
としている文献があったり、
別の疑問として、
train_X
をまるごと正規化して交差検証の対象にしている
=交差検証において、「学習データ(train_X_scaled
の9/10)」が本来学習に使うべきでない「テストデータ(train_X_scaled
の1/10)」も含めたデータ全体(train_X_scaled
)で正規化されている
=交差検証で過学習が起こっているのではないか?
という考えが生じ、頭がこんがらがっています。
詳しい方がいましたら、SVMでグリッドサーチを使用する際の、適切な正規化の方法をご教授頂きたいです。
よろしくお願いいたします。
追記
頂いた回答を参考に修正してみました。このコードで適切に書けているでしょうか?
python
1//(一部省略) 2 3X = df_all 4y = df["label"] 5 6(train_X , test_X , train_y , test_y) = train_test_split(X, y, test_size = 0.25, random_state = 0, shuffle=False) 7 8# パイプライン 9pipe = Pipeline([ 10 ('scale', MinMaxScaler()), 11 ('clf', SVC()) 12 ]) 13 14param_dict = { 15 "clf__C": [0.1 * x for x in range(1, 1001)], 16 "clf__gamma": [0.01 * x for x in range(1, 10)] 17} 18 19grid_search = GridSearchCV(pipe, param_dict, cv=10, return_train_score=False, scoring="roc_auc") 20grid_search.fit(train_X, train_y) 21 22best_parameters = {} 23best_parameters['C'] = grid_search.best_params_['clf__C'] 24best_parameters['gamma'] = grid_search.best_params_['clf__gamma'] 25svc = SVC(**best_parameters, random_state=0, probability=True) 26 27scalar = MinMaxScaler().fit(train_X) 28trainVal_X_scaled = scalar.transform(train_X) 29test_X_scaled = scalar.transform(test_X) 30svc.fit(train_X_scaled, train_y) 31pred = svc.predict(test_X_scaled) 32 33print('Test set AUC with best parameters: {}'.format(roc_auc_score(pred, test_y)))
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。