在sklearn MultinomialNB中处理负值

sea*_*enz 8 python scikit-learn multinomial

我正在像这样在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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rte 5

我建议您不要将朴素贝叶斯与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)
Run Code Online (Sandbox Code Playgroud)

这是相同的情况,但是我使用NMP(非负矩阵分解)而不是SVD并获得了0.04%的精度。

将分类器MultinomialNB更改为RandomForest,我的准确度为79%。

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

  • 不要忘记使用“from sklearn.decomposition import NMF”[1]导入[NFM] [1]:http://scikit-learn.org/stable/modules/ generated/sklearn.decomposition.NMF.html (2认同)