<b>1.4 性能衡量名額</b>
在上一節讨論預測模組化過程的時候,我們讨論了利用訓練集和測試集對被訓練模型的性能進行評估的重要性。在本節,我們要審視在描述不同模型的預測精确度時常遇見的某些性能衡量名額。其實,根據問題的不同類型,會需要使用略有差異的性能評估方式。由于本書讨論的重點是有監督的模型,是以我們會審視如何評估回歸模型和分類模型。對于分類模型,我們還會讨論二進制分類任務這樣一個非常重要且經常遇到各類問題的模型所采用的某些額外的衡量名額。
1.4.1 評估回歸模型
在一個回歸的場景裡,讓我們回顧一下,通過模型,我們要建構一個函數,它是理論上的基礎目标函數f的近似。該模型的輸入是我們選擇的輸入特征的值。如果我們把這個函數運用到訓練資料裡的每個用函數真實值yi标記的觀測資料xi,我們就會得到一組(yi, i)的配對資料。為了確定我們清楚最後一點,這裡的第一個資料項是在我們訓練資料的第i條觀測資料的輸出變量實際值,而第二個資料項則是把我們的模型運用到該觀測資料的特征值上産生的預測值。
如果模型和資料拟合得很好,在訓練集裡這兩個值就會互相非常接近。如果在測試集裡也是如此,那麼就認為這個模型應該能對将來的未知觀測資料有良好的表現。為了對預測值和正确值在一個資料集的所有觀測資料中互相接近的概念進行量化,我們要定義一個衡量名額,它稱為均方差(mean square error,mse),如下所示:
這裡的n是資料集裡觀測資料的總數。是以,這個方程告訴我們,首先要對測試集裡每條觀測資料i計算其輸出值及預測值之差的平方,然後把它們累加起來再除以觀測資料的數量,得到所有這些值的平均數。這樣,這個衡量名額被稱為均方差的原因就很清楚了。這個數值越低,觀測資料中輸出變量的實際值和我們預測結果之間的平均誤差越小,我們的模型就越準确。我們有時候也會參考均方根誤差(root mean square error,rmse),它是均方差和誤差平方和(sum of squared error,sse)的平方根,其中誤差平方和sse和均方差mse 是相似的,隻是它沒有除以訓練樣本個數n而産生歸一化結果。對訓練資料集計算得到的這些數量值是很有價值的,它的較小數值就表明我們充分訓練了模型。總體而言我們并不期望它達到0,而且由于過拟合的問題,我們也不能根據這些數量值在模型中進行取舍。而計算這些衡量名額的關鍵領域是測試資料。在大部分情況下,某個模型訓練資料的均方差(或者等同的名額:均方根誤差或誤差平方和)會比對測試資料計算出的相應衡量名額更小。存在過拟合資料情況的模型m1和另一個模型m2對比,往往可以通過m1模型産生了更低的訓練均方差卻有更高的測試均方差來進行識别。
1.4.2 評估分類模型
在回歸模型裡,我們的預測函數對于特定觀測資料xi産生近似輸出yi的不正确程度是在均方差裡展現的。具體而言,對較大的誤差取平方會導緻在某個資料點上的很大誤差比多個資料點上的一些小誤差影響更大。這恰恰是因為在回歸中,我們處理的是數值型輸出,這樣不僅可以衡量我們對于哪些觀測資料的預測不夠好,還可以衡量我們偏離了多遠。
對于進行分類的模型,我們也可以定義一個誤差率,但這裡我們隻能讨論模型作出錯誤分類的數量。具體地說,錯誤率是由如下公式給出的:
這個衡量名額利用了訓示函數(indicator function),它在預測類别和标簽類别不同的情況下傳回的值為1。是以,誤差率就可以這樣進行計算:對輸出變量的類型預測錯誤個數進行計數,然後把這個計數除以資料集裡的觀測資料數量。在這種方式下,可以看到,誤差率實際上是模型作出錯誤分類的觀測資料所占的百分比。必須要指出的是,這種衡量名額把所有類型的分類錯誤視為等同的。如果某些錯誤分類的成本要高于其他錯誤分類,那麼這種衡量名額可以通過加入權值來進行調整,這些權值的作用是給每種錯誤的分類乘以一個與其成本成比例的數量。
如果要診斷某個回歸問題中誤差的最大來源,我們往往會先檢視預測值和實際值之間誤差最大的那個點。而在進行分類時,計算所謂的混淆矩陣(confusion matrix)往往是很有用的。它能顯示在資料上産生的所有配對的錯誤分類。現在,我們要回到鸢尾花品種分類問題了。在前面的小節,我們訓練了3個knn模型。我們現在會看到如何能夠評估它們的性能。和很多分類模型一樣,knn傳回的預測既可以是最終的類别标簽,也可以是與每種可能的輸出類型相關的一組評分。有時候就像這裡的示例一樣,這些評分實際上是該模型給出的每種可能輸出的機率。不管該評分是不是機率,我們都可以根據這些評分來決定選取哪個輸出标簽,通常就是直接選取評分最高的那個标簽。在r語言裡,用來作出模型預測的最常見函數是predict()函數,我們在自己的knn模型裡會用到它:
在該knn模型裡,我們可以通過計算屬于每個輸出标簽的最鄰近樣本的比例,進而把輸出的評分指定為直接機率。在上面顯示的三個測試示例中,virginica品種在其中兩個示例中的機率為1,而在另一個示例中隻有60%的機率。另外的40%屬于versicolor品種,是以看起來在後面那個示例中,每5個最鄰近樣本中有3個屬于virginica品種,而另外2個屬于versicolor品種。很顯然,相比這個分類結果,我們應該會對前面兩個分類結果更有信心。我們現在要在測試資料上對這三個模型進行類别預測的計算:
我們可以利用caret包的postresample()函數來顯示模型在測試集上的精确度名額:
在這裡,精确度等于1減去誤差率,也就是正确分類的觀測資料比例。可以看到,所有的模型在精确度方面都非常接近,其中使用了z評分(z-score)變換進行歸一化的那個模型勝出了。由于測試集較小,這個差别并不顯著。卡巴統計量(kappa statistic)的定義如下所示:
卡巴統計量是設計用來抵消随機因素的,它的取值空間為[-1, 1],其中1代表完全精确,-1代表完全不精确,而0是在精确度恰好等于随機猜測法的結果時出現的。注意,對于一個分類模型來說,随機猜測法猜測的是最常見的那個類别。在鸢尾花分類模型的示例中,3個品種在資料中出現的機會是均等的,是以期望精确度等于三分之一。我們鼓勵讀者通過給期望精确度運用這個值來進行檢驗,我們可以根據各個精确度的值來獲得卡巴統計量的觀測值。
我們還可以利用一個混淆矩陣來檢查模型作出的特定錯誤分類。它可以通過用正确的輸出标簽對預測結果進行交叉分析(cross-tabulating)直接建構出來:
caret包還有一個非常有用的confusionmatrix()函數,它能自動計算這張表以及幾種其他的性能衡量名額,該函數功能的說明可以查閱http://topepo.github.io/caret/other.html。
在前面的混淆矩陣裡,我們可以看到正确分類的觀測資料的數量是28個,它是主對角線上的數值10、9、9之和。該表格給我們展示的是setosa品種看起來用我們的模型更易于預測,因為它從來沒有和其他品種混淆。不過,versicolor和virginica品種會互相混淆,該模型對這兩個品種都各有1次錯誤的分類。是以,我們可以推測,計算混淆矩陣可以作為一個有用的練習。找出經常混淆的類别配對可以指導我們對模型作出改進,例如去尋找有助于區分這些類别的特征。
評估二進制分類模型
有一種特殊的分類任務被稱為二進制分類(binary classification),它是在我們隻有兩個類别的情況下出現的。一些典型的二進制分類的場景如下:
根據收到的電子郵件的内容和标題,把它們分類為垃圾郵件或非垃圾郵件
根據病人的症狀和病史,把他們分類為是否患有某疾病
根據查詢關鍵字和文檔中的單詞,把一個文檔的大資料庫中的某個文檔分類為是否和該查詢相關
把生産線上的某個産品分類為次品或不是次品
根據客戶的信用評分和财務狀況,預測在某銀行申請貸款的某位客戶還款時是否會發生違約
在二進制分類任務裡,通常把兩個類别稱為陽性類(positive class)和陰性類(negative class)。按照慣例,陽性類對應的是模型嘗試預測的一種特殊情況,并且通常比陰性類更為少見。從之前的示例,我們可以給垃圾郵件、生産線的次品、違約客戶等等使用陽性類标簽。現在考慮醫療診斷領域的一個示例,在這個領域,我們要嘗試訓練一個模型來診斷某個在10 000人中隻出現1例的疾病。我們會把陽性類配置設定給患有這個疾病的病人。注意,在這樣的一個場景中,誤差率本身不是模型的充分衡量名額。例如,可以通過把每個病人都預測為健康的來設計出最簡單的分類器,它隻有0.01%的誤差率,但這樣的一個分類器是沒有用的。通過分析混淆矩陣,可以得出更有用的衡量名額。假定已經建構了一個診斷罕見疾病的模型,對于100 000病人的測試樣本,我們獲得了如下的混淆矩陣:
二進制分類問題是如此常見,以至于它的二進制混淆矩陣的單元都有它們自己的命名。在包含了正确分類條目的主對角線上,我們稱其元素為真陰性(true negative)和真陽性(true positive)。在示例中,我們有99 900例真陰性和13例真陽性。當把實際上屬于陰性類的觀測資料錯誤分類為陽性類時,就得到了一個假陽性(false positive),也稱為第一類錯誤(type i error)。假陰性(false negative)或第二類錯誤(type ii error)則出現在把陽性類的觀測資料錯誤分類為陰性類的情況下。在這個示例中,模型得到了78例假陽性和9例假陰性。
現在我們要引入兩個在二進制分類環境中非常重要的衡量名額,它們是查準率(precision)和查全率(recall)。查準率的定義是準确預測的陽性類例數占預測的陽性類總例數的比例。利用前面的二進制混淆矩陣的标簽,查準率可由如下公式得出:
是以,查準率實際上衡量的是我們對陽性類進行預測的精确度。根據定義,隻要從不預測陽性類就能達到100%的查準率,因為以這種方式可以保證不會犯任何錯誤。反過來,查全率的定義是陽性類的正确預測數在資料集裡所有陽性類成員中的占比。同理,利用二進制混淆矩陣中的标簽,可以把查全率的定義表示為:
查全率衡量的是從資料集中識别所有陽性類成員的能力。可以通過把所有資料點都預測為陽性類來輕松達到最大查全率。這樣我們會犯很多錯誤,但永遠不會有假陰性。注意,查準率和查全率構成了模型性能的一個權衡。一方面,如果對任何資料點都不預測為陽性類,我們會得到0查全率,但查準率是最大的。而另一方面,如果把所有的資料點都預測為屬于陽性類(記住,陽性類是罕見的類),我們會得到最大查全率,但查準率是非常低的。換言之,嘗試減小第一類錯誤會導緻第二類錯誤增加,反之亦然。這種相反的關系經常可以針對具體的問題在查全-查準曲線(precision-recall curve)上繪制出來。通過采用一個适當的門檻值參數,我們就可以對模型的性能進行調優,進而達到這個查全-查準曲線上适合我們情況的某個點。例如,在某些問題的領域,由于把陽性類的觀測資料錯誤分類為陰性類的成本很高,是以,我們會偏向于得到更高的查全率而不是查準率。因為經常要用單個數值描述某個模型的性能,我們定義了一個叫做f1分數(f1 score)的衡量值,它合并了查全率和查準率。具體來說,f1分數的定義是查準率和查全率之間的調和平均數:
讀者應該在示例的混淆矩陣裡檢驗一下,查準率是14.3%,查全率是59.1%,而f1分數是0.23。