質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

2回答

1477閲覧

【scikit-learn】SVMでグリッドサーチを使用する際の正規化(Scalerの使い方)について

dal

総合スコア38

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

0クリップ

投稿2019/11/18 14:22

編集2019/11/18 17:11

悩んでいること

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_Xtest_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)))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

トレーニングデータをスケールしているのにテストデータをスケールしていないのはミスだと思われます。
トレーニングセットが十分に大きくて、そこから求められる平均、分散が母集団の平均、分散として認められそうなら、常にtrain_X_scaledを使っていいと思います。テストデータに対しても使っていいです。
scaleがなにしているかと、平均値が正しく求められてそうかを調べてみてください。

投稿2019/11/18 14:35

fukatani

総合スコア626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

scikit-learnで複数のモデルを多段に積み重ねる場合、原則的にはPipelineを使うようにしてください。それが混乱を防ぐ最良の方法です。

sklearn.pipeline.Pipeline — scikit-learn 0.21.3 documentation

投稿2019/11/18 14:33

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dal

2019/11/18 14:36

ご回答ありがとうございます。 >複数のモデルを多段に積み重ねる場合 これは交差検証のことを指しているのでしょうか? 私のコードでは10個のモデルを積み重ねていると言えますかね。
hayataka2049

2019/11/18 14:39 編集

>これは交差検証のことを指しているのでしょうか? いえ、たとえばMinMaxScalerでスケーリングしてからSVCで予測するといったケースのことを言っています。他にも、変数選択や次元削減を入れようとするときはだいたい当てはまります。
dal

2019/11/18 15:02 編集

Pipelineを使用して修正してみました。 追記の項目を確認していただけると幸いです。
hayataka2049

2019/11/18 15:07 編集

grid_search.fit(train_X, train_y) の行までは良いと思います。その後は間違っています。 グリッドサーチを行った後、改めてモデルを構成する必要はありません。得られたgrid_searchをそのまま使うか、grid_search.best_estimator_を取り出して使えば十分でしょう(refit=True(デフォルト設定)の場合)。 https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html なので、最短で書くなら grid_search.fit(train_X, train_y) pred = grid_search.predict(test_X) print('Test set AUC with best parameters: {}'.format(roc_auc_score(test_y, pred))) # 引数の順番間違ってたので直しました で終わりです。
dal

2019/11/18 16:42

ご丁寧な返信ありがとうございます。 Pipelineを使うことによって、 grid_search.fit(train_X, train_y) pred = grid_search.predict(test_X) とするだけでMinMaxScalerが適用されるということでですね。 この場合、交差検証で過学習が起こることもないのでしょうか?(最初の質問の疑問点でもあります)
hayataka2049

2019/11/19 03:08

交差検証における分割されたデータで訓練し、テストデータは変換のみが施されるよう自動で処理されますから、問題ないでしょう。
dal

2019/11/19 03:18

ありがとうございました!
hayataka2049

2019/11/19 03:20

Pipelineを使わない場合は確かに問題になります。パラメータチューニングにわずかに影響するだけなのでどうでも良いと割り切れるかどうかは微妙なところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問