17

我正在尝试使用Spark的MLLib构建一个NaiveBayes分类器,该分类器将一组文档作为输入。apache spark MLLib:如何构建字符串特征的标记点?

我想放些东西作为特征(即作者,明确的标签,关键字隐,类别),但看着the documentation似乎一个LabeledPoint只包含双打,即它看起来像LabeledPoint[Double, List[Pair[Double,Double]]

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

我可以弥补自己的转换,但它似乎很奇怪。我该如何处理这个使用MLLib?我相信答案在HashingTF类(即哈希特征),但我不明白这是如何工作的,它似乎需要某种容量值,但我的关键字和主题列表是有效无界的(或更好,在开始时是未知的)。

回答

10

HashingTF使用hashing trick将潜在无限数量的要素映射到有界大小的向量。存在特征碰撞的可能性,但是通过在构造函数中选择更多的特征,可以使其更小。

为了不仅基于特征的内容创建特征,而且还基于一些元数据(例如,具有“猫”的标签而不是文档中的“猫”字),您可以输入HashingTF类像'tag:cats'这样的东西,这样一个带有单词的标签会散列到不同的单词槽中。

如果您创建使用HashingTF特征计数向量可以使用它们通过大于零的任意数设置为1,您还可以使用IDF类,像这样创造TF-IDF向量创造的词的功能包:

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

在你的情况下,它看起来像你已经计算出每个文档的字数。这不适用于HashingTF课程,因为它旨在为您做点数。

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

+0

谢谢,只是一个额外的说明:如果我理解正确,'HashingTF'中的'numFeatures'基本上被用作'mod'值,用于将特征数量绑定到给定的最大值?如果是这样,不应该只是'Double.MAX_VALUE'?或者是使用它的想法,即它可以将不同的特征限制在给定的范围内并限制交叉碰撞? (即在1..N中放置某种特征,在N..2N中放置某些特征,你会在同一种类中碰撞,但不是交叉类型) – riffraff 2014-12-16 09:21:54

+0

是的,计算看起来像'features [hash(feature) %numFeatures] + = 1'。创建的向量通常用作某个模型的输入,所以使用'Double.MAX_VALUE'将意味着一个巨大的模型。哈希技巧的主要动机之一是减少内存。您当然可以按照您建议的方式创建功能,但我不确定如何评估这种方法的好处。 – mrmcgreg 2014-12-16 13:54:09

+0

当然啊我在想稀疏向量,所以没有考虑数组的大小。谢谢你的帮助! – riffraff 2014-12-17 08:34:48