SVM中严格的类标签

时间:2011-07-01 19:47:45

标签: libsvm

我正在使用 one-vs-all 来执行21 - 类 svm分类

我希望标签-1表示“不在此课程中,标签1表示”确实在此课程中“对于每个21内核。

我使用这个标准生成了我预先计算的内核和我的测试向量。

使用easy.py对于20个类来说,一切都很顺利,但对于其中一个,标签已切换,以便所有应使用1标记的输入进入该课程被标记为-1,反之亦然。

该类的差异在于预先计算的内核中的第一个向量标记为1,而在所有其他内核中,第一个向量标记为-1。这表明 LibSVM 重新标记了我的所有载体。

有没有办法阻止这种或简单的解决方法?

2 个答案:

答案 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