【发布时间】:2017-10-11 02:06:39
【问题描述】:
有没有办法让模型返回一个预测标签列表以及每个标签的概率分数?
例如 给定特征(f1,f2,f3), 它返回如下内容: 标签1:0.50,标签2:0.33...
在 spark 中可行吗?
【问题讨论】:
标签: apache-spark pyspark apache-spark-mllib
有没有办法让模型返回一个预测标签列表以及每个标签的概率分数?
例如 给定特征(f1,f2,f3), 它返回如下内容: 标签1:0.50,标签2:0.33...
在 spark 中可行吗?
【问题讨论】:
标签: apache-spark pyspark apache-spark-mllib
是的,这是可能的。
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)
}
【讨论】: