在训练和预测过程中,我在Matlab中使用了带有选项'-b 1'
的libsvm。但它总是返回Model does not support probabiliy estimates
,所以我没有得到任何概率或准确性估计。我在二进制类SVM中尝试过(而不是nu-SVM!),它本应该和'-b 1'
一起工作,但事实并非如此。有人知道这个问题的原因吗?
感谢
- 让我向您展示svm predict的用法:
用法:svm predict[选项]test_file model_file output_file选项:
-b probability_estimates:预测概率估计,0还是1(默认为0);对于一类SVM,仅支持0
-q:安静模式(无输出)
- svm训练:
用法:svm train[选项]training_set_file[模型文件]选项:
-s svm_type : set type of SVM (default 0)
0-C-SVC(多类分类)
1--nu SVC(多类分类)
2-一类SVM
3-epsilon SVR(回归)4-nu-SVR(回归)
-t kernel_type:核函数的集合类型(默认值2)
0--线性:u'v 1--多项式:(gammau'v+coeff0)^度
2--径向基函数:exp(-gamma|u-v|^2)
3--sigmoid:tanh(gamma*u'*v+coff0)4——预计算内核(training_set_file中的内核值)
-d度:在内核函数中设置度(默认值3)
-g gamma:在内核函数中设置gamma(默认1/num_features)
-r coeff0:在内核函数中设置coeff0(默认为0)
-c cost:设置c-SVC、epsilon SVR和nu SVR的参数c(默认为1)
-n nu:设置nu SVC、一类SVM和nu SVR(默认0.5)的参数nu
-p epsilon:设置epsilon SVR的损失函数中的epsilon(默认值为0.1)
-m cachesize:设置以MB为单位的缓存大小(默认为100)
-eε:设置终止标准的容差(默认值0.001)
-h收缩:是否使用收缩启发式,0或1(默认为1)
-b probability_estimates:是否训练SVC或SVR模型进行概率估计,0或1(默认为0)
-wi weight:将i类的参数C设置为weight*C,用于C-SVC(默认为1)
-vn:n倍交叉验证模式
-q:安静模式(无输出)
我们可以看到最后四行是-b选项。如果我们用"-b1"选项训练模型,我们会得到一个模型,当你试图预测时,它可以输出概率。否则,如果在尝试预测而不使用"-b 1"生成模型时仅使用"-b"选项。你会得到错误:模型不支持概率估计
主要的是,如果你想获得概率估计,你应该在训练和测试过程中使用">-b1",这两个过程都是如此。
实际上,您的问题需要更多信息才能得到正确的答案。但一般来说,出现错误的部分在源代码中:
try
{
BufferedReader input = new BufferedReader(new FileReader(argv[i]));
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(argv[i+2])));
svm_model model = svm.svm_load_model(argv[i+1]);
if(predict_probability == 1)
{
if(svm.svm_check_probability_model(model)==0)
{
System.err.print("Model does not support probabiliy estimatesn");
System.exit(1);
}
}
else
{
if(svm.svm_check_probability_model(model)!=0)
{
System.out.print("Model supports probability estimates, but disabled in prediction.n");
}
}
predict(input,output,model,predict_probability);
input.close();
output.close();
}
catch(FileNotFoundException e)
{
exit_with_help();
}
catch(ArrayIndexOutOfBoundsException e)
{
exit_with_help();
}
}
这意味着它没有找到概率模型。