1. 程式人生 > 其它 >機器學習中的評價指標--01

機器學習中的評價指標--01

機器學習中的評價指標--01

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

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

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

跑完分類模型(Logistic迴歸、決策樹、神經網路等),我們經常面對一大堆模型評估的報表和指標,如ACC、ROC、AUC等,我們下面對各個評估指標逐一說明。

效能指標的分類

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

學習分類 效能指標
分類 Accuracy、precision、Recall、F1 Score、ROC Curve、PR Curve、AUC
迴歸 MAE、MSE、RMSE

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

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

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

這裡解釋一下上面列聯表的意思:
T/F(True/False)表示預測是否正確P/N(Positive/Negative)表示 預測的label而不是實際的label。

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

準確率(Accuracy):

準確率是使用的最普遍的,也是最直觀的效能指標,其定義如下:
(TP+TN)/(TP+FN+FP+TN)

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

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

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

精確率(Precision):

有時也叫查準率,定義如下:
TP/(TP+FP)
從定義中可以看出,精確率代表的是:在所有被分類為正例的樣本中,真正是正例的比例。簡單的來說,
“你說的1有多大概率是1!”, 就是這個道理。

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

召回率(Recall):

也被稱為查全率,在醫學上常常被稱作敏感度(Sensitive),定義如下:
TP/(TP+FN)
召回率的定義是,在所有實際為正例的樣本中,被預測為正例的樣本比例,簡單說就是“總共這麼多1,你預測對了多少?”

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

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

特異性(Specificity):

特異性,定義如下:
SP=TN/(FP+TN)

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

F1 分數(F1 Score)

又稱平衡F分數(balanced F Score),它被定義為精確率和召回率的調和平均數。

更一般的,我們定義

除了 F1分數之外, F2分數和F0.5分數在統計學中也得到大量的應用。其中,

F2分數中,召回率的權重高於準確率,而F0.5分數中,準確率的權重高於召回率。

物理意義
人們通常使用準確率和召回率這兩個指標,來評價二分類模型的分析效果。

但是當這兩個指標發生衝突時,我們很難在模型之間進行比較。比如,我們有如下兩個模型A、B,A模型的召回率高於B模型,但是B模型的準確率高於A模型,A和B這兩個模型的綜合性能,哪一個更優呢?

準確率 召回率
A 0.8 0.9
B 0.9 0.8

為了解決這個問題,人們提出了Fβ分數。

Fβ的物理意義就是將準確率和召回率這兩個分值合併為一個分值,在合併的過程中,召回率的權重是準確率的β倍. F1分數認為召回率和準確率同等重要, F2分數認為召回率的重要程度是準確率的2倍,而F0.5分數認為召回率的重要程度是準確率的一半。

ROC曲線:

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

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

FPR=FP/(FP+TN)

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

被誤診的人數/所有健康的人數

就是他想表達的意思。

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

TPR=TP/(TP+FN)

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

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

在一個二分類模型中,假設採用邏輯迴歸分類器,其給出針對每個例項為正例的概率,那麼通過設定一個閾值如 0.6,概率大於等於 0.6 的為正例,小於 0.6 的為負例。對應的就可以算出一組(FPR,TPR),在平面中得到對應座標點。隨著閾值的逐漸減小,越來越多的例項被劃分為正例,但是這些正例中同樣也摻雜著真正的負例,即 TPR 和 FPR 會同時增大。閾值最大時,對應座標點為(0,0),閾值最小時,對應座標點(1,1)。

原來,畫出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')

AUC 值的計算

AUC (Area Under Curve) 被定義為 ROC 曲線下的面積,顯然這個面積的數值不會大於 1。又由於 ROC 曲線一般都處於 y=x 這條直線的上方,所以 AUC 的取值範圍一般在 0.5 和 1 之間。使用 AUC 值作為評價標準是因為很多時候 ROC 曲線並不能清晰的說明哪個分類器的效果更好,而作為一個數值,對應 AUC 更大的分類器效果更好。

AUC 的計算有兩種方式,梯形法和 ROC AUCH 法,都是以逼近法求近似值,具體見wikipedia。

AUC 意味著什麼
那麼 AUC 值的含義是什麼呢?根據(Fawcett, 2006),AUC 的值的含義是:

The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.

這句話有些繞,我嘗試解釋一下:首先 AUC 值是一個概率值,當你隨機挑選一個正樣本以及一個負樣本,當前的分類演算法根據計算得到的 Score 值將這個正樣本排在負樣本前面的概率就是 AUC 值。當然,AUC 值越大,當前的分類演算法越有可能將正樣本排在負樣本前面,即能夠更好的分類。

從 AUC 判斷分類器(預測模型)優劣的標準:

  • AUC = 1,是完美分類器,採用這個預測模型時,存在至少一個閾值能得出完美預測。絕大多數預測的場合,不存在完美分類器。
  • 0.5 < AUC < 1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。
  • AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。
  • AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優於隨機猜測。

三種 AUC 值示例:

簡單說:AUC 值越大的分類器,正確率越高。

為什麼使用 ROC 曲線
既然已經這麼多評價標準,為什麼還要使用 ROC 和 AUC 呢?因為 ROC 曲線有個很好的特性:當測試集中的正負樣本的分佈變化的時候,ROC 曲線能夠保持不變。在實際的資料集中經常會出現類不平衡(class imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試資料中的正負樣本的分佈也可能隨著時間變化。下圖是 ROC 曲線和Precision-Recall曲線的對比:

在上圖中,(a)和(c)為 ROC 曲線,(b)和(d)為 Precision-Recall 曲線。(a)和(b)展示的是分類其在原始測試集(正負樣本分佈平衡)的結果,(c)和(d)是將測試集中負樣本的數量增加到原來的 10 倍後,分類器的結果。可以明顯的看出,ROC 曲線基本保持原貌,而 Precision-Recall 曲線則變化較大。