Spark MLLib - 如何重用 TF-IDF 模型

数据挖掘 机器学习 分类 阿帕奇火花
2021-09-20 20:21:41

我正在使用spark ml IDF 估计器/模型 (TF-IDF)将文本特征转换为向量,然后再将其传递给分类算法。这是过程:

数据集:

Full sample data (labeled) <br>
Training (labeled)<br>
Test (labeled)<br>
Unseen (non-labeled)<br>

这是我目前的工作流程:

Fit IDF model (idf-1) on full Sample data<br>
Apply(Transform) idf-1 on full sample data<br>
Split data set into Training and Test data<br>
Fit ML model on Training data<br>
Apply(Transform) model on Test data<br>
Apply(Transform) idf-1 on Unseen data<br>
Apply(Transform) model on Unseen data<br>

我在某处读到我应该在拟合 IDF 模型之前将我的数据拆分为训练和测试;仅在训练数据上拟合 IDF,然后使用相同的转换器来转换训练和测试数据。

为什么要这么做?IDF 在拟合过程中究竟学到了什么,它可以重用于转换任何新数据集。也许,想法是在使用 new 时|D|保持相同的值DF|t, D|TF|t, D|

另外,我多久会根据新的看不见的数据拟合(而不是转换)IDF 模型?假设我的模型已准备好进行预测。我使用相同的 IDF 和分类器模型进行了 n 预测。之后我想重新训练模型,因为我现在有新数据。那我还应该重新培训 IDF 吗?

1个回答

tf-idf 会学习一个词汇,idf,有些还会学习停用词(基于 min_df、max_df、max_features)。阅读sklearn 的 TfidfVectorizer,您可以看到 fit 方法将设置的属性。

当您将经过训练的 tf-idf 暴露给新数据时,它会将该数据转换为与原始数据大小相同的向量,使用词汇表构建 Term_Counts,然后将其转换为您的 tf 向量。这样做的价值在于,您可以使用另一个模型来预测基于 tf_idf 的结果,因为每个新文档将具有与您用于训练模型的文档相同大小的 tf_idf 向量。否则你不能用它来做出预测!例如,对 tfidf 进行天真的贝叶斯分类:

tfidf = TfidfVectorizer()
X = tfidf.fit_transform(X_train)
nb = MultinomialNB()
nb.fit(X, y_train)

# When you receive a new document
X = tfidf.transform(new_doc)
prediction = nb.predict_proba(X)

而且我认为您不会想要改装模型。如果您想要某种持续的实时更新,请考虑实施贝叶斯更新