PySpark:如何从MultilayerPerceptronClassifier获得分类概率?

Ond*_*rej 7 machine-learning neural-network apache-spark pyspark apache-spark-ml

我在python中使用Spark 2.0.1,我的数据集在DataFrame中,所以我使用ML(不是MLLib)库进行机器学习.我有一个多层感知器分类器,我只有两个标签.

我的问题是,是否有可能不仅获得标签,还可以(或仅)获得该标签的概率?对于每个输入不仅仅是0或1,而是0到0.95和0.05为1.如果MLP不可能,但是可以使用其他分类器,我可以更改分类器.我只使用了MLP,因为我知道它们应该能够返回概率,但我在PySpark中找不到它.

我发现了一个类似的主题, 如何从MultilayerPerceptronClassifier获得分类概率? 但他们使用Java,他们建议的解决方案在python中不起作用.

谢谢

des*_*aut 6

实际上,从版本2.0开始,Spark ML中的MLP似乎没有提供分类概率; 然而,有许多其他分类器这样做,即Logistic回归,朴素贝叶斯,决策树随机森林.这是第一个和最后一个的简短示例:

from pyspark.ml.classification import LogisticRegression, RandomForestClassifier
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)

rf = RandomForestClassifier(numTrees=3, maxDepth=2, labelCol="label", seed=42)
rf_model = rf.fit(df)

# test data:
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()
# +---------+--------------------+--------------------+----------+
# | features|       rawPrediction|         probability|prediction|
# +---------+--------------------+--------------------+----------+
# |[0.2,0.5]|[0.98941878916476...|[0.72897310704261...|       0.0|
# |[0.5,0.2]|[-0.9894187891647...|[0.27102689295738...|       1.0|  
# +---------+--------------------+--------------------+----------+

rf_result = rf_model.transform(test)
rf_result.show()
# +---------+-------------+--------------------+----------+ 
# | features|rawPrediction|         probability|prediction| 
# +---------+-------------+--------------------+----------+ 
# |[0.2,0.5]|    [1.0,2.0]|[0.33333333333333...|       1.0| 
# |[0.5,0.2]|    [1.0,2.0]|[0.33333333333333...|       1.0| 
# +---------+-------------+--------------------+----------+
Run Code Online (Sandbox Code Playgroud)

对于MLlib,看到我的答案在这里 ; 有关PySpark分类的几个未记录和反直觉的功能,请参阅我的相关博客文章.

  • @gannawag注意点(`...`); 这里只显示`概率`2D数组的第一个元素,即在第一行中`probability [0]`具有最大值(因此预测为'0.0`),而在第二行中(未示出) )`probability [1]`具有最大值,因此预测为"1.0".类似地,在RF中,在两行中,"probability [1]"(再次,未在上面示出)具有最大值.因此两个预测都是针对第1类的.这个例子很容易重现,只需用`lr_result.show(truncate = False)`来查看完整的数组值. (2认同)