連載
» 2020年10月27日 05時00分 公開

TensorFlow 2+Keras(tf.keras)入門:第10回 機械学習の評価関数(二値分類用)の基礎を押さえよう

二値分類問題で使える基礎的な評価関数をまとめ、使い分け指針を示す。具体的には正解率、適合率、再現率/感度、特異度、F値/F1スコア、重み付きF値/Fβスコアを説明する。

[一色政彦,デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「TensorFlow 2+Keras(tf.keras)入門」のインデックス

連載目次

 前々回は分類問題の解き方を解説した。その性能評価時における精度指標Metrics)として正解率(Accuracy)を用いた。これは、最も基礎的で一般的な評価関数Evaluation function)である。実践では、より多様な評価関数を使い分けることになるだろう。

 そこで今回は、二値分類問題で使える基本的な評価関数をまとめる(前回は回帰問題の評価指標をまとめており、今回と次回はその続編である)。具体的には下記の6個の評価関数を説明する。

 今回は二値分類用[基礎編]を説明するが、今回を踏まえて次回は、二値分類用[応用編]や多クラス分類用の評価関数について説明する予定だ。

 では、早速1つずつ説明していこう。今回はこれまでの連載の中でも比較的難しめであるので、理解できない部分があれば時間をかけて何度も読むなどして頑張ってほしい。

二値分類用[基礎編](Binary classification)

混同行列(Confusion Matrix)について

 二値分類の評価関数を理解するには、まずは混同行列Confusion Matrix)を知っておく必要があるので、最初に説明させてほしい。簡単そうで間違いやすいところなので、冗長になるが例を使って丁寧に説明する。

 二値分類の問題に対する学習済みモデルの予測結果を評価して、正解率(何%正解か)を算出することを考えてみよう。二値分類の一方の値が例えば「YES(1.0)」で、もう一方が「NO(0.0)」であるとする(例えばタイタニック号乗客者の生存状況で生存がYES、死亡がNOなど)。予測値がYESのとき、正解値がYESなら正解True)であり、正解値がNOなら不正解False)である。また、予測値がNOのとき、正解値がNOなら正解True)であり、正解値がYESなら不正解False)である。二値分類ではこのように「二値分類の予測」×「正解と不正解」で4種類の組み合わせが考えられる。

 この4種類は性能を正確に評価するために明確に区別したい、というニーズがある。これに対応する定義が混同行列である。

  • 予測値がYESで正解値がYESであれば、予測がYES(Positive:陽性)で正解(True:真)なので、これをTrue PositiveTP真陽性)と呼ぶ
  • 予測値がNOで正解値がNOであれば、予測がNO(Negative:陰性)で正解(True:真)なので、これをTrue NegativeTN真陰性)と呼ぶ

 このように正解(True)時の予測値パターン(Positive/Negative)が2種類あるわけだ。同様に、不正解(False)時の予測値パターン(Positive/Negative)も2種類ある。

  • 予測値がYESで正解値がNOであれば、予測がYES(Positive:陽性)で不正解(False:偽)なので、これをFalse PositiveFP偽陽性)と呼ぶ
  • 予測値がNOで正解値がYESであれば、予測がNO(Negative:陰性)で不正解(False:偽)なので、これをFalse NegativeFN偽陰性)と呼ぶ

 もちろん二値分類はYES/NOだけではない。例えば犬/猫の二値分類なども考えられる。この場合、例えば犬が「YES(1.0)」、猫が「NO(0.0)」のように考えて混同行列を作ればよい。実際に「二値分類の予測」×「正解と不正解」で4種類の組み合わせを書き出すと下記の箇条書きのようになる(ただしここでは、YESの予測は「陽性予測」、NOの予測は「陰性予測」と表現した。詳細後述)。

  • 犬と予測して正解が犬ならTP(真陽性=正解&陽性予測)で
  • 猫と予測して正解が猫ならTN(真陰性=正解&陰性予測)であり
  • 犬と予測して正解が猫ならFP(偽陽性=不正解&陽性予測)で
  • 猫と予測して正解が犬ならFN(偽陰性=不正解&陰性予測)である

 なお、先ほどまでは「YES/NO」と表現したが、一般的に「陽性(Positive)/陰性(Negative)」と表現するものと同じで、基本的に陽性(Positive)は「状態あり」、陰性(Negative)は「状態なし」を意味する。例えば病気への感染状態の有無(YES/NO)は「陽性/陰性」で表現することが一般的である。

 機械学習では、「陽性/陰性」ではなく、「正例(=正に分類される事例)/負例(=負に分類される事例)」と表現されることが多いので、「正例/負例」という呼び方は必ず知っておいてほしい。また「Positive/Negative」の文字通りに「肯定的/否定的」と表現されることもある。

 本稿では「陽性/陰性」という呼び方を採用することにした(その理由は、「正例」と「正解」という漢字の見た目が紛らわしいので、パッと見の分かりやすさを優先したためである)。

 以上の混同行列の定義を表にまとめたのが図1である。なお、日本語よりも英語の方が直感的に分かりやすいので、英語表記とした。以下の説明ではTP/TN/FP/FNという略語を用いることとする。

図1 混同行列の定義 図1 混同行列の定義

 この図は非常に有名で、後述の説明のベースともなっているので確実に理解し覚えてほしい。混同行列は、特にこの4種のデータが不均衡imbalanced data)な場合に役立つ。

 TensorFlow/Kerasで混同行列の値は、

で計算できる。

正解率(Binary Accuracy)

 説明するまでもないが、機械学習モデルによる予測における正解数をデータ数で割った値が正解率である。0.0(=0%)〜1.0(=100%)の範囲の値になり、1.0に近づくほどよりよい。

 正解率を混同行列(図2)で説明すると、上記の式の通り、正解率はTP+TN(陽性予測と陰性予測での正解を足した数)をTP+FP+TN+FN(4種類全部の数)で割った数である。あえて難しく説明している形になっているが、これは後述の適合率や再現率との違いを視認しやすくするためである。

図2 混同行列による正解率の説明 図2 混同行列による正解率の説明

 正解率は、最も典型的で基礎的な評価関数であり、一般人向けにも分かりやすいのでよく用いられる。実際に本連載の第8回でも使用した。二値分類だけでなく、次回解説する多クラス分類でも用いられる。

 ただし正解率の使用には注意が必要である。というのも、確かに正解の二値が均等に分けられている場合は問題がない。しかし正解の二値が不均衡である場合、例えば「猫」が正解のデータが99個あり「犬」が1個しかないという極端な状況の場合、常に「猫」と答えれば99%正解することになる。このような予測を行う学習済みモデルは、正解率は高いものの、価値がないといえる。「犬」を予測したい場合には全く使えないモデルである。この問題に対する(正解率ではなく)適合率や再現率(いずれも後述)は0%を示すので「おかしい」と気付きやすい。

 TensorFlow/Kerasでの正解率の計算には、

もしくは(compile()メソッドの引数metricsで)、

  • 'binary_accuracy'
  • 'accuracy'
  • 'acc'

という文字列を使えばよい。二値分類で'accuracy''acc'を使った場合、自動的にBinaryAccuracyクラスが選択される。

 ちなみに、1.0−正解率誤答率Error rate)と呼ばれる。

適合率(Precision)

 機械学習モデルによる予測で陽性(Positive、正例)だった予測全体のうち、正解だった割合が適合率Precision)である。つまり、機械学習モデルによる予測が陽性だった場合にどれくらい正解に「適合」できるか、ということだ。もちろん100%適合できるのが最良である。

 具体的には上記の式の通り、TP(=正解&陽性予測の数)をTP+FP(=正解&陽性予測+不正解&陽性予測の数)で割った数値である(図3)。よって、0.0(=0%)〜1.0(=100%)の範囲の値になり、1.0に近づくほどよりよい。

図3 混同行列による適合率の説明 図3 混同行列による適合率の説明

 適合率は、精度評価でFP(偽陽性=不正解&陽性予測)をできるだけ低くしたい一方で、FN(偽陰性=不正解&陰性予測)があまり重要ではなく無視してもよい場合に有用である。

 と言われても分からない人も多いと思うので、例を挙げて説明しておこう。例えばあなたが果物屋さんで「個々のお客さんに対し、りんごの購入が必要かどうか」という二値分類を予測する機械学習モデルを作成したとする。

 このケースでは、「購入が必要」という陽性予測は、より正確で(=FP:偽陽性ができるだけ低く)なければならないだろう。もし間違ってしまうと、リンゴを買ってもらう機会を損失してしまうからだ。

 一方で、「購入が不要」という陰性予測では、不正解であること(=FN:偽陰性)はそれほど重要ではない。なぜなら、実際にはリンゴの購入が不要である人に間違ってリンゴの購入をお勧めしてしまったとしても、いずれにしろ買ってはもらえず、結果的にはお店のメリットにはならないからだ。つまり果物屋さんにとっては、売れない予測についてはハズレようと実利面からは無視しても構わず、売れる予測の精度を強化する方がより重要ということである。

 このケースでは、正解率や再現率よりも適合率を採用する方が精度指標として優れていると考えられる。まとめると適合率は、陽性予測においては、できるだけ不正解「FP」は出したくない場合に使えばよい。

 TensorFlow/Kerasでの適合率の計算には、

を使えばよい。

再現率(Recall)/感度(Sensitivity)

 実際の「真の値(正解値)」が陽性(Positive、例:YES)のデータ全体のうち、機械学習モデルによる予測が正解だった割合が再現率Recall)もしくは感度Sensitivity)である。つまり、正解値が陽性である場合において機械学習モデルによる予測がどれくらいその正解を「再現」できるか、ということだ。当然、100%再現できるのが最良である。

 具体的には上記の式の通り、TP(=正解&陽性予測の数)をTP+FN(=正解&陽性予測+不正解&陰性予測の数)で割った数値である。よって0.0(=0%)〜1.0(=100%)の範囲の値になり、1.0に近づくほどよりよい。

 分母の意味が少し分かりづらいが、「陰性予測をして不正解」ということは、つまり「正解値は陽性(Positive、例:YES)」ということである。つまりこの分母TP+FNは、「実際の正解値が陽性のデータ全体」ということを意味する(図4)。

図4 混同行列による再現率の説明 図4 混同行列による再現率の説明

 再現率は、精度評価でFN(偽陰性=不正解&陰性予測、つまり正解は陽性)をできるだけ低くしたい一方で、FP(偽陽性=不正解&陽性予測、つまり正解は陰性)があまり重要ではなく無視してもよい場合に有用である。このように再現率は、適合率とは注目しているポイントが異なることに注意してほしい。

 これも何を言っているかが分かりづらいと思うので、例を挙げて説明しておこう。例えばあなたがお医者さんで「健康診断における個々の患者さんに対し、精密検査が必要かどうか」という二値分類を予測する機械学習モデルを作成したとする。

 このケースでは、「精密検査が不要」という陰性予測は、より正確で(=FN:偽陰性ができるだけ低く)なければならないだろう。もし間違ってしまうと、病気の発見を見逃してしまうことになるからだ。

 一方で、「精密検査が必要」という陽性予測では、不正解であること(=FP:偽陽性)はそれほど重要ではない。なぜなら、実際には病気ではない人に間違って「精密検査が必要」と診断してしまったとしても、その精密検査では問題が出ずに「健康」と診断されるからだ。つまりお医者さんにとっては、実際に健康な人(正解=陰性)への予測結果が外れようと安全面からは無視して構わず、実際に病気の人(正解=陽性)への予測の精度を強化する方がより重要ということである。

 このケースでは、正解率や適合率よりも再現率を採用する方が精度指標として優れていると考えられる。まとめると再現率は、実際の正解値が陽性のデータに対しては、その予測時にできるだけ不正解は出したくない場合(=陰性予測においては、できるだけ不正解「FN」は出したくない場合)に使えばよい。

 TensorFlow/Kerasでの再現率/感度の計算には、

を使えばよい。

 なお、適合率と再現率には重要な法則がある。通常、両者にはトレードオフの関係がある(図5)。例えば再現率を高くするために、より多くの予測値(範囲は0.01.0とする)が陽性(1.0)になるよう、分類判定のしきい値を中央の0.5から0.3に変更したとする。これにより確かに再現率は高まるが、適合率においては、分母である「陽性予測全体の数」が増えることになる。それと同等に分子であるである「陽性予測&正解の数」が増えない限り、つまり通常は適合率が小さくなるのである。逆に再現率を低くすると、適合率は高まる可能性が高い。このトレードオフ関係を利用して、再現率のしきい値(例えば0.3以上など)を指定してベストな適合率を計算するためのPrecisionAtRecallクラスが、TensorFlow/Kerasには用意されている。

図5 適合率と再現率のトレードオフ 図5 適合率と再現率のトレードオフ

特異度(Specificity)

 先ほどの感度(=再現率と同じもの)は、正解値が「陽性」である場合の正解率を測る精度指標だった。その別パターンで、正解値が「陰性」である場合の正解率を測る精度指標もある。それが特異度Specificity)である。特異度は、感度(Sensitivity)に対立する概念として使われるので、これについても説明しておこう。両者の違いを例で説明すると、以下のようになる。

  • 感度 例えば「何らかの病気であると正しく判別される割合」など
  • 特異度 例えば「何の病気でもないと正しく判別される割合」など

 例えば健康診断であれば、検査の感度(誤検出も含めた検出率)が高いほど好ましい。感度が高い状況では、病気である可能性のある人をできるだけ広く検出する。「少しでも問題がありそうであれば、精密検査を受けてもらう」という方が病気を見落とさない確率が高まるというメリットがある。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。