您好,我已经在 matlab 中训练了一个分类器,我想测试一下它的准确性。 我发现了很多函数可以做到这一点,但我对使用什么感到困惑......
目前:
% train my classifier
svmStruct = fitcsvm(Xtrain,Ytrain,'KernelFunction','linear','Standardize',true);
% predict the output of an unknown input <- this part takes a lot of time
IDX_svm = zeros(size(Xtest,1),1);
for j = 1 : size(Xtest,1)
IDX_svm(j) = predict(svmStruct,Xtest(j,:));
end
%compute performaces
TABLE = confusionmat(Ytest,IDX_svm);
sum_diag = 0;
for j = 1 : size(TABLE,2)
sum_diag = sum_diag + TABLE(j,j);
end
error_rate = 1-(sum_diag/sum(sum(TABLE,2)));
最佳答案
准确性简单地定义为正确预测的标签与测试/验证集中标签总数之间的比率。因此,如果您有测试标签向量(我想是Ytest
)和预测标签向量(我想是IDX_svm
),而不是使用混淆矩阵,您可以简单地运行
Accuracy=sum(IDX_svm==Ytest)/length(Ytest)
准确度
将在 [0;1] 范围内,您只需将其乘以 100 即可按百分比缩放。
当然,错误率是根据以下之一定义的:
- 如果您之前评估过准确度
1-Accuracy
如果Accuracy
在 [0;1] 范围内100-Accuracy
如果Accuracy
以百分比给出
- 如果您只想评估错误率
- in正确预测标签与测试/验证集中标签总数的比率:
ErrorRate=sum(IDX_svm~=Ytest)/length(Ytest)
。这样的值将在 [0;1] 范围内 - 将上述结果乘以 100 将得出错误率百分比
- in正确预测标签与测试/验证集中标签总数的比率:
这些是标准定义,它们适用于每个分类器,而不仅仅是 SVM。
此外,我建议避免在循环中使用 predict()
函数。在这种情况下,您多次调用 predict()
,每次调用都会对一个点进行分类。这会减慢您的代码。正如您现在可能看到的那样,predict()
可以将整个测试矩阵作为输入并返回整个标签向量,因此您不必在 for 循环中预先分配和写入此类向量的每个元素.而且您只调用一次 predict()
。你可能想尝试类似的东西
IDX_svm=predict(svmStruct,Xtest);
关于matlab - 测试性能分类器matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35312938/