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。那么中间阈值没有区别。
考虑BinaryClassificationMetrics
的numBins
参数:
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拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)