【问题标题】:How to get classification probabilities from PySpark MultilayerPerceptronClassifier?如何从 PySpark MultilayerPerceptronClassifier 获取分类概率?
【发布时间】:2017-09-23 16:04:26
【问题描述】:

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

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

我发现了一个类似的话题, How to get classification probabilities from MultilayerPerceptronClassifier? 但他们使用 Java,他们建议的解决方案在 python 中不起作用。

谢谢

【问题讨论】:

    标签: apache-spark machine-learning neural-network pyspark apache-spark-ml


    【解决方案1】:

    确实,从 2.0 版开始,Spark ML 中的 MLP 似乎不提供分类概率;尽管如此,还有许多其他分类器这样做,即Logistic Regression、Naive Bayes、Decision Tree 和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,见我的回答here;有关 PySpark 分类的几个未记录和违反直觉的特征,请参阅我的相关 blog post。

    【讨论】:

    • 您能解释一下概率列实际显示的内容吗?在第一行的 lr 示例中,结果等于 1 的预测概率是 0.7289 吗?如果是这样,那么为什么预测为 0(预测概率 = 0.2710 的行预测 = 1)?
    • @gannawag 注意点 (...);这里只显示了probabilities 二维数组的第一个元素,即第一行中probability[0] 具有最大值(因此预测0.0),而在第二行中(未显示)@987654332 @ 具有最大的价值,因此预测 1.0。同样,在 RF 中,两行中的probability[1](同样,上面未显示)具有最大值。因此,这两个预测都是针对第 1 类的。该示例很容易重现,只需使用 lr_result.show(truncate=False) 尝试即可查看完整的数组值。
    • @gannawag 0.7289 是结果为0.0 的概率(Python 索引从零开始),同样适用于 0.2710
    猜你喜欢
    • 2016-06-28
    • 2019-06-29
    • 1970-01-01
    • 2018-08-28
    • 2014-06-09
    • 1970-01-01
    • 2019-10-25
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多