Apache spark PySpark:获取ROC曲线中每个点的阈值(截止值)
我从PySpark开始,构建二元分类模型(逻辑回归),我需要为我的模型找到最佳阈值(截止点) 我想用ROC曲线来找到这个点,但我不知道如何提取曲线中每个点的阈值。有没有办法找到这个值 我发现的东西:Apache spark PySpark:获取ROC曲线中每个点的阈值(截止值),apache-spark,pyspark,roc,Apache Spark,Pyspark,Roc,我从PySpark开始,构建二元分类模型(逻辑回归),我需要为我的模型找到最佳阈值(截止点) 我想用ROC曲线来找到这个点,但我不知道如何提取曲线中每个点的阈值。有没有办法找到这个值 我发现的东西: 显示如何提取ROC曲线,但仅提取TPR和FPR的值。它对于绘图和选择最佳点很有用,但我找不到阈值 我知道我可以使用H2O找到ROC曲线中每个点的阈值(我以前做过),但我正在研究Pyspark 是一篇描述如何使用R。。。但是,再一次,我需要用Pyspark来做 其他事实 我正在使用ApacheS
- 显示如何提取ROC曲线,但仅提取TPR和FPR的值。它对于绘图和选择最佳点很有用,但我找不到阈值
- 我知道我可以使用H2O找到ROC曲线中每个点的阈值(我以前做过),但我正在研究Pyspark
- 是一篇描述如何使用R。。。但是,再一次,我需要用Pyspark来做
- 我正在使用ApacheSpark2.4.0
- 我正在使用数据帧(我真的不知道如何使用RDD,但我不怕学习;)
来自pyspark.ml.classification导入逻辑回归
lr=逻辑回归(labelCol=“label”,featuresCol=“features”)
模型=lr.配合(训练数据)
预测=model.transform(testData)
然后收集你的分数和标签1:
preds=预测。选择('label','probability'))\
.rdd.map(lambda行:(float(行['probability'][1]),float(行['label']))\
.collect()
现在转换preds
以使用roc\u曲线
从sklearn.metrics导入roc_曲线
y_分数,y_真=zip(*preds)
fpr、tpr、阈值=roc\U曲线(y\U真、y\U分数、位置标签=1)
注释:
1
。然而,在二进制分类问题中,您将立即知道AUC是否小于0.5。在这种情况下,只需对概率取1-p
(因为类概率总和为1)来自pyspark.ml.classification导入逻辑回归
lr=逻辑回归(labelCol=“label”,featuresCol=“features”)
模型=lr.配合(训练数据)
预测=model.transform(testData)
然后收集你的分数和标签1:
preds=预测。选择('label','probability'))\
.rdd.map(lambda行:(float(行['probability'][1]),float(行['label']))\
.collect()
现在转换preds
以使用roc\u曲线
从sklearn.metrics导入roc_曲线
y U分数,y_Utrue=zip(*preds)
fpr、tpr、阈值=roc\U曲线(y\U真、y\U分数、位置标签=1)
注释:
1
。然而,在二进制分类问题中,您将立即知道AUC是否小于0.5。在这种情况下,只需对概率取1-p
(因为类概率总和为1)如果您特别需要为不同的阈值生成ROC曲线,一种方法可以是生成您感兴趣的阈值列表,并在数据集上对每个阈值进行拟合/转换。或者,您可以使用
model.transform(test)
响应中的probability
字段手动计算每个阈值点的ROC曲线
或者,您可以使用按阈值提取绘制各种指标(F1分数、精度、召回率)的曲线
不幸的是,PySpark版本似乎没有实现Scala版本所实现的大多数方法,因此需要用Python包装该类
例如:
从pyspark.mllib.evaluation导入BinaryClassificationMetrics
#Scala版本实现了.roc()和.pr()
#Python: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
类曲线度量(BinaryClassificationMetrics):
定义初始化(self,*args):
超级(曲线测量学,自).\uuuu初始值(*args)
定义到列表(自身、rdd):
点数=[]
#注意:对于大型数据集,此收集可能效率低下
#考虑到每个数据点可能有一个概率(最多)
#Scala版本采用numBins参数,
#但似乎不可能将其从Python传递到Java
对于rdd.collect()中的行:
#结果以scala.Tuple2类型返回,
#它似乎没有py4j映射
点+=[(float(row.\u 1())、float(row.\u 2()))]
返回点
def get_曲线(自身、方法):
rdd=getattr(self.\u java_模型,方法)().toJavaRDD()
将自身返回到列表(rdd)
用法:
导入matplotlib.pyplot作为plt
preds=predictions.select('label','probability').rdd.map(lambda行:(float(row['probability'][1]),float(row['label']))
#以列表形式返回(假阳性率、真阳性率)
点=曲线矩阵(preds)。获取曲线('roc')
plt.图()
x_val=[x[0]表示x英寸的点]
y_val=[x[1]表示x个点]
标题(标题)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.plot(x_val,y_val)
结果:
以下是一个F1分数曲线的阈值示例,如果您未与ROC结婚:
如果您特别需要为不同的阈值生成ROC曲线,一种方法是生成您感兴趣的阈值列表,并在数据集上对每个阈值进行拟合/转换。或者您可以使用<代码手动计算每个阈值点的ROC曲线