处理 sklearn MultinomialNB 中的负值

Posted

技术标签:

【中文标题】处理 sklearn MultinomialNB 中的负值【英文标题】:Dealing with negative values in sklearn MultinomialNB 【发布时间】:2014-08-01 21:12:02 【问题描述】:

在像这样在 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 阶段创建的非负值。有什么想法可以解决这个问题吗?

【问题讨论】:

尝试使用sklearn.preprocessing.MinMaxScaler()。将您的训练功能扩展到[0,1] 太棒了。做到了!谢谢。 或者尝试用non-negative matrix factorization (NMF) 代替 LSA,或者用 SVM 代替朴素贝叶斯。 【参考方案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% 的准确度。

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

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

【讨论】:

别忘了用from sklearn.decomposition import NMF [1] 导入[NFM] [1]:scikit-learn.org/stable/modules/generated/…【参考方案2】:

尝试在fit()中执行此操作

train_text.np.todense() 

【讨论】:

【参考方案3】:

尝试创建一个管道,第一步是标准化,第二步是模型拟合。

from sklearn.preprocessing import MinMaxScaler
p = Pipeline([('Normalizing',MinMaxScaler()),('MultinomialNB',MultinomialNB())])
p.fit(X_train,y_train) 

【讨论】:

【参考方案4】:

我在 NB 上运行了同样的问题,并且确实使用了 gobrewers14 建议的 sklearn.preprocessing.MinMaxScaler() 作品。但它实际上将同一标准化数据集的决策树、随机森林和 KNN 的性能准确度降低了 0.2%。

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于处理 sklearn MultinomialNB 中的负值的主要内容,如果未能解决你的问题,请参考以下文章

sklearn naive bayes MultinomialNB:尽管我有 2 个类,为啥我只得到一个带系数的数组?

利用sklearn进行朴素贝叶斯分类

MultinomialNB - 理论与实践

sklearn中的naive bayes算法

实战:朴素贝叶斯对文档进行分类

sklearn - 从文本文档中预测多标签分类中的前 3-4 个标签