【问题标题】:How do I properly combine numerical features with text (bag of words) in Spark?如何在 Spark 中正确地将数字特征与文本(词袋)结合起来?
【发布时间】:2018-06-16 13:56:10
【问题描述】:

我的问题与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 足够聪明来处理这个问题。 (如果可能的话,我如何获得该模型的最佳功能?)

【问题讨论】:

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


    【解决方案1】:

    VectorAssembler 将简单地将所有数据组合到一个向量中,它对权重或其他任何事情都没有任何作用。

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

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

    系数越高的特征对最终结果的影响越大。

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

    【讨论】:

    • 谢谢!您能否简要解释一下如何“检查特征的权重以确认这一点”。只需使用提供的 LinearSVCModel 系数方法。'
    • @schoon:添加了更多解释
    猜你喜欢
    • 2017-01-19
    • 2017-10-28
    • 2018-07-12
    • 2018-05-24
    • 2015-12-27
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多