于營,楊婷婷,楊博雄
(1.三亞學院信息與智能工程學院,三亞572011;2.三亞學院陳國良院士創新中心,三亞572011)
在計算機視覺中,對象檢測即在圖像中定位一個或多個目標。除了傳統的對象檢測技術外,R-CNN和YOLO(You Only Look Once,一種先進的實時目標檢測系統)等先進的深度學習模型,可以對不同類型的目標實現較為精準的檢測。在這些模型中輸入圖像,將會返回每個檢測到的對象周圍的邊界框的坐標。
二元分類(Binary classification),又稱“二向分類”。在包含兩類事項的比較研究中,按兩個標識所作的分類,標識常記作1和0,或正和負,或惡性與良性(如問題與癌癥分類有關),或成功與失敗(如學生考試成績的分類)。
假設存在一個帶有正負兩類的二元分類問題。用于訓練模型的7個樣本的標簽記作:[positive,negative,positive,negative,positive,positive,negative]。當將這些樣本提供給模型時,模型不一定返回類標簽,而是返回分數。例如,當將這7個樣本提供給模型時,它們的類別得分可能為:[0.6,0.2,0.55,0.7,0.4,0.9,0.5]。用戶可以針對這些得分設置閾值,從而使每個樣本賦予類標簽。閾值即模型的超參數,設本例中閾值是0.6,然后任何高于或等于0.6的樣本都會被賦予正標簽,否則賦予負標簽。則可以得到樣本的預測標簽為:[positive(0.6),negative(0.2),negative(0.55),positive(0.9),negative(0.4),positive(0.8),negative(0.5)]。
為提取模型性能的更多信息,可以使用混淆矩陣。混淆矩陣有助于我們在區分兩個類別時鑒別模型是否“混淆”。圖1是一個2×2矩陣,兩行和兩列的標簽分別為正向和負向。行標簽代表真實值標簽,而列標簽代表預測值標簽。

圖1 二元分類混淆矩陣
矩陣的4個元素(紅色和綠色項目)表示計算模型正確和不正確預測數的4個指標。紅色項目代表預測正確,即預測標簽和真實標簽匹配;綠色項目代表預測不正確,即預測標簽和真實標簽不匹配。目標是最大限度地利用“真”值(真正例和真負例)來衡量指標,并最大限度地減少其他兩個指標(假正例和假負例)。因此,混淆矩陣中的四個指標是:
●左上(真正例):模型將真樣本正確地分類為Positive的次數是多少?
●右上(假負例):模型將真樣本錯誤地分類為Negative的次數是多少?
●左下(假正例):模型將假樣本錯誤地分類為Positive的次數是多少?
●右下(真負例):模型將假樣本正確地分類為Negative的次數是多少?
為前面的7個樣本計算這4個指標,得到混淆矩陣如圖2所示。

圖2 分類結果
這就是針對二元分類問題計算混淆矩陣的方法。
假設有9個樣本,每個樣本屬于3個類別之一:白色、黑色或紅色。以下是9個樣本的真實數據:Red,Black,Red,White,Black,Red,Black,Red,White。當樣品被輸入模型時,得到預測的標簽為:White,Black,Red,White,Red,Black,White,Red,Red。
為了便于比較,并列記錄如表1所示。

表1
在計算混淆矩陣之前,必須指定目標類。假設將紅色類設定為目標。此類標記為“正”,所有其他類標記為“負”。則表1被標記為表2。

表2
問題再次被轉化為正負兩個類,可以按照二元分類來計算混淆矩陣。
同理,可得目標為白色類和黑色類的混淆矩陣,如圖4、圖5所示。

圖4 白色類的混淆矩陣

圖5 黑色類的混淆矩陣
Scikit-learn庫中的模塊metrics可用于計算混淆矩陣中的指標。
對于二元分類問題,使用confusion_matrix()函數及其以下兩個參數:

圖3 紅色類的混淆矩陣
●y_true:真實標簽。
●y_pred:預測的標簽。
以下代碼計算了1.1小節的二元分類示例的混淆矩陣。

要計算多類分類問題的混淆矩陣,使用multilabel_confusion_matrix()函數,除y_true和y_pred參數外,使用labels參數接受類標簽的列表。

Multilabel_confusion_matrix()函數為每個類計算混淆矩陣,并返回所有矩陣。矩陣的順序與labels參數中的標簽順序匹配,可以使用numpy.flip()函數調整矩陣中元素的順序。

準確性通常描述模型在所有類別上的表現,用于當所有類別都同等重要的情況,表示正確預測數與預測總數之間的比率。

基于先前計算的混淆矩陣,使用Scikit-learn計算準確性的方法。變量acc為真正值和假負值之和除以矩陣中所有值之和的結果。結果為0.5714,這意味著該模型進行正確的預測時準確性為57.14%。

需要注意的是,準確性可能具有欺騙性。例如,數據不平衡時,假設總共有600個樣本,其中550個屬于“正”類別,而只有50個屬于“負”類別。由于大多數樣本屬于一個類別,因此該類別的準確性將高于另一個類別。
精確度是正確分類為正樣本的數量與分類為正樣本(正確或不正確)的樣本總數之間的比率。精確度衡量模型將樣品分類為陽性的準確性。

當模型做出許多錯誤的正分類,即“假正例”比較多時,代表分母增大,使得精確度變小。在以下情況下,模型得精確度比較高:
●該模型使許多正確的正分類(最大化真正的正)
●該模型使不正確的正分類更少(盡量減少誤報)精確度反映了模型將樣品分類為陽性樣本時有多可靠。在Scikit-learn中,sklearn.metrics模塊具有一個名為precision_score()的函數,該函數接受樣本信息和預測的標簽并返回精度。pos_label參數接受positive類的標簽,默認值為1。

表示模型的精確度為66.67%。
召回率衡量模型檢測陽性樣品的能力,計算方法是正確分類為True的正樣本數與正樣本總數之間的比率。召回率越高,檢測到的陽性樣本越多。

召回率僅關注陽性樣本的分類方式,與陰性樣品的分類方式無關。當模型將所有正樣本歸為正樣本時,即使所有負樣本均被錯誤分類為正樣本,召回率也將為100%。
類似于precision_score()函數,sklearn.metrics模塊中的callback_score()函數計算召回率。代碼如下:

表示模型的召回率為50%。
本文討論了混淆矩陣以及如何在二元和多類分類問題中計算“真正例”、“真負例”、“假正例”和“假負例”4個指標,使用Scikit-learn中的metrics模塊實現了在Python中計算混淆矩陣的方法。進一步,使用sklearn.metrics模塊分別進行計算模型的準確性、準確度和召回率。