【问题标题】:Apache SPARK SVM in Scala vs PythonScala 与 Python 中的 Apache SPARK SVM
【发布时间】:2015-11-28 10:47:25
【问题描述】:

最近我一直在尝试利用 Spark 进行二进制分类。我用 Python 编写代码,为了使用 Spark SVM,我使用了以下包:

from pyspark.mllib.classification import SVMWithSGD

看着this link,我意识到 SVM.predict 的 Scala 版本返回一个分数,而它的 python 版本返回一个标签。由于我想使用以下方法计算 AUROC:

from pyspark.mllib.evaluation import BinaryClassificationMetrics

我确实需要分数而不是测试样本的标签。阅读 spark 官方文档,不幸的是,前面提到的 python 版本只返回标签。如果我错了,请纠正我或帮助我解决此问题(如果您知道任何其他软件包或其他内容)。

谢谢

【问题讨论】:

  • 没错,但问题是什么?
  • @eliasah python spark svm 中返回分数而不是标签的任何方法?
  • 不。你必须自己调整它。您还可以编写自己的评估类。这就是我所做的,因为即使在 Scala 中它们仍然不是全部可用。
  • 不。他们现在不应该是,但最终他们会是。在标准化 API 方面有很多工作。尽管如此,Python 并不在 JVM 中运行,而且它使用的 numpy 与 Scala 或 Java 中的结构定义不同。因此,API之间的不一致。但是 Apache Spark 团队正在研究它。该项目非常复杂且庞大,需要维护所有库以及管道中的 Tungsten 项目。因此,您只需要耐心并同时围绕它调整自己的解决方案。我就是这么做的。
  • 有道理。无论如何感谢您的帮助。

标签: python scala apache-spark svm


【解决方案1】:

正如@eliasah 所指出的,您可以扩展SVMModel 以添加一个返回您要查找的内容的函数:

def predictRaw(self, x):
    """
    Predict values for a single data point or an RDD of points
    using the model trained.
    """
    if isinstance(x, RDD):
        return x.map(lambda v: self.predict(v))

    x = _convert_to_vector(x)
    margin = self.weights.dot(x) + self.intercept
    return margin

我去实现参数清除,以便您可以像使用 Scala API 一样执行此操作,而且它似乎已经适合您了,只需在模型上调用 clearThreshold 并预测将切换为返回边距Scala API。

【讨论】:

  • 感谢您对霍顿的有用评论。我也会试一试,让你知道结果。
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2016-03-24
  • 2020-08-23
  • 1970-01-01
  • 2020-09-28
  • 2015-12-30
  • 2015-08-09
相关资源
最近更新 更多