有朋友问如何用matlab绘制lisvm结果的ROC曲线,遂熬夜稍微弄了一下。
主体就是用matlab自带的plotroc实现的。就是前面加进了一些预处理。
可以绘制任何类别数目的数据的ROC,数据的类别标签可以任意。(不一定非得是 +1 和 -1 )
lssvm中有可以绘制ROC曲线的函数,但类别的标签只能是 - 1 和 +1
程序很简单。但前面的预处理挺有意思。以及后面与plotroc结合的地方我煞费了一点心思(最后是用eval实现的)。O(∩_∩)O
====那个朋友的发问题的帖子
如何利用LIBSVM-MAT画ROC曲线?
http://www.ilovematlab.cn/thread-62962-1-1.html
====
什么是ROC曲线? 不知道。。。!??
明白的自然明白。不明白的百度去。。我就不说了。睡觉先。明天还得自习
期末复习ing。。。。
测试图
测试 1 hearscale 数据 两类 类别标签 -1 + 1
==============
测试2 wine 数据 三类 类别标签 1 2 3
代码:
===============plotSVMroc(true_labels,predict_labels,classnumber)=======
CODE:
function plotSVMroc(true_labels,predict_labels,classnumber)
% plotSVMroc
% by faruto
% Email:farutoliyang@gmail.com
% 2010.01.11
%%
len = length(true_labels);
label = zeros(1,classnumber);
label(1) = true_labels(1);
currentindex = 1;
for run = 2:len
flag = 0;
for class = 1:currentindex
if true_labels(run) == label(class)
flag = 1;
end
end
if flag == 1
continue;
else
label(currentindex+1) = true_labels(run);
currentindex = currentindex + 1;
end
end
%%
targets_true = zeros(classnumber,len);
outputs_predict = zeros(classnumber,len);
for class = 1:classnumber
for run = 1:len
if true_labels(run) == label(class)
targets_true(class,run) = 1;
end
if predict_labels(run) == label(class)
outputs_predict(class,run) = 1;
end
end
end
%% plot ROC curve
plotroc(targets_true,outputs_predict);
grid on;
%% plot ROC curve subplot
str = ['plotroc('];
for class = 1:classnumber
str_temp = ['targets_true(',num2str(class),...
',:),','outputs_predict(',num2str(class),',:),',...
'''class ','',num2str(class),'(label:',...
num2str(label(class)),')''',','];
str = [str str_temp];
end
str = str(1:end-1);
str = [str ')'];
eval(str);
===========测试代码
CODE:
%% plotSVMroc_test
%%
clear;
clc;
%%
load wine_test
%%
[train_data,test_data] = scaleForSVM(train_data,test_data,0,1);
model = svmtrain(train_data_labels,train_data);
[pre,acc] = svmpredict(test_data_labels,test_data,model);
%% plotSVMroc
plotSVMroc(test_data_labels,pre,3)