1. 程式人生 > >ROC曲線詳解及matlab繪圖例項

ROC曲線詳解及matlab繪圖例項

訊號檢測理論中,接收者操作特徵曲線receiver operating characteristic curve,或者叫ROC曲線)是一種座標圖式的分析工具,用於 (1) 選擇最佳的訊號偵測模型、捨棄次佳的模型。 (2) 在同一模型中設定最佳閾值。

在做決策時,ROC分析能不受成本/效益的影響,給出客觀中立的建議。

ROC曲線首先是由二戰中的電子工程師和雷達工程師發明的,用來偵測戰場上的敵軍載具(飛機、船艦),也就是訊號檢測理論。之後很快就被引入了心理學來進行訊號的知覺檢測。數十年來,ROC分析被用於醫學無線電生物學犯罪心理學領域中,而且最近在機器學習(machine learning)和

資料探勘(data mining)領域也得到了很好的發展。

分類模型(又稱分類器,或診斷)是將一個例項對映到一個特定類的過程。ROC分析的是二元分類模型,也就是輸出結果只有兩種類別的模型,例如:(陽性/陰性)(有病/沒病)(垃圾郵件/非垃圾郵件)(敵軍/非敵軍)。

訊號偵測(或變數測量)的結果是一個連續值時,類與類的邊界必須用一個閾值(英語:threshold)來界定。舉例來說,用血壓值來檢測一個人是否有高血壓,測出的血壓值是連續的實數(從0~200都有可能),以收縮壓140/舒張壓90為閾值,閾值以上便診斷為有高血壓,閾值未滿者診斷為無高血壓。二元分類模型的個案預測有四種結局:

  1. 真陽性(TP):診斷為有
    實際上也有高血壓。
  2. 偽陽性(FP):診斷為有實際卻沒有高血壓。
  3. 真陰性(TN):診斷為沒有實際上也沒有高血壓。
  4. 偽陰性(FN):診斷為沒有實際卻有高血壓。
真實值 總 數
p n
預 測 輸 出 p' 真陽性 (TP) 偽陽性 (FP) P'
n' 偽陰性 (FN) 真陰性 (TN) N'
總數 P N

ROC空間

ROC空間將偽陽性率(FPR)定義為 X 軸,真陽性率(TPR)定義為 Y 軸。

  • TPR:在所有實際為陽性的樣本中,被正確地
    判斷為陽性之比率。

{\displaystyle TPR=TP/(TP+FN)}{\displaystyle TPR=TP/(TP+FN)}

  • FPR:在所有實際為陰性的樣本中,被錯誤地判斷為陽性之比率。

{\displaystyle FPR=FP/(FP+TN)}{\displaystyle FPR=FP/(FP+TN)}

給定一個二元分類模型和它的閾值,就能從所有樣本的(陽性/陰性)真實值和預測值計算出一個 (X=FPR, Y=TPR) 座標點。

從 (0, 0) 到 (1,1) 的對角線將ROC空間劃分為左上/右下兩個區域,在這條線的以上的點代表了一個好的分類結果(勝過隨機分類),而在這條線以下的點代表了差的分類結果(劣於隨機分類)。

完美的預測是一個在左上角的點,在ROC空間座標 (0,1)點,X=0 代表著沒有偽陽性,Y=1 代表著沒有偽陰性(所有的陽性都是真陽性);也就是說,不管分類器輸出結果是陽性或陰性,都是100%正確。一個隨機的預測會得到位於從 (0, 0) 到 (1, 1) 對角線(也叫無識別率線)上的一個點;最直觀的隨機預測的例子就是拋硬幣。

讓我們來看在實際有100個陽性和100個陰性的案例時,四種預測方法(可能是四種分類器,或是同一分類器的四種閾值設定)的結果差異:

A B C C'
TP=63 FP=28 91
FN=37 TN=72 109
100 100 200
TP=77 FP=77 154
FN=23 TN=23 46
100 100 200
TP=24 FP=88 112
FN=76 TN=12 88
100 100 200
TP=76 FP=12 88
FN=24 TN=88 112
100 100 200
TPR = 0.63 TPR = 0.77 TPR = 0.24 TPR = 0.76
FPR = 0.28 FPR = 0.77 FPR = 0.88 FPR = 0.12
ACC = 0.68 ACC = 0.50 ACC = 0.18 ACC = 0.82

ROC空間的4個例子

將這4種結果畫在ROC空間裡:

  • 點與隨機猜測線的距離,是預測力的指標:離左上角越近的點預測(診斷)準確率越高。離右下角越近的點,預測越不準。
  • ABC三者當中,最好的結果是A方法。
  • B方法的結果位於隨機猜測線(對角線)上,在例子中我們可以看到B的準確度(ACC,定義見前面表格)是50%。
  • C雖然預測準確度最差,甚至劣於隨機分類,也就是低於0.5(低於對角線)。然而,當將C以 (0.5, 0.5) 為中點作一個映象後,C'的結果甚至要比A還要好。這個作映象的方法,簡單說,不管C(或任何ROC點低於對角線的情況)預測了什麼,就做相反的結論。

ROC曲線

隨著閾值調整,ROC座標系裡的點如何移動

上述ROC空間裡的單點,是給定分類模型且給定閾值後得出的。但同一個二元分類模型閾值可能設定為高或低,每種閾值的設定會得出不同的FPR和TPR。

  • 同一模型每個閾值 的 (FPR, TPR) 座標都畫在ROC空間裡,就成為特定模型的ROC曲線

例如右圖,人體的血液蛋白濃度是呈正態分佈的連續變數,病人的分佈是紅色,平均值為A g/dL,健康人的分佈是藍色,平均值是C g/dL。健康檢查會測量血液樣本中的某種蛋白質濃度,達到某個值(閾值,threshold)以上診斷為有疾病徵兆。研究者可以調整閾值的高低(將左上圖的垂直線往左或右移動),便會得出不同的偽陽性率與真陽性率,總之即得出不同的預測準確率。

1. 由於每個不同的分類器(診斷工具、偵測工具)有各自的測量標準和測量值的單位(標示為:“健康人-病人分佈圖”的橫軸),所以不同分類器的“健康人-病人分佈圖”都長得不一樣。

2. 比較不同分類器時,ROC曲線的實際形狀,便視兩個實際分佈的重疊範圍而定,沒有規律可循。

3. 但在同一個分類器之內,閾值的不同設定對ROC曲線的影響,仍有一些規律可循:

  • 當閾值設定為最高時,亦即所有樣本都被預測為陰性,沒有樣本被預測為陽性,此時在偽陽性率 FPR = FP / ( FP + TN ) 算式中的 FP = 0,所以 FPR = 0%。同時在真陽性率(TPR)算式中, TPR = TP / ( TP + FN ) 算式中的 TP = 0,所以 TPR = 0%

→ 當閾值設定為最高時,必得出ROC座標系左下角的點 (0, 0)。

  • 當閾值設定為最低時,亦即所有樣本都被預測為陽性,沒有樣本被預測為陰性,此時在偽陽性率FPR = FP / ( FP + TN ) 算式中的 TN = 0,所以 FPR = 100%。同時在真陽性率 TPR = TP / ( TP + FN ) 算式中的 FN = 0,所以 TPR=100%

→ 當閾值設定為最低時,必得出ROC座標系右上角的點 (1, 1)。

  • 因為TP、FP、TN、FN都是累積次數,TN和FN隨著閾值調低而減少(或持平),TP和FP隨著閾值調低而增加(或持平),所以FPR和TPR皆必隨著閾值調低而增加(或持平)。

→ 隨著閾值調低,ROC點 往右上(或右/或上)移動,或不動;但絕不會往左/下/左下移動

曲線下面積(AUC)

例示三種AUC值(曲線下面積)

在比較不同的分類模型時,可以將每個模型的ROC曲線都畫出來,比較曲線下面積做為模型優劣的指標。

意義[編輯]

ROC曲線下方的面積(英語:Area under the Curve of ROC (AUC ROC)),其意義是:

  • 因為是在1x1的方格里求面積,AUC必在0~1之間。
  • 假設閾值以上是陽性,以下是陰性;
  • 若隨機抽取一個陽性樣本和一個陰性樣本,分類器正確判斷陽性樣本的值高於陰性樣本之概率 {\displaystyle =AUC}{\displaystyle =AUC}[1]
  • 簡單說:AUC值越大的分類器,正確率越高。

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

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

程式設計題目

        接收操作特徵(Receiver Operating Characteristic,ROC)曲線,即通常所講的ROC Curve,是機器學習領域中常用的分類效能評估曲線,橫軸是False Positive Rate,縱軸是True Positive Rate。請用Matlab編寫一個自動畫出ROC曲線的函式,並給出測試例子。

[1]原理分析

    對於經典的二分類(0、1)問題來說,分類器分類之後,往往會得到對每個樣本是哪一類的一個估計predict,像是LR模型就會將這個估計規範化到【0、1】。根據這個估計,你選擇一個閾值p_i,就可以將分類結果對映到0、1了;分類效果好不好跟真實的對應的ground_truth中的標籤比比就行了。所以你手裡有predict和ground_truth兩個向量,用來做分類結果的評估,這兩個向量便是函式的兩個輸入引數。

        為了更好的衡量ROC所表達結果的好壞,Area Under Curve(AUC)被提了出來,簡單來說就是曲線右下角部分佔正方形格子的面積比例。那麼計算這個東西其實就很簡單了,在這裡我用到了matlab中自帶的一個函式trapz,它可以計算出這個面積。通常來說,曲線越靠近影象的左上角,也就是曲線的下方面積越大,表示模型的效能越好。

[2]程式程式碼

        其實畫ROC曲線函式的程式碼編寫方法不止一種。老師註釋裡提供的方法是一種很簡潔高效的方法。只需要不斷遍歷排序後的predict向量,引入x_step和y_step,迴圈判斷排序後predict[i]對應的ground_truth[i]的值,然後讓x軸或者y軸減小x_step或y_step。這樣,便不必每次去統計TP和FP的值然後再計算每個點的座標了。最後程式碼如下:

 在CODE上檢視程式碼片派生到我的程式碼片

  1. function  auc = plot_roc( predict, ground_truth )  
  2. % INPUTS  
  3. %  predict       - 分類器對測試集的分類結果  
  4. %  ground_truth - 測試集的正確標籤,這裡只考慮二分類,即0和1  
  5. % OUTPUTS  
  6. %  auc            - 返回ROC曲線的曲線下的面積  
  7. %初始點為(1.0, 1.0)  
  8. x = 1.0;  
  9. y = 1.0;  
  10. %計算出ground_truth中正樣本的數目pos_num和負樣本的數目neg_num  
  11. pos_num = sum(ground_truth==1);  
  12. neg_num = sum(ground_truth==0);  
  13. %根據該數目可以計算出沿x軸或者y軸的步長  
  14. x_step = 1.0/neg_num;  
  15. y_step = 1.0/pos_num;  
  16. %首先對predict中的分類器輸出值按照從小到大排列  
  17. [predict,index] = sort(predict);  
  18. ground_truth = ground_truth(index);  
  19. %對predict中的每個樣本分別判斷他們是FP或者是TP  
  20. %遍歷ground_truth的元素,  
  21. %若ground_truth[i]=1,則TP減少了1,往y軸方向下降y_step  
  22. %若ground_truth[i]=0,則FP減少了1,往x軸方向下降x_step  
  23. for i=1:length(ground_truth)  
  24.     if ground_truth(i) == 1  
  25.         y = y - y_step;  
  26.     else  
  27.         x = x - x_step;  
  28.     end  
  29.     X(i)=x;  
  30.     Y(i)=y;  
  31. end  
  32. %畫出影象       
  33. plot(X,Y,'-ro','LineWidth',2,'MarkerSize',3);  
  34. xlabel('虛報概率');  
  35. ylabel('擊中概率');  
  36. title('ROC曲線圖');  
  37. %計算小矩形的面積,返回auc  
  38. auc = -trapz(X,Y);            
  39. end  

由於缺少具體測試資料,在這裡我們簡單用【0,1】之間的101個點作為predict向量值,用101維隨機0-1值向量作為ground_truth。測試程式碼如下:

 在CODE上檢視程式碼片派生到我的程式碼片

  1. clear all;  
  2. predict=(0:1/100:1);            %生成間隔為0.01的預測閾值  
  3. ground_truth=randi([0,1],1,101);%生成0-1隨機向量  
  4. result=plot_roc(predict,ground_truth);  
  5. disp(result);  

[3]實驗效果

由最後的ROC曲線圖效果如下。