機械学習の分類問題における評価指標(二クラス分類編)

# 二値(二クラス)分類の評価
二値(二クラス)分類問題の評価指標の用語の定義に関するメモです．
分類問題の評価を行う度にググることが多かったので，，，
## 混同行列(Confusion Matrix)
二値分類問題で出力されたクラス分類の結果をまとめたマトリックス(行列≒表)のことで，二値分類機械学習モデルの性能を測る指標として使われます．
二値分類の正解・不正解の種類として，以下の4つが挙げられます．
**TP(True Positive)**，**FP(False Positive)**，**FN(False Negative)**， **TN(True Negative)**です．
 
 - 1文字目：**T(True)は予測正解，F(False)は予測不正解**
 - 2文字目：**P(Positive)は予測が正，N(Negative)は予測が負**

これらを表にあらわすと以下のようになり，これを**混同行列(Confusion Matrix)**と呼びます．
**TP**と**TN**は正解です．FPとFNは不正解で，FPは「第1種の誤り」で，FNは「第2種の誤り」で，それぞれ偽陽性と偽陰性と呼ばれます．
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395817/20c86c13-d7a6-44b5-2410-ba24f3b880d6.png">

### 評価指標
#### 正解率(Accuracy)
全体のデータの中で正しく分類できたTPとTNがどれだけあるかという指標のことです．
高いほど性能が良いです．

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

#### 適合率(Precision)
Positiveと分類されたデータ(TP + FP)のなかで実際にPositiveだったデータ(TP)数の割合のことです．この値が高いほど性能が良く，間違った分類が少ないということを意味します．

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

#### 再現率(Recall)
取りこぼすことなくPositiveなデータを正しくPositiveと推測できているかどうかです．この値が高いほど性能が良く，間違ったPositiveの判断が少ないということです．
別の言い方をすると，本来Positiveと推測すべき全データの内，どれほど回収できたかという指標です．

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

#### 特異率(Specificity)
取りこぼすことなくNegativeなデータを正しくNegativeと推測できているかどうかです．この値が高いほど性能が良く，間違ったNegativeの判断が少ないということです．
別の言い方をすると，本来Negativeと推測すべき全データの内，どれほど回収できたかという指標です．

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

#### F値(F-measure)
適合率と再現率の調和平均

```math
Fmeasure = \frac{2×Precision×Recall}{Precision+Recall}
```

#### 正解率(Accuracy)以外の指標が必要な理由
例えば，画像に写っているのが人間かどうかを判断する機械学習モデルがあり，
そのモデルに対してゴリラ，猿，カンガルー，人間の画像を判断させた場合，機械学習モデルが以下のように判断したとします．

|物体  |数  |人間と推測した数  |人間ではないと推測した数  |
|---|---|---|---|
|ゴリラ |900  |0  |900  |
|猿  |50  |0  |50  |
|カンガルー|20  |0  |20 |
|人間|30|0|30|

この機械学習モデルでは，人間以外の全ての物体に対して**人間ではない(Negative)**と推測をした一方，全ての人間に対しても**人間ではない(Negative)**と推測をした．
上記の結果をもとに正解率(Accuracy)を計算してみると，

```math
Accuracy = \frac{TP+TN}{TP+FP+FN+TN} = \frac{0+970}{0+0+30+970} = 0.97
```
となり，正解率としては高くなるが，人間を1人たりとも正しく推測することができておらず，使い物にならないモデルです．
このように，一見すると正解率が高くて性能の良い機械学習モデルのように見えても，蓋を開けてみると，ただひたすらに**人間ではない(Negative)**と出力するだけの何も判断しない機械学習モデルとなってしまっています．このような理由から，正解率(Accuracy)だけでは2値分類の機械学習モデルの性能を測ることができません．

#### 再現率(Recall)を用いて，どれだけ人間を正しく人間と推測できるかという性能を測る
前項目で記述した際に役立つのが再現率(Recall)になります．
この指標を用いると，本物の人間に対して**人間である**と漏れなく推測できているかを計測することができます．
今回の場合だと，

```math
Recall = \frac{TP}{TP+FN} = \frac{0}{0+30} = 0
```
となっており，人間を正しく推測することが全くできていないことがわかります．
そこで機械学習モデルを改良して，新たに以下の結果が得られたとします．

|物体  |数  |人間と推測した数  |人間ではないと推測した数  |
|---|---|---|---|
|ゴリラ |900  |2  |898  |
|猿  |50  |20  |30  |
|カンガルー|20  |5  |15 |
|人間|30|27|3|

再現率を計算すると以下のようになります．

```math
Recall = \frac{TP}{TP+FN} = \frac{27}{27+3} = 0.90
```

正解率(Accuracy)は0.95で変化していませんが，再現率(Recall)は0.90と向上し，人間を推測する機械学習モデルとしてはこちらの方が性能は良くなります．

#### 適合率(Precision)を用いて保守的に人間の推測をしたい
人間でないものを誤って**人間である**と推測する事態をなるべく減らしたい場合を考えます．その場合に役に立つ指標が**適合率(Precision)**です．

**再現率(Recall)**と**適合率(Precision)**は対の関係にあり，一般的に適合率(Precision)を上げると再現率(Recall)は下がる傾向にあります．
その点を考慮して，どのようなユースケースで機械学習を用いたいのかを検討し，再現率(Recall)と適合率(Precision)を調整する必要があります．

今回のケースですと，「人間でないものを誤って**人間である**と推測する事態をなるべく減らしたい」ですので，適合率(Precision)を上げることで，再現率(Recall)を下げる結果になり，本物の人間を人間ではないと判断して取りこぼしをする可能性も上がることになります．

#### 2値分類をビジネスで利用するには
2値分類の機械学習モデルをビジネスで利用するには性能を測る指標を算出し，目的にあった指標を見ることが重要になってきます．
単に正解率(Accuracy)だけを見て2値分類の機械学習モデルの性能を測るのではなく，再現率(Recall)の指標も組み合わせて利用することが必要になります．

# 参考

- https://www.procrasist.com/entry/ml-metrics
- https://qiita.com/TsutomuNakamura/items/a1a6a02cb9bb0dcbb37f
- https://qiita.com/FukuharaYohei/items/be89a99c53586fa4e2e4#%E6%B7%B7%E5%90%88%E8%A1%8C%E5%88%97confusion-matrix%E3%81%A8tp-fp-fn-tn

次回は多値(多クラス)分類に関する評価指標のまとめ記事を書きたいと思います．