处理 sklearn MultinomialNB 中的负值

新手上路,请多包涵

在 sklearn 中运行 MultinomialNB 之前,我正在规范我的文本输入,如下所示:

 vectorizer = TfidfVectorizer(max_df=0.5, stop_words='english', use_idf=True)
lsa = TruncatedSVD(n_components=100)
mnb = MultinomialNB(alpha=0.01)

train_text = vectorizer.fit_transform(raw_text_train)
train_text = lsa.fit_transform(train_text)
train_text = Normalizer(copy=False).fit_transform(train_text)

mnb.fit(train_text, train_labels)

不幸的是,MultinomialNB 不接受在 LSA 阶段创建的非负值。解决这个问题有什么想法吗?

原文由 seanlorenz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 829
1 个回答

我建议您不要将朴素贝叶斯与 SVD 或其他矩阵分解一起使用,因为 朴素贝叶斯基于应用贝叶斯定理和特征之间的强(朴素)独立性假设。使用其他分类器,例如 RandomForest

我用这个结果尝试了这个实验:

 vectorizer = TfidfVectorizer(max_df=0.5, stop_words='english', use_idf=True)
lsa = NMF(n_components=100)
mnb = MultinomialNB(alpha=0.01)

train_text = vectorizer.fit_transform(raw_text_train)
train_text = lsa.fit_transform(train_text)
train_text = Normalizer(copy=False).fit_transform(train_text)

mnb.fit(train_text, train_labels)

这是相同的情况,但我使用 NMP(非负矩阵分解)代替 SVD 并获得 0.04% 的准确度。

将分类器 MultinomialNB 更改为 RandomForest,我得到了 79% 的准确率。

因此,更改分类器或不应用矩阵分解。

原文由 Martin Forte 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题