apache-spark - Spark ML 朴素贝叶斯用概率预测多个类别

标签 apache-spark pyspark apache-spark-mllib

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

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

在 Spark 中可行吗?

最佳答案

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

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

需要注意的是,如果您使用 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)
  }

关于apache-spark - Spark ML 朴素贝叶斯用概率预测多个类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43926116/

相关文章:

apache-spark - 如何使用 SPARK 将多个 parquet 文件转换为 TFrecord 文件?

pyspark - 如何在Pyspark中交叉验证后得到最佳的超参数值?

apache-spark - 关于 HIVE_STATS_JDBC_TIMEOUT 的任何更新以及如何在源代码级别跳过它

scala - Spark - 从 CSV 文件创建(标签、特征)对的 RDD

apache-spark - 关于 Spark SQL 中 Dataset.filter 的错误

apache-spark - 如何将不同的时区应用于 PySpark 中的时间戳

python - 带有额外参数的子类 python 类继承

scala - (数组/ML Vector/MLlib Vector)RDD 到 ML Vector Dataframe 可以

python - 即使没有 maxDF 参数,如何将 maxDF 设置为 pyspark.ml.feature.CountVectorizer?

apache-spark - Mesos 上 Apache Spark 的自定义状态存储提供程序