我的问题与这个问题类似,但这是针对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
足够智能来处理这个问题?(如果可能的话,我如何获取这个模型的最佳特征?)
回答:
VectorAssembler
只会将所有数据合并成一个单一的向量,它不会对权重或其他任何东西进行处理。
由于30,000个词向量非常稀疏,更密集的特征(月份)很可能会对结果产生更大的影响,所以这些特征不太可能像你所说的那样被“盖过”。你可以训练一个模型并检查特征的权重来确认这一点。只需使用LinearSVCModel
提供的coefficients
方法来查看特征对最终总和的影响程度:
val model = new LinearSVC().fit(trainingData)val coeffs = model.coefficients
具有较高系数的特征将对最终结果有更大的影响。
如果给月份的权重太低或太高,可以使用setWeightCol()
方法为这些特征设置权重。