使用scikit-learn OneClassSVM时,每次新观察的概率都是异常值

时间:2015-02-08 04:11:41

标签: scikit-learn svm

我是scikit-learn和SVM方法的新手。我的数据集与scikit-learn OneClassSVM一起运行良好,以便检测异常值;我使用观察训练OneClassSVM,所有观察都是'内部',然后使用predict()在我的测试数据集上生成二进制内部/异常值预测。

然而,为了继续我的分析,我想获得与我的测试集中的每个新观察相关的概率。例如。与每个新观察相关的异常值的概率。我注意到scikit-learn中的其他分类方法提供了传递参数probability = True来计算它的能力,但OneClassSVM不提供此功能。有没有简单的方法来获得这些结果?

2 个答案:

答案 0 :(得分:1)

在我到达这个页面之前,我一直在寻找你的同一个问题的答案。坚持了一段时间,然后,我回去查看原始的LIBSVM包,因为scikit-learn的OneClassSVM基于所述here的LIBSVM实现。

main page of LIBSVM,他们对选项'-b'说明以下内容,用于激活某些SVM变体的返回概率输出分数: -b probability_estimates:是否训练SVC或SVR模型进行概率估计,0或1(默认为0) 换句话说,SVM类型的单类SVM(既不是SVC也不是SVR)没有实现概率估计。

如果我尝试使用LIBSVM的命令行界面强制执行此选项(即-b),例如: ./svm-train -s 2 -t 2 -b 1 heart_scale

我收到以下错误消息: 错误:尚未支持单类SVM概率输出

总之,LIBSVM尚不支持非常理想的输出,因此scikit-learn目前还没有提供它。我希望在不久的将来,他们可以激活此功能并在此更新帖子。

答案 1 :(得分:0)

它提供决策函数分数,理论上是与正常和异常之间的边缘决策边界的距离 OCSVM 进行无监督分类。这意味着算法内部的异常是根据到原点的距离定义的(引自 NIPS https://papers.nips.cc/paper/1999/file/8725fb777f25776ffa9076e44fcfd776-Paper.pdf 的 Scholkopf 论文)。

TLDR:使用

clf.decision_function(samples) * (-1)

作为分数。你会得到一个稀疏的分数分布。