【问题标题】:Spark ML Naive Bayes predict multiple classes with probabilitiesSpark ML 朴素贝叶斯用概率预测多个类
【发布时间】:2017-10-11 02:06:39
【问题描述】:

有没有办法让模型返回一个预测标签列表以及每个标签的概率分数?

例如 给定特征(f1,f2,f3), 它返回如下内容: 标签1:0.50,标签2:0.33...

在 spark 中可行吗?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-mllib


    【解决方案1】:

    是的,这是可能的。 rawPrediction 列的输出是 Array[Double],其中包含每个标签的概率。

    在您的示例中,此列将是一个 Array(0.5,0.33,0.17),您必须编写一个 UDF 将此 Array 转换为 String。

    请务必注意,如果您使用 StringIndexer 对标签列进行编码,则生成的标签将与原始标签不同。 (most frequent label gets index 0)

    有一些代码可以做类似的事情,可以适应您的用例。 我的代码只是将每个功能的前 X 个预测写入 CSV 文件。 writeToCsv 的参数 @df 必须是经过朴素贝叶斯模型转换后的 DataFrame。

     def topXPredictions(v: Vector, labels: Broadcast[Array[String]], topX: Int): Array[String] = {
        val labelVal = labels.value
        v.toArray
          .zip(labelVal)
          .sortBy {
            case (score, label) => score
          }
          .reverse
          .map {
            case (score, label) => label
          }
          .take(topX)
      }
    
      def writeToCsv(df: DataFrame, labelsBroadcast: Broadcast[Array[String]], name: String = "output"): Unit = {
        val get_top_predictions = udf((v: Vector, x: Int) => topXPredictions(v, labelsBroadcast, x))
    
          df
          .select(
            col("id")
            ,concat_ws(" ", get_top_predictions(col("rawPrediction"), lit(10))).alias("top10Predictions")
           )
          .orderBy("id")
          .coalesce(1)
          .write
          .mode(SaveMode.Overwrite)
          .format("com.databricks.spark.csv")
          .option("header", "true")
          .save(name)
      }
    

    【讨论】:

    • 这正是我想要的!非常感谢!
    猜你喜欢
    • 2016-03-22
    • 2016-11-30
    • 2014-01-13
    • 2023-03-08
    • 2013-08-06
    • 2021-03-05
    • 2016-10-23
    • 2013-12-10
    相关资源
    最近更新 更多