【问题标题】:How to interpret probability column in spark logistic regression prediction?如何解释火花逻辑回归预测中的概率列?
【发布时间】:2017-10-18 22:48:19
【问题描述】:

我正在通过spark.ml.classification.LogisticRegressionModel.predict 获得预测。许多行的prediction 列为1.0probability 列为.04model.getThreshold0.5,所以我假设模型将超过 0.5 概率阈值的所有内容分类为 1.0

我应该如何解释 1.0 predictionprobability 为 0.04 的结果?

【问题讨论】:

    标签: apache-spark machine-learning apache-spark-sql logistic-regression apache-spark-ml


    【解决方案1】:

    执行LogisticRegression 的概率列应包含一个长度与类数相同的列表,其中每个索引给出该类的相应概率。我用两个类做了一个小例子来说明:

    case class Person(label: Double, age: Double, height: Double, weight: Double)
    val df = List(Person(0.0, 15, 175, 67), 
          Person(0.0, 30, 190, 100), 
          Person(1.0, 40, 155, 57), 
          Person(1.0, 50, 160, 56), 
          Person(0.0, 15, 170, 56), 
          Person(1.0, 80, 180, 88)).toDF()
    
    val assembler = new VectorAssembler().setInputCols(Array("age", "height", "weight"))
      .setOutputCol("features")
      .select("label", "features")
    val df2 = assembler.transform(df)
    df2.show
    
    +-----+------------------+
    |label|          features|
    +-----+------------------+
    |  0.0| [15.0,175.0,67.0]|
    |  0.0|[30.0,190.0,100.0]|
    |  1.0| [40.0,155.0,57.0]|
    |  1.0| [50.0,160.0,56.0]|
    |  0.0| [15.0,170.0,56.0]|
    |  1.0| [80.0,180.0,88.0]|
    +-----+------------------+
    
    val lr = new LogisticRegression().setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
    val Array(testing, training) = df2.randomSplit(Array(0.7, 0.3))
    
    val model = lr.fit(training)
    val predictions = model.transform(testing)
    predictions.select("probability", "prediction").show(false)
    
    
    +----------------------------------------+----------+
    |probability                             |prediction|
    +----------------------------------------+----------+
    |[0.7487950501224138,0.2512049498775863] |0.0       |
    |[0.6458452667523259,0.35415473324767416]|0.0       |
    |[0.3888393314864866,0.6111606685135134] |1.0       |
    +----------------------------------------+----------+
    

    这里是概率以及算法做出的最终预测。最终概率最高的类别是预测的类别。

    【讨论】:

    • 嗨 Shaido。我们如何将每个概率与其对应的类别相关联?正如我们在这里看到的,prob[0] 实际上来自 0 类,而 prob[1] 来自 1 类。它在哪里说 prob[0] 不对应于 1 类?
    • 好问题。在二进制分类任务中,某些算法似乎默认概率高于某个阈值与类“0”相关联。这基本上没用...
    • @guiotan:在二分类的情况下,预测的类别总是概率较高的类别。即,在上面的代码中,prediction 0.0 和 1.0 对应于标签 0.0 和 1.0,而每个预测的相关概率将是 probability 列中的最高概率。
    • 是否有一种方法可以为概率列提供 0 和 1 之间的 1 个值?就像另一列 ('combined_probability') 导致前两个预测的概率低于 0.5,而最后一行的概率为 0.5 或更高?
    • @sAguinaga:您可以简单地获取数组的第一个元素(或者如果您想要其他顺序,则为第二个元素)来获得您想要的。
    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2018-03-05
    相关资源
    最近更新 更多