準確率、精確率(查準率)、召回率(查全率)、F1值、ROC曲線的AUC值,都可以作為評價一個機器學習模型好壞的指標(evaluation metrics),而這些評價指標直接或間接都與混淆矩陣有關,前四者可以從混淆矩陣中直接計算得到,AUC值則要通過ROC曲線進行計算,而ROC曲線的橫縱座標又和混淆矩陣聯絡密切,所以在瞭解這些評價指標之前,先知道什麼是混淆矩陣很有必要,也方便記憶。
1.混淆矩陣
對於一個二分類問題,我們可以得到如表 1所示的的混淆矩陣(confusion matrix):
表 1:混淆矩陣
Actual class | |||
positive class | negative class | ||
Predicted class | positive class | True Positive(TP) | False Positive(FP) |
negative class | False Negative(FN) | True Negative(TN) |
表 1 所示的混淆矩陣中,行表示資料在模型上的預測類別(predicted class/predicted condition),列表示資料的真實類別(actual class/true condition)。在看混淆矩陣時,要分清樣本的真實類別和預測類別,有些地方的行列表示可能和這裡不一致。在sklearn中,二分類問題下的混淆矩陣需要分別將表 1 中的predicted class和Actual class對調,將橫縱座標的positive class和negative class都分別對調,再重新計算混淆矩陣。
通過混淆矩陣,我們可以很直觀地看清一個模型在各個類別(positive和negative)上分類的情況。
表 2:TP、FP、FN、TN
TP | 真實類別為positive,模型預測的類別也為positive |
FP | 預測為positive,但真實類別為negative,真實類別和預測類別不一致 |
FN | 預測為negative,但真實類別為positive,真實類別和預測類別不一致 |
TN | 真實類別為negative,模型預測的類別也為negative |
TP、FP、TN、FN,第二個字母表示樣本被預測的類別,第一個字母表示樣本的預測類別與真實類別是否一致。
2.準確率
準確率(accuracy)計算公式如下所示:
\begin{equation}\label{equ:accuracy}
\mbox{accuracy} = \frac{TP+TN}{TP+TN+FP+FN} = \frac{TP+TN }{\mbox{all data}}
\end{equation}
準確率表示預測正確的樣本(TP和TN)在所有樣本(all data)中佔的比例。
在資料集不平衡時,準確率將不能很好地表示模型的效能。可能會存在準確率很高,而少數類樣本全分錯的情況,此時應選擇其它模型評價指標。
3.精確率(查準率)和召回率(查全率)
positive class的精確率(precision)計算公式如下:
\begin{equation}\label{equ:precision}
\mbox{precision} = \frac{TP}{TP+FP} = \frac{TP}{\mbox{預測為positive的樣本}}
\end{equation}
positive class的召回率(recall)計算公式如下:
\begin{equation}\label{equ:recall}
\mbox{recall} = \frac{TP}{TP+FN} = \frac{TP}{\mbox{真實為positive的樣本}}
\end{equation}
positive class的精確率表示在預測為positive的樣本中真實類別為positive的樣本所佔比例;positive class的召回率表示在真實為positive的樣本中模型成功預測出的樣本所佔比例。
positive class的召回率只和真實為positive的樣本相關,與真實為negative的樣本無關;而精確率則受到兩類樣本的影響。
4.$F_1$值和$F_\beta$值
$F_1$值的計算公式如下:
\begin{equation}\label{equ:f1}
F_1 = \frac{2}{\frac{1}{\mbox{precision}}+\frac{1}{\mbox{recall}}} = \frac{2*\mbox{precision}*\mbox{recall}}{\mbox{precision}+\mbox{recall}}
\end{equation}
$F_1$值就是精確率和召回率的調和平均值,$F_1$值認為精確率和召回率一樣重要。
$F_\beta$值的計算公式如下:
\begin{equation}\label{equ:fbeta}
F_\beta = \frac{1+\beta^2}{\frac{1}{\mbox{precision}}+\frac{\beta^2}{\mbox{recall}}} = \frac{(1+\beta^2)*\mbox{precision}*\mbox{recall}}{\beta^2*\mbox{precision}+\mbox{recall}}
\end{equation}
在$\beta = 1$時,$F_\beta$就是$F_1$值,此時$F_\beta$認為精確率和召回率一樣重要;當$\beta > 1$時,$F_\beta$認為召回率更重要;當$0< \beta < 1$時,$F_\beta$認為精確率更重要。除了$F_1$值之外,常用的還有$F_2$和$F_{0.5}$。
5.ROC曲線及其AUC值
AUC全稱為Area Under Curve,表示一條曲線下面的面積,ROC曲線的AUC值可以用來對模型進行評價。ROC曲線如圖 1 所示:
圖 1:ROC曲線
(注:圖片摘自https://en.wikipedia.org/wiki/Receiver_operating_characteristic)
ROC曲線的縱座標True Positive Rate(TPR)在數值上就等於positive class的recall,記作recall$_{positive}$,橫座標False Positive Rate(FPR)在數值上等於(1 - negative class的recall),記作(1 - recall$_{negative}$)如下所示:
\begin{equation}\label{equ:tpr}
\begin{split}
\mbox{TPR} &= \frac{TP}{TP + FN} \\ &= \mbox{recall$_{positive}$}
\end{split}
\end{equation}
\begin{equation}\label{equ:fpr}
\begin{split}
\mbox{FPR} &= \frac{FP}{FP + TN} = \frac{FP + TN -TN}{FP + TN} \\ &= 1 - \frac{TN}{FP + TN} \\ &= 1 - \mbox{recall$_{negative}$}
\end{split}
\end{equation}
通過對分類閾值$\theta$(預設0.5)從大到小或者從小到大依次取值,我們可以得到很多組TPR和FPR的值,將其在影象中依次畫出就可以得到一條ROC曲線,閾值$\theta$取值範圍為$[0, 1]$。
ROC曲線在影象上越接近左上角$(0, 1)$模型越好,即ROC曲線下面與橫軸和直線FPR = 1圍成的面積(AUC值)越大越好。直觀上理解,縱座標TPR就是recall$_{positive}$值,橫座標FPR就是(1 - recall$_{negative}$),前者越大越好,後者整體越小越好,在影象上表示就是曲線越接近左上角$(0, 1)$座標越好。
圖 1展示了3個模型的ROC曲線,要知道哪個模型更好,則需要計算每條曲線的AUC值,一般認為AUC值越大越好。AUC值由定義通過計算ROC曲線、橫軸和直線FPR = 1三者圍成的面積即可得到。