gpt4 book ai didi

scala - 为什么 Spark ML NaiveBayes 输出的标签与训练数据不同?

转载 作者:行者123 更新时间:2023-11-30 08:28:36 26 4
gpt4 key购买 nike

我使用NaiveBayes Apache Spark ML 中的分类器(版本1.5.1)预测一些文本类别。但是,分类器输出的标签与我的训练集中的标签不同。我做错了吗?

这是一个小例子,可以粘贴到例如齐柏林飞艇笔记本:

import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.NaiveBayes
import org.apache.spark.ml.feature.{HashingTF, Tokenizer}
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.sql.Row

// Prepare training documents from a list of (id, text, label) tuples.
val training = sqlContext.createDataFrame(Seq(
(0L, "X totally sucks :-(", 100.0),
(1L, "Today was kind of meh", 200.0),
(2L, "I'm so happy :-)", 300.0)
)).toDF("id", "text", "label")

// Configure an ML pipeline, which consists of three stages: tokenizer, hashingTF, and lr.
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol("words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val nb = new NaiveBayes()

val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, nb))

// Fit the pipeline to training documents.
val model = pipeline.fit(training)

// Prepare test documents, which are unlabeled (id, text) tuples.
val test = sqlContext.createDataFrame(Seq(
(4L, "roller coasters are fun :-)"),
(5L, "i burned my bacon :-("),
(6L, "the movie is kind of meh")
)).toDF("id", "text")

// Make predictions on test documents.
model.transform(test)
.select("id", "text", "prediction")
.collect()
.foreach { case Row(id: Long, text: String, prediction: Double) =>
println(s"($id, $text) --> prediction=$prediction")
}

小程序的输出:

(4, roller coasters are fun :-)) --> prediction=2.0
(5, i burned my bacon :-() --> prediction=0.0
(6, the movie is kind of meh) --> prediction=1.0

预测标签集 {0.0, 1.0, 2.0} 与我的训练集标签 {100.0, 200.0, 300.0} 不相交。

问题:如何将这些预测标签映射回我的原始训练集标签?

额外问题:当任何其他类型都可以像标签一样工作时,为什么训练集标签必须是 double 的?看来没必要。

最佳答案

However, the classifier outputs labels that are different from the labels in my training set. Am I doing it wrong?

有点。据我所知,您遇到了 SPARK-9137 描述的问题。一般来说,ML 中的所有分类器都期望基于 0 的标签(0.0、1.0、2.0,...),但 ml.NaiveBayes 中没有验证步骤。在底层,数据被传递到 mllib.NaiveBayes,它没有这个限制,因此训练过程可以顺利进行。

当模型转换回 ml 时,预测函数只是假设标签正确,并且 returns predicted label using Vector.argmax ,因此您得到的结果。您可以使用例如 StringIndexer 来修复标签。

why do the training set labels have to be doubles, when any other type would work just as well as a label?

我想这主要是为了保持简单且可重用的 API。这样,LabeledPoint 就可以用于分类和回归问题。此外,它在内存使用和计算成本方面是一种有效的表示。

关于scala - 为什么 Spark ML NaiveBayes 输出的标签与训练数据不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33708532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com