如何在多项朴素贝叶斯算法中实现 HashingVectorizer

数据挖掘 机器学习 tfidf 散列向量化器 朴素贝叶斯算法
2022-03-13 20:22:16

我使用了 TfidfVectorizer 并通过 MultinomialNB 将其传递给文档分类,它工作正常。

但是现在我需要为 ex 传递超过 10 万的大量文档,当我尝试将这些文档内容传递给 TfidfVectorizer 时,我的本地计算机被挂起。它似乎有一个性能问题。所以我得到了一个使用 HashingVectorizer 的建议。

我使用下面的代码进行分类(只需用 HashingVectorizer 替换 TfidfVectorizer)

stop_words = open("english_stopwords").read().split("\n")
vect = HashingVectorizer(stop_words=stop_words, ngram_range=(1,5))
X_train_dtm = vect.fit_transform(training_content_list)
X_predict_dtm = vect.transform(predict_content_list)
nb = MultinomialNB()
nb.fit(X_train_dtm, training_label_list)
predicted_label_list = nb.predict(X_predict_dtm)

得到错误:

_count raise ValueError("Input X must be non -negative") ValueError:输入 X 必须为非负数

所以我得到 TfidfVectorizer 是根据单词的出现来计算的,所以它可以工作,但是 HashingVectorizer 逻辑是不同的,我无法弄清楚 HashingVectorizer 将如何在 MultinomialNB 中实现。

有人可以帮我解决这个性能问题。如果可以,我可以将 TfidfVectorizer 用于庞大的训练数据集,那么如何?如果没有,那么我如何在这里使用 HashingVectorizer?

3个回答

您需要确保散列向量不会产生负面影响。做到这一点的方法是通过HashingVectorizer(non_negative=True)

在某些版本中,这似乎不是non_negative一个论点。尝试使用decode_error = 'ignore'. 如果您使用的是大型数据集,此错误也可能是由哈希冲突引起的,这可以通过增加特征数量来解决:

vect = HashingVectorizer(decode_error = 'ignore',
                        n_features = 2**21,
                        preprocessor = None)

较新版本的 sklearn中,使用HashingVectorizer(alternate_sign=False)