機械学習の評価指標 チートシート

# はじめに
この記事では、機械学習の主要ライブラリであるscikit-learn（sklearn）を用いて回帰タスク、分類タスク、多クラス分類の各タスクに応じた主要な評価指標の説明と具体的な導出方法を紹介します。
# 回帰タスク
ある入力（特徴量）から連続的な出力（実数値）を予測するタスク。
具体的には、家の特徴（例：部屋の数、立地、面積など）から家の価格を予測する問題や、過去の売上データから未来の売上を予測する問題など。
回帰タスクの主な評価指標には、平均絶対誤差(MAE)、平均二乗誤差(MSE)、平均平方根二乗誤差(RMSE)などがある。
## 平均絶対誤差 (MAE)
実際の値と予測値の絶対的な差の平均。
すべてのデータポイントにおける誤差の絶対値の平均を取るため、大きな外れ値にはそれほど敏感ではない。

$$MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$

```python
from sklearn.metrics import mean_absolute_error
MAE = mean_absolute_error(y_val, y_pred)
```

## 平均二乗誤差 (MSE)
実際の値と予測値の差の二乗の平均を示す。
大きな誤差がある場合、その影響が大きくなるため、外れ値に敏感。
$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$

```python
from sklearn.metrics import mean_squared_error
MSE = mean_squared_error(y_val, y_pred)
```

## 平均平方根二乗誤差 (RMSE)
MSEの平方根を取ったもの。
この指標も外れ値に敏感だが、誤差の単位が元のデータと同じになる。
$$RMSE = \sqrt{MSE} $$
```python
import numpy as np
RMSE = np.sqrt(mean_squared_error(y_val, y_pred))
```
## 決定係数 (R-squared)
モデルの予測が実際のデータにどれだけ適合しているかを示す指標。
1に近いほどモデルの予測が実際のデータに良く適合していることを示す。
```math
R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2}
```


```python
from sklearn.metrics import r2_score
r2 = r2_score(y_val, y_pred)
```


# 分類タスク
ある入力（特徴量）がどのカテゴリ（クラス）に属するかを予測するタスク。最も基本的な分類タスクは二値分類で、具体的にはメールがスパムか非スパムかを判断する問題や、患者がある病気を持っているか否かを診断する問題。分類タスクの主な評価指標としては、正解率、適合率、再現率、F1スコアなどがある。

## 混同行列
|       | 実測値: Positive | 実測値: Negative |
|------------------|----------------|----------------|
| 予測値: Positive   | TP        | FP                 |
| 予測値: Negative   | FN       | TN        |

## 正解率(Accuracy)
正しく分類されたデータの数を全データ数で割ったもの。
$$\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}$$
```python
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_val, y_pred)
```
## 適合率(Precision)
正と予測されたデータのうち、実際に正であるデータの割合を示す。
この指標は偽陽性（誤って正と予測されたデータ）を低く抑えることが重要な場面で重要。
$$\text{Precision} = \frac{TP}{TP + FP} $$
```python
from sklearn.metrics import precision_score
precision = precision_score(y_val, y_pred)
```
## 再現率(Recall)
実際の正のデータのうち、正確に正と予測されたデータの割合を示す。
この指標は偽陰性（誤って負と予測された正のデータ）を低く抑えることが重要な場面で重要。
$$\text{Recall} = \frac{TP}{TP + FN}$$
```python
from sklearn.metrics import recall_score
recall = recall_score(y_val, y_pred)
```
## F1スコア(F1 score)
適合率と再現率の調和平均として計算される指標で、両方のバランスを示す。
適合率と再現率の間にトレードオフが存在する場面で、そのバランスを評価するために使用される。
$$F1\ \text{Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
```python
from sklearn.metrics import f1_score
f1 = f1_score(y_val, y_pred)
```

# 多クラス分類タスク
分類タスクの一種で、入力が3つ以上の複数のカテゴリ（クラス）の中からどれに属するかを予測するタスク。
具体的には、手書きの数字の画像を入力として、それが0から9のどの数字であるかを予測する問題や、ニュース記事を入力として、それがどのトピック（例：スポーツ、経済、エンターテインメントなど）に属するかを予測する問題など。多クラス分類の評価には、マクロ平均やマイクロ平均などの方法を用いて、各クラス間のバランスを考慮しつつ評価指標を計算することが一般的。


## マクロ平均(適合率)
マクロ平均は、各クラスごとに計算された評価指標の算術平均。
すべてのクラスが平等に扱われるため、クラスのサイズやサンプル数には影響されない。
例えば、適合率のマクロ平均は各クラスごとの適合率を計算し、その平均を取ることにより導出される。
$$
\text{Macro-Precision} = \frac{1}{N} \sum_{i=1}^{N} \text{Precision}_i
$$
```python
from sklearn.metrics import precision_score
precision_macro = precision_score(y_val, y_pred, average='macro')
```

## マイクロ平均(適合率)
マイクロ平均は、すべてのクラスのTrue Positives, False Positives, True Negatives, False Negativesを合計し、これらの合計を用いて評価指標を計算。
これにより、多くのサンプルが存在するクラスに重みが置かれるため、サンプルの多いクラスの影響を受けやすい。

```math
\text{Micro-Precision} = \frac{\sum_{i=1}^{N} \text{TP}_i}{\sum_{i=1}^{N} \text{TP}_i + \sum_{i=1}^{N} \text{FP}_i}
```
```python
from sklearn.metrics import precision_score
precision_micro = precision_score(y_val, y_pred, average='micro')
```
# 終わりに
分析や予測のタスクごとに、最適な評価指標が異なるのはあるあるです！
そして、一般的でない評価指標も、とても役立つことがあります。
この記事は、みなさんのフィードバックをもとに、随時更新していきたいと思っています。この記事が評価指標に関するみなさんの手助けとなる情報源、チートシートとなれることを切に願っております！！
もし、取り上げてほしい評価指標や意見があれば、どうぞコメントでお知らせください！