Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark:获取ROC曲线中每个点的阈值(截止值)_Apache Spark_Pyspark_Roc - Fatal编程技术网

Apache spark 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

我从PySpark开始,构建二元分类模型(逻辑回归),我需要为我的模型找到最佳阈值(截止点)

我想用ROC曲线来找到这个点,但我不知道如何提取曲线中每个点的阈值。有没有办法找到这个值

我发现的东西:

  • 显示如何提取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)

注释

  • 我不能100%确定概率向量的排序是否总是使正标签位于索引
    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)
    

    注释

  • 我不能100%确定概率向量的排序是否总是使正标签位于索引
    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曲线