f1 score とは

Posted by siguniang January 10, 2016 January 10, 2016 Posted in algorithm, nlp Tags: f1 score, information retrieval, precision, recall あるモデルによって情報を分類した時に、どのくらいうまく分類しているのか評価するためのメトリクスについてメモ。 この MATLAB 関数 は、prediction 内の予測セグメンテーションと groundTruth 内のトゥルース セグメンテーションとの間の BF (Boundary F1) 輪郭マッチング スコアを計算します。 F1 Score is needed when you want to seek a balance between Precision and Recall. 設定出典:『Wikipedia』 (2011/07/18 09:16 UTC 版)ピン留めアイコンをクリックすると単語とその意味を画面の右側に残しておくことができます。 KerasでF1スコアをモデルのmetrics(評価関数)に入れて訓練させてたら、えらい低い値が出てきました。「なんかおかしいな」と思ってよく検証してみたら、とんでもない穴があったので書いておきます。環境:Keras v2.2.4Precision-recallのトレードオフの最適解を求めるための尺度。特に精度が意味をなさなくなる歪んだデータに対して有効。F1スコアについて知っている方は飛ばしていいです。2クラス分類を考えるとしましょう。設定は猫と犬の分類、メールがスパムかスパムではないか、なんでもいいです。2クラス分類なので、「y=0、y=1の2種類のラベル」があります。ここで歪んだデータとは、例えば「不均衡データ」と呼ぶほうが一般的かもしれません。もし、y=0が9900個、y=1が100個の場合、「精度もF1スコアもある式により求めた尺度にすぎないので、より直接的にモデルの良し悪しを図るには混同行列を見るのが一番良いです。これはSklearnを使うと簡単にできます。y_trueには正しいラベルを、y_predには予測されたラベルを代入します。混同行列をprintで表示すると、このように出てきます。詳しくは一般的な混同行列とちょっと違う(普通は一番上がTPになる)のですが、sklearnのconfusion_matrixではこのようになります。y_true, y_predの順で与えている点、そして多クラスへの拡張を考えるとこのような形になってしまうのは仕方がないでしょう。この混合行列をもとに、いくつか評価尺度の定義があります。参考:尺度の定義なのでそういうものだと思ってください。F1値の式の意味はこれらのPrecision, Recall, F1スコアは全てSklearnで計算することができます。このような混合行列の例を想定します。まずはデータを作ります。予測値(data_pred)と真の値(data_true)を擬似的に作ります。Kerasで使うことを想定してランク2のテンソルにしています。各値を計算してみましょう。手動で検算すると、Precisionが150÷(150+30)=0.833…となるので良いですね。残りの値も同様です。このままSklearnの関数を使って、混同行列を表示してみましょう。はじめの設定どおりになったのが確認できたでしょうか。混同行列だけに「どこがどの値だっけ?」と混同しやすくなるので、簡単な例を作って確認するとわかりやすいですね。ここからが本題。KerasでのF1スコアはmetricsとして独自に定義すればエポック中に計算することができます。sumとかroundとか入っていますが、シグモイド関数の出力に足して0.5未満ならラベル0、0.5以上ならラベル1と推定するためのちょっとかっこいい書き方です。大事なのは、先程の例で確認してみましょう。SklearnのF1スコアとKeras用に定義したF1スコアの値が等しくなるか見てみます。F1スコアの説明を飛ばした方は、最後の「Scikit-learnで確認してみる」のコードを見てください。PrecisionとRecallの値を表示するコードは、このまま使うとKerasのモデルのコンパイルでコケるのでコメントアウトしています。今確認用にコメントアウトを外してみます。変数周りがごちゃごちゃしていますが、Kerasでの内部の計算を再現するためにTensorFlowのテンソルに置き換えているだけです。上から、Precision、Recall、F1の値が表示されます。このようにSklearnで計算した場合と同じなので、ただ、このMNIST+多層パーセプトロンで検証してみました。MNIST自体は歪みの少ない綺麗なデータですが、0のサンプルだけ訓練600、テスト100と極端に減らし、歪んだデータを再現しています。その上で「0かそうでないかを分類する」問題です。検証用コードはmetricsにF1スコアを入れながら訓練させ、最後にmodel.predictで本来のF1スコアを計算させます。出力の最後のほうを取ってみました。ログに出てくるF1スコアが0.516でも、データ全体で計算すると(これはmodel.predictからf1関数に代入して計算しました)F1スコアが0.998もあるのです。F1スコアの解説で見たように、F1スコアというのは調和平均です。なので、ちなみに先程の例で、validationをフルバッチ(バッチサイズ=テストデータ数)とするとほぼ正しい値になります。1.3%ぐらいズレはあるものの、ValidationのほうのF1スコアのほうはだいぶマシな値になっていますね。ミニバッチのままのTrainのほうは全然違う値が出てきます。つまり、metricsにF1スコアをいれると全然違う値が出てくる→KerasでF1スコアは使えないというわけではなくて、ちゃんとデータ全体を一括で計算してくれるようにすればいいのです。一つの例ですが、コールバックを使ってon_epoch_endでF1スコアを計算させます。こうすればバッチ間の平均計算の影響を受けません。いちいちF1スコアの関数定義するの面倒なので、Sklearnの関数使うのがいいと思います。もし必要なら、F1スコアを計算したあと、モデルのチェックポイント(係数の保存)を定義します。全体のコードはこちらにあります。コールバックを使う場合はfitでもfit_generatorでもどちらでもOK(なはず)です。出力は以下のようになります。ちゃんとした値が出てくるのは当たり前ということで。データをGenerator経由でファイルから読ませる場合、正しいラベルを取得するのが大変かもしれません。この場合、コールバック側でGeneratorからのバッチを再転送するようなジェネレーター関数を作り、predict_generatorに食わせつつ、正しいラベルをキャッシュしていくといいかもしれませんね。ちなみにどうしてもmetricsで使いたい場合、バッチサイズを極端に大きくすると多少マシになると思います。なぜなら大数の法則が働いて、バッチ間のF1スコアがデータ全体のF1スコアに収束していくからです。追記:もう少し賢い方法ありました。TP,FP,FN,TNをmetricsで計算させて、Callback側ではそれらの値をlogから取得し、F1スコアを計算する方法です。これなら大規模なデータでもいけそうですね。KerasでF1スコアを評価関数にしたいときは、metricsではなくCallbackに入れよう。metricsにダイレクトにF1スコアを入れるとバッチ間の平均計算の影響で、間違った値が出てきて死ぬぞ。 F1値の式の意味はPrecisionとRecallの調和平均で、「この尺度を使うと歪んだデータにも対応できるんだな」ぐらいに思っておけばOKです。ただこのF1スコアの平均が、足して母数で割る一般的な算術平均ではないということは忘れないでください。

Right…so what is the difference between F1 Score and Accuracy then? F1 score F1値(F1-measure): f1_score() F1値(F1-measure)は適合率と再現率の調和平均。 単純にF値(F-measure, F-score)と呼ばれることもある。 F1_Scoreは分類モデルの評価指標の一つで、precisionとrecall両方とも考慮して、調和平均でスコアを計算します。ある程度precisionとrecallのバランスを表しています。スコアの範囲は最悪0~最善1まで。F1_Scoreの公式は下記の通り: In statistics, the F 1 score (also F-score or F-measure) is a measure of a test 's accuracy. ©2020 Weblio F値 (F尺度, F-measure) : 再現率 と 適合率 の 調和平均 . ブレイクイブンポイント (breakeven point) : 精度を上昇させると共に, 再現率 を下降させる,またその逆も可能なパラーメータを調整して, 再現率 と精度が同じになるとき,そのときの 再現率 (=精度)

.

塩 麹 ハンバーグ オーブン, PS Vita 新型 噂, 霧島 ヒロアカ 声優, クロエ オードパルファム 香り, ベノム 歌詞 コピー, ハイキュー 漫画 41巻, メンタル 強さ 種類,