機器學習常用性能指標總結


序言

在機器學習中,性能指標(Metrics)是衡量一個模型好壞的關鍵,通過衡量模型輸出y_predicty_true之間的某種"距離"得出的。

性能指標往往是我們做模型時的最終目標,如准確率召回率敏感度等等,但是性能指標常常因為不可微分,無法作為優化的loss函數,因此采用如cross-entropy, rmse等“距離”可微函數作為優化目標,以期待在loss函數降低的時候,能夠提高性能指標。而最終目標的性能指標則作為模型訓練過程中,作為驗證集做決定(early stoping或model selection)的主要依據,與訓練結束后評估本次訓練出的模型好壞的重要標准。

在機器學習的比賽中,有部分比賽也是用metrics作為排名的依據(當然也有使用loss排名)。

性能指標的分類

性能指標根據問題不同,主要分為:

  • 回歸類性能指標
  • 分類性能指標

回歸類性能指標,如RMSE,MSE等,有待更新

二分類性能指標(最經常使用)

首先一說到二分類性能指標,一般都會祭出混淆矩陣,我們這里給出混淆矩陣:

預測1 預測0 合計
實際1(P) \(TP\) \(FN\) \(TP+FN(P)\)
實際0(N) \(FP\) \(TN\) \(FP+TN(N)\)
合計 \(TP+FP\) \(FN+TN\) \(TP+FN+FP+TN\)

這里解釋一下上面列聯表的意思:
T/F表示預測是否正確,P/N表示 預測的label而不是實際的label,由於總是忘記這一點,一定要寫出來

好了有了列聯表就可以使用數學公式描述各個Metrics的含義了

准確率(Accuracy):

准確率是使用的最普遍的,也是最直觀的性能指標,其定義如下:

\[ \frac{TP+TN}{TP+FN+FP+TN} \]

意義是預測正確的sample占所有sample的比例,表示了一個分類器的區分能力,注意,這里的區分能力沒有偏向於是正例還是負例,這也是Accuracy作為性能指標最大的問題所在

假設是一個地震的分類器,0表示沒有地震,1表示地震,由於地震概率非常小(通常是1e-x級別,姑且認為地震的概率是0.0001吧),因此,只要所有的例子來都猜是0,就能夠是准確率(Accuracy)達到0.9999,使用Acc看來,這是一個好的分類器,而其實不然。對於地震的分類器,我們關心的是不是所有的正例全都被判別出來,至於一些時候,沒有地震時,我們預測為1,只要在可接受范圍內,那么,這個分類器就是一個好的分類器。

可以看到,對於數據不平衡或是當某一方數據漏掉(通常是把這樣的例子作為正例)時會產生很大的代價的時候,我們需要更有效的指標作為補充。

精確率(Precision):

有時也叫查准率,定義如下:

\[ \frac{TP}{TP+FP} \]

從定義中可以看出,精確率代表的是:在所有被分類為正例的樣本中,真正是正例的比例。簡單的來說,

“你說的1有多大概率是1!”, 就是這個道理。

這個指標常常被應用於推薦系統中,對某一個商品,以用戶喜歡為1,不喜歡為0,使用查准率進行性能衡量。
在這個問題中,查准率可以理解成“網易雲音樂每日推薦的20首歌曲中,我喜歡的歌曲所占的比例”

召回率(Recall):

也被稱為查全率,在醫學上常常被稱作敏感度(Sensitive),定義如下:

\[ \frac{TP}{TP+FN} \]

召回率的定義是,在所有實際為正例的樣本中,被預測為正例的樣本比例,簡單說就是“總共這么多1,你預測除了多少?

在醫學領域(包括剛才說的地震),常把患病(發生地震)這樣的高風險類別作為正類,當漏掉正類的代價非常高,像是漏診可能導致病人的延遲治療,或是地震了沒有預測出來將會產生巨大的人員傷亡時,召回率就派上用場了。

在醫學中,必須極力降低漏診率,而誤診相對於誤診(把負例判為正例)相對於漏診的重要性就低了很多。

特異性(Specificity):

特異性,定義如下:

\[ SP = \frac{TN}{FP+TN} \]

特異性的語義為:實際為負的樣本中,有多大概率被預測出來,這個定義和召回率非常像,二者區別只是對象不同,召回率是針對正例,而特異性針對的是負例。可以簡單把特異性理解成“負例查全率”。
特異性在醫療中也被認為是一個重要指標,為什么呢,因為特異性低也就是“誤診率高”,舉一個極端例子,一個分類器把所有的樣本都判定成患病,此時敏感度為1,但是有特異性卻很低。因此,在醫學領域,特異性敏感度是需要同時考量的。

ROC曲線:

ROC曲線的全稱叫做Receiver Operating Characteristic,常常被用來判別一個分類器的好壞程度,一下是一個ROC的例子:

上圖引用自(http://alexkong.net/2013/06/introduction-to-auc-and-roc/)

首先看一下x軸坐標是False positive rate,即假正例率,其定義如下:

\[ FPR = \frac{FP}{FP+TN} \]

這個指標乍一看比較奇怪,但是仔細對比一下公式可以發現,\(FPR = 1 - SP\)假正例率代表的負例中沒有查出來的概率,簡單說是“總共有這么多0,分類器沒有查出來多少”而沒有查出來的,自然就都被分為1了,那么這些0就被誤診了,因此,FPR代表的其實是“誤診率”。

\[ \frac{被誤診的人數}{所有健康的人數} \]

就是他想表達的意思。

再看一下y軸是True positive rate真正例率,定義是:

\[ TPR = \frac{TP}{TP+FN} \]

回頭看一下,其實就是敏感度和召回率啦~

ok,現在明白了,ROC的x軸是誤診率,y軸是漏診率。可是一個分類器只可能得到一個數字,為什么會得出上圖畫出的那條曲線呢?

原來,畫出ROC的曲線的方法不只是計算一次誤診率和漏診率,按照以下方式進行:
1. 將分類器預測為正例的概率從小到大排序
2. 把每兩個樣本間的概率作為閾值,小於該閾值的分為負例,大於的分為正例
3. 分別計算TPR和FPR
4. 轉2
5. 當所有閾值都被枚舉完之后,獲得一組(TPR, FPR)的坐標點,將他們畫出來。結束

這就是ROC曲線的畫法,sklearn中已經對大量以上所說的性能指標做了實現,以下是ROC曲線在sklearn中如何調用

    from sklearn.metrics import roc_curve
    import matplotlib.pyplot as plt
    
    p_rate = model.get_prob(X) #計算分類器把樣本分為正例的概率
    fpr, tpr, thresh = roc_curve(y_true, p_rate)
   
    plt.figure(figsize=(5, 5))
    plt.title('ROC Curve')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.grid(True)
    plt.plot(fpr, tpr)
    plt.savefig('roc.png')

有待更新……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM