我正在学习使用tfidf和朴素贝叶实现文本分类(分为两类),参考this blog和sklearn tfidf
下面的是代码段:
kf = StratifiedKFold(n_splits=5)
totalNB = 0
totalMatNB = np.zeros((2,2));
for train_index, test_index in kf.split(documents, labels):
X_train = [documents[i] for i in train_index]
X_test = [documents[i] for i in test_index]
y_train, y_test = labels[train_index], labels[test_index]
vectorizer = TfidfVectorizer(min_df=2, max_df= 0.2, use_idf= True, stop_words=stop_words)
train_corpus_tf_idf = vectorizer.fit_transform(X_train)
test_corpus_tf_idf = vectorizer.transform(X_test)
model2 = MultinomialNB()
model2.fit(train_corpus_tf_idf, y_train)
result2 = model2.predict(test_corpus_tf_idf)
totalMatNB = totalMatNB + confusion_matrix(y_test, result2)
totalNB = totalNB + sum(y_test == result2)
上述代码按预期工作。
我已阅读过这些文件,但我仍然对 min_df 和 max_df 感到困惑。
如何使用基于tf-idf分数的分类功能,即根据tf-idf分数过滤功能 例如。
答案 0 :(得分:1)
在训练矢量图时,设置min_df
和max_df
的特定值可以帮助您通过限制词汇量来调整最终的tf-idf表示,以最好地满足您的需求。它还有助于减少矢量表示的维度,这通常是一件好事,因为它们往往很大。
设置高min_df
值将从表示中删除相对不频繁的术语。如果您的最终模型不应该过分关注非常独特的术语,那将是一件好事。
设置低max_df
将从表示中删除相对频繁的术语。如果您的最终模型不关心在许多上下文中使用的单词(例如“the”,“or”,“and”),那么这将是一件好事。注意,这里的“低”可以表示非零整数> 1或浮子< 1接近0。
重要提示:根据他们的tf-idf权重事后过滤功能的建议是完全不同的。在拟合矢量化器时设置min_df
和max_df
将根据整个训练样本中的文档频率限制最终的词汇表。而给定向量中的最终tf-idf权重是特定于文档的值(因为它也受特定文档中术语频率的影响)。
希望这有帮助!