在Spark MLlib中,DataFrame的列'rawPrediction'和'概率'意味着什么?

问题描述 投票:4回答:3

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

apache-spark-sql logistic-regression apache-spark-ml
3个回答
11
投票

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

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

Prediction是找到modeargmax`的统计rawPrediction - via的结果:

  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

1
投票

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

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

它在后来的版本中不存在,但你仍然可以在Scala source code中找到它。

无论如何,除了任何不幸的措辞之外,Spark ML中的rawPrecictions,对于逻辑回归案例,是世界其他地方所谓的logits,即逻辑回归分类器的原始输出,随后使用该变换分类器转换为概率分数。 logistic function exp(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取其最大值的参数,它给出了最可能的标签(单个数字)

-1
投票

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

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

概率为1 /(1 + e ^(w * x +偏差))

预测是0或1。

© www.soinside.com 2019 - 2024. All rights reserved.