如何使用 LIBSVM 从混淆矩阵中获得分类精度?

Posted

技术标签:

【中文标题】如何使用 LIBSVM 从混淆矩阵中获得分类精度?【英文标题】:How to get classification accuracy from confusion matrix using LIBSVM? 【发布时间】:2014-02-08 10:12:34 【问题描述】:

朋友们,目前我正在使用 LIBSVM 进行 SVM 分类器(5 折交叉验证)。下面我有提到的代码。总共,数据有 120 x 4 个向量和 3 个类别。因此,每次折叠,trainData = 120 x 4,testData = 30 x 4。问题是,我必须从混淆矩阵中获得分类精度。 我需要以下问题的答案:

    如何从混淆矩阵中得到每个类的分类准确率?? 概率估计需要什么? 什么是“预测概率最高的类别”? 我不明白“acc”的结果???

提前感谢朋友们。

代码是:

load fisheriris                   %# Fisher Iris dataset
[~,~,labels] = unique(species);   %# labels: 1/2/3
data = zscore(meas);              %# scale features
numInst = size(data,1);
numLabels = max(labels);  
FISH =[];

numFolds = 5;
for jj=1:5% number of iterations

indices  = crossvalind('Kfold',labels,numFolds);       % K-Fold Validation
for ii = 1:numFolds 
test = (indices == ii); 
train = ~test

%# split training/testing
idx = randperm(numInst);
numTrain = 120; numTest = numInst - numTrain;
trainData = data(idx(1:numTrain),:);  testData = data(idx(numTrain+1:end),:);
trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end));

%# train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
modelk = svmtrain(double(trainLabel==k), trainData, '-t 2 -c 1 -g 1 -b 1');
end

%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
[~,~,p] = svmpredict(double(testLabel==k), testData, modelk, '-b 1');
prob(:,k) = p(:,modelk.Label==1);    %# probability of class==k
end

%# predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == testLabel) ./ numel(testLabel)    %# accuracy
CM = confusionmat(testLabel, pred)                   %# confusion matrix
end
FISH =[FISH;(CM(1,1)/10)*100 (CM(2,2)/10)*100 (CM(3,3)/10)*100)      
end 

【问题讨论】:

【参考方案1】:

1. How to get the classification accuracy for each class from confusion matrix??

您的代码通过将其转换为 one-vs-all 问题来处理 3 类分类问题。更具体地说,此代码double(trainLabel==k) 在与 k 具有相同标签的样本中分配标签 1,而其余标签为 0。这是针对 for 循环内的所有类完成的,并为每种情况保存一个模型。实际上有一个二元分类问题,您可以使用sensitivity 和specificity 措施。一般来说,如果你有消极和积极的标签,特异性衡量分类器识别消极标签的有效性,而敏感性衡量分类器识别积极标签的有效性。一个很好的参考是here。

2. What is the need for probability estimates?

LIBSVM 有一个参数选项 (-b 1) 来获取带有概率信息的模型并使用概率估计来预测测试数据。在以下代码中

%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
[~,~,p] = svmpredict(double(testLabel==k), testData, modelk, '-b 1');
prob(:,k) = p(:,modelk.Label==1);    %# probability of class==k
end

正如评论所指,我们得到每个对象属于一个类的概率。这是通过循环模型获得的,并存储每个样本属于k变量指定的类的概率。这适用于所有标签,numLabels

3. What the term refers "predict the class with the highest probability"? 矩阵prob 的行数与样本数一样多,列数与标签数一样多。在每一行中,列数包含样本属于相应标签数的概率。例如,如果连续有以下数字0.7 0.2 0.1,则对应的样本属于第 1 类。

4. I do not understand the result of "acc"??? acc 是经典的准确度指标:正确分类的样本总数除以样本总数。这也可以通过对矩阵的对角元素求和并将该数字除以矩阵中的总帧数从混淆矩阵中获得。

【讨论】:

以上是关于如何使用 LIBSVM 从混淆矩阵中获得分类精度?的主要内容,如果未能解决你的问题,请参考以下文章

遥感软件中混淆矩阵是如何产生的

评价-分类算法的评价指标

混淆矩阵颜色匹配数据大小而不是分类精度

混淆矩阵-MATLAB代码详解

Python遥感图像处理应用篇(二十八):Python绘制遥感图像分类结果混淆矩阵和计算分类精度

Python遥感图像处理应用篇(二十八):Python绘制遥感图像分类结果混淆矩阵和计算分类精度