使用基于tf idf得分的功能进行使用朴素贝叶斯的文本分类(sklearn)

时间:2017-12-03 20:53:30

标签: scikit-learn tf-idf text-classification feature-selection naivebayes

我正在学习使用tfidf和朴素贝叶实现文本分类(分为两类),参考this blogsklearn 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分数过滤功能 例如。

  1. 使用其tf-idf分数大于x [分数(要点)> x]
  2. 的要素
  3. 使用tf-idf得分在x和y之间的特征[y>得分(特征)> x]或[y> =得分(特征)> = x]

1 个答案:

答案 0 :(得分:1)

在训练矢量图时,设置min_dfmax_df的特定值可以帮助您通过限制词汇量来调整最终的tf-idf表示,以最好地满足您的需求。它还有助于减少矢量表示的维度,这通常是一件好事,因为它们往往很大。

  • 设置高min_df值将从表示中删除相对不频繁的术语。如果您的最终模型不应该过分关注非常独特的术语,那将是一件好事。

  • 设置低max_df将从表示中删除相对频繁的术语。如果您的最终模型不关心在许多上下文中使用的单词(例如“the”,“or”,“and”),那么这将是一件好事。注意,这里的“低”可以表示非零整数> 1或浮子< 1接近0。

重要提示:根据他们的tf-idf权重事后过滤功能的建议是完全不同的。在拟合矢量化器时设置min_dfmax_df将根据整个训练样本中的文档频率限制最终的词汇表。而给定向量中的最终tf-idf权重是特定于文档的值(因为它也受特定文档中术语频率的影响)。

希望这有帮助!