Spark / Pyspark:SVM - 如何获得曲线下面积?

时间:2018-01-24 23:08:27

标签: python apache-spark pyspark apache-spark-ml

晚上好,

我最近一直在处理随机森林和天真的贝叶斯。现在我想使用支持向量机。

在拟合模型后,我想使用输出列“probability”和“label”来计算AUC值。但是现在我已经看到SVM没有列“概率”了?!

在这里你可以看到我到目前为止的表现:

from pyspark.ml.classification import LinearSVC

svm = LinearSVC(maxIter=5, regParam=0.01)
model = svm.fit(train)

scores = model.transform(train)
results = scores.select('probability', 'label')

# Create Score-Label Set for 'BinaryClassificationMetrics'
results_collect = results.collect()
results_list = [(float(i[0][0]), 1.0-float(i[1])) for i in results_collect]
scoreAndLabels = sc.parallelize(results_list)

metrics = BinaryClassificationMetrics(scoreAndLabels)
print("AUC-value: " + str(round(metrics.areaUnderROC,4)))

这是我的方法,我过去如何为随机森林和朴素的贝叶斯做到这一点。我以为我也可以用svm来做...但是这不起作用,因为没有输出列“概率”。

有谁知道为什么列“概率”不存在?我现在如何计算AUC值?

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用最新的spark/pyspark到答案的时间:

如果您使用pyspark.ml模块(与mllib不同),则可以使用Dataframe作为界面:

svm = LinearSVC(maxIter=5, regParam=0.01)
model = svm.fit(train)
test_prediction = model.transform(test)

创建评估者(参见设置的源代码):

# don't forget: from pyspark.ml.evaluation import BinaryClassificationEvaluator
evaluator = BinaryClassificationEvaluator()

将评估者应用于数据(同样,源代码显示更多选项):

evaluation = evaluator.evaluate(test_prediction)

evaluate的结果默认为“曲线下面积”:

print("evaluation (area under ROC): %f" % evaluation)

答案 1 :(得分:0)

SVM算法不提供概率估计,但只提供一些分数。

Platt提出了一种算法来计算给定SVM得分的概率,但它被批评但有些并且显然没有在Spark中实现。

不过,有一个类似的问题What does the score of the Spark MLLib SVM output mean?