为什么朴素贝叶斯在训练和测试中给出结果,但在与 GridSerchCV 一起应用时给出负值误差?

Why Naive Bayes gives results and on training and test but gives error of negative values when applied with GridSerchCV?

我研究了一些关于朴素贝叶斯的相关问题,这里是链接。 link1, ,link3 我使用 TF-IDF 进行特征选择,使用朴素贝叶斯进行分类。拟合模型后,它成功给出了预测。这是输出

accuracy = train_model(model, xtrain, train_y, xtest)
print("NB, CharLevel Vectors: ", accuracy)

NB, accuracy: 0.5152523571824736

不明白为什么朴素贝叶斯在训练和测试过程中没有报错

from sklearn.preprocessing import PowerTransformer
params_NB = {'alpha':[1.0], 'class_prior':[None], 'fit_prior':[True]}

gs_NB = GridSearchCV(estimator=model, 
                 param_grid=params_NB, 
                 cv=cv_method,
                 verbose=1, 
                 scoring='accuracy')

Data_transformed = PowerTransformer().fit_transform(xtest.toarray())
gs_NB.fit(Data_transformed, test_y);

它给出了这个错误

Negative values in data passed to MultinomialNB (input X)

TL;DR: PowerTransformer,你似乎只在 GridSearchCV 的情况下应用,产生负数据,这使得 MultinomialNB 预期失败,es 在中解释详情如下;如果你最初的 xtrainytrain 确实是 TF-IDF 特征,并且你没有用 PowerTransformer 类似地转换它们(你没有显示类似的东西),那么事实是他们工作正常也不足为奇和意料之中。


虽然不是非常清楚documentation:

The multinomial Naive Bayes classifier is suitable for classification with discrete features (e.g., word counts for text classification). The multinomial distribution normally requires integer feature counts. However, in practice, fractional counts such as tf-idf may also work.

仔细阅读你会发现这意味着所有特征都应该是 positive.

这确实有统计依据;来自交叉验证线程 Naive Bayes questions: continus data, negative data, and MultinomialNB in scikit-learn:

MultinomialNB assumes that features have multinomial distribution which is a generalization of the binomial distribution. Neither binomial nor multinomial distributions can contain negative values.

另请参见(打开)Github 问题 MultinomialNB fails when features have negative values(它针对不同的库,不是 scikit-learn,而是底层的 数学道理是一样的)。

证明这一点其实并不难;使用 documentation:

中可用的示例
import numpy as np
rng = np.random.RandomState(1)
X = rng.randint(5, size=(6, 100))  # random integer data
y = np.array([1, 2, 3, 4, 5, 6])
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X, y) # works OK

# inspect X
X # only 0's and positive integers

现在,将 X 的单个元素更改为负数并再次尝试拟合:

X[1][0] = -1
clf.fit(X, y)

确实给出了:

ValueError: Negative values in data passed to MultinomialNB (input X)

你能做什么?正如上面链接的 Github 线程所建议的那样:

  • 要么使用 MinMaxScaler(),这将带来 [0, 1]
  • 的所有功能
  • 或使用 GaussianNB 代替,它不受此限制