libsvm与perfcurve

直入主题

在matlab中,用SVM分类器做二分类问题时,除了准确率,不可避免地需要得到在测试数据上分类结果的auc值,此时我们可以采用matlab自带的函数perfcurve进行,所以我们现在先来看perfcurve的输入输出参数:

perfcurve函数功能: 用于实现分类器输出的ROC曲线绘制和对应AUC值计算
输入参数:
labels, 测试数据的真实label 如 [0;0;0;0;1;1;1;1;1;1] 10*1列向量
scores, 由分类器得到的以正样本列的预测概率 如分类器将样本预测为1的概率 [0.1; 0.2; 0.21; 0.12;...] 10*1列向量
posclass, 正样本类label 如 这里的 1
输出参数:
X, 用于绘制ROC曲线的x轴坐标
Y, 用于...的y轴坐标
T, 计算X Y时采用的各个阈值
AUC, ROC曲线下的AUC值
...

好,现在应用perfcurve,我们发现,我们通过matlab自带的svm分类器预测得到的直接是assignment label,而非概率值。
为了得到预测概率值,此时,我们需要换用libsvm下的libsvmtrainlibsvmpredict
其中,用于预测的libsvmpredict的输入输出参数有:

输入参数:
testlabel, 测试数据的真实label,如 [0;0;0;0;1;1;1;1;1;1] 10*1列向量 如果测试数据label未知,可以随意指定值
test_instance, 测试数据的数据, 如m*n的矩阵, 其中m为样本数,n为特征数
model, 训练得到的模型,也就是svmtrain的输出模型
'options', 一些可选的的参数, '-q'表示不在窗口打印预测信息, '-b 1' 表示需要返回概率估计值。
对于使用'-b 1'需要注意,只有同时在svmtrain函数里也指定才可以,如svmtrain(trainlabel, trainfeats, '-s 0 -t 0 -c 1 -b 1 -q')
输出参数:
predict_label, 模型预测的label,如 [0;0;0;1;1;1;1;1;1;1]
accuracy, 模型预测准确率, 一个包含了准确率(针对分类),均方误差和平方相关系数(针对回归)
decision_values/prob, 模型预测决策值 当'-b 1'指定时, 这里输出为概率估计值,维度m*2 (针对二分类问题)。

好,现在采用libsvmpredict,为了得到预测概率值,我们需要对libsvmtrainlibsvmpredict指定-b 1
接下来,可以进行libsvm训练,测试并得到其准确率和ROC曲线及AUC了。

举例

clear;
clc;
tic;
addpath('/usr/local/MATLAB/R2015a/libsvm/matlab/');
load('./train.mat'); % 载入训练数据。1200*5的trainfeats 1200*1的trainlabel 两类样本为0 1
load('./test.mat'); % 载入测试数据。200*5的testfeats 200*1的testlabel
%% data preprocessing scale to -1 1
[trainfeats, ~] = mapminmax(trainfeats', -1, 1); % the min and max value aim to each row
trainfeats = trainfeats';
[testfeats, ~] = mapminmax(testfeats', -1, 1); % the min and max value aim to each row
testfeats = testfeats';
%% model train and predict
cmd = '-s 0 -t 0 -c 1 -b 1 -q';
model = libsvmtrain(trainlabel, trainfeats, cmd);
[predict_label, accuracy, prob] = libsvmpredict(testlabel, testfeats, model, '-b 1');
[X,Y, ~, AUC] = perfcurve(testlabel, prob(:,2), 1); % calculate the auc
disp(accuracy(1))
disp(AUC)
plot(X, Y, 'r')
toc;