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

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

ただいまの
回答率

90.34%

  • Python

    9149questions

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

  • Python 3.x

    7354questions

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

  • 機械学習

    760questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 454

lilium_09

score 1

 前提・実現したいこと

機械学習初心者です。
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)

 該当のソースコード

#グリッドサーチ
X_train, X_test, y_train, y_test = train_test_split(Images,Labels, test_size=0.2, random_state=0)
tuned_parameters = [
    {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
    {'C': [1, 10, 100, 1000], 'kernel': ['rbf'], 'gamma': [10,1,0.01,0.1,0.001,0.0001]},
    {'C': [1, 10, 100, 1000], 'kernel': ['poly'], 'degree': [2, 3, 4], 'gamma': [10,1,0.1,0.01,0.001, 0.0001]},
    {'C': [1, 10, 100, 1000], 'kernel': ['sigmoid'], 'gamma': [10,1,0.1,0.01,0.001,0.0001]}
    ]
clf = GridSearchCV(
    SVC(), # 識別器
    tuned_parameters, # 最適化したいパラメータセット 
    cv=StratifiedKFold(), # 交差検定の回数
    scoring = 'f1'
    )# モデルの評価関数の指定
clf.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の実行結果も載せさせていただきます。

     mean_fit_time  mean_score_time  mean_test_score  mean_train_score  \
0         0.000667         0.000334         0.549208          0.494650   
1         0.000000         0.000667         0.618010          0.635955   
2         0.000334         0.000334         0.606922          0.640143   
3         0.000667         0.000334         0.606922          0.640143   
4         0.000667         0.000334         0.648052          0.647610   
5         0.000334         0.000334         0.635159          0.638346   
6         0.000667         0.000334         0.000000          0.000000   
7         0.000000         0.001001         0.000000          0.000000   
8         0.000000         0.001001         0.000000          0.000000   
9         0.000667         0.000667         0.000000          0.000000   
(中略)   
 param_C param_degree param_gamma param_kernel  \
0         1          NaN         NaN       linear   
1        10          NaN         NaN       linear   
2       100          NaN         NaN       linear   
3      1000          NaN         NaN       linear   
4         1          NaN          10          rbf   
5         1          NaN           1          rbf   
6         1          NaN        0.01          rbf   
7         1          NaN         0.1          rbf   
8         1          NaN       0.001          rbf   
9         1          NaN      0.0001          rbf   
(中略)
                                                params  rank_test_score  \
0                         {'C': 1, 'kernel': 'linear'}               25   
1                        {'C': 10, 'kernel': 'linear'}               11   
2                       {'C': 100, 'kernel': 'linear'}               19   
3                      {'C': 1000, 'kernel': 'linear'}               19   
4               {'C': 1, 'gamma': 10, 'kernel': 'rbf'}                2   
5                {'C': 1, 'gamma': 1, 'kernel': 'rbf'}                7   
6             {'C': 1, 'gamma': 0.01, 'kernel': 'rbf'}               47   
7              {'C': 1, 'gamma': 0.1, 'kernel': 'rbf'}               47   
8            {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}               47   
9           {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'}               47   

(中略)
     split0_test_score  split0_train_score  split1_test_score  \
0             0.545455            0.500000           0.473684   
1             0.590909            0.623656           0.571429   
2             0.558140            0.637363           0.571429   
3             0.558140            0.637363           0.571429   
4             0.590909            0.623656           0.590909   
5             0.666667            0.631579           0.571429   
6             0.000000            0.000000           0.000000   
7             0.000000            0.000000           0.000000   
8             0.000000            0.000000           0.000000   
9             0.000000            0.000000           0.000000   
(中略)
     split1_train_score  split2_test_score  split2_train_score  std_fit_time  \
0              0.617284           0.628571            0.366667  4.717075e-04   
1              0.631579           0.692308            0.652632  0.000000e+00   
2              0.630435           0.692308            0.652632  4.718199e-04   
3              0.630435           0.692308            0.652632  4.717075e-04   
4              0.639175           0.763636            0.680000  4.717637e-04   
5              0.638298           0.666667            0.645161  4.718199e-04   
6              0.000000           0.000000            0.000000  4.718199e-04   
7              0.000000           0.000000            0.000000  0.000000e+00   
8              0.000000           0.000000            0.000000  0.000000e+00   
9              0.000000           0.000000            0.000000  4.717075e-04   
(中略)
     std_score_time  std_test_score  std_train_score  
0      4.718199e-04        0.063051         0.102384  
1      4.718200e-04        0.052845         0.012227  
2      4.717075e-04        0.060282         0.009273  
3      4.717075e-04        0.060282         0.009273  
4      4.718199e-04        0.081270         0.023763  
5      4.718199e-04        0.044811         0.005545  
6      4.718199e-04        0.000000         0.000000  
7      1.123916e-07        0.000000         0.000000  
8      2.247832e-07        0.000000         0.000000  
9      4.716513e-04        0.000000         0.000000  


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

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

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

追記1

   fit_time  score_time  test_f1  test_precision  test_recall  train_f1  \
0  0.001001    0.002001      0.0             0.0          0.0       0.0   
1  0.001001    0.002001      0.0             0.0          0.0       0.0   
2  0.000000    0.002002      0.0             0.0          0.0       0.0   

   train_precision  train_recall  
0              0.0           0.0  
1              0.0           0.0  
2              0.0           0.0  

追記2

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

追記3

   fit_time  score_time  test_accuracy  test_f1_macro  train_accuracy  \
0    0.0005    0.001501       0.533333       0.347826        0.522727   
1    0.0005    0.001001       0.522727       0.343284        0.528090   
2    0.0005    0.000500       0.522727       0.343284        0.528090   

   train_f1_macro  
0        0.343284  
1        0.345588  
2        0.345588  



Z:\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.
  'precision', 'predicted', average, warn_for)
Z:\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.
  'precision', 'predicted', average, warn_for)
Z:\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.
  'precision', 'predicted', average, warn_for)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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)


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


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

import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import cross_validate

X_train, X_test, y_train, y_test = train_test_split(Images,Labels, test_size=0.2, random_state=0)

svm = SVC()
svm.set_params(**{'C': 1, 'gamma': 0.01, 'kernel': 'rbf'} )
scores = cross_validate(svm, X_train, y_train, scoring=["precision", "recall", "f1"])
print(pd.DataFrame(scores))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/13 12:23

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

    お手数をおかけして大変申し訳ないのですが、これらについて教えて頂けないでしょうか。

    キャンセル

  • 2018/07/13 12:57

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

    キャンセル

  • 2018/07/13 14:20

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

    たびたび申し訳ないのですが、ご教授頂けないでしょうか。

    キャンセル

  • 2018/07/13 15:21

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

    いろいろと教えていただきまして、誠にありがとうございました。

    キャンセル

  • 2018/07/13 15:26 編集

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

    キャンセル

  • 2018/07/14 01:11

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

    キャンセル

  • 2018/07/14 04: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))

    キャンセル

  • 2018/07/18 14:42

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9149questions

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

  • Python 3.x

    7354questions

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

  • 機械学習

    760questions

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