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