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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

Q&A

解決済

1回答

1301閲覧

[Python/SVM]GridSearchCV実行時の警告UndefinedMetricWarningを消したい

lilium_09

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

0グッド

0クリップ

投稿2018/07/12 09:32

編集2018/07/13 05:05

前提・実現したいこと

機械学習初心者です。
SVMで画像分類を行うことを目標として、GridSearchCVでハイパラメータのチューニングを行っています。
GridSearchCVをfitさせるとbest_score_などの結果は得られるのですが、UndefinedMetricWarningが大量に出てしまいます。
この警告がなぜ出るのかという理由と、消す方法を教えていただけますでしょうか。

発生している問題・エラーメッセージ

FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True warnings.warn(*warn_args, **warn_kwargs)

該当のソースコード

Python

1#グリッドサーチ 2X_train, X_test, y_train, y_test = train_test_split(Images,Labels, test_size=0.2, random_state=0) 3tuned_parameters = [ 4 {'C': [1, 10, 100, 1000], 'kernel': ['linear']}, 5 {'C': [1, 10, 100, 1000], 'kernel': ['rbf'], 'gamma': [10,1,0.01,0.1,0.001,0.0001]}, 6 {'C': [1, 10, 100, 1000], 'kernel': ['poly'], 'degree': [2, 3, 4], 'gamma': [10,1,0.1,0.01,0.001, 0.0001]}, 7 {'C': [1, 10, 100, 1000], 'kernel': ['sigmoid'], 'gamma': [10,1,0.1,0.01,0.001,0.0001]} 8 ] 9clf = GridSearchCV( 10 SVC(), # 識別器 11 tuned_parameters, # 最適化したいパラメータセット 12 cv=StratifiedKFold(), # 交差検定の回数 13 scoring = 'f1' 14 )# モデルの評価関数の指定 15clf.fit(X_train,y_train)

###コード内変数の説明
train_test_splitに渡しているImagesは訓練画像で、85枚+84枚の計169枚のデータが入っています。
またLabelsには0と1のラベルが入っています。

試したこと

・GridSearchCVのcvを以前は数字でそのまま指定していたのですが、StratifiedKFold()に変えてみました。
・scoreingを'f1'から'recall'に変えてみると警告が消えました。
・scikit-learnのバージョンの問題で起こることがあるという情報がありましたので、アップグレードしました(現在0.19.1)
・サンプル数が少ないとこの警告が出ることがあるという情報がありましたので、変数Imagesを435+435の計870枚のデータに変えてみましたが、変化は見られませんでした。
・警告内容から予測結果がすべてネガティブだと、Precisionやrecallが0になることでF値が0/0になってしまうことが原因とのことでしたので、GridSearchCV内で行われる交差検定の結果についてconfusion_matrixができないかと考えたのですが、やり方がわかりませんでした。

###問題かと思われるところ
GridSearchCVのcv_results_を実行すると、 mean_test_scoreやmean_train_score,split0_train_scoreなどが0.000000になっているところがありました。
0.000000になっているところは何度実行しても値がそのままです。
cv_resultsの実行結果も載せさせていただきます。

Python

1 mean_fit_time mean_score_time mean_test_score mean_train_score \ 20 0.000667 0.000334 0.549208 0.494650 31 0.000000 0.000667 0.618010 0.635955 42 0.000334 0.000334 0.606922 0.640143 53 0.000667 0.000334 0.606922 0.640143 64 0.000667 0.000334 0.648052 0.647610 75 0.000334 0.000334 0.635159 0.638346 86 0.000667 0.000334 0.000000 0.000000 97 0.000000 0.001001 0.000000 0.000000 108 0.000000 0.001001 0.000000 0.000000 119 0.000667 0.000667 0.000000 0.000000 12(中略) 13 param_C param_degree param_gamma param_kernel \ 140 1 NaN NaN linear 151 10 NaN NaN linear 162 100 NaN NaN linear 173 1000 NaN NaN linear 184 1 NaN 10 rbf 195 1 NaN 1 rbf 206 1 NaN 0.01 rbf 217 1 NaN 0.1 rbf 228 1 NaN 0.001 rbf 239 1 NaN 0.0001 rbf 24(中略) 25 params rank_test_score \ 260 {'C': 1, 'kernel': 'linear'} 25 271 {'C': 10, 'kernel': 'linear'} 11 282 {'C': 100, 'kernel': 'linear'} 19 293 {'C': 1000, 'kernel': 'linear'} 19 304 {'C': 1, 'gamma': 10, 'kernel': 'rbf'} 2 315 {'C': 1, 'gamma': 1, 'kernel': 'rbf'} 7 326 {'C': 1, 'gamma': 0.01, 'kernel': 'rbf'} 47 337 {'C': 1, 'gamma': 0.1, 'kernel': 'rbf'} 47 348 {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'} 47 359 {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'} 47 36 37(中略) 38 split0_test_score split0_train_score split1_test_score \ 390 0.545455 0.500000 0.473684 401 0.590909 0.623656 0.571429 412 0.558140 0.637363 0.571429 423 0.558140 0.637363 0.571429 434 0.590909 0.623656 0.590909 445 0.666667 0.631579 0.571429 456 0.000000 0.000000 0.000000 467 0.000000 0.000000 0.000000 478 0.000000 0.000000 0.000000 489 0.000000 0.000000 0.000000 49(中略) 50 split1_train_score split2_test_score split2_train_score std_fit_time \ 510 0.617284 0.628571 0.366667 4.717075e-04 521 0.631579 0.692308 0.652632 0.000000e+00 532 0.630435 0.692308 0.652632 4.718199e-04 543 0.630435 0.692308 0.652632 4.717075e-04 554 0.639175 0.763636 0.680000 4.717637e-04 565 0.638298 0.666667 0.645161 4.718199e-04 576 0.000000 0.000000 0.000000 4.718199e-04 587 0.000000 0.000000 0.000000 0.000000e+00 598 0.000000 0.000000 0.000000 0.000000e+00 609 0.000000 0.000000 0.000000 4.717075e-04 61(中略) 62 std_score_time std_test_score std_train_score 630 4.718199e-04 0.063051 0.102384 641 4.718200e-04 0.052845 0.012227 652 4.717075e-04 0.060282 0.009273 663 4.717075e-04 0.060282 0.009273 674 4.718199e-04 0.081270 0.023763 685 4.718199e-04 0.044811 0.005545 696 4.718199e-04 0.000000 0.000000 707 1.123916e-07 0.000000 0.000000 718 2.247832e-07 0.000000 0.000000 729 4.716513e-04 0.000000 0.000000

なぜ0.000000になってしまうのかわからないです。
GridSearchCV内の引数がおかしいのでしょうか。それともデータの問題なのでしょうか。
何かお気づきの点などございましたら、ご教示頂けますと幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

開発環境
Windows10
WinPython-64bit-3.6.3(Python3.6)

###追記1

Python

1 2 fit_time score_time test_f1 test_precision test_recall train_f1 \ 30 0.001001 0.002001 0.0 0.0 0.0 0.0 41 0.001001 0.002001 0.0 0.0 0.0 0.0 52 0.000000 0.002002 0.0 0.0 0.0 0.0 6 7 train_precision train_recall 80 0.0 0.0 91 0.0 0.0 102 0.0 0.0

###追記2

Python

1UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples. 2 'precision', 'predicted', average, warn_for

###追記3

Python

1 fit_time score_time test_accuracy test_f1_macro train_accuracy \ 20 0.0005 0.001501 0.533333 0.347826 0.522727 31 0.0005 0.001001 0.522727 0.343284 0.528090 42 0.0005 0.000500 0.522727 0.343284 0.528090 5 6 train_f1_macro 70 0.343284 81 0.345588 92 0.345588 10 11 12 13Z:\Downloads\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\lib\site-packages\sklearn\metrics\classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 14 'precision', 'predicted', average, warn_for) 15Z:\Downloads\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\lib\site-packages\sklearn\metrics\classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 16 'precision', 'predicted', average, warn_for) 17Z:\Downloads\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\lib\site-packages\sklearn\metrics\classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 18 'precision', 'predicted', average, warn_for)

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、質問に書いてある警告は

python

1FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True 2 warnings.warn(*warn_args, **warn_kwargs)

になってますが、こっちはreturn_train_score=Trueないしreturn_train_score=Trueで消えます。


とりあえず、パット見で変なところは見つからなかったので、スコアが0になっちゃうパラメータをGridSearchCV使わずに交差検証にかけてみて、再現するかどうか確認しましょうか。こんな感じで(適当に足りない部分は補ってください)。

python

1import pandas as pd 2from sklearn.svm import SVC 3from sklearn.model_selection import cross_validate 4 5X_train, X_test, y_train, y_test = train_test_split(Images,Labels, test_size=0.2, random_state=0) 6 7svm = SVC() 8svm.set_params(**{'C': 1, 'gamma': 0.01, 'kernel': 'rbf'} ) 9scores = cross_validate(svm, X_train, y_train, scoring=["precision", "recall", "f1"]) 10print(pd.DataFrame(scores))

投稿2018/07/12 10:16

編集2018/07/12 10:18
hayataka2049

総合スコア30933

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

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

lilium_09

2018/07/13 03:23

ご回答いただきありがとうございます。 return_train_score=Trueとすることにより上記質問のFutureWarningは無事に消えました。 またご教授頂きましたコードを実行したところ、追記1のような結果になりました。 GridSearchCVのせいではないということは分かりましたが、なぜこのようになるのでしょうか。 また、当初の質問欄に記載するのを忘れてしまっていたのですが、UndefinedMetricWarningとして追記2のような警告も出てしまいます。 この警告についてはどのように対処すればよいのでしょうか。 お手数をおかけして大変申し訳ないのですが、これらについて教えて頂けないでしょうか。
hayataka2049

2018/07/13 03:57

ひとつ考えられるのは、binaryのf1だと計算式が2TP/(2TP+FP+FN)なので、TPが0になるとF1値は0になるということです。 accuracyと、f1_macro(これだとTNも加味される)にして見てみてください。
lilium_09

2018/07/13 05:20

早速のご回答ありがとうございます。 scoringをaccuracyとf1_macroにしたところ、結果は追記3のようになりました。 TNが加味されると0.00000にならないということは、負の分類は正しくされているということですよね。 TNが分類されているのにTPがされていないとは...謎です。 TPが0になっていたとしても、f1_macroで得られた結果の信頼性に問題はないのでしょうか。 またUndefinedMetricWarningについては放置していても大丈夫でしょうか。 たびたび申し訳ないのですが、ご教授頂けないでしょうか。
lilium_09

2018/07/13 06:21

先ほど訓練画像を435+435の計870枚で試したところ、質問時に出ていたUndefinedMetricWarningが消え、f1,precision,recallともに値が出ました。 Imagesの中身を見てみたところ、今まで試していたものは85枚+84枚の計169枚のものは要素が-0.050...-02など極めて小さくなっており、試した870枚は0.114...など比較的大きな値になっていました。 なぜ以前は870枚のほうもF値が0になっていたのかはわからないのですが、169枚のほうではまだUndefinedMetricWarningが出ていることを考えると、訓練画像の枚数が少なかったことが原因かと考えています。 いろいろと教えていただきまして、誠にありがとうございました。
hayataka2049

2018/07/13 06:29 編集

正解率5割なので、山勘だけどほぼぜんぶNegativeに分類する感じで学習してるのかな? 工夫してラベルを見てみればわかります(たしか自分でクロバリ書くのが一番手っ取り早かった記憶がある。StratifiedKFold.splitあたり使えばできますね) Cとgammaが低い傾向でそうなるということで、モデルの表現力が低すぎてfitしていない結果なのではないでしょうか データの中身については助言できないので、良し悪しとかはそちらで究明してください
lilium_09

2018/07/13 16:11

コメントありがとうございます。 ラベルを見るというのは、交差検定で判定された結果(ラベル)を見るということでしょうか。 すみません、飲み込みが悪くて… ともかくモデルに問題があるようなので、データの整形処理についても見直してみたいと思います。 ご助言いただいたおかげで、先日は全くわからなかった問題の根本が見えてきました。 本当にありがとうございます。
hayataka2049

2018/07/13 19:47

>ラベルを見るというのは、交差検定で判定された結果(ラベル)を見るということでしょうか。 そのとおりです。適当に書いてみました。 trues = [] preds = [] for train_idx, test_idx in StratifiedKFold().split(X_train, y_train): # 以下インデント svm.fit(X_train[train_idx], y_train[train_idx]) pred = svm.predict(X_train[test_idx]) trues.append(y_train[test_idx]) preds.append(pred) # インデントここまで print(np.hstack(trues)) print(np.hstack(preds))
lilium_09

2018/07/18 05:42

返信が遅くなり申し訳ありません。 ご提案頂きましたサンプルを実行したところ、0が多く分類されていました。 そこで訓練画像を倍に増やして正規化を標準化に変えてグリッドサーチしたところ、UndefinedMetricWarningが消え、正解率が最高で94%ほどになりました。 やはり画像が少なかったことが原因のようです。 様々なご助言をいただきまして誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問