pyspark提取ROC曲线?

pyspark提取ROC曲线?,pyspark,apache-spark-ml,Pyspark,Apache Spark Ml,有没有办法从pyspark中的Spark ML获得ROC曲线上的点?在文档中,我看到了Scala的一个示例,但不是python: 是这样吗?我当然可以想到实现它的方法,但我不得不想象,如果有一个预构建的函数,它会更快。我正在处理300万个分数和几十个模型,因此速度很重要。只要ROC曲线是FPR与TPR的曲线图,您就可以提取所需的值,如下所示: your_model.summary.roc.select('FPR').collect() your_model.summary.roc.select(

有没有办法从pyspark中的Spark ML获得ROC曲线上的点?在文档中,我看到了Scala的一个示例,但不是python:


是这样吗?我当然可以想到实现它的方法,但我不得不想象,如果有一个预构建的函数,它会更快。我正在处理300万个分数和几十个模型,因此速度很重要。

只要ROC曲线是FPR与TPR的曲线图,您就可以提取所需的值,如下所示:

your_model.summary.roc.select('FPR').collect()
your_model.summary.roc.select('TPR').collect())
例如,您的_模型可以是这样的模型:

from pyspark.ml.classification import LogisticRegression
log_reg = LogisticRegression()
your_model = log_reg.fit(df)
现在,您应该使用matplotlib等工具,根据TPR绘制FPR

附言

下面是一个使用名为your_model和其他任何工具的模型绘制ROC曲线的完整示例!。我还在ROC图中绘制了一条参考随机猜测线

import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
plt.plot([0, 1], [0, 1], 'r--')
plt.plot(your_model.summary.roc.select('FPR').collect(),
         your_model.summary.roc.select('TPR').collect())
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()

对于除逻辑回归(如决策树或缺乏模型摘要的随机森林)之外的模型,更通用的解决方案可以使用Spark MLlib获得ROC曲线

请注意,PySpark版本并没有实现的所有方法,因此您需要使用中的.callname函数。py4j似乎也不支持解析scala.Tuple2类,因此必须手动处理它们

例如:

从pyspark.mllib.evaluation导入BinaryClassificationMetrics Scala版本实现.roc和.pr 蟒蛇:https://spark.apache.org/docs/latest/api/python/_modules/pyspark/mllib/common.html 斯卡拉:https://spark.apache.org/docs/latest/api/java/org/apache/spark/mllib/evaluation/BinaryClassificationMetrics.html 类别曲线TricsBinarCyclassitionMetrics: 定义初始自我,*参数: 超曲面度量,self.\u初始参数 定义到列表自身,rdd: 点数=[] 注意:对于大型数据集,此收集可能效率低下 考虑到每个数据点最多可能有一个概率 Scala版本采用numBins参数, 但似乎不可能将其从Python传递到Java 对于rdd.collect中的行: 结果以scala.Tuple2类型返回, 它似乎没有py4j映射 点数+=[floatrow.\u 1,floatrow.\u 2] 返回点 def get_曲线自身,方法: rdd=getattrself.\u java\u模型,method.toJavaRDD 返回self.\u到\u列表rdd 用法:

将matplotlib.pyplot作为plt导入 创建管道估计器并拟合列车DF,预测测试DF 模型=估计器.fittrain 预测=模型试验 以列表形式返回假阳性率、真阳性率 preds=预测。选择“标签”、“概率”。rdd.maplambda行:floatrow['probability'][1],floatrow['label'] 点=曲线矩阵。获取曲线“roc” plt.图 x_val=[x[0]表示x英寸的点] y_val=[x[1]表示x个点] 小标题 plt.xlabelx标签 plt.ylabellabel plt.plot x_val,y_val Scala中的BinaryClassificationMetrics还实现了其他几种有用的方法:

度量=曲线度量 度量。获取_曲线“fMeasureByThreshold” 度量。获取_曲线“精度阈值” 指标。获取_曲线“RecCallByThreshold”
谢谢,这很有帮助。但就我而言,我没有实际的模型。我有一个带概率的两列rdd和一个二进制标签。在scala文档中,您可以执行metrics=BinaryClassificationMetricspredictionAndLabels,然后metrics.roc为您打分。但这对pyspark不起作用。我想这是一个万岁,因为函数存在于其他地方?而且,我能够获取一些模型对象并重新加载它们,从pyspark.ml.classification导入LogisticRegressionModel,然后mdl=LogisticRegressionModel.loadloc,但当我尝试调用时,我得到RuntimeError:此LogisticRegressionModel没有可用的培训摘要。你有什么想法吗?你在装之前把模型装好了吗?培训完模型后,应立即提供总结。如果运行mdl.hasSummary,会发生什么?关于管道,我还有另一个猜测:如果将该模型作为管道的最后一个阶段,则可以使用mdl.stages[-1].summary而不是mdl.summary来访问它。它是在另一个程序中训练的模型,然后使用mdl.write.saves3\u路径保存到s3。我猜不知怎么的,它失去了概要。我想我只需要回到另一个程序,在保存模型之前提取ROC点,然后将它们保存为json或其他格式。这并不理想,但我想这是最好的选择。谢谢你的帮助,我理解。通常我不使用save/load,因此在这方面我没有帮助。我很高兴我帮助了你!此代码提供错误名称错误:未定义名称“points”。知道为什么吗?在这里创建列表时,您需要用roc替换点:roc=CurveMetricspreds。获取曲线“roc”,并替换绘图函数中的变量名。谢谢@AlexRoss这真的很有帮助!我真希望我能多加几次!真的没有办法转换scala.Tupl吗
e2s而不收集整个RDD?这一整天都让我发疯。我花了一天的时间来研究这个问题,在这个答案出现的时候,我也没找到办法。但我可能错过了一些东西,或者API可能已经改变了。这对于大型数据集来说并不理想。