Scala与Python中的Apache SPARK SVM

Scala与Python中的Apache SPARK SVM,python,scala,apache-spark,svm,Python,Scala,Apache Spark,Svm,最近我一直在尝试利用Spark进行二元分类。我使用Python编写代码,为了使用Spark SVM,我使用以下软件包: from pyspark.mllib.classification import SVMWithSGD 通过查看,我意识到Scala版本的SVM.predict返回一个分数,而python版本的SVM.predict返回一个标签。因为我想使用以下公式计算AUROC: from pyspark.mllib.evaluation import BinaryClassificati

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

from pyspark.mllib.classification import SVMWithSGD
通过查看,我意识到Scala版本的SVM.predict返回一个分数,而python版本的SVM.predict返回一个标签。因为我想使用以下公式计算AUROC:

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


感谢@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
,predict将切换到与Scala API一样返回边距。

正如@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
,predict将切换到与Scala API一样返回边距。

正如@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
,predict将切换到与Scala API一样返回边距。

正如@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相同的保证金。

没错,但问题是什么?@eliasah python中有没有返回分数而不是标签的方法?没有。你得自己调整一下。您还可以编写自己的评估类。这就是我所做的,因为即使在Scala中,它们仍然不都可用。现在不应该这样,但最终会这样。在标准化API方面有很多工作要做。尽管如此,Python并没有在JVM中运行,而且它使用的numpy与Scala或Java中的结构定义不同。因此,API之间存在不一致性。但是apachespark团队正在研究它。该项目非常复杂和庞大,需要维护所有的库,还需要管道中的钨项目。所以你只需要耐心,同时调整你自己的解决方案。我就是这么做的,有道理。无论如何,谢谢你的帮助。没错,但问题是什么?@eliasah python spark svm中有没有返回分数而不是标签的方法?没有。你得自己调整一下。您还可以编写自己的评估类。这就是我所做的,因为即使在Scala中,它们仍然不都可用。现在不应该这样,但最终会这样。在标准化API方面有很多工作要做。尽管如此,Python并没有在JVM中运行,而且它使用的numpy与Scala或Java中的结构定义不同。因此,API之间存在不一致性。但是apachespark团队正在研究它。该项目非常复杂和庞大,需要维护所有的库,还需要管道中的钨项目。所以你只需要耐心,同时调整你自己的解决方案。我就是这么做的,有道理。无论如何,谢谢你的帮助。没错,但问题是什么?@eliasah python spark svm中有没有返回分数而不是标签的方法?没有。你得自己调整一下。您还可以编写自己的评估类。这就是我所做的,因为即使在Scala中,它们仍然不都可用。现在不应该这样,但最终会这样。在标准化API方面有很多工作要做。尽管如此,Python并没有在JVM中运行,而且它使用的numpy与Scala或Java中的结构定义不同。因此,API之间存在不一致性。但是apachespark团队正在研究它。该项目非常复杂和庞大,需要维护所有的库,还需要管道中的钨项目。所以你只需要耐心,同时调整你自己的解决方案。我就是这么做的,有道理。无论如何,谢谢你的帮助。没错,但问题是什么?@eliasah python spark svm中有没有返回分数而不是标签的方法?没有。你得自己调整一下。您还可以编写自己的评估类。这就是我所做的,因为即使在Scala中,它们仍然不都可用。现在不应该这样,但最终会这样。在标准化API方面有很多工作要做。尽管如此,Python并没有在JVM中运行,而且它使用的numpy与Scala或Java中的结构定义不同。因此,API之间存在不一致性。但是apachespark团队正在研究它。该项目非常复杂和庞大,需要维护所有的库,还需要管道中的钨项目。所以你只需要耐心,同时调整你自己的解决方案。我就是这么做的,有道理。无论如何,谢谢你的帮助。谢谢你对霍尔顿的有用评论。我也会给这一个镜头,让你知道结果。谢谢你有用的评论霍尔顿。我也会试一试,让你知道结果