我在Python中使用的是Spark 2.0.1版本,我的数据集是DataFrame格式,因此我使用的是机器学习的ML库(而不是MLLib)。我有一个多层感知器分类器,并且只有两个标签。
我的问题是,是否有可能不仅仅获取标签,还能(或者只)获取该标签的概率?比如,不只是每个输入的0或1,而是像0的概率为0.95,1的概率为0.05。如果多层感知器做不到,但其他分类器可以做到,我可以更换分类器。我之所以使用多层感知器,是因为我知道它们应该能够返回概率,但在PySpark中我找不到这个功能。
我找到了一个关于这个问题的类似话题,如何从多层感知器分类器中获取分类概率? 但他们使用的是Java,他们建议的解决方案在Python中不起作用。
谢谢
回答:
确实,截至2.0版本,Spark ML中的多层感知器似乎不提供分类概率;然而,有许多其他分类器可以做到这一点,例如逻辑回归、朴素贝叶斯、决策树和随机森林。以下是使用前两个分类器的简短示例:
from pyspark.ml.classification import LogisticRegression, RandomForestClassifierfrom pyspark.ml.linalg import Vectorsfrom pyspark.sql import Rowdf = 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| # +---------+-------------+--------------------+----------+