Spark:回归模型阈值和精度

Posted

技术标签:

【中文标题】Spark:回归模型阈值和精度【英文标题】:Spark : regression model threshold and precision 【发布时间】:2016-03-16 22:47:41 【问题描述】:

我有逻辑回归模式,我将阈值明确设置为 0.5。

model.setThreshold(0.5)

我训练模型,然后我想获得基本的统计数据——精度、召回率等。

这是我评估模型时所做的:

val metrics = new BinaryClassificationMetrics(predictionAndLabels)

val precision = metrics.precisionByThreshold


precision.foreach  case (t, p) =>

      println(s"Threshold is: $t, Precision is: $p")

    

我得到的结果只有 0.0 和 1.0 作为阈值,而 0.5 被完全忽略。

这是上述循环的输出:

阈值为:1.0,精度为:0.8571428571428571

阈值为:0.0,精度为:0.3005181347150259

当我调用 metrics.thresholds() 时,它也只返回两个值,0.0 和 1.0。

如何获得阈值为 0.5 的准确率和召回率值?

【问题讨论】:

【参考方案1】:

您需要在进行预测之前清除模型阈值。清除阈值会使您的预测返回分数而不是分类标签。如果没有,您将只有两个阈值,即您的标签 0.0 和 1.0。

model.clearThreshold()

来自 predictionsAndLabels 的元组应该看起来像 (0.6753421,1.0) 而不是 (1.0,1.0)

看看https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/mllib/BinaryClassificationMetricsExample.scala

如果输入很大,您可能仍想设置 numBins 来控制点数。

【讨论】:

拜托,我有预测和标签,如 (1.0,1.0) 以及阈值 1,0 的精度和召回值。我无法在管道模型中设置阈值。如何解决这个问题?阈值为:0.0,召回为:1.0 阈值为:1.0,召回为:1.0【参考方案2】:

我认为发生的情况是所有预测都是 0.0 或 1.0。那么中间阈值没有区别。

考虑BinaryClassificationMetricsnumBins 参数:

numBins: 如果大于 0,则内部计算的曲线(ROC 曲线、PR 曲线)将被下采样到这么多“箱”。如果为 0,则不会发生下采样。这很有用,因为曲线包含输入中每个不同分数的一个点,这可能与输入本身一样大 - 数百万个点或更多,而数千个点可能完全足以总结曲线。下采样后,曲线将改为由大约 numBins 个点组成。点由相等数量的连续点组成。每个 bin 的大小为 floor(scoreAndLabels.count() / numBins),这意味着生成的 bin 数量可能不完全等于 numBins。因此,每个分区中的最后一个 bin 可能会更小,这意味着分区边界处可能会有额外的样本。

因此,如果您不设置numBins,则会在所有不同的预测值下计算精度。在您的情况下,这似乎只是 0.0 和 1.0。

【讨论】:

看看predictionAndLabels的内容来证实或反驳这个理论! 我仍然不确定您的评论。 model.setThreshold(0.5) 将在 1 类中得分小于 0.5,在 2 类中得分 > 0.5。我有 2 个类。我不确定 numbins 对此有何帮助。 如果不设置numBins,那么会在所有不同的预测值下计算精度。在您的情况下,这似乎只是 0.0 和 1.0。我已将此添加到答案中。看看predictionAndLabels的内容,看看我说的对不对! @DanielDarabos 请,我有预测 1 或 0 中的所有值。阈值 1,0 的精度和召回值。我无法在管道模型中设置阈值。如何解决这个问题?阈值为:0.0,召回为:1.0 阈值为:1.0,召回为:1.0。怎么了? 对不起,我不知道。我好久没用过这个了。将其作为一个新问题发布,希望有人能给出有用的答案!祝你好运!【参考方案3】:

首先,尝试像这样添加更多的 bin(这里 numBins 是 10):

val metrics = new BinaryClassificationMetrics(probabilitiesAndLabels,10);

如果您仍然只有 0 和 1 这两个阈值,请检查以确保您定义 predictionAndLabels 的方式。如果您不小心提供了(label, prediction) 而不是(prediction, label),那么很多人都会遇到这个问题。

【讨论】:

以上是关于Spark:回归模型阈值和精度的主要内容,如果未能解决你的问题,请参考以下文章

如何更改加载逻辑回归模型的决策阈值

机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型

确定R中glm逻辑回归模型的阈值

R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)

回归和分类的区别

Spark:从管道模型中提取 ML 逻辑回归模型的摘要