Spark MLlib中DataFrame的‘rawPrediction’和‘probability’列是啥意思?

Posted

技术标签:

【中文标题】Spark MLlib中DataFrame的‘rawPrediction’和‘probability’列是啥意思?【英文标题】:What do columns ‘rawPrediction’ and ‘probability’ of DataFrame mean in Spark MLlib?Spark MLlib中DataFrame的‘rawPrediction’和‘probability’列是什么意思? 【发布时间】:2016-10-20 13:46:17 【问题描述】:

在我训练了一个 LogisticRegressionModel 之后,我用它转换了测试数据 DF 并得到了预测 DF。然后当我调用 prediction.show() 时,输出列名是:[label | features | rawPrediction | probability | prediction]。我知道labelfeatrues 是什么意思,但是我应该如何理解rawPrediction|probability|prediction

【问题讨论】:

如果下面的答案解决了您的问题,请接受 - 请参阅What should I do when someone answers my question? 【参考方案1】:

在旧版本的 Spark javadocs(例如 1.5.x)中,曾经有如下解释:

“原始”预测的含义可能因算法而异,但它直观地给出了对每个可能标签的置信度(其中越大 = 越置信)。

在以后的版本中没有了,但你仍然可以在 Scala 中找到它source code。

无论如何,除了任何不幸的措辞,Spark ML 中的rawPrecictions 用于逻辑回归案例,世界其他地方都称之为logits,即逻辑回归分类器的原始输出,随后使用logistic functionexp(x)/(1+exp(x))转换成概率分数。

以下是 Pyspark 中的玩具数据示例:

spark.version
# u'2.2.0'

from pyspark.ml.classification import LogisticRegression
from pyspark.ml.linalg import Vectors
from pyspark.sql import Row
df = sqlContext.createDataFrame([
     (0.0, Vectors.dense(0.0, 1.0)),
     (1.0, Vectors.dense(1.0, 0.0))], 
     ["label", "features"])
df.show()
# +-----+---------+
# |label| features|
# +-----+---------+
# |  0.0|[0.0,1.0]|
# |  1.0|[1.0,0.0]|
# +-----+---------+

lr = LogisticRegression(maxIter=5, regParam=0.01, labelCol="label")
lr_model = lr.fit(df)

test = sc.parallelize([Row(features=Vectors.dense(0.2, 0.5)),
                       Row(features=Vectors.dense(0.5, 0.2))]).toDF()
lr_result = lr_model.transform(test)
lr_result.show(truncate=False)

结果如下:

+---------+----------------------------------------+----------------------------------------+----------+ 
|features |                          rawPrediction |                            probability |prediction|
+---------+----------------------------------------+----------------------------------------+----------+ 
|[0.2,0.5]|[0.9894187891647654,-0.9894187891647654]|[0.7289731070426124,0.27102689295738763]|      0.0 |
|[0.5,0.2]|[-0.9894187891647683,0.9894187891647683]|[0.2710268929573871,0.728973107042613]  |      1.0 | 
+---------+----------------------------------------+----------------------------------------+----------+

现在让我们确认rawPrediction 的逻辑函数给出了probability 列:

import numpy as np

x1 = np.array([0.9894187891647654,-0.9894187891647654])
np.exp(x1)/(1+np.exp(x1))
# array([ 0.72897311, 0.27102689])

x2 = np.array([-0.9894187891647683,0.9894187891647683])
np.exp(x2)/(1+np.exp(x2))
# array([ 0.27102689, 0.72897311])

即确实是这样


所以,总结一下所有三 (3) 个输出列:

rawPrediction 是逻辑回归分类器的原始输出(长度等于类数的数组) probability 是将逻辑函数应用于rawPrediction 的结果(长度等于rawPrediction 的数组) prediction 是数组 probability 取最大值的参数,它给出最可能的标签(单个数字)

【讨论】:

由于实际的代码/示例,这比我的答案更好 是的,我已经看到了,谢谢。为了其他读者的利益,我将评论放在这里,并在我的答案顶部发表评论,引用这个【参考方案2】:

注意:另请参阅下面的回答 Desertnaut https://***.com/a/52947815/1056563

RawPrediction 通常是直接概率/置信度计算。来自 Spark 文档:

每个可能标签的原始预测。 “原始”的含义 预测可能因算法而异,但它直观地给出了一个 每个可能标签的置信度度量(其中更大 = 更多 自信)。

Prediction是查找rawPrediction - viaargmax`的统计mode的结果:

  protected def raw2prediction(rawPrediction: Vector): Double =
          rawPrediction.argmax

Probability 是每个类的conditional probability。这是scaladoc

在给定原始预测的情况下估计每个类别的概率, 就地进行计算。这些预测也被称为 类条件概率。

实际计算取决于您使用的是哪个Classifier

DecisionTree

将原始预测向量标准化为 多项式概率向量,到位。

它只是按类对实例求和,然后除以总实例数。

 class_k probability = Count_k/Count_Total

LogisticRegression

它使用逻辑公式

 class_k probability: 1/(1 + exp(-rawPrediction_k))

Naive Bayes

 class_k probability = exp(max(rawPrediction) - rawPrediction_k)

Random Forest

 class_k probability = Count_k/Count_Total

【讨论】:

感谢您的详细解释,但我仍然有一些问题:为什么在计算 rawPrediction 之后需要概率,因为它们都表示每个可能的类和度量的“概率” areaUnderROC 和 areaUnderPR 在 BinaryClassificationEvaluator 是都基于 rawPrediction 计算? @StarLee 关于PredictionProbability 如何不同(源自)rawPrediction 的详细信息显示在我的答案中 - 并直接取自源代码。所以我已经回答了这个问题。您想了解哪个部分的更多详细信息? 一些参考链接将不胜感激 - 谢谢 (+1) @desertnaut 我为上述信息挖掘了代码库。【参考方案3】:

如果分类模型是逻辑回归,

rawPrediction 等于(w*x + 偏差)变量系数值

概率是 1/(1+e^(w*x + bias))

预测是 0 或 1。

【讨论】:

以上是关于Spark MLlib中DataFrame的‘rawPrediction’和‘probability’列是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

spark机器学一Mllib 数据类型

掌握Spark机器学习库-02-mllib数据格式

Spark机器学习中ml和mllib中矩阵向量

大数据Spark MLlib机器学习