分類器性能評估(混淆矩陣、PR曲線、ROC曲線)
大家好,我是Bryce。
這次和大家分享機器學習涉及到的內(nèi)容——分類器性能評估,包括準確率、精確率、召回率、PR曲線、ROC曲線等。
一、準確率(Accuracy)
準確率并不是一個很好的分類器性能指標,尤其是當處理的數(shù)據(jù)集存在偏差時(一些類比其他類多得多)。比如有9個蘋果和1個香蕉,那我猜測10個都不是香蕉的準確率也高達90%。
在Python中,準確率指標可以使用cross_val_score()函數(shù)評估,同時使用K折交叉驗證。具體形式如下,其中,cv=3表示3折。
from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring='accuracy')
二、混淆矩陣
如上圖所示,混淆矩陣每一行代表一個實際的結(jié)果,每一列代表一個預測的結(jié)果。分別有TP、FN、FP、TN四種結(jié)果,有Accuracy(準確率)、Precision(精確率)、Sensitivity(召回率或靈敏度)、Specificity(特異度)和Negative Predictive Value(反例預測率)5種衡量指標,它們的計算公式如上圖。
還是以蘋果、香蕉舉例子(蘋果為正例,香蕉為反例):
- TP:真正例,把蘋果認成了蘋果;
- FN:偽反例,把蘋果認成了香蕉;
- FP:偽正例,把香蕉認成了蘋果;
- TN:真反例,把香蕉認成了香蕉。
Accuracy(準確率):不管正負例,預測對的占多少。
Precision(精確率):找了這么多正例,找對了多少。
Sensitivity(召回率):有這么多正例,找出了多少。
在Python中計算混淆矩陣比較簡單,如下:
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train, y_train_pred)
其中,y_train表示訓練值,y_train_pred表示預測值。
衡量指標中用的比較多的是精確率和召回率,它們的值可以在計算出混淆矩陣后,按照上圖公式計算,也可以直接調(diào)用對應(yīng)的函數(shù)。
from sklearn.metrics import precision_score, recall_score
precision_score(y_train, y_train_pred)
recall_score(y_train, y_train_pred)
其中,precision_score表示精確率,recall_score表示召回率。
F1值
F1值結(jié)合了精確率和召回率,是它們的調(diào)和平均。普通的平均值平等看待所有值,而調(diào)和平均會給小的值更大的權(quán)重。要想獲得一個高的F1值,精確率和召回率要同時高。
from sklearn.metrics import f1_score
f1_score(y_train, y_train_pred)
精確率和召回率之間存在一種折中關(guān)系,提高精確率會降低召回率。到底需要較高的精確率還是較高的召回率,不能一概而論,具體場景具體分析。需要找得對就需要高的精確率,也就是想要的一定是好的;不想把想要的漏掉太多,就需要較高的召回率。
某模型的精確率、召回率與閾值的關(guān)系曲線如下,橫坐標表示算法判斷的閾值(大于閾值為正,否則為負):
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train, y_scores) # y_scores是決策分數(shù),不是預測值
從圖中就可以看出精確率和召回率之間的博弈關(guān)系。
仔細看我們會發(fā)現(xiàn),召回率曲線比較平滑,而精確率曲線在性能較高時會有波動,這表示提高閾值,精確率并不一定會提高。
精確率和召回率之間的關(guān)系曲線(PR曲線)如下:
三、ROC曲線
ROC曲線橫坐標為FPR(偽正例率),縱坐標為TPR(真正例率,也即召回率),其中FPR=1-TNR,TNR就是特異性。
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train, y_scores)
一個評估分類器好壞的方法是:計算ROC曲線下的面積,roc_auc_score()可實現(xiàn)。面積越大,性能越好,從圖來看,就是更靠近左上角。(PR曲線應(yīng)該盡可能的靠近右上角)
from sklearn.metrics import roc_auc_score
roc_auc_score(y_train, y_scores)
PR曲線還是ROC曲線?
當正例非常少或者你更關(guān)注偽正例(FP)而不是偽反例(FN)時,你應(yīng)該選擇PR曲線, 反之則是ROC曲線。
本文轉(zhuǎn)載自微信公眾號「且聽數(shù)據(jù)說」,作者「Bryce」,可以通過以下二維碼關(guān)注。
轉(zhuǎn)載本文請聯(lián)系「且聽數(shù)據(jù)說」公眾號。