機器學習筆記(十三)——重中之重的性能度量方式你要懂

性能度量

本文參考《機器學習》和《機器學習實戰》

在之前講述的所有分類介紹中,我們都是假設所有類別的分類代價是一樣的,由於主要探討的是二分類問題,所以可看作1和0的分類代價相同。

而對於分類代價相同的問題,我們通常利用正確率或錯誤率來評價所構建分類器性能的好壞。比如手寫數字識別系統,對於測試數據集,它的準確率可以達到98%,就可以說這個模型比較不錯。

但是我們現在考慮癌症檢測問題,我們也通過某種算法構建了一個準確率不錯的分類器,將病人相關數據輸入,會得出一個預測結果——陽性或陰性。假如這個人沒有患病,分類器預測結果卻是陽性,這可能只是影響病人的心情,在做幾次檢測可以解決的問題;但是假如這個人患病了,分類器預測結果爲陰性,那麼病人可能不會重視,直至癌症晚期,從而失去了生命。

這個時候分類器的準確率已經不足以評判該模型的好壞,因爲我們更看重的是從患癌症中的人有多少可以被成功地檢測出來,所以我們需要考察一種新的分類器性能度量的方法。

查準率、查全率

現在一般都會遇見一個情況就是在淘寶剛剛搜過的物品,而當你刷抖音或者朋友圈的時候會給推薦類似的商品。它肯定不可能隨意推薦,一定是根據你的喜好,而這時就需要注重兩個事情,一是“推薦的物品有多少是用戶感興趣的”、二是“用戶感興趣的物品有多少被推薦”。

針對上述兩種情況,就有了查準率(precision)和查全率(recall)兩種更加適應此類需求的性能度量,也可以稱之爲正確率和召回率,在不同文獻中可能有不同的名字。

在介紹這兩個概念之間需要知道什麼是混淆矩陣:

在這裏插入圖片描述

其中T、F、P、N分別對應四個單詞True、False、Positive、Negative。如何快速記下混淆矩陣呢?先看第一個字母,如果第一個字母爲T,代表預測結果與真實結果一致,F則反之。

比如FN,預測出的結果是反例(N),但它預測結果與真實結果不一致(F),所以真實結果應該爲正例§;而對於TN,預測的結果是反例(N),但它預測的結果與真實結果一致(T),所以真實結果也爲反例(N)。

由上述混淆矩陣就可以得出查準率公式和查全率公式。
查準率公式如下:

在這裏插入圖片描述

查全率公式如下:

在這裏插入圖片描述

查準率給出的是預測爲正例的樣本中的真正正例的比例;查全率給出的是預測爲正例的真實正例佔所有真實正例的比例。

可以很容易構造一個高查準率或高查全率的分類器,但是很難保證兩者同時成立。比如將所有樣本都判定爲正例,那麼此時查全率是很高的,但是查準率卻很低,所以兩者之間是相互矛盾的關係。

P-R曲線與F1度量

像邏輯迴歸、AdaBoost等算法構建出的分類器,並不能直接得出分類結果是1還是0,而是通過和一個閾值比較進行判斷,前者是通過Sigmoid函數判斷,後者則是通過符號函數sign判斷。

假如對樣本進行一個簡單的排序,排在最前面的是分類器認爲“最可能”分類爲正例的樣本,排在後面的則是分類器認爲“最不可能”分類爲正例的樣本,按照這個順序逐個把樣本當做正例預測,每次就可算出當前的查準率和查全率。

而通過查準率和查全率則可繪製出相關的曲線——PR曲線:

在這裏插入圖片描述

對於不同分類器而言,當其對應的PR曲線越向右上角凸出則代表該分類器越優,比如B分類器優於C分類器。而對於產生交叉的兩條曲線,則是比較其對應的“平衡點(BEP)”值的大小,平衡點就是曲線的查準率和查全率相等的點,所以A分類器優於B分類器。

除了“平衡點”之外,更加常用的是通過F1度量來判斷兩個分類器之間性能的高低:

在這裏插入圖片描述

而在不同的應用情景下,我們可能更加註重查準率和查全率其中之一,FβF_\beta則可以體現出分類器對查準率或查全率的偏好:

在這裏插入圖片描述

β=1\beta=1時,FβF_\beta退化至標準的F1度量;當β>1\beta>1時,查全率有更大的影響;β<1\beta<1時,查準率有更大的影響。

ROC曲線

除了PR曲線之外,ROC曲線也可以用來對模型性能評估,在繪製ROC曲線之前,也需要將樣本進行排序,方式與繪製PR曲線前排序一致。PR曲線是以查準率和查全率作爲橫縱座標軸,而ROC曲線是以真正例率(真陽率)、假正例率(假陽率)作爲橫縱座標軸繪製曲線。

而真正例率和假正例率也是基於混淆矩陣得到的。
真正例率公式如下:

在這裏插入圖片描述

假正例率公式如下:

在這裏插入圖片描述

其中真正例率是真正例所佔真實爲正例的比例;假正例率是假正例所佔真實爲反例的比例。

以假正例率作爲x軸、以真正例率作爲y軸可繪製ROC曲線圖如下:

在這裏插入圖片描述

上圖有兩個ROC曲線,左側的預測樣本是無限的,所以對應的ROC曲線是平滑的,虛線給出的是隨機猜測的結果曲線;而現實中數據集都是有限的,所以右側有棱角的ROC曲線纔是常見的。

在理想的情況下,最佳分類器應該儘可能處於左上角,這意味着該分類器假正例率非常低的同時又有着很高的真正例率。

比較不同的ROC曲線通常是比較曲線所覆蓋的陰影面積,這個指標被稱作AUC,它只是給出的分類器的平均性能值,並不能完全代表ROC曲線,一個完美的分類器對應AUC的值爲1.0,而隨機猜測的AUC的值爲0.5。下面將會給出繪製ROC曲線的代碼,並作簡要介紹。

在這裏插入圖片描述

上圖中Inst#代表排序、Class代表分類標籤(p爲正、n爲負)、Score代表預測強度,即有多少可能被分類器預測爲正類,在這張圖的基礎上繪製ROC曲線。

首先在所有排序的樣本最左邊畫一條線,如下:123...20|1·2·3...20 線左邊的樣本被認爲是正類,右邊的被認爲是負類,此時TP=0,FN=10,TN=10,FP=0,所以TPR=0(Y軸),FPR=0(X軸),該點位於原點(0,0)。

然後將豎線向右移動,如下: 1234...201|2·3·4...20 同樣線左邊的樣本被認爲是正類,右邊的被認爲是負類,此時TP=1,FN=9,TN=10,FP=0,所以TPR=0.1(Y軸),FPR=0(X軸)。

依次類推,知道豎線移動到20的右邊,通過這樣的推導就可以總結出一個規律,每次碰到一個預測爲正類的樣本,在Y方向上加一個步長,否則就要在X方向上加一個步長,Y軸步長和X軸步長就是1除以正類樣本或者負類樣本的個數。

當然這個前提是預測強度的排列由大到小排列,如果排列順序是由小至大,起點就變成了(1,1),加一個步長相應變爲減一個步長。

下面給出了繪製對應ROC曲線圖的代碼:

# 分類器的預測強度
predStrengths = [0.9,0.8,0.7,0.6,0.55,0.54,0.53,0.52,0.51,0.505,
                 0.4,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.30,0.1]
# 類別標籤
classLabels = [1,1,0,1,1,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0]
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) # 中文字體
cur = (0.0, 0.0) # 起始位置
ySum = 0.0
numPosClas = np.sum(np.array(classLabels) == 1.0) # 統計正類的數量
yStep = 1 / float(numPosClas) # y軸步長
xStep = 1 / float(len(classLabels) - numPosClas) # x軸步長

print("y軸步長爲:",yStep)
print("x軸步長爲:",xStep)
sortedIndicies = sorted(predStrengths,reverse=True) # 將預測強度從大到小排列

fig = plt.figure()
fig.clf()
ax = plt.subplot(111)
# 遍歷整個類別數組,如果標籤爲1,縱軸加上一個步長;
# 如果標籤爲0,橫軸加上一個步長。
for index in range(len(sortedIndicies)):
    if classLabels[index] == 1:
        delX = 0; delY = yStep
    else:
        delX = xStep; delY = 0
        ySum += cur[1] # 縱軸上的高度累加,用於計算AUC
    ax.plot([cur[0], cur[0] + delX], [cur[1], cur[1] + delY], c = 'b') # 繪製ROC曲線
    cur = (cur[0] + delX, cur[1] + delY) #更新繪製光標的位置
ax.plot([0,1], [0,1], 'b--') # 繪製虛線
plt.title('ROC曲線', FontProperties = font)
plt.xlabel('假正例率', FontProperties = font)
plt.ylabel('真正例率', FontProperties = font)
ax.axis([0, 1, 0, 1])
print('AUC面積爲:', ySum * xStep) # 計算AUC的值
plt.show()

ROC曲線圖片如下:
在這裏插入圖片描述

計算對應的AUC面積也是非常簡單的,從圖中可以看到Y軸步長和X軸步長都爲0.1,我們可以將這個不規則圖形劃分成10個寬爲0.1的矩形,所以只需要算出每個矩形的高,進行累加運算,然後在乘以0.1就可以得出AUC的面積。

在這裏插入圖片描述

總結

上述知識是機器學習中相當重要的一部分,也是機器學習的基礎,因爲構建一個分類器往往是比較容易的,而第一次構建出的分類器並不能保證其性能最優,所以在此基礎上更多操作是對分類器進行調優,我們在調優時針對不同的應用場景可能度量分類器性能的方式也會有所不同。

關注公衆號【奶糖貓】獲取每篇文章的源碼和數據,歡迎各位夥伴和博主交流呀。

在這裏插入圖片描述

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