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]
。我知道label
和featrues
是什么意思,但是我应该如何理解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 - via
argmax`的统计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 关于Prediction
和Probability
如何不同(源自)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应用