2

我正在使用one-vs-all进行21-class svm categorization

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

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

对于这些类,使用easy.py一切都很顺利20,但是对于其中一个类,标签被切换了,因此所有应该被标记1为在类中的输入都被标记了,-1反之亦然。

该类的不同之处在于预先计算的内核中的第一个向量被标记1,而在所有其他内核中,第一个向量被标记-1。这表明LibSVM 重新标记了我的所有向量。

有没有办法防止这种情况或解决它的简单方法?

4

2 回答 2

2

您已经发现 libsvm 将标签 -1 用于它首先遇到的任何标签。原因是,它允许任意标签,并根据它们在标签向量中出现的顺序将它们更改为 -1 和 +1。

因此,您可以直接检查这一点,也可以查看 libsvm 返回的模型。它包含一个名为的条目Label,它是一个向量,其中包含 libsvm 遇到标签的顺序。您还可以使用此信息来切换分数的符号。

于 2013-04-05T21:59:25.810 回答
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
于 2015-11-12T16:47:25.437 回答