【问题标题】:MLlib: Calculating Precision and Recall for multiple threshold valuesMLlib:计算多个阈值的精度和召回率
【发布时间】:2016-04-09 22:18:41
【问题描述】:

在使用它进行评分之前,我将逻辑回归的阈值设置为 0.5。我现在想获得该值的精度、召回率和 f1 分数。不幸的是,当我尝试这样做时,我看到的唯一阈值是 1.0 和 0.0。如何获取 0 和 1 以外的阈值指标。

例如这里是 o/p:

阈值为:1.0,精度为:0.85

阈值为:0.0,精度为:0.312641

我没有得到阈值 0.5 的精度。这是相关代码。

// 我在这里设置我的逻辑回归模型的阈值。

model.setThreshold(0.5)

// Compute the score and generate an RDD with prediction and label values.  
val predictionAndLabels = data.map { 
  case LabeledPoint(label, features) => (model.predict(features), label)
}

// 我现在要计算准确率和召回率等指标。由于我已将模型阈值设置为 0.5,因此我希望获得该值的 PR。

val metrics = new BinaryClassificationMetrics(predictionAndLabels)
val precision = metrics.precisionByThreshold()

precision.foreach { 
  case (t, p) => {
    println(s"Threshold is: $t, Precision is: $p")

    if (t == 0.5) {
      println(s"Desired: Threshold is: $t, Precision is: $p")        
    }
}

【问题讨论】:

标签: scala apache-spark apache-spark-mllib


【解决方案1】:

precisionByThreshold() 方法实际上是在尝试不同的阈值并给出相应的精度值。由于您已经对数据进行了阈值处理,因此您只有 0 和 1。

假设您有: [0 0 0 1 1 1] 阈值后和真实标签是 [f f f f t t].

然后使用0 进行阈值处理,得到[t t t t t t],这给了你4 个假阳性和2 个真阳性,因此精度为2 / (2 + 4) = 1/3

现在使用1 进行阈值处理,您将得到[f f f t t t],它会为您提供1 个误报和2 个真阳性,因此精度为2 /(2 + 1) = 2/3

您可以看到,现在使用 0.5 的阈值会给您[f f f t t t],这与使用 1 的阈值相同,因此您正在寻找阈值 1 的精度。

这有点令人困惑,因为您已经对预测进行了阈值化。如果你没有对你的预测设定阈值,假设你有[.3 .4 .4 .6 .8 .9](与我一直使用的[0 0 0 1 1 1]保持一致)。

然后precisionByThreshold() 将为您提供阈值 0、.3、.4、.6 .8 .9 的精度值,因为这些都是给出不同结果和精度的阈值,并获得阈值.5 您仍然会采用下一个更大阈值 (.6) 的值,因为同样,它会给出相同的预测,因此具有相同的精度。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2012-11-26
    • 2014-11-20
    • 1970-01-01
    • 2015-10-19
    • 2016-07-26
    • 2020-02-23
    • 2017-11-13
    • 2019-12-14
    相关资源
    最近更新 更多