【问题标题】:Getting probability of each new observation being an outlier when using scikit-learn OneClassSVM使用 scikit-learn OneClassSVM 时获取每个新观察结果为异常值的概率
【发布时间】:2015-04-08 01:17:31
【问题描述】:

我是 scikit-learn 和一般 SVM 方法的新手。为了检测异常值,我的数据集与 scikit-learn OneClassSVM 配合良好;我使用观察来训练 OneClassSVM,所有这些都是“内点”,然后使用 predict() 对我的测试数据集生成二进制内点/异常点预测。

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

【问题讨论】:

  • 嗨,知道这是一个老问题,但我认为你一定已经解决了这个问题或找到了解决方法,我基本上被困在 3 年前的同一点上,我需要概率来计算 AUC-ROC ,我也发布了这个堆栈溢出问题stackoverflow.com/questions/49931965/…

标签: scikit-learn svm


【解决方案1】:

在访问此页面之前,我一直在为您的相同问题寻找答案。卡住了一段时间,然后,我回去检查原始的 LIBSVM 包,因为 scikit-learn 的 OneClassSVM 是基于 LIBSVM 的实现,如 here 所述。

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 暂时不提供它。我希望在不久的将来,他们会激活此功能并在此处更新线程。

【讨论】:

    【解决方案2】:

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

    TLDR:使用

    clf.decision_function(samples) * (-1)
    

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

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2022-11-25
      • 2017-12-22
      • 2018-01-24
      • 2014-04-27
      • 2015-12-01
      • 2015-08-20
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多