"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

ディープラーニングのモデルの分類性能評価指標についてざっくり整理してみる/Neural Network Console

モデルの分類性能の評価指標をの見方を、整理してみようかなと思います。

題材には、「Neural Network Console」を使います。

f:id:arakan_no_boku:20190707151819j:plain

今回の目的

 

機械学習で学習して推論を行った時に「十分な精度で学習できているかどうか」を判定する指標には、色々な種類があります。

どんなものがあるのかは、こちらの網羅的にまとめてもらっているサイトでも見てもらうとして(笑)

www.procrasist.com

今回は、SONYの「Neural Network Console」の結果画面で使われている基本的な分類性能評価指標について、ざっくり整理してみます。

 

Neural Network Consoleの結果画面

 

SONYの「Neural Network Console」で評価結果を確認できる「Confusion Matrix」はこんな感じです。

f:id:arakan_no_boku:20190707152840p:plain

こういう風に分類結果をまとめた表のことを、混同行列(Confusion Matrix)というらしいです。

ここにでてくる指標は以下の4つです。

  • Accuracy
  • Precision
  • ReCall
  • F-Measure

これらが、今回のお題というわけです。

 

指標について整理する前提知識がありました

 

4つの指標の整理をするのに、前提となる知識があります。

  • 調和平均
  • TP・FP・FN・TN

です。

この言葉を使わないと説明が書きづらいので、上記を先に整理します。

 

調和平均

 

調和平均も「平均」です。

でも、自分らが普通に使っている平均(算術平均)とは違います。

算術平均は値そのものの合計値を個数等で割って求めますが、調和平均は2つの値の比で表す数値の平均をとって求めます。

toukeigaku-jouhou.info

上記のサイトから引用すると。f:id:arakan_no_boku:20191212184806p:plain

調べてみると。

時速の計算に使われる平均の求め方なので、意外とお馴染みだったりします。

これは、F-Measureという指標で使われます。

 

TP・FP・FN・TN

 

それぞれ以下の略です。

  • TP=True Positive
  • FP= False Positive
  • FN= False Negative
  • TP= True Negative

これはつまり。

  • Positive=これが正解だと予測した
  • Negative=これは不正解だと予測した

だと考えれば、

  • TP=Positiveだと予測して正解した
  • FP=Positiveだと予測したけど間違った
  • FN=Negativeだと予測したけど間違った
  • TN=Negativeだと予測して正解だった

 という状態を表します。

当然ですが。

分類の結果は必ず、この4つの状態のどれかとなります。

なので、例えば。

TP+FP+FN+TNは「評価対象全体の個数」になります。

TP+FNは、

  • Positiveと判断して正解だった数(TP)
  • Negativeと判断して間違った数(TF)

の合計なので、結局「Positiveと判断されるべきすべての数」になります。

TP+FPは、

  • Positiveと判断して正解だった数(TP)
  • 間違った数(FP)

の合計なので、「分類でPositiveと判断された全体の数」になります。

これらが、各指標の計算に使われます。

 

各指標の意味について

 

以下の4つの指標について、ざっくりとみていきます。

  • Accuracy
  • Precision
  • ReCall
  • F-Measure

 

Accuracy

 

日本語で言うと正答率です。

計算式は

(TP+TN)/(TP+FP+FN+TN)

です。

TP+TNは「正解した数全体」なので、「全体の中の正解だったものの比率」です。

とても、わかりやすいです。

自分もそうですが、Pythonとかで自分で評価指標を計算しないといけない時とかは、これだけ計算する時も多いですし、ネットとかのサンプルとかでも、そうなっているものがあるくらい、代表的な指標です。

 

Precision

 

日本語では「適合率」です。

Positiveに対する適合率と、Negativeに対する適合率の2種類が定義可能で、それぞれの計算式は以下になります。

TP /(TP+FP)

または

TN  /  (TN+FN)

前者は「Positiveと判断した中での正解率」です。

後者は「Negativeと判断した中での正解率」です。

でも、Neural Network ConsoleのConfusion Matrixでは「Positive=正解と同じラベルだと判断して正解した数」に対する「適合率」のみが計算されてます。

実際の例で検算してみると

f:id:arakan_no_boku:20190708002954p:plain

Y' つまり、分類の予測結果の縦列で計算しているのがわかります。

Y'=0の例でいけば。

正解(y)が0の時に0と予測して正解した数(TP)と、正解(y)が1の時に[0」と予測(つまりNegativeと判断)して正解した数(TN)が縦に並んでいると読めるので、以下で計算できます。

235 / (235 + 8)  = 0.9670781893004

 

ReCall 

 

日本語だと再現率です。

これもPositive・Negativeごとの計算ができますが、Neural Network ConsoleのConfusion Matrixでは、Positive分だけなので、そちらの計算式のみ。

TP / (TP + FN)

 Positiveと判定して正解したものと、Negativeと判断して間違ったものの中での、正解したものの比率です。

こちらの、今回のサンプルでみてみると。

f:id:arakan_no_boku:20190708094321p:plain

y’は判定結果です。

上段を例にすると、y=0が正解の場合に、y'=0と判断(つまりPositiveと判断)して正解だった数(TP=235)、Y'=1と判断(つまりNegativeと判断)して不正解だった数(FN=15)ですから。</p

235 / (235 + 15)  = 0.94

 となります。

 

F-Measure

 

日本語で言えば「F値」です。

といっても・・何のことやら・・ですが。

F値は「Precision」と「Recall」の平均(調和平均)です。

計算式は以下です。

2 /  ((1 / Precision) + ( 1 / Recall))

今回の例にあてはめて検算してみます。

f:id:arakan_no_boku:20190708101320p:plain

Neural Network ConsoleのConfusion Matrixでは、1列目と1行目、2列目と2行目・・みたいに対応づけして計算しているようです。

前者は。

 2 / (( 1 / 0.9670) + ( 1/ 0.94)) = 0.9533088621

後者が

2 / (( 1 / 0.9416) + ( 1/ 0.968)) = 0.9546175115

とですから、その理解であってるみたいですね。

 

何で、こんな指標が必要なんだろうか?

 

これらの、各指標を見ても、数学的な意味合いはわかったけど、それを見てどうのこうのというがピンとこない・・。

たぶん。

結構な割合の人がそう思っていると思うので、「結果を判断する」例をやってみます。

例えば・・。

工場で「正常(出荷OK)」と欠陥(出荷NG)」を判定するものとします。

そのためにモデルを作って学習させました。

そして、実際の製品のデータを使って、モデルが適切にできていることをテストしてみたというケースの場合。

各指標は以下のような意味を持ちます。

Accuracy 正常か欠陥のいずれかを、どのくらい正しく判定できたか 
Precision(正常) 正常と判定したものが、どのくらい正確なのか?
Precision(欠陥) 欠陥と判定したものが、どのくらい正確なのか?
Recall(正常) 正常と判定すべきものを、どのくらい見逃さずに拾えているか?
Recall(欠陥) 欠陥と判定すべきものを、どのくらい見逃さずに拾えているか?

わかりやすいのは「Accuracy」です。

これが例えば99.9%です・・とか言われると、かなり良い精度だからOKじゃないかといいたくなります。

でも。

この例では、それだけでは不十分です。

なぜかというと。

上記の表の「Accuracy」以外をを以下のようにまとめてみると

  • 正常または欠陥と判定したものが、どのくらい正確なのか?(Precision)
  • 正常または欠陥と判定すべきものを、どのくらい見逃さずに拾えたか?(ReCall)

なので、ReCallがとても重要なことに気づきます。

なぜかというと。

出荷判定の場合「欠陥と判定すべきものを見逃した」が一番企業にとってダメージがきついからです。

 

 

そう考えると。

他の指標が全部合格基準であっても、それだけではダメです。

出荷判定での「欠陥品の見落とし」を回避するために「欠陥のRecallの値」が基準に達していない限り、全体を不合格とみなすべきだ・・と報告できる・・、てな感じです。

それで。

まだ改善の余地があるな・・となった場合の対策ですが。

欠陥のRecallの値が低い=「欠陥と判定する確度のしきい値を高いものだけを拾う方向に寄せすぎている」ということです。

対策としては「欠陥と判定する確度のしきい値を下げて、見落としを少なくする」方向にモデルをチューニングするという感じですかね。

でも、そうすると。

今度は「今まで欠陥と判定されなかったものが欠陥と判定される」ようになります。

だから、欠陥に対する正確度を示すPrecisionの値が下がる可能性があります。

つまり

  • その辺の折り合いをどうつけるのか?
  • 合格基準をどのあたりに設定するのがベストなのか?

という検討が必要になります。

その時に参考にするのが。

2つの指標の平均(調和平均)である「F-Measure(F値)」・・てな感じですかね。

いや・・大変です。

けれど、こんな感じで。

評価指標の見方を知って、その数字を現実のイメージに置き換えられるようになるのが、現場で機械学習を使う第一歩なんだな・・ということなのでしょうねえ。

なお。

上記で使った指標のうち、欠陥(Negative)のPrecisionとRecallの値は、Neural Network ConsoleのConfusion Matrixにはありません。

現状、手計算してやる必要がありますので、念のため。

以上、分類性能評価で基本的な指標を、SONYの「Neural Network Console」の「Confusion Matrix」を参考にして整理してみました。

今回はこんなところで。

ではでは。

※この記事は2019年7月9日の記事の一部を補正したリライトです。