如何在Spark中将数字特征与文本(词袋)正确组合?

时间:2018-01-07 09:25:34

标签: scala apache-spark machine-learning apache-spark-mllib feature-extraction

我的问题类似于this,但对于Spark而言,原始问题并没有令人满意的答案。

我正在使用带有推文数据作为输入的Spark 2.2 LinearSVC模型:推文的文本(已经预处理)作为hash-tfidf以及它的月份如下:

val hashingTF = new HashingTF().setInputCol("text").setOutputCol("hash-tf")
  .setNumFeatures(30000) 
val idf = new IDF().setInputCol("hash-tf").setOutputCol("hash-tfidf")
  .setMinDocFreq(10)
val monthIndexer = new StringIndexer().setInputCol("month")
  .setOutputCol("month-idx")
val va = new VectorAssembler().setInputCols(Array("month-idx",  "hash-tfidf"))
  .setOutputCol("features")

如果有30,000个单词功能赢了这些月的沼泽吗?或者VectorAssembler足够智能来处理这个问题。 (如果可能的话,我如何获得该模型的最佳功能?)

1 个答案:

答案 0 :(得分:1)

VectorAssembler只会将所有数据合并到一个矢量中,它不会对权重或其他任何内容产生任何影响。

由于30,000字矢量非常稀疏,因此更密集的特征(月份)很可能会对结果产生更大的影响,因此这些特征可能不会像你所说的那样被“淹没”。您可以训练模型并检查要素的权重以确认这一点。只需使用coefficients提供的LinearSVCModel方法查看功能对最终总和的影响程度:

val model = new LinearSVC().fit(trainingData)
val coeffs = model.coefficients

具有较高系数的特征将对最终结果产生较大影响。

如果给予月份的权重太低/太高,可以使用setWeightCol()方法为这些设置权重。