在旧版的Spark
javadocs中(例如1.5.x),曾经有以下解释:
“‘原始’预测的含义可能因算法而异,但它直观地给出了每个可能标签的置信度(其中较大=更自信)。”
在后来的版本中已经没有这个解释了,但你仍然可以在Scala
source code中找到它。
无论如何,除了任何不幸的措辞之外,在Spark ML中,对于逻辑回归情况下的
rawPrecictions
,其余的世界称之为
logits,即逻辑回归分类器的原始输出,随后使用
logistic function exp(x)/(1+exp(x))
转换为概率分数。
以下是在Pyspark中使用玩具数据的示例:
spark.version
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()
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))
x2 = np.array([-0.9894187891647683,0.9894187891647683])
np.exp(x2)/(1+np.exp(x2))
即这确实是情况
因此,总结所有三个输出列:
rawPrediction
是逻辑回归分类器的原始输出(数组长度等于类别数)
probability
是将逻辑函数应用于 rawPrediction
的结果(长度等于rawPrediction
的长度)
prediction
是使数组 probability
取得最大值的参数,它给出最有可能的标签(单个数字)
Prediction
和Probability
如何与rawPrediction
不同(是从哪里推导出来的),这些信息直接来自源代码。所以我已经回答了这个问题。你想要更多细节的部分是什么? - WestCoastProjects