【入門者向け】機械学習の分類問題評価指標解説(正解率・適合率・再現率など)

分類問題の評価指標の言葉の定義に関するメモです。いつも、やるたびにググって思い出しているので、記憶を定着させるために作りました。さすがにそろそろ **「覚えるぞ」という意思を込めて結構、力を入れました**:muscle:

# 混合行列(Confusion Matrix)とTP, FP, FN, TN
まずは基本の基本から。二値分類の正解・不正解の種類です。
**TP**(True Positive)、**FP**(False Positive)、**FN**(False Negative)、**TN**(True Negative)の4種類です。

- 1文字目：**T(True)は予測正解、F(False)は予測不正解。**
- 2文字目：**Pは予測が正(Positive)、Nは予測が負(Negative)**

TP、FP、FN、TNのマトリックスを混合行列(Confusion Matrix)と呼びます。下の混合行列で**太字部分**(TPとTN)は正解です。太字でないFPとFNは不正解で、False Positiveが統計で言う「第1種の誤り」で、False Negativeが「第2種の誤り」で、それぞれ偽陽性と偽陰性と呼ばれることもあります。

||実際は正<br>(Positive)|実際は負<br>(Negative)|
|:-:|:-:|:-:|
|予測が正<br>(Positive)|**TP(真陽性)<br>True Positive**|FP(偽陽性)<br>False Positive<br>第1種の誤り|
|予測が負<br>(Negative)|FN(偽陰性)<br>Flase Negative<br>第2種の誤り|**TN(真陰性)<br>True Negative**|

- [WikiのClassification Context](https://en.wikipedia.org/wiki/Precision_and_recall#Definition_(classification_context))
- [第一種過誤と第二種過誤](https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%A8%AE%E9%81%8E%E8%AA%A4%E3%81%A8%E7%AC%AC%E4%BA%8C%E7%A8%AE%E9%81%8E%E8%AA%A4)

## 実例
例えば、妊娠検査を例にします。女性に対して妊娠検査をして妊娠または非妊娠と診断したかを混合行列で表現します。

||実際は妊娠中<br>(Positive)|実際は非妊娠<br>(Negative)|
|:-:|:-:|:-:|
|予測が妊娠中<br>(Positive)|TP(True Positive)<br>妊娠女性に妊娠と診断|FP(False Positive)<br>非妊娠女性に妊娠と診断<br>第1種の誤り|
|予測が非妊娠<br>(Negative)|FN(Flase Negative)<br>妊娠女性に非妊娠と診断<br>第2種の誤り|TN(True Negative)<br>非妊娠女性に非妊娠と診断|

まったく同じことを絵にしました。

||実際は妊娠中<br>(Positive)|実際は非妊娠<br>(Negative)|
|:-:|:-:|:-:|
|予測が妊娠中<br>(Positive)|<img width="200" alt="10.ExampleTP.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/f43f77dc-c7ad-9838-a0c9-89546becbf72.jpeg">|<img width="200" alt="10.ExampleFP.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/c293b7c8-a19d-f65d-4410-0b70dc713a6a.jpeg">|
|予測が非妊娠<br>(Negative)|<img width="200" alt="10.ExampleFN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/02cce3e7-c41c-4ed1-bffa-1de9ea5aca7c.jpeg">|<img width="200" alt="10.ExampleTN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/d53d154e-b81b-b13d-4460-8b16b67acae5.jpeg">|

ひらたく言うとこういうことです(医学的な検査ではないですが、わかりやすいかと思い表現を変えています)。

- TP: 妊婦に妊娠と予測し正解
- FP: お腹が出ていたので妊娠と予測したら実はただ太っていただけ(第１種の誤り)
- FN: スリムだったので非妊娠と予測したら妊婦だった(第２種の誤り)
- TN: 非妊娠な人に非妊娠と予測し正解


# 評価指標
## 評価指標一覧
まずは評価指標を一覧化しました。個々の評価指標詳細は一覧の後に書いています。

|指標|意味|式|図解(分母と分子)|
|:-:|:-:|:-:|:-:|
|正解率(Accuracy)|全予測正答率|$\frac{TP + TN}{TP + FP + FN + TN}$|分母は図解上になし<br><img width="421" alt="20.TPandTN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/d64803cf-cbad-7414-923a-3cfbc134463b.jpeg">|
|適合率(Precision)|正予測の正答率|$\frac{TP}{TP + FP}$|<img width="344" alt="30.Precision.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/38a2a65c-2a10-bb97-1602-03e377fd428a.jpeg">|
|再現率(Recall)|正に対する正答率|$\frac{TP}{TP + FN}$|<img width="342" alt="40.Recall.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/85f83313-d370-de95-42be-59aa9e3c58e0.jpeg">|
|特異率(Specificity)|負に対する正答率|$\frac{TN}{FP + TN}$|<img width="340" alt="50.Specificity.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/f9d87e26-c0d1-b16c-25e3-6712fc7db372.jpeg">|
|F値(F-measure)|適合率と再現率の調和平均|$\frac{2 \times Precision \times Recall}{Precision + Recall}$|なし|

## 正解率(Accuracy)
全予測に対する正答率です。

```math
\frac{TP + TN}{TP + FP + FN + TN} 
```

妊娠検査の例：全検査数に対する妊娠・非妊娠の正答率
###### 正解率(Accuracy)：分子の図解(分母は省略)。
><img width="421" alt="20.TPandTN.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/d64803cf-cbad-7414-923a-3cfbc134463b.jpeg">


## 適合率(Precision)
正と予測したデータのうち，実際に正であるものの割合。「精度」と呼ぶこともあり。

```math
\frac{TP}{TP + FP} 
```

妊娠検査の例：妊娠と診断した中で正しかった(本当に妊娠だった)率
###### 適合率(Precision)図解(上下を分子と分母で表しています)
><img width="344" alt="30.Precision.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/38a2a65c-2a10-bb97-1602-03e377fd428a.jpeg">

## 再現率(Recall)
実際に正であるもののうち，正であると予測されたものの割合。
(2019/7/26追記)機械学習の指標を理解しにくい原因のひとつに「再現率」という呼び方があると考えています。これ、正直翻訳ミスなのではないでしょうか？私は**心の中では「回収率」と呼んでいます**(車などのリコール(回収)と同じ)。実際に**正であるものをどれだけ回収(予測)できたかの割合**と理解しています。

```math
\frac{TP}{TP + FN} 
```

妊娠検査の例：妊娠中の人で検査結果が正しかった(正しく妊娠と診断された)率
###### 再現率(Recall)図解(上下を分子と分母で表しています)
><img width="342" alt="40.Recall.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/85f83313-d370-de95-42be-59aa9e3c58e0.jpeg">

## 特異率(Specificity)
実際に負であるもののうち，負であると予測されたものの割合。再現率の逆。

```math
\frac{TN}{FP + TN} 
```

妊娠検査の例：非妊娠の人で検査結果が正しかった(正しく非妊娠と診断された)率
###### 特異率(Specificity)図解(上下を分子と分母で表しています)
><img width="340" alt="50.Specificity.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/134273/f9d87e26-c0d1-b16c-25e3-6712fc7db372.jpeg">

## F値(F-measure)
適合率と再現率の[調和平均](https://ja.wikipedia.org/wiki/%E8%AA%BF%E5%92%8C%E5%B9%B3%E5%9D%87)。算術平均
でなく調和平均を使う理由は記事[「F値に調和平均を使う理由（再）」](https://abicky.net/2010/11/21/002415/)にわかりやすく書かれています。

```math
\frac{2 \times Precision \times Recall}{Precision + Recall} 
```

# 各評価指標と頭の体操
数値を例示して各指標がどうなるかを見てみます。

## すべて均等混合行列
全体100のうちTP, FP, FN, TNすべて均等で25としました。すべて半分予測が正解というケースです。

||実際は正<br>(Positive)|実際は負<br>(Negative)|
|:-:|:-:|:-:|
|予測が正<br>(Positive)|TP<br>25|FP<br>25|
|予測が負<br>(Negative)|FN<br>25|TN<br>25|

|指標|意味|式|
|:-:|:-:|:--|
|正解率(Accuracy)|全予測正答率|$50\\% = \frac{TP(25) + TN(25)}{TP(25) + FP(25) + FN(25) + TN(25)}$|
|適合率(Precision)|正予測の正答率|$50\\% = \frac{TP(25)}{TP(25) + FP(25)}$|
|再現率(Recall)|正に対する正答率|$50\\% = \frac{TP(25)}{TP(25) + FN(25)}$|
|特異率(Specificity)|負に対する正答率|$50\\% = \frac{TN(25)}{FP + TN(25)}$|
|F値(F-measure)|適合率と再現率の調和平均|$50\\% = \frac{2 \times Precision(50) \times Recall(50)}{Precision(50) + Recall(50)}$|

## データにPositiveに偏った場合
Positive(正)にデータが偏った場合です。全体の正解率(Accuracy)をあげようとすると、分類器でNegativeが軽視されることがあります。
妊娠の例では、妊婦(正)が多いので全体の正答率を重視して分類器が妊婦(正)ばっかり予測した場合です。非妊娠(負)に対する正答率が低いのですが、正解率(Accuracy)・適合率(Precision)、再現率(Recall)、F値(F-measure)は高い数値を出しています。逆に特異率(Specificity)が低いです。

||実際は正<br>(Positive)|実際は負<br>(Negative)|
|:-:|:-:|:-:|
|予測が正<br>(Positive)|TP<br>70|FP<br>10|
|予測が負<br>(Negative)|FN<br>10|TN<br>10|

|指標|意味|式|
|:-:|:-:|:--|
|正解率(Accuracy)|全予測正答率|$80\\% = \frac{TP(70) + TN(10)}{TP + FP(10) + FN(10) + TN(10)}$|
|適合率(Precision)|正予測の正答率|$88\\% = \frac{TP(70)}{TP(70) + FP(10)}$|
|再現率(Recall)|正に対する正答率|$88\\% = \frac{TP(70)}{TP + FN(10)} = 88\%$|
|特異率(Specificity)|負に対する正答率|$50\\% = \frac{TN(10)}{FP(10) + TN(10)}$|
|F値(F-measure)|適合率と再現率の調和平均|$88\\% = \frac{2 \times Precision(88) \times Recall(88)}{Precision(88) + Recall(88)}$|

## データにNegativeに偏った場合
Negative(負)にデータが偏った場合です。全体の正解率(Accuracy)をあげようとすると、今度は逆に分類器でPositiveが軽視されることがあります。
妊娠の例では、非妊娠(負)が多いので全体の正答率を重視して分類器が非妊娠(負)ばっかり予測した場合です。妊娠(正)に対する正答率が低いので、正解率(Accuracy)・特異率(Specificity)は高い数値を出しています。逆に適合率(Precision)、再現率(Recall)、F値(F-measure)が低いです。

||実際は正<br>(Positive)|実際は負<br>(Negative)|
|:-:|:-:|:-:|
|予測が正<br>(Positive)|TP<br>10|FP<br>10|
|予測が負<br>(Negative)|FN<br>10|TN<br>70|

|指標|意味|式|
|:-:|:-:|:--|
|正解率(Accuracy)|全予測正答率|$80\\% = \frac{TP(10) + TN(70)}{TP(10) + FP(10) + FN(10) + TN(70)}$|
|適合率(Precision)|正予測の正答率|$50\\% = \frac{TP(10)}{TP(10) + FP(10)}$|
|再現率(Recall)|正に対する正答率|$50\\% = \frac{TP(10)}{TP(10) + FN(10)}$|
|特異率(Specificity)|負に対する正答率|$88\\% = \frac{TN(70)}{FP(10) + TN(70)}$|
|F値(F-measure)|適合率と再現率の調和平均|$50\\% = \frac{2 \times Precision(50) \times Recall(50)}{Precision(50) + Recall(50)}$|

## 適合率重視(FNが多い場合)
FN(False Negative)が多い場合です。これは、分類器にとって、Positive(正)は正しく判断できるが、Negative(負)と判断しやすいPositiveが多い場合です。
適合率と再現率はトレードオフの関係で、問題設定によりどちらを重視するかを決めます。適合率を重視するのは、第２種の誤りが多くても正予測の正答率をあげたい場合です。例えば、スパムメール判定の場合スパムメールがスパムと判定されなくて(FN)もいいので、通常メールをスパム判定(FP)したくないような場合に適合率を重視します。
妊娠の例では、妊婦(正)を比較的正しく診断できるのですが、スリムな人間をどちらか判断できてきない場合です。この場合、Positive予測(TPとFP)を分母にとる適合率(Precision)は高い数値を出します。

||実際は正<br>(Positive)|実際は負<br>(Negative)|
|:-:|:-:|:-:|
|予測が正<br>(Positive)|TP<br>40|FP<br>10|
|予測が負<br>(Negative)|FN<br>40|TN<br>10|

|指標|意味|式|
|:-:|:-:|:--|
|正解率(Accuracy)|全予測正答率|$ 50\\% = \frac{TP(40) + TN(10)}{TP(40) + FP(10) + FN(40) + TN(10)}$|
|適合率(Precision)|正予測の正答率|$ 80\\% = \frac{TP(40)}{TP(40) + FP(10)}$|
|再現率(Recall)|正に対する正答率|$ 50\\% = \frac{TP(40)}{TP(40) + FN(40)}$|
|特異率(Specificity)|負に対する正答率|$50\\% = \frac{TN(10)}{FP(10) + TN(10)}$|
|F値(F-measure)|適合率と再現率の調和平均|$ 62\\% = \frac{2 \times Precision(80) \times Recall(50)}{Precision(80) + Recall(50)}$|

## 再現率重視(FPが多い場合)
FP(False Positive)が多い場合です。これは、分類器にとって、Negative(負)は正しく判断できるが、Positive(正)と判断しやすいNegativeが多い場合です。
(適合率を軽視して)再現率を重視するのは、第1種の誤りが多くても負予測の正答率をあげたい場合です。言い換えると、見つけにくいものを機械的に発見して、正予測を人間がチェックするような場合です。例えば、工場の生産プロセスでめったにない不良品候補を機械的に検知して、不良品候補を人間が不良品かを調べるような場合です。この場合は、不良品のすり抜け(FN)をさせたくないので、不良品でないのに不良品と診断した数(FP)が多くてもいいシナリオです。
妊娠の例では、非妊娠(負)を比較的正しく診断できるのですが、お腹が出た人間をどちらか判断できてきない場合です。この場合、実際はPositive(TPとFN)を分母にとる再現率(Recall)は高い数値を出します。逆にが特異率(Specificity)低いです。

||実際は正<br>(Positive)|実際は負<br>(Negative)|
|:-:|:-:|:-:|
|予測が正<br>(Positive)|TP<br>40|FP<br>40|
|予測が負<br>(Negative)|FN<br>10|TN<br>10|

|指標|意味|式|
|:-:|:-:|:--|
|正解率(Accuracy)|全予測正答率|$ 50\\% = \frac{TP(40) + TN(10)}{TP(40) + FP(40) + FN(10) + TN(10)}$|
|適合率(Precision)|正予測の正答率|$ 50\\% = \frac{TP(40)}{TP(40) + FP(40)}$|
|再現率(Recall)|正に対する正答率|$ 80\\% = \frac{TP(40)}{TP(40) + FN(10)}$|
|特異率(Specificity)|負に対する正答率|$20\\% = \frac{TN(10)}{FP(40) + TN(10)}$|
|F値(F-measure)|適合率と再現率の調和平均|$ 62\\% = \frac{2 \times Precision(50) \times Recall(80)}{Precision(50) + Recall(80)}$|

# 多クラス分類
多クラス分類の場合は多少複雑になります。
例えばA・B・Cの三値分類の混合行列は以下のようになります。

||実際はA|実際はB|実際はC|
|:-:|:-:|:-:|:-:|
|予測がA|**True A**|False A(B)|False A(C)|
|予測がB|False B(A)|**True B**|False B(C)|
|予測がC|False C(A)|False C(B)|**True C**|

Aに関する適合率(Precision)、再現率(Recall)、F値(F-measure)は以下の計算式です。BとCも同様です。

|指標|意味|式|
|:-:|:-:|:--|
|Aの適合率|A予測の正答率|$\frac{True A}{True A + False A}$|
|Aの再現率|Aに対する正答率|$\frac{True A}{True A + False B(A) + False C(A)}$|
|AのF値|Aの適合率と再現率の調和平均|$\frac{2 \times Precision(A) \times Recall(A)}{Precision(A) + Recall(A)}$|

## マクロ平均とマイクロ平均
**マクロ平均は単純な算術平均**(相加平均)です。調和平均ではありません。各クラスごとの正解率、適合率等の値を平均するだけです(なので式も省略)。
**マイクロ平均は各クラスごとの計算をせずに、混合行列全体からTP等の値集計をして算出**します。他クラス分類の場合に、全体の合計で考えるのでPositiveとNegativeの区別が丸め込まれるためFPとFNは同一です。そのため、適合率・再現率・F値も同じ値です。詳しくは記事[「Why are precision, recall and F1 score equal when using micro averaging in a multi-class problem?」](https://simonhessner.de/why-are-precision-recall-and-f1-score-equal-when-using-micro-averaging-in-a-multi-class-problem/)を見てください。

|種類|式|
|:-:|:--|
|TP|True A + True B + True C|
|FP/FN|False A + False B + False C|
|適合率・再現率・F値|$\frac{TP}{TP + FP}$|

マクロ平均やマイクロ平均とは別に「重み付け平均」もあります。[「機械学習で使う指標総まとめ(教師あり学習編)」](https://www.procrasist.com/entry/ml-metrics)などを参考にしてください。

# 参考リンク
[朱鷺の杜Wiki](http://ibisforest.org/index.php?F%E5%80%A4)
[【python】分類タスクの評価指標の解説とsklearnでの計算方法](https://www.haya-programming.com/entry/2018/03/14/112454)
[機械学習で使う指標総まとめ(教師あり学習編)](https://www.procrasist.com/entry/ml-metrics)

PR曲線とROC曲線について別記事で書きました。

https://qiita.com/FukuharaYohei/items/9d83f5746c20eaadf40c