Java ApacheSpark MLLib:如何为字符串特性构建标记点?
我正试图用Spark的MLLib构建一个NaiveBayes分类器,它将一组文档作为输入 我想把一些东西作为特性(即作者、显式标记、隐式关键字、类别),但看一看,Java ApacheSpark MLLib:如何为字符串特性构建标记点?,java,apache-spark,machine-learning,apache-spark-mllib,feature-selection,Java,Apache Spark,Machine Learning,Apache Spark Mllib,Feature Selection,我正试图用Spark的MLLib构建一个NaiveBayes分类器,它将一组文档作为输入 我想把一些东西作为特性(即作者、显式标记、隐式关键字、类别),但看一看,LabeledPoint似乎只包含双精度,也就是说它看起来像LabeledPoint[Double,List[Pair[Double,Double] 相反,我从其余代码中得到的输出类似于LabeledPoint[Double,List[Pair[String,Double]] 我可以自己进行转换,但这似乎很奇怪。我应该如何使用MLLib
LabeledPoint
似乎只包含双精度,也就是说它看起来像LabeledPoint[Double,List[Pair[Double,Double]
相反,我从其余代码中得到的输出类似于LabeledPoint[Double,List[Pair[String,Double]]
我可以自己进行转换,但这似乎很奇怪。我应该如何使用MLLib处理这个问题
我相信答案在
HashingTF
类(即哈希功能)中,但我不明白它是如何工作的,它似乎需要某种容量值,但我的关键字和主题列表实际上是无限的(或者更好,一开始是未知的).HashingTF
使用将数量可能无限的特征映射到大小有界的向量。存在特征冲突的可能性,但可以通过在构造函数中选择数量更多的特征来减小冲突
为了创建不仅基于功能内容而且基于某些元数据的功能(例如,在文档中有一个“cats”标记而不是“cats”一词),您可以向HashingTF
类提供类似“tag:cats”的内容,以便带有单词的标记将散列到与单词不同的位置
如果您使用HashingTF
创建了特征计数向量,您可以使用它们通过将任何计数设置为0到1来创建单词包特征。您还可以使用IDF
类创建TF-IDF向量,如下所示:
val tfIdf = new IDF().fit(featureCounts).transform(featureCounts)
在您的情况下,看起来您已经计算了每个文档的字数。这不适用于HashingTF
类,因为它是为您计算字数而设计的
对于为什么功能冲突在语言应用程序中不是一个大问题,有一些争论。基本原因是大多数单词不常见(由于语言的属性),并且冲突与单词频率无关(由于哈希属性)因此,对一个人的模型有帮助的足够常见的单词不太可能同时散列到同一个位置。谢谢,还有一点需要澄清:如果我理解正确,
HashingTF
中的numFeatures
基本上被用作mod
值,用于将功能数量绑定到给定的最大值?如果是,请它不是仅仅是Double.MAX_VALUE
?或者使用它的想法是这样的,即它可以将不同的特征限制在给定的范围内并限制交叉冲突?(即,将某种特征放在1..N中,而将另一些特征放在N..2N中,相同种类之间会有冲突,但不会有交叉种类)是的,计算看起来像特征[hash](特征)%numFeatures]+=1
。创建的向量通常用作某些模型的输入,因此使用Double.MAX_VALUE
将意味着一个巨大的模型。散列技巧的主要动机之一是内存减少。您当然可以按照建议的方式创建特性,但我不确定如何评估这种方法的好处当然,我在考虑稀疏向量,所以没有考虑数组大小。谢谢你的帮助!