我正在尝试使用Spark的MLLib构建一个朴素贝叶斯分类器,其输入为一组文档。 我想将一些内容作为特征(即作者,显式标签,隐含关键字,类别),但是查看文档后,发现
LabeledPoint
仅包含双精度浮点数,即它看起来像LabeledPoint[Double,List [Pair [Double,Double]]]
。 相反,我从我的代码的其他部分得到的输出将是LabeledPoint [Double,List [Pair [String,Double]]]
之类的东西。 我可以编写自己的转换,但这似乎很奇怪。我应该如何在MLLib中处理这个问题? 我相信答案在HashingTF
类中(即散列特征),但我不理解它的工作原理,它似乎需要一些容量值,但是我的关键字和主题列表实际上没有界限(或更好地说,在开始时未知)。
HashingTF
中的numFeatures
基本上是用作mod
值,以将特征数量限制在给定的最大值内?如果是这样,它不应该只是Double.MAX_VALUE
吗?还是说想法是使用它,以便将不同的特征限制在给定范围内并限制交叉碰撞?(即将某些特征放在1..N中,将其他一些特征放在N..2N中,您将在相同类型之间发生冲突,但不会跨类型) - riffrafffeatures[hash(feature) % numFeatures] += 1
。创建的向量通常用作某个模型的输入,因此使用Double.MAX_VALUE
会意味着一个巨大的模型。哈希技巧的主要动机之一是减少内存占用。您当然可以按照您建议的方式创建特征,但我不确定如何评估这种方法的好处。 - mrmcgreg