处理 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 中的负值的主要内容,如果未能解决你的问题,请参考以下文章