java - Apache Spark MLLib : how to build labeled points for string features?

标签 java apache-spark machine-learning apache-spark-mllib feature-selection

我正在尝试使用 Spark 的 MLLib 构建一个 NaiveBayes 分类器,它将一组文档作为输入。

我想把一些东西作为特征(即作者、显式标签、隐式关键字、类别),但查看 the documentation似乎 LabeledPoint 只包含 double ,即它看起来像 LabeledPoint[Double, List[Pair[Double,Double]]

相反,我的其余代码的输出将类似于 LabeledPoint[Double, List[Pair[String,Double]]

我可以自己进行转换,但这看起来很奇怪。我应该如何使用 MLLib 来处理这个问题?

我相信答案在 HashingTF 类(即散列功能)中,但我不明白它是如何工作的,它似乎需要某种容量值,但我的关键字列表并且主题实际上是无界的(或者更好的是,一开始是未知的)。

最佳答案

HashingTF 使用 hashing trick将可能无限数量的特征映射到有界大小的 vector 。存在特征冲突的可能性,但可以通过在构造函数中选择更多的特征来减小这种可能性。

为了不仅基于要素的内容而且还基于某些元数据(例如,具有“猫”标签而不是文档中的“猫”一词)来创建要素,您可以提供 HashingTF 类类似于“tag:cats”,这样带有单词的标签将散列到与单词不同的插槽。

如果您使用 HashingTF 创建了特征计数 vector ,您可以通过将任何大于零的计数设置为 1 来使用它们来创建词袋特征。您还可以使用 HashingTF 创建 TF-IDF vector code>IDF 类如下:

val tfIdf = new IDF().fit(featureCounts).transform(featureCounts)

在您的情况下,您似乎已经计算了每个文档的字数。这不适用于 HashingTF 类,因为它旨在为您进行计数。

This paper关于为什么功能冲突在语言应用程序中不是那么大的问题有一些争论。根本原因是大多数单词不常见(由于语言的属性)并且冲突与单词频率无关(由于散列属性),因此不太可能常见到足以帮助一个人的模型的单词都散列到相同的插槽。

关于java - Apache Spark MLLib : how to build labeled points for string features?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27334694/

相关文章:

java - 如何在使用 Maven 创建 Jar 时使用依赖项在本地运行代码并排除它们

arrays - 从Spark Scala的DataFrame列中的数组添加文件名

apache-spark - 属性spark.yarn.jars - 如何处理它?

python - FAILED_PRECONDITION : Error: SavedModel directory gs://mybucket1/is expected contain exactly one of [saved_model. pb,saved_model.pbtxt]

python - ValueError : Error when checking input: expected dense_39_input to have shape (6, )但得到形状为(1,)的数组

java - 方法引用表达式评估中空检查背后的原因是什么?

java - 是否可以在 Java 的派生类中取消实现接口(interface)?

java - 边界内的抛物线

machine-learning - 从最终模型混淆矩阵重新创建 "multiClassSummary"统计数据

java - 为http服务生成java类