Matlab繪製ROC曲線(附詳細畫法思路及博客參考)


學習機器學習時的一次作業:

[1]繪圖說明

對於經典的二分類(0、1)問題來說,分類器分類之後,往往會得到對每個樣本是哪一類的一個估計predict。根據這個估計,選擇一個閾值p_i,就可以將分類結果映射到0、1了;分類效果好不好跟真實的對應的ground_truth中的標籤對比。所以predict和ground_truth兩個向量便是函數的兩個輸入參數。因爲沒有找到合適的數據直接使用了隨機值代替,用[0,1]之間的101個點作爲predict向量值,用101維隨機0-1值向量作爲ground_truth。
因爲Matlab自帶的一個函數trapz可以計算出ROC曲線圍成的面積,即AUC值,我選用Matlab繪製曲線。通常來說,曲線越靠近圖像的左上角,AUC值越大,表示模型的性能越好。

[2]程序代碼(帶註釋)

首先在plot_roc.m文件中寫函數:

function auc=plot_roc(predict,ground_truth)
%初始點爲(0.0,0.0)
x = 0.0;
y = 0.0;
pos_num=sum(ground_truth==1);
neg_num=sum(ground_truth==0);
%根據該數目可以計算出沿x軸或者y軸的步長
x_step = 1.0/neg_num;
y_step = 1.0/pos_num;
%首先對predict中的分類器輸出值按照從大到小排列
[predict,index] = sort(predict,'descend');
ground_truth = ground_truth(index);
%對predict中的每個樣本分別判斷他們是FP或者是TP
%遍歷ground_truth的元素,
%若ground_truth[i]=1,則TP增加了1,往y軸方向上升y_step
%若ground_truth[i]=0,則FP增加了1,往x軸方向上升x_step
for i=1:length(ground_truth)
    if ground_truth(i) == 1
        y = y + y_step;
    else
        x = x + x_step;
    end
    X(i)=x;
    Y(i)=y;
end
%畫出圖像     
plot(X,Y,'-ro','LineWidth',2,'MarkerSize',3);
xlabel('假正例率');
ylabel('真正例率');
title('ROC曲線圖');
%trapz,matlab自帶函數,計算小矩形的面積,返回auc
auc = trapz(X,Y);          
end

說明:首先計算出ground_touth中正樣本的數目pos_num和neg_num,引入x_step和y_step,就相當於書上的可以計算出沿x軸或者y軸的步長。再對predict中的分類器輸出值按照從大到小排列,即可首先將分類閾值設爲最大,循環判斷排序後predict[i]對應的ground_truth[i]的值,然後讓x軸或者y軸減小x_step或y_step將predict[i]對應的ground_truth[i]的值,。這樣,便不必每次去統計TP和FP的值然後再計算每個點的座標了。

命令行程序:

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

[3]繪圖結果

在這裏插入圖片描述

參考博客(推薦):

Ro從c曲線的Matlab實現
Roc曲線的通俗理解

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