我是 SVM 新手。我正在使用jlibsvm来解决多类分类问题。基本上,我正在做一个句子分类问题。有 3 个类别。我的理解是我正在做一对一分类。我有一个相对较小的火车组。共75句,其中每类25句。
我正在制作 3 个 SVM(即 3 个不同的模型),其中,在训练时,在 SVM_A 中,属于 A 类的句子将有一个真实的标签,即 1> 和其他句子将有一个 -1 标签。对 SVM_B 和 SVM_C 进行了相应的处理。
在测试时,为了获得句子的真实标签,我将句子赋予 3 个模型,并采用这 3 个模型返回的预测概率。哪一个返回最高将是该句子所属的类别。
我就是这么做的。但对于所有模型的测试集中的每个句子,我都得到相同的预测概率。
A predicted:0.012820514
B predicted:0.012820514
C predicted:0.012820514
这些值对训练集中的所有句子重复。
以下是我设置训练参数的方法:
C_SVC svm = new C_SVC();
MutableBinaryClassificationProblemImpl problem;
ImmutableSvmParameterGrid.Builder builder = ImmutableSvmParameterGrid.builder();
// create training parameters ------------
HashSet<Float> cSet;
HashSet<LinearKernel> kernelSet;
cSet = new HashSet<Float>();
cSet.add(1.0f);
kernelSet = new HashSet<LinearKernel>();
kernelSet.add(new LinearKernel());
// configure finetuning parameters
builder.eps = 0.001f; // epsilon
builder.Cset = cSet; // C values used
builder.kernelSet = kernelSet; //Kernel used
builder.probability=true; // To get the prediction probability
ImmutableSvmParameter params = builder.build();
我做错了什么?
除此之外还有其他更好的方法来进行多类分类吗?
最佳答案
您将获得相同的输出,因为您生成了相同的模型三次。
这样做的原因是 jlibsvm
能够根据提供的数据执行开箱即用的多类分类(LIBSVM
本身也支持这一点)。如果它检测到给定数据中提供了两个以上的类标签,它会自动执行多类分类。因此无需手动进行 1vsN 方法。只需为每个类别提供带有类标签的数据即可。
但是,jlibsvm
仍处于 beta 状态,并且依赖于相当旧的 LIBSVM
版本(2.88)。很多有changed 。对于更直观的 Java 绑定(bind)(与默认的 LIBSVM
版本相比),您可以查看 zlibsvm ,可通过 Maven Central 获取并基于最新的 LIBSVM
版本。
关于machine-learning - 如何获得多类分类中的jlibsvm预测概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41888141/