序言
在機器學習中,性能指標(Metrics)是衡量一個模型好壞的關鍵,通過衡量模型輸出y_predict
和 y_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):
准確率是使用的最普遍的,也是最直觀的性能指標,其定義如下:
意義是預測正確的sample占所有sample的比例,表示了一個分類器的區分能力,注意,這里的區分能力沒有偏向於是正例還是負例,這也是Accuracy作為性能指標最大的問題所在
假設是一個地震的分類器,0表示沒有地震,1表示地震,由於地震概率非常小(通常是1e-x級別,姑且認為地震的概率是0.0001吧),因此,只要所有的例子來都猜是0,就能夠是准確率(Accuracy)達到0.9999,使用Acc看來,這是一個好的分類器,而其實不然。對於地震的分類器,我們關心的是不是所有的正例全都被判別出來,至於一些時候,沒有地震時,我們預測為1,只要在可接受范圍內,那么,這個分類器就是一個好的分類器。
可以看到,對於數據不平衡或是當某一方數據漏掉(通常是把這樣的例子作為正例)時會產生很大的代價的時候,我們需要更有效的指標作為補充。
精確率(Precision):
有時也叫查准率,定義如下:
從定義中可以看出,精確率代表的是:在所有被分類為正例的樣本中,真正是正例的比例。簡單的來說,
“你說的1有多大概率是1!”, 就是這個道理。
這個指標常常被應用於推薦系統中,對某一個商品,以用戶喜歡為1,不喜歡為0,使用查准率進行性能衡量。
在這個問題中,查准率可以理解成“網易雲音樂每日推薦的20首歌曲中,我喜歡的歌曲所占的比例”
召回率(Recall):
也被稱為查全率,在醫學上常常被稱作敏感度(Sensitive),定義如下:
召回率的定義是,在所有實際為正例的樣本中,被預測為正例的樣本比例,簡單說就是“總共這么多1,你預測除了多少?”
在醫學領域(包括剛才說的地震),常把患病(發生地震)這樣的高風險類別作為正類,當漏掉正類的代價非常高,像是漏診可能導致病人的延遲治療,或是地震了沒有預測出來將會產生巨大的人員傷亡時,召回率就派上用場了。
在醫學中,必須極力降低漏診率,而誤診相對於誤診(把負例判為正例)相對於漏診的重要性就低了很多。
特異性(Specificity):
特異性,定義如下:
特異性的語義為:實際為負的樣本中,有多大概率被預測出來,這個定義和召回率
非常像,二者區別只是對象不同,召回率是針對正例,而特異性針對的是負例。可以簡單把特異性理解成“負例查全率”。
特異性在醫療中也被認為是一個重要指標,為什么呢,因為特異性低也就是“誤診率高”,舉一個極端例子,一個分類器把所有的樣本都判定成患病,此時敏感度為1,但是有特異性卻很低。因此,在醫學領域,特異性和敏感度是需要同時考量的。
ROC曲線:
ROC曲線的全稱叫做Receiver Operating Characteristic,常常被用來判別一個分類器的好壞程度,一下是一個ROC的例子:
上圖引用自(http://alexkong.net/2013/06/introduction-to-auc-and-roc/)
首先看一下x軸坐標是False positive rate,即假正例率,其定義如下:
這個指標乍一看比較奇怪,但是仔細對比一下公式可以發現,\(FPR = 1 - SP\)假正例率代表的負例中沒有查出來的概率,簡單說是“總共有這么多0,分類器沒有查出來多少”而沒有查出來的,自然就都被分為1了,那么這些0就被誤診了,因此,FPR代表的其實是“誤診率”。
就是他想表達的意思。
再看一下y軸是True positive rate真正例率,定義是:
回頭看一下,其實就是敏感度和召回率啦~
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')
有待更新……