【问题标题】:What does the score of the Spark MLLib SVM output mean?Spark MLLib SVM 输出的分数是什么意思?
【发布时间】:2015-07-13 19:45:09
【问题描述】:

我不理解 Spark MLLib 算法的 SVM 分类器的输出。我想将分数转换为概率,以便获得属于某个类的数据点的概率(在该类上训练 SVM,也就是多类问题)(see also this thread)。目前尚不清楚分数的含义。是到超平面的距离吗?我如何从中获得概率?

【问题讨论】:

  • SVM 是确定性的,不处理概率,它们只适合决策边界。您当然可以根据到决策边界的距离来猜测概率,但它的效果如何是值得怀疑的。
  • LibSVM 确实支持它,以及科学文献:www.citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.1639 所以我认为计算后验概率是可能的,但在 Spark MLLib 中不可用。由于我没有得到社区关于此类功能已经可用的任何回应,我得出结论,我必须自己实现它?
  • 那个链接失效了。
  • 更多信息here有一种技术可以将 svm 分数映射到基于逻辑回归的概率。这种技术是由 Platt 等人提出的。几年前,可用于许多体面的 svm 实现。由于它只是围绕最终 svm 的事后概率分数,一些科学家批评它不是真正的概率。对于后者,可以使用高斯过程 [...]

标签: apache-spark svm probability apache-spark-mllib


【解决方案1】:
import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.util.MLUtils

// Load training data in LIBSVM format.
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")

// Split data into training (60%) and test (40%).
val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0).cache()
val test = splits(1)

// Run training algorithm to build the model
val numIterations = 100
val model = SVMWithSGD.train(training, numIterations)

// Clear the default threshold.
model.clearThreshold()

// Compute raw scores on the test set.
val scoreAndLabels = test.map { point =>
  val score = model.predict(point.features)
  (score, point.label)
}

// Get evaluation metrics.
val metrics = new BinaryClassificationMetrics(scoreAndLabels)
val auROC = metrics.areaUnderROC()

println("Area under ROC = " + auROC)

// Save and load model
model.save(sc, "myModelPath")
val sameModel = SVMModel.load(sc, "myModelPath")

如果您在 MLLib 中使用 SVM 模块,它们会为您提供 ROC 曲线下面积的 AUC,相当于 "Accuracy" 。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    该值是边距——到分离超平面的距离。这不是概率,SVM 通常不会给你一个概率。但是,正如 @cfh 的 cmets 所指出的,您可以尝试根据此边距学习概率。但这与 SVM 是分开的。

    【讨论】:

    • 作为作者:共同作者,Spark 上的高级分析,您可能肯定知道 Spark MLLib 是否包含学习概率的功能。我找不到。如果我可以随意问:您认为 LVQ 在多类分类和提取概率方面更有意义吗?我认为确实如此,因为集群中点的分布可以通过高斯函数建模,并且该函数可用于计算概率。我希望你能给我一些建议:)
    • 是的,就是我。如果您需要学习概率,请使用像简单 LR 一样直接执行此操作的模型。不过,你不需要多类的概率。我真的不知道 LVQ 但这会给出概率吗?我不认为你在其中任何一个中都适合高斯。
    • 好,是的,我同意,但是,在多类分类问题中,逻辑回归 (LR) 不如带有 RBF 内核的 SVM(大多数情况下)强大。因此,我想知道如何计算这些概率。从您的回答中,我可以得出结论,Spark 的 MLLib 不包括学习概率的功能?在这种情况下,我认为使用 LVQ 更明智:onlinecourses.science.psu.edu/stat557/node/79 在这个链接中,可以找到带有颜色的点云,这些云可以用高斯函数拟合,从而给出概率?
    • 如果您想对看起来像“多色云”的数据进行建模,我的建议是让每个云(即类)成为高斯凹凸,然后通过贝叶斯规则推导出后验类概率。
    • 谢谢肖恩·欧文和罗伯特·多德勒。我很清楚现在该做什么。
    猜你喜欢
    • 2016-10-20
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多