我正在尝试使用 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/