koji/メガネ男の日誌

日々の学び、活動状況を記録します。仕事のことは少なめ。

精度評価指標について調べてみた(前半)

f:id:kj_man666:20200816155723j:plain kaggle等でモデルの精度を評価する際、いつもググって出て来た評価指標を適当に使っていて指標の意味が分かっていなかったので、学びのためにまとめてみました。

なおこの前半部分は理論のまとめとし、後日、後半部分としてコードで各精度評価指標を実装する予定です。

分類モデルの評価指標

混同行列(Confusion Matrix)

混同行列は分類モデルの評価を考える際の基本となる行列で、モデルの予測値と観測値の関係を表したもの。

陽性と予測 陰性と予測
実際は陽性 TP(True Positive)真陽性 FN(False Negative)偽陰性
実際は陰性 FP(False Positive)疑陽性 TN(True Negative)真陰性
from sklearn.metrics import confusion_matrix

m = confusion_matrix(y_test, y_pred)
正解率(Accuracy)
\displaystyle{
\frac{陽性と予測して陽性だった確率+陰性と予測して陰性だった確率(=予測が当たった確率)}{すべての確率}
}

正解率は、全体に対して予測が当たった確率。

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_pred)
適合率(Precision)
\displaystyle{
\frac{陽性と予測して陽性だった確率}{陽性と予測して陽性だった確率+陽性と予測して陰性だった確率}
}

適合率は、陽性と予測したものが当たった(実際に陽性だった)確率。

たくさん陽性を出す検査(保守的な検査)は再現率は高くなるが、適合率は低くなる。

from sklearn.metrics import precision_score

precision_score(y_test, y_pred)
再現率(Recall)
\displaystyle{
\frac{陽性と予測して陽性だった確率}{陽性と予測して陽性だった確率+陰性と予測して陽性だった確率}
}

再現率は、陽性のものを、陽性と予測できた確率。

たくさん陰性を出す検査は適合率は高くなるが、再現率は低くなる。

from sklearn.metrics import recall_score

recall_score(y_test, y_pred)
F1スコア
\displaystyle{
\frac{2*(適合率*再現率)}{適合率+再現率}
}

F1スコアは適合率と再現率の調和平均

適合率を優先すべきか、再現率を優先すべきかが決まっていない時点で、モデルを総合的に評価する場合などに使われる。

from sklearn.metrics import f1_score

f1_score(y_test, y_pred)

なお、Fの意味は下記サイトをご参照ください。

F値のFはFunction(関数)の意味だったようです。

qiita.com

ROC曲線、AUC

medium.com

  • ROC(Receiver Operating Characteristic)曲線

ROC曲線は、縦軸に真陽性率、横軸に偽陽性率の値をプロットした曲線。

真陽性率(TPR: True Positive Rate)=再現率 陽性のものを、陽性と予測できた確率。

偽陽性率(FPR: False Positive Rate)陽性のものを陰性と予測してしまった確率。

from sklearn.metrics import roc_curve

# 偽陽性率と真陽性率の算出
fpr, tpr, thresholds = roc_curve(y_test, y_pred)

# ROC曲線の描画
plt.plot(fpr, tpr, color='red', label='ROC curve (area = %.3f)' % auc)
plt.plot([0, 1], [0, 1], color='black', linestyle='--')
  • AUC(Area Under the Curve)

AUCとは、2クラス分類の評価指標で、ROC曲線の右下部分の面積を差す。

from sklearn.metrics import auc

# AUCの算出
auc = auc(fpr, tpr)

回帰モデルの評価指標

MSE(Mean Squared Error) 平均二乗誤差
\displaystyle{
MSE=\frac{1}N \sum_{i=1}^n (y_{test, i}- y_{pred, i})^ 2
}

予測値と正解の差(残差)の二乗をサンプルごとに足し上げたものをサンプル数で割ったもの。

MSE が 0 に近いほど見積もられる予測誤差が小さい、すなわち予測精度が高い。

from sklearn.metrics import mean_squared_error

mse = mean_squared_error(y_test, y_pred)
MAE(Mean Absolute Error) 平均絶対誤差
\displaystyle{
MAE=\frac{\sum_{i}|y_{test,i} - y_{pred,i}|}n
}

残差の絶対値をサンプルごとに足し上げ、最後にサンプル数で割ったもの。

MSEと比べ残差が二乗されていない分、(予測の)外れ値の影響を受けにくい。

MAE も 0 に近いほど予測精度が高いことを表す。

from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(y_test, y_pred)
R2(Multiple R-Squared) 決定係数
\displaystyle{
R^2=1-\frac{\sum{(y_{test,i}-y_{pred,i})^2}}{\sum{(y_{test,i}-\overline{y_{pred,i}})^2}}
}

検証データの平均値で予測をした場合の残差平方和 SST(Sum of Squared Total)と、モデルの残差平方和 SSE(Sum of Squared Errors)の比率で、 R2=1−SSE/SST と定義される。

平均値予測という最もナイーブな予測に対して二乗誤差をどれだけ削れたかを示す指標で、誤差をすべてなくせば1.0となり、平均値予測と同じになれば0.0になる。

R2 の範囲は、通常0〜1の値を取りますが、負になる可能性がある。

from sklearn.metrics import r2_score

r2 = r2_score(y_test, y_pred)
RMSE(Root Mean Squared Error) 平均平方二乗誤差
\displaystyle{
RMSE=\sqrt{\frac{\sum{(y^{test,i}-y ^{pred,i})^2}}{n}}
}

実績と予測が近似する(誤差が小さい)ほど、RMSE は小さくなる。

逆に、実績と予測が乖離する(誤差が大きい)と、RMSE が大きくなる。

したがって、外れ値があると、RMSE が著しく大きくなる。

RMSE は外れ値の影響を受けやすい。

import numpy as np
from sklearn.metrics import mean_squared_error

rmse = np.sqrt(mean_squared_error(y_test, y_pred))

最後までお読みいただきありがとうございました。

参照サイト

funatsu-lab.github.io

mathwords.net

mathwords.net

qiita.com

weblab.t.u-tokyo.ac.jp

note.nkmk.me

stats.biopapyrus.jp