模型評估指標(Confusion Matrix、ROC、AUC)

1、選擇合適的模型評估指標的依據

通常在模型訓練完之後,我們想要查看模型訓練的效果以驗證模型的好壞,並根據評估結果來繼續調整模型的參數、特徵或者算法,以達到滿意的結果。在迴歸算法中評價模型好壞的指標很明確主要有:擬合優度R2R^2,均方誤差MSEMSE,均方根誤差RMSERMSE,以及平均絕對誤差MAEMAE

但是,在分類算法中評估模型效果的指標往往就不那麼明確了。分類算法的評估指標多種多樣,在諸多的評價指標中,大部分指標只能片面的反應模型的一部分性能,如果不能合理的運用評估指標,不僅不能發現模型本身的問題,而且會得出錯誤的結論。一般分類算法評價一個模型最簡單也是最常用的指標就是準確率(Accuracy),但是在沒有任何前提下準準確率(Accuracy)往往不能反映一個模型性能的好壞,例如在不平衡的數據集上,正類樣本佔總數的95%,負類樣本佔總數的5%;那麼有一個模型把所有樣本全部判斷爲正類,該模型也能達到95%的準確率,但是這個模型沒有任何的意義。

因此,對於一個模型,我們需要從不同的方面去判斷它的性能。在對比不同模型的能力時,使用不同的性能度量往往會導致不同的評價結果;這意味着模型的好壞是相對的,什麼樣的模型是好的,不僅取決於算法和數據,還決定於任務需求。例如醫院中檢測病人是否有心臟病的模型,即檢測出少數類,那麼這個模型的目標是將所有有病的人給檢測出來,即使會有許多的誤診也在所不惜(將沒病檢測爲有病);又比如在警察追捕罪犯的模型上,該模型的目標是將罪犯準確的識別出來,而不希望有過多的誤判(將正常人認爲是罪犯)。

所以不同的任務需求,模型的訓練目標不同,因此評價模型性能的指標也會有所差異。

也就是說,單純地追求捕捉出少數類,就會成本太高,而不顧及少數類,又會無法達成模型的效果。所以在現實中,我們往往在尋找捕獲少數類的能力將多數類判錯後需要付出的成本的平衡。如果一個模型在能夠儘量捕獲少數類的情況下,還能夠儘量對多數類判斷正確,則這個模型就非常優秀了。爲了評估這樣的能力,我們將引入新的模型評估指標:混淆矩陣和ROC曲線來幫助我們。

2、混淆矩陣(Confusion Matrix)

混淆矩陣是二分類問題的多維衡量指標體系,在樣本不平衡時極其有用。在混淆矩陣中,我們將少數類認爲是正例多數類認爲是負例。在決策樹,隨機森林這些普通的分類算法裏,即是說少數類是1,多數類是0。在SVM裏,就是說少數類是1,多數類是-1。普通的混淆矩陣,一般使用{0,1}來表示。如圖所示:

預測值
1 0
真實值 1 TP(11) FN(10)
0 FP(01) TN(00)

  1. TP:預測爲正樣本,實際也爲正樣本的特徵數
  2. FP:預測爲正樣本,實際爲負樣本的特徵數
  3. TN:預測爲負樣本,實際也爲負樣本的特徵數
  4. FN:預測爲負樣本,實際爲正樣本的特徵數

混淆矩陣中,永遠是真實值在前,預測值在後。其實可以很容易看出,11和00的對角線就是全部預測正確的,01和10的對角線就是全部預測錯誤的。基於混淆矩陣,我們有六個不同的模型評估指標,這些評估指標的範圍都在[0,1]之間,所有以11和00爲分子的指標都是越接近1越好,所以以01和10爲分子的指標都是越接近0越好。

2.1 模型整體效果:準確率

準確率是分類問題中最爲原始的評價指標,準確率的定義是預測正確的結果佔總樣本的百分比,通常來說越接近1越好。其公式如下:
Accuracy=TP(11)+TN(00)TP(11)+TN(00)+FP(01)+FN(10)Accuracy = \frac{TP(11)+TN(00)}{TP(11)+TN(00)+FP(01)+FN(10)}

但是,準確率評價算法有一個明顯的弊端問題,就是在數據的類別不均衡,特別是有極偏的數據存在的情況下,準確率這個評價指標是不能客觀評價算法的優劣的。例如下面這個例子:

在測試集裏,有100個sample,99個反例,只有1個正例。如果我的模型不分青紅皁白對任意一個sample都預測是反例,那麼我的模型的準確率就爲0.99,從數值上看是非常不錯的,但事實上,這樣的算法沒有任何的預測能力,於是我們就應該考慮是不是評價指標出了問題,這時就需要使用其他的評價指標綜合評判了。

2.2 捕捉少數類:精確率(Precision)、召回率(Recall)和F1-score

2.2.1 精準率(Precision)

精準率(Precision) 又叫查準率,它是針對預測結果而言的,它的含義是在所有被預測爲正的(少數)樣本中實際爲正的(少數)樣本的概率,意思就是在預測爲正樣本的結果中,我們有多少把握可以預測正確。其公式如下:

Precision=TP(11)TP(11)+FP(01)Precision = \frac{TP(11)}{TP(11)+FP(01)}

在現實的樣本不平衡例子中,當每一次將多數類判斷錯誤的成本非常高昂的時候(比如大衆召回車輛的例子,警察追捕罪犯),我們會追求高精確度。精確度越低,我們對多數類的判斷就會越錯誤。當然了,如果我們的目標是不計一切代價捕獲少數類,那我們並不在意精確度。

2.2.2 召回率(Recall)

召回率(Recall) 又叫查全率,它是針對原樣本而言的,它的含義是在實際爲正的(少數)樣本中被預測爲正(少數)樣本的概率,其公式如下:

Recall=TP(11)TP(11)+FN(10)Recall = \frac{TP(11)}{TP(11)+FN(10)}

如果我們希望不計一切代價,找出少數類(比如找出癌症患者),那我們就會追求高召回率,相反如果我們的目標不是儘量捕獲少數類,那我們就不需要在意召回率。

注意召回率和精確度的分子是相同的(都是TP(11)),只是分母不同。而召回率和精確度是此消彼長的,兩者之間的平衡代表了捕捉少數類的需求和儘量不要誤傷多數類的需求的平衡。究竟要偏向於哪一方,取決於我們的業務需求:究竟是誤傷多數類的成本更高,還是無法捕捉少數類的代價更高。

2.2.3 P-R曲線(Precision Recall Curve)

P-R曲線(Precision Recall Curve) 正是描述精確率/召回率變化的曲線,P-R曲線定義如下:對於同一個模型,通過調整分類閾值,可以得到不同的P-R值,從而可以得到一條曲線(縱座標爲P,橫座標爲R)。通常隨着分類閾值從大到小變化(大於閾值認爲P),Precision減小,Recall增加。比較兩個分類器好壞時,顯然是查得又準又全的比較好,也就是的PR曲線越往座標(1,1)的位置靠近越好。若一個學習器的P-R曲線被另一個學習器完全”包住”,則後者的性能優於前者。當存在交叉時,可以計算曲線圍住面積,不太容易判斷,但是可以通過平衡點(Break-Even Point,BEP)來判斷,當P=R時的取值,平衡點的取值越高,性能更優。。如下圖所示:
在這裏插入圖片描述

2.2.4 F1-Score

F1-Score 正如上文所述,Precision和Recall指標有時是此消彼長的,即精準率高了,召回率就下降,在一些場景下要兼顧精準率和召回率,最常見的方法就是F1-Measure,又稱F1-Score。F1-Measure是P和R的加權調和平均,即:

F1score=21Recall+1Precision=2PrecisionRecallPrecision+RecallF1-score = \frac{2}{\frac{1}{Recall}+{\frac{1}{Precision}}} = \frac{2*Precision*Recall}{Precision+Recall}

2.2.5 sklearn中的混淆矩陣

含義
sklearn.metrics.confusion_matrix 混淆矩陣
sklearn.metrics.accuracy_score 準確率accuracy
sklearn.metrics.precision_score 精確度precision
sklearn.metrics.recall_score 召回率recall
sklearn.metrics.precision_recall_curve 精確度-召回率平衡曲線
sklearn.metrics.f1_score F1-Score

3、ROC、AUC

ROC以及後面要講到的AUC,是分類任務中非常常用的評價指標,本文將詳細闡述。可能有人會有疑問,既然已經這麼多評價標準,爲什麼還要使用ROC和AUC呢?

因爲ROC曲線有個很好的特性:當測試集中的正負樣本的分佈變化的時候,ROC曲線能夠保持不變。在實際的數據集中經常會出現類別不平衡(Class Imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試數據中的正負樣本的分佈也可能隨着時間變化,ROC以及AUC可以很好的消除樣本類別不平衡對指標結果產生的影響。

另一個原因是,ROC和上面做提到的P-R曲線一樣,是一種不依賴於閾值(Threshold)的評價指標,在輸出爲概率分佈的分類模型中,如果僅使用準確率、精確率、召回率作爲評價指標進行模型對比時,都必須時基於某一個給定閾值的,對於不同的閾值,各模型的Metrics結果也會有所不同,這樣就很難得出一個很置信的結果。

在正式介紹ROC之前,我們還要再介紹兩個指標,這兩個指標的選擇使得ROC可以無視樣本的不平衡。這兩個指標分別是:靈敏度(sensitivity)和特異度(specificity),也叫做真正率(TPR)和假正率(FPR),具體公式如下。

TPR==TP(11)TP(11)+FN(10)=RecallTPR = \frac{正樣本預測正確數}{正樣本總數}= \frac{TP(11)}{TP(11)+FN(10)} = Recall

FPR==FP(01)TN(00)+FP(01)FPR = \frac{負樣本預測錯誤數}{負樣本總數} = \frac{FP(01)}{TN(00)+FP(01)}

ROC曲線中的主要兩個指標就是真正率TPR和假正率FPR,上面已經解釋了這麼選擇的好處所在。其中橫座標爲假正率(FPR),縱座標爲真正率(TPR),下面就是一個標準的ROC曲線圖。
在這裏插入圖片描述
以TPR爲y軸,以FPR爲x軸,我們就直接得到了RoC曲線。從FPR和TPR的定義可以理解,TPR越高,FPR越小,我們的模型和算法就越高效。也就是畫出來的RoC曲線越靠近左上越好。如下圖左圖所示。從幾何的角度講,RoC曲線下方的面積越大越大,則模型越優。所以有時候我們用RoC曲線下的面積,即AUC(Area Under Curve)值來作爲算法和模型好壞的標準。

所以總結一下就是TPR越高,同時FPR越低(即ROC曲線越陡),那麼模型的性能就越好

sklearn中的ROC曲線和AUC面積

在sklearn中,我們有幫助我們計算ROC曲線的橫座標假正率FPR,縱座標Recall和對應的閾值的類sklearn.metrics.roc_curve。同時,我們還有幫助我們計算AUC面積的類sklearn.metrics.roc_auc_score

sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None, max_fpr=None, multi_class='raise', labels=None
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)

舉個例子:

from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
area = roc_auc_score(y,clf.decision_function(X))
FPR, recall, thresholds = roc_curve(y,clf.decision_function(X), pos_label=1)

plt.figure()
plt.plot(FPR, recall, color='red',label='ROC curve (area = %0.2f)' % area)
plt.plot([0, 1], [0, 1], color='black',linestyle='--')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('Recall')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

此外,至於多分類問題以後遇到了再寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章