機器學(xué)習(xí)常見評價指標(biāo)

在機器學(xué)習(xí)或深度學(xué)習(xí)中,評價指標(biāo)是衡量一個模型效果好與壞的標(biāo)準(zhǔn)。
本文主要介紹一些常用的評價指標(biāo),包含:準(zhǔn)確率(accuary)、精準(zhǔn)率、召回率、F1值、PR曲線、ROC曲線、AUC等。
在介紹這些評價指標(biāo)之前,我們先來看一個簡單的例子。

對于輿情預(yù)警,判斷一段輿情文本數(shù)據(jù)是否需要預(yù)警,其結(jié)果有兩種:預(yù)警不預(yù)警。
如果有100條輿情文本,模型A預(yù)測為預(yù)警的樣本數(shù)為25,其中這25個樣本經(jīng)過人工驗證,發(fā)現(xiàn)有20個是真正需要預(yù)警的數(shù)據(jù),另外的5條不需要預(yù)警;預(yù)測為不預(yù)警的樣本數(shù)為75,其中這75個樣本經(jīng)過人工驗證,發(fā)現(xiàn)有10個是真正需要預(yù)警的數(shù)據(jù),另外的65條不需要預(yù)警。

根據(jù)以上描述,我們可以建立如下的矩陣


其中,
模型預(yù)測為預(yù)警,而且人工驗證為預(yù)警,我們稱為真正例(True Positive, TP)
模型預(yù)測為預(yù)警,但是人工驗證為不預(yù)警,我們稱為偽正例(False Positive, FP)
模型預(yù)測為不預(yù)警,但是人工驗證為預(yù)警,我們稱為偽負(fù)例(False Negative, FN)
模型預(yù)測為不預(yù)警,而且人工驗證為不預(yù)警,我們稱為真負(fù)例(True Negative, TN)
根據(jù)以上定義,我們可知 TP=20,F(xiàn)P=5,F(xiàn)N=10,TN=65

1.準(zhǔn)確率

準(zhǔn)確率(Accuary)應(yīng)該是一種最基礎(chǔ)的評價指標(biāo),描述的是整體結(jié)果的預(yù)測正確與否。
Accuary = 預(yù)測正確樣本量 / 總樣本量
預(yù)測正確的樣本量包含TP和TN,所以

通過scikit-learn中的accuracy_score可直接計算出準(zhǔn)確率

>>> from sklearn.metrics import accuracy_score
>>> y_pred = [0, 2, 1, 3]
>>> y_true = [0, 1, 2, 3]
# normalize:默認(rèn)值為True,返回正確分類的比例;如果為False,返回正確分類的樣本數(shù)
>>> accuracy_score(y_true, y_pred)
0.5
>>> accuracy_score(y_true, y_pred, normalize=False)
2

2.精準(zhǔn)率、召回率、F1值

準(zhǔn)確率評價指標(biāo)有一個明顯的弊端問題,即在數(shù)據(jù)類別不均衡的情況下,準(zhǔn)確率指標(biāo)不能客觀得評價一個模型的效果,如:

現(xiàn)有另外100條輿情數(shù)據(jù),其中99條是不需要預(yù)警的數(shù)據(jù),只有1條是需要預(yù)警,如果我們訓(xùn)練一個模型B,該模型直接將全部輸入的輿情數(shù)據(jù)預(yù)測為不預(yù)警,那么根據(jù)準(zhǔn)確率指標(biāo),則Accuary=99/100=0.99
如果單看準(zhǔn)確率指標(biāo),則我們可以認(rèn)為模型B效果很好,但是實際上模型B沒什么意義,所以這時就需要其他評價指標(biāo)了,如精準(zhǔn)率(precision)、召回率(recall)、F1值等。

通常在評價我們訓(xùn)練的機器學(xué)習(xí)/深度學(xué)習(xí)模型中,精準(zhǔn)率、召回率和F1值都是一起使用的,根據(jù)此三個指標(biāo)可相對綜合客觀地評價一個模型效果的好壞。

精準(zhǔn)率(precision) 跟準(zhǔn)確率有點相似,但是兩者是完全不同的概念。
精準(zhǔn)率表示的是在所有被預(yù)測為正例的樣本中實際為正的樣本的概率,可以理解為當(dāng)模型預(yù)測結(jié)果為正的時候,我們有多大的把握相信模型是對的,其公式如下:

>>> from sklearn.metrics import precision_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> precision_score(y_true, y_pred, average='macro')
0.2222222222222222
>>> precision_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> precision_score(y_true, y_pred, average='weighted')
0.2222222222222222
>>> precision_score(y_true, y_pred, average=None)
array([0.66666667, 0.        , 0.        ])

召回率(recall) 表示的是在所有實際為正例的樣本中被預(yù)測為正例的樣本的概率,可以理解為模型將樣本中所有正例樣本預(yù)測正確的概率,其公式如下:

>>> from sklearn.metrics import recall_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> recall_score(y_true, y_pred, average='macro')
0.3333333333333333
>>> recall_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> recall_score(y_true, y_pred, average='weighted')
0.3333333333333333
>>> recall_score(y_true, y_pred, average=None)
array([1., 0., 0.])

F1值是精準(zhǔn)率和召回率的一個綜合評價指標(biāo),其公式如下:

>>> from sklearn.metrics import f1_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> f1_score(y_true, y_pred, average='macro')
0.26666666666666666
>>> f1_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> f1_score(y_true, y_pred, average='weighted')
0.26666666666666666
>>> f1_score(y_true, y_pred, average=None)
array([0.8, 0. , 0. ])

通常精準(zhǔn)率跟召回率呈現(xiàn)一個此消彼長的過程,因此選擇模型的時候需要依據(jù)具體的業(yè)務(wù)場景。
如果是"寧可錯殺一千,不放過一個",則此時需要在保證一定的準(zhǔn)確率基礎(chǔ)上優(yōu)先考慮召回率;
如果是"精準(zhǔn)打擊",則此時需要在保證一定召回率基礎(chǔ)上優(yōu)先考慮精確率。

metrics.classification_report函數(shù)可以將精準(zhǔn)率、召回率及F1一次性輸出,關(guān)于該函數(shù)的具體介紹,可參考前一篇文章:http://www.itdecent.cn/p/757dfef76e13

3.PR曲線

P-R曲線(Precision Recall Curve)描述的是精確率與召回率之間變化關(guān)系的曲線。

P-R曲線定義:
根據(jù)學(xué)習(xí)器的預(yù)測結(jié)果(一般為一個實值或概率)對測試樣本進(jìn)行排序,將最可能是“正例”的樣本排在前面,最不可能是“正例”的排在后面,按此順序逐個把樣本作為“正例”進(jìn)行預(yù)測,每次計算出當(dāng)前的P值和R值。

PR曲線圖如下所示:


從precision與Recall的指標(biāo)上來看,precision與Recall越高說明模型效果越好,那么基于此,在PR曲線圖中,越靠右上角的曲線所代表的分類器效果更好,圖中模型A、B、C的效果從高到低依次是:Model A>Model B > Model C

PR曲線下方的面積叫AP分?jǐn)?shù),能在一定程度上反應(yīng)模型的精確率和召回率都很高的比例。但這個值不方便計算,綜合考慮精度與召回率一般使用F1函數(shù)或者AUC值(因為ROC曲線很容易畫,ROC曲線下的面積也比較容易計算)。

4.ROC曲線

在分類任務(wù)中,大部分模型輸出的都是各個類別的預(yù)測概率或得分,通常我們會設(shè)置一個閾值或選取概率/得分最大的那個類別輸出。此時,如果選擇精準(zhǔn)率、召回率、F1值等指標(biāo)來評估模型效果時,或多或少會受到一定的影響,而ROC曲線(Receiver Operating Characteristic, ROC)正好可以消除這種影響,其可以在不設(shè)置閾值的情況下對模型進(jìn)行評估,得到的結(jié)果更能反應(yīng)模型的真實效果。

ROC曲線還有另一個很好的特性:當(dāng)測試集中的正負(fù)樣本的分布變化的時候,ROC曲線能夠保持不變。在實際的數(shù)據(jù)集中經(jīng)常會出現(xiàn)類別不平衡現(xiàn)象,即負(fù)樣本比正樣本多很多(或者相反),而且測試數(shù)據(jù)中的正負(fù)樣本的分布也可能隨著時間變化,ROC以及AUC可以很好的消除樣本類別不平衡對指標(biāo)結(jié)果產(chǎn)生的影響。

ROC曲線又稱接受者操作特征曲線,其縱坐標(biāo)是真正率(True Positive Rate, TPR),橫坐標(biāo)是假正率(False Positive Rate, FPR)。


ROC曲線如下圖所示


ROC曲線越靠近左上角,此時模型效果越好,如果處于左上角,此時FPR=0,TPR=1,根據(jù)FPR和TPR公式,此時FN=0,F(xiàn)P=0,模型對所有樣本分類正確。

繪制ROC曲線很簡單,首先對所有樣本按預(yù)測概率排序,以每條樣本的預(yù)測概率為閾值,計算相應(yīng)的FPR和TPR,然后線段連接。

當(dāng)數(shù)據(jù)量少時,繪制的ROC曲線不平滑;當(dāng)數(shù)據(jù)量大時,繪制的ROC曲線會趨于平滑。

一般來說,如果ROC是光滑的,那么基本可以判斷沒有太大的overfitting,這個時候調(diào)模型可以只看AUC,面積越大一般認(rèn)為模型越好。

5.AUC

AUC(Area Under Curve)是處于ROC曲線下方的面積。ROC曲線下方面積越大,也即AUC越大表明模型效果越好。

物理意義
AUC對所有可能的分類閾值的效果進(jìn)行綜合衡量。首先AUC值是一個概率值,可以理解為隨機挑選一個正樣本以及一個負(fù)樣本,分類器判定正樣本分值高于負(fù)樣本分值的概率就是AUC值。簡言之,AUC值越大,當(dāng)前的分類算法越有可能將正樣本分值高于負(fù)樣本分值,即能夠更好的分類。

參考

一文讀懂機器學(xué)習(xí)分類模型評價指標(biāo)
【機器學(xué)習(xí)】一文讀懂分類算法常用評價指標(biāo)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容