機器學習算法常用指標總結

深度學習交流QQ羣:811460433


  考慮一個二分問題,即將實例分成正類(positive)或負類(negative)。對一個二分問題來說,會出現四種情況。如果一個實例是正類並且也被 預測成正類,即爲真正類(True positive),如果實例是負類被預測成正類,稱之爲假正類(False positive)。相應地,如果實例是負類被預測成負類,稱之爲真負類(True negative),正類被預測成負類則爲假負類(false negative)。


 對於一個二分類問題,我們定義如下指標:

  • TP:True Positive,即正確預測出的正樣本個數
  • FP:False Positive,即錯誤預測出的正樣本個數(本來是負樣本,被我們預測成了正樣本)
  • TN:True Negative,即正確預測出的負樣本個數
  • FN:False Negative,即錯誤預測出的負樣本個數(本來是正樣本,被我們預測成了負樣本)

  • 列聯表如下表所示,1代表正類,0代表負類:
  •  預測1預測0
    實際1True Positive(TP)False Negative(FN)
    實際0False Positive(FP)True Negative(TN)

分類器性能評價指標

由以上四個指標,可以進一步衍生出其他三個常用的評價分類器性能的指標

  • PrecisionTP÷(TP+FP)TP÷(TP+FP),分類器預測出的正樣本中,真實正樣本的比例
  • RecallTP÷(TP+FN)TP÷(TP+FN),在所有真實正樣本中,分類器中能找到多少
  • Accuracy(TP+TN)÷(TP+NP+TN+FN)(TP+TN)÷(TP+NP+TN+FN),分類器對整體的判斷能力,即正確預測的比例

1. TPR、FPR&TNR

  從列聯表引入兩個新名詞。其一是真正類率(true positive rate ,TPR), 計算公式爲

TPR = TP / (TP + FN)

刻畫的是分類器所識別出的 正實例佔所有正實例的比例。

  另外一個是負正類率(false positive rate, FPR),計算公式爲

FPR = FP / (FP + TN)

計算的是分類器錯認爲正類的負實例佔所有負實例的比例。

  還有一個真負類率(True Negative Rate,TNR),也稱爲specificity,計算公式爲

TNR = TN /(FP + TN) = 1 - FPR


2. 精確率Precision、召回率Recall和F1值

  精確率(正確率)召回率是廣泛用於信息檢索和統計學分類領域的兩個度量值,用來評價結果的質量。其中精度是檢索出相關文檔數與檢索出的文檔總數的比率,衡量的是檢索系統的查準率;召回率是指檢索出的相關文檔數和文檔庫中所有的相關文檔數的比率,衡量的是檢索系統的查全率

  一般來說,Precision就是檢索出來的條目(比如:文檔、網頁等)有多少是準確的,Recall就是所有準確的條目有多少被檢索出來了,兩者的定義分別如下:

Precision = 提取出的正確信息條數 / 提取出的信息條數

Recall = 提取出的正確信息條數 / 樣本中的信息條數

  爲了能夠評價不同算法的優劣,在Precision和Recall的基礎上提出了F1值的概念,來對Precision和Recall進行整體評價。F1的定義如下:

F1值 = 正確率 * 召回率 * 2 / (正確率 + 召回率)

  不妨舉這樣一個例子:

  某池塘有1400條鯉魚,300只蝦,300只鱉。現在以捕鯉魚爲目的。撒一大網,逮着了700條鯉魚,200只蝦,100只鱉。那麼,這些指標分別如下:

  正確率 = 700 / (700 + 200 + 100) = 70%

  召回率 = 700 / 1400 = 50%

  F1值 = 70% * 50% * 2 / (70% + 50%) = 58.3%

  不妨看看如果把池子裏的所有的鯉魚、蝦和鱉都一網打盡,這些指標又有何變化:

  正確率 = 1400 / (1400 + 300 + 300) = 70%

  召回率 = 1400 / 1400 = 100%

  F1值 = 70% * 100% * 2 / (70% + 100%) = 82.35%

  由此可見,正確率是評估捕獲的成果中目標成果所佔得比例;召回率,顧名思義,就是從關注領域中,召回目標類別的比例;而F值,則是綜合這二者指標的評估指標,用於綜合反映整體的指標。

  當然希望檢索結果Precision越高越好,同時Recall也越高越好,但事實上這兩者在某些情況下有矛盾的。比如極端情況下,我們只搜索出了一個結果,且是準確的,那麼Precision就是100%,但是Recall就很低;而如果我們把所有結果都返回,那麼比如Recall是100%,但是Precision就會很低。因此在不同的場合中需要自己判斷希望Precision比較高或是Recall比較高。如果是做實驗研究,可以繪製Precision-Recall曲線來幫助分析。



3. 綜合評價指標F-measure

  Precision和Recall指標有時候會出現的矛盾的情況,這樣就需要綜合考慮他們,最常見的方法就是F-Measure(又稱爲F-Score)。

  F-Measure是Precision和Recall加權調和平均


  當參數α=1時,就是最常見的F1。因此,F1綜合了P和R的結果,當F1較高時則能說明試驗方法比較有效。

4. ROC曲線和AUC

  4.1 爲什麼引入ROC曲線?

  Motivation1:在一個二分類模型中,對於所得到的連續結果,假設已確定一個閥值,比如說 0.6,大於這個值的實例劃歸爲正類,小於這個值則劃到負類中。如果減小閥值,減到0.5,固然能識別出更多的正類,也就是提高了識別出的正例佔所有正例 的比類,即TPR,但同時也將更多的負實例當作了正實例,即提高了FPR。爲了形象化這一變化,引入ROC,ROC曲線可以用於評價一個分類器。

  Motivation2:在類不平衡的情況下,如正樣本90個,負樣本10個,直接把所有樣本分類爲正樣本,得到識別率爲90%。但這顯然是沒有意義的。單純根據Precision和Recall來衡量算法的優劣已經不能表徵這種病態問題。

  4.2 什麼是ROC曲線?

  ROC(Receiver Operating Characteristic)翻譯爲"接受者操作特性曲線"。曲線由兩個變量1-specificity 和 Sensitivity繪製. 1-specificity=FPR,即負正類率。Sensitivity即是真正類率,TPR(True positive rate),反映了正類覆蓋程度。這個組合以1-specificity對sensitivity,即是以代價(costs)對收益(benefits)。

此外,ROC曲線還可以用來計算“均值平均精度”(mean average precision),這是當你通過改變閾值來選擇最好的結果時所得到的平均精度(PPV)。

  爲了更好地理解ROC曲線,我們使用具體的實例來說明:

  如在醫學診斷中,判斷有病的樣本。那麼儘量把有病的揪出來是主要任務,也就是第一個指標TPR,要越高越好。而把沒病的樣本誤診爲有病的,也就是第二個指標FPR,要越低越好。

  不難發現,這兩個指標之間是相互制約的。如果某個醫生對於有病的症狀比較敏感,稍微的小症狀都判斷爲有病,那麼他的第一個指標應該會很高,但是第二個指標也就相應地變高。最極端的情況下,他把所有的樣本都看做有病,那麼第一個指標達到1,第二個指標也爲1。

  我們以FPR爲橫軸,TPR爲縱軸,得到如下ROC空間。

  我們可以看出,左上角的點(TPR=1,FPR=0),爲完美分類,也就是這個醫生醫術高明,診斷全對。點A(TPR>FPR),醫生A的判斷大體是正確的。中線上的點B(TPR=FPR),也就是醫生B全都是蒙的,蒙對一半,蒙錯一半;下半平面的點C(TPR<FPR),這個醫生說你有病,那麼你很可能沒有病,醫生C的話我們要反着聽,爲真庸醫。上圖中一個閾值,得到一個點。現在我們需要一個獨立於閾值的評價指標來衡量這個醫生的醫術如何,也就是遍歷所有的閾值,得到ROC曲線。

  還是一開始的那幅圖,假設如下就是某個醫生的診斷統計圖,直線代表閾值。我們遍歷所有的閾值,能夠在ROC平面上得到如下的ROC曲線。


  曲線距離左上角越近,證明分類器效果越好。


  如上,是三條ROC曲線,在0.23處取一條直線。那麼,在同樣的低FPR=0.23的情況下,紅色分類器得到更高的PTR。也就表明,ROC越往上,分類器效果越好。我們用一個標量值AUC來量化它。

  4.3 什麼是AUC?

  AUC值爲ROC曲線所覆蓋的區域面積,顯然,AUC越大,分類器分類效果越好。

  AUC = 1,是完美分類器,採用這個預測模型時,不管設定什麼閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。

  0.5 < AUC < 1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。

  AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。

  AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優於隨機猜測。

  AUC的物理意義:假設分類器的輸出是樣本屬於正類的socre(置信度),則AUC的物理意義爲,任取一對(正、負)樣本,正樣本的score大於負樣本的score的概率。

  4.4 怎樣計算AUC?

  第一種方法:AUC爲ROC曲線下的面積,那我們直接計算面積可得。面積爲一個個小的梯形面積之和。計算的精度與閾值的精度有關。

  第二種方法:根據AUC的物理意義,我們計算正樣本score大於負樣本的score的概率。取N*M(N爲正樣本數,M爲負樣本數)個二元組,比較score,最後得到AUC。時間複雜度爲O(N*M)。

  第三種方法:與第二種方法相似,直接計算正樣本score大於負樣本的概率。我們首先把所有樣本按照score排序,依次用rank表示他們,如最大score的樣本,rank=n(n=N+M),其次爲n-1。那麼對於正樣本中rank最大的樣本,rank_max,有M-1個其他正樣本比他score小,那麼就有(rank_max-1)-(M-1)個負樣本比他score小。其次爲(rank_second-1)-(M-2)。最後我們得到正樣本大於負樣本的概率爲

  時間複雜度爲O(N+M)。


5. CMC曲線

CMC曲線全稱是Cumulative Match Characteristic (CMC) curve,也就是累積匹配曲線,同ROC曲線Receiver Operating Characteristic (ROC) curve一樣,是模式識別系統,如人臉,指紋,虹膜等的重要評價指標,尤其是在生物特徵識別系統中,一般同ROC曲線一起給出,能夠綜合評價出算法的好壞。如下圖所示:


那麼,CMC曲線的原理是什麼?怎樣編程實現?下面將進行詳解。

CMC曲線原理

CMC曲線綜合反映了分類器的性能,它的評價指標與現在deep learning中常用的top1 err或top5 err評價指標一樣的意思,不同的是這裏Rank1 recognition rate表示的是正確率而不是錯誤率,兩者的關係是

Rank1識別率=1-top1 err

Rank5識別率=1-top5 err

它們表示的是什麼意思呢?就比如給你一個選擇題,有10個選項,但是隻有一個選項是正確的,現在讓你從中選出正確答案。如果讓你猜一次,正確的概率爲1/10,你感覺自己狀態不好,想從猜一次,現在給你機會,讓你再猜一次,現在你總共猜兩次,選兩個答案,正確率一下子提高到1/5,你又說了,猜兩次反映不出你的水平,你要猜五次,也就是從10個選項中選5個選項,這5個選項中包括正確選項的概率大大增加,變爲1/2,如果讓你猜10次,那蒙對的概率肯定爲1了,也有人蒙的能力比較強,可能猜3次就能猜到正確答案,也就是提前收斂到1。CMC曲線Rank1識別率就是表示按照某種相似度匹配規則匹配後,第一次就能判斷出正確的標籤的數目與總的測試樣本數目之比,Rank5識別率就是指前五項(按照匹配程度從大到小排列後)有正確匹配。如果一個樣本按照匹配程度從大到小排列後,到最後一項,才匹配到正確標籤,這就說明分類器不太好,把最應匹配的判別成最不應匹配的。語言表述有點蒼白,還是看具體實現吧。

Matlab編程實現

現設match_dist=NxM的矩陣,其中N爲測試樣本(test set)數,M爲訓練樣本(training set)數,根據某種相似度匹配規則,如距離或概率或score等,得到的一個匹配矩陣match_dist。示例如下:


具體代碼如下:

    %處理測試樣本與註冊的訓練樣本匹配的相似度矩陣  
           match_scores = zeros(length(num_test),length(num_class));  
           true_labels = zeros(length(num_test),length(num_class));  
           for i=1:length(num_test)  
               for j=1:length(num_class)  
                   [x,y]=find(num_class(j)==num_train);  
                     
                   %選取匹配程度的中值  
                   label_distances(i,j) = median(match_dist(i,y));  
                   if num_test(i)==num_class(j)  
                       true_labels(i,j)=1;  
                   end  
               end  
           end  
             
           %生成CMC  
           max_rank = length(num_class);  
             
           %Rank取值範圍  
           ranks = 1:max_rank;  
             
           %排序  
           label_distances_sort = zeros(length(num_test),length(num_class));  
           true_labels_sort = zeros(length(num_test),length(num_class));  
           for i=1:length(num_test)  
               [label_distances_sort(i,:), ind] = sort(label_distances(i,:));  
               true_labels_sort(i,:) =  true_labels(i,ind);  
           end  
             
           %迭代  
           rec_rates = zeros(1,max_rank);  
           tmp = 0;  
           for i=1:max_rank  
               tmp = tmp + sum(true_labels_sort(:,i));  
               rec_rates(1,i)=tmp/length(num_test);  
           end    
在代碼中,num_test爲測試樣本標籤labels向量,num_class爲總的類別標籤向量,num_train爲註冊在gallery或訓練集中的標籤向量,如下所示:

num_test


num_class


num_train


然後,根據已得數據可以直接plot即可得CMC曲線:

plot(1:max_rank,rec_rates)  
如下圖所示:


看上去不太美觀,可以根據set調整一下如下:

    hold on  
    set(gca,'XLim',[1 40]);%X軸的數據顯示範圍  
    set(gca,'YLim',[0.6 1]);%X軸的數據顯示範圍  
    %set(gca,'XTickLabel',[1:5:40]);%給座標加標籤  
    title('CMC曲線')  
    xlabel('Rank')  
    ylabel('Recognition Rate')  

圖示如下:


PS: CMC曲線例子

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