我正在使用 one-vs-all 来执行21
- 类 svm分类。
我希望标签-1
表示“不在此课程中,标签1
表示”确实在此课程中“对于每个21
内核。
我使用这个标准生成了我预先计算的内核和我的测试向量。
使用easy.py
对于20
个类来说,一切都很顺利,但对于其中一个,标签已切换,以便所有应使用1
标记的输入进入该课程被标记为-1
,反之亦然。
该类的差异在于预先计算的内核中的第一个向量标记为1
,而在所有其他内核中,第一个向量标记为-1
。这表明 LibSVM 重新标记了我的所有载体。
有没有办法阻止这种或简单的解决方法?
答案 0 :(得分:3)
您已经发现libsvm使用标签-1来表示它首先遇到的任何标签。 原因是,它允许任意标签,并根据它们在标签向量中出现的顺序将它们更改为-1和+1。
因此,您可以直接检查这个,也可以查看libsvm返回的模型。
它包含一个名为Label
的条目,它是一个包含libsvm遇到标签的顺序的向量。您也可以使用此信息来切换乐谱的符号。
答案 1 :(得分:2)
如果在训练期间 libsvm 首先遇到标签 A ,那么在预测期间 libsvm 将使用正值为对象分配标签 A ,将负值用于其他标签。
因此,如果您使用标签 1 作为正类, 0 作为负数,那么要获得正确的输出值,您应该执行以下技巧(Matlab)。
%test_data.y contains 0-s and 1-s
[labels,~,values] = svmpredict(test_data.y, test_data.X, model, ' ');
if (model.Label(1) == 0) % we check which label was encountered by libsvm first
values = -values;
end