【问题标题】:What is the relation between numFeatures in HashingTF in Spark MLlib and actual number of terms in a document?Spark MLlib 中 HashingTF 中的 numFeatures 与文档中的实际术语数之间有什么关系?
【发布时间】:2017-12-11 11:54:32
【问题描述】:

Spark MLlib HashingTF 中的 numFeatures 与文档(句子)中的实际词条数有什么关系吗?

List<Row> data = Arrays.asList(
  RowFactory.create(0.0, "Hi I heard about Spark"),
  RowFactory.create(0.0, "I wish Java could use case classes"),
  RowFactory.create(1.0, "Logistic regression models are neat")
);
StructType schema = new StructType(new StructField[]{
  new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
  new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
Dataset<Row> sentenceData = spark.createDataFrame(data, schema);

Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
Dataset<Row> wordsData = tokenizer.transform(sentenceData);

int numFeatures = 20;
HashingTF hashingTF = new HashingTF()
  .setInputCol("words")
  .setOutputCol("rawFeatures")
  .setNumFeatures(numFeatures);

Dataset<Row> featurizedData = hashingTF.transform(wordsData);

正如 Spark Mllib 的文档中所提到的,HashingTF 将每个句子转换为以 numFeatures 为长度的特征向量。 如果这里的每个文档,在这种情况下,句子包含数千个术语,会发生什么? numFeatures 的值应该是多少?如何计算该值?

【问题讨论】:

    标签: apache-spark machine-learning apache-spark-mllib tf-idf


    【解决方案1】:

    HashingTF 使用hashing trick 不维护单词/标记与其向量位置之间的映射。 Transformer 获取每个单词/taken,应用哈希函数(MurmurHash3_x86_32)生成一个 long 值,然后执行简单的模块操作(%'numFeatures')生成一个介于 0 和numFeatures 之间的 Integer。结果值是将在特征向量中递增的索引。

    鉴于算法的性质,如果 numFeatures 小于 DataFrame 中不同单词/标记的实际数量,则保证您至少有 1 个标记具有“不正确”的频率(即不同的标记将散列到同一个桶)。注意:即使 numFeatures >= 词汇大小冲突“可能”仍然会发生。

    numFeatures 的最佳价值是什么?我会取一个大于您的“词汇表”大小的数字(不要太担心空间,因为这些功能存储在ml.linalg.SparseVector 中)。请注意(见docs):

    由于使用简单的模数将散列函数转换为列索引,因此建议使用 2 的幂作为 numFeatures 参数;否则特征将不会均匀地映射到列。

    如果您希望获得准确的频率计数,请查看CountVectorizer

    【讨论】:

    • 只是检查我是否正确理解了这一点 - 如果我将该函数应用于具有相同 numfeatures 参数的新数据集,我在先前数据集上训练的算法是否适用于新数据集?
    • 将 numFeatures 设置为大于词汇大小的数字没有意义。相反,您希望将 numFeatures 设置为低于词汇大小的数字。因为使用 hashingTF 的主要动机之一是通过牺牲一些碰撞来减少维数。从这个意义上说,基线方法是 CountVectorizer,它将生成词汇大小的向量。为您的数据集找到最佳 numFeatures 的一种方法是提高和监控 ML 任务的准确性。我在 512 上取得了不错的成绩,其中词汇量约为 60k。
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 2017-02-02
    • 2016-05-14
    • 2016-04-22
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多