如何从 PySpark MultilayerPerceptronClassifier 获取分类概率?
How to get classification probabilities from PySpark MultilayerPerceptronClassifier?
我在 python 中使用 Spark 2.0.1,我的数据集在 DataFrame 中,所以我使用 ML(不是 MLLib)库进行机器学习。
我有一个多层感知器分类器,但我只有两个标签。
我的问题是,是否有可能不仅获得标签,而且(或仅)获得该标签的概率?不仅仅是每个输入的 0 或 1,而是 0.95 和 1 的 0.05。
如果这对于 MLP 是不可能的,但对于其他分类器是可能的,我可以更改分类器。我只用过 MLP,因为我知道它们应该能够返回概率,但我在 PySpark 中找不到它。
我找到了一个类似的主题,
但他们使用 Java 并且他们建议的解决方案在 python.
中不起作用
感谢
事实上,从 2.0 版本开始,Spark ML 中的 MLP 似乎并没有提供分类概率;尽管如此,还有许多其他分类器这样做,即 Logistic Regression, Naive Bayes, Decision Tree, and Random Forest。这是第一个和最后一个的简短示例:
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|
# +---------+-------------+--------------------+----------+
关于MLlib,看我的回答; for several undocumented & counter-intuitive features of PySpark classification, see my relevant blog post。
我在 python 中使用 Spark 2.0.1,我的数据集在 DataFrame 中,所以我使用 ML(不是 MLLib)库进行机器学习。 我有一个多层感知器分类器,但我只有两个标签。
我的问题是,是否有可能不仅获得标签,而且(或仅)获得该标签的概率?不仅仅是每个输入的 0 或 1,而是 0.95 和 1 的 0.05。 如果这对于 MLP 是不可能的,但对于其他分类器是可能的,我可以更改分类器。我只用过 MLP,因为我知道它们应该能够返回概率,但我在 PySpark 中找不到它。
我找到了一个类似的主题,
感谢
事实上,从 2.0 版本开始,Spark ML 中的 MLP 似乎并没有提供分类概率;尽管如此,还有许多其他分类器这样做,即 Logistic Regression, Naive Bayes, Decision Tree, and Random Forest。这是第一个和最后一个的简短示例:
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|
# +---------+-------------+--------------------+----------+
关于MLlib,看我的回答