17

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

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

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

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

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

4

1 回答 1

10

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

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

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

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

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

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

于 2014-12-09T23:50:33.607 回答