Spark ML Naive Bayes预测具有概率的多个类

时间:2017-05-11 21:47:42

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

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

例如 给定特征(f1,f2,f3), 它返回这样的东西: LABEL1:0.50,LABEL2:0.33 ...

火花是否可行?

1 个答案:

答案 0 :(得分:2)

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

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

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

有一些代码可以做一些类似的事情,可以适应你的用例。 我的代码只是将每个功能的前X个预测写为CSV文件。 writeToCsv的参数@df必须是Naive Bayes模型转换后的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)
  }