【问题标题】:Spark HashingTF result explanationSpark HashingTF 结果说明
【发布时间】:2017-04-30 09:42:56
【问题描述】:

我在 DataBricks 上尝试了标准 spark HashingTF 示例。

import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}

val sentenceData = spark.createDataFrame(Seq(
  (0, "Hi I heard about Spark"),
  (0, "I wish Java could use case classes"),
  (1, "Logistic regression models are neat")
)).toDF("label", "sentence")

val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData = tokenizer.transform(sentenceData)
val hashingTF = new HashingTF()
  .setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(20)
val featurizedData = hashingTF.transform(wordsData)
display(featurizedData)

我很难理解下面的结果。 Please see the image 当 numFeatures 为 20 时

[0,20,[0,5,9,17],[1,1,1,2]]
[0,20,[2,7,9,13,15],[1,1,3,1,1]]
[0,20,[4,6,13,15,18],[1,1,1,1,1]]

如果 [0,5,9,17] 是哈希值
和 [1,1,1,2] 是频率。
17 有频率 2
9 有 3(它有 2)
13,15 有 1 而他们必须有 2。

可能我错过了什么。找不到详细解释的文档。

【问题讨论】:

  • Spark 类 HashingTF 利用了散列技巧。通过应用哈希函数将原始特征映射到索引(术语)。然后根据映射的索引计算词频。这种方法避免了计算全局术语到索引映射的需要,这对于大型语料库来说可能很昂贵,但它会遭受潜在的哈希冲突,其中不同的原始特征在哈希后可能会变成同一个术语。

标签: scala apache-spark apache-spark-mllib apache-spark-ml


【解决方案1】:

你的猜测是正确的:

  • 20 - 是一个向量大小
  • 第一个列表是索引列表
  • 第二个列表是值列表

前导0只是内部表示的产物。

这里没有什么要学的了。

【讨论】:

  • 亲爱的板球,感谢您的回答。如果第二个值列表(我假设它是频率)。您没有看到频率有任何异常值吗? 17怎么会有频率2?
  • @mcelikkaya,我在Cross Validated 提出了同样的问题,并发布了我的发现以防万一。谢谢!
【解决方案2】:

正如 mcelikkaya 所说,输出频率不是您所期望的。这是由于少量特征的哈希冲突,在本例中为 20。我在输入数据中添加了一些单词(用于说明目的)并将特征增加到 20,000,然后生成正确的频率:

+-----+---------------------------------------------------------+-------------------------------------------------------------------------+--------------------------------------------------------------------------------------+
|label|sentence                                                 |words                                                                    |rawFeatures                                                                           |
+-----+---------------------------------------------------------+-------------------------------------------------------------------------+--------------------------------------------------------------------------------------+
|0    |Hi hi hi hi I i i i i heard heard heard about Spark Spark|[hi, hi, hi, hi, i, i, i, i, i, heard, heard, heard, about, spark, spark]|(20000,[3105,9357,11777,11960,15329],[2.0,3.0,1.0,4.0,5.0])                           |
|0    |I i wish Java could use case classes spark               |[i, i, wish, java, could, use, case, classes, spark]                     |(20000,[495,3105,3967,4489,15329,16213,16342,19809],[1.0,1.0,1.0,1.0,2.0,1.0,1.0,1.0])|
|1    |Logistic regression models are neat                      |[logistic, regression, models, are, neat]                                |(20000,[286,1193,9604,13138,18695],[1.0,1.0,1.0,1.0,1.0])                             |
+-----+---------------------------------------------------------+-------------------------------------------------------------------------+------------------------------------------------------------

【讨论】:

    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2016-05-14
    • 2021-11-24
    相关资源
    最近更新 更多