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

sklearn naive bayes MultinomialNB: Why do I get only one array with coefficients although I have 2 classes?

我训练了一个朴素贝叶斯 MultinomialNB 模型来预测短信是否是垃圾邮件。

我按预期得到 2 类:

nb = MultinomialNB(alpha=0.0)
nb.fit(X_train, y_train)

print(nb.classes_)
#Output: ['ham' 'spam']

但是当我输出系数时,我只得到 1 个数组。

print(nb.coef_)
#Output: [[ -7.33025958  -6.48296172 -32.55333508 ...  -9.52748415 -32.55333508
  -32.55333508]]

我已经对另一个数据集做了同样的事情。有 5 个而不是 2 个 类,它起作用了,我得到了一个包含 5 个数组的矩阵。

完整代码如下:

sms = pd.read_csv("spam-sms.csv", header=0, encoding = "ISO-8859-1")

X = sms.iloc[:, 1].values
X_clean = X[pd.notnull(X)]
y = sms.iloc[:,0].values
y_clean = y[pd.notnull(y)]



vectorizer = CountVectorizer()
X_cnt = vectorizer.fit_transform(X_clean)

X_train, X_test, y_train, y_test = train_test_split(X_cnt, y_clean,
test_size=0.2, random_state=0)

nb = MultinomialNB(alpha=0.0)
nb.fit(X_train, y_train)

y_pred = nb.predict(X_test)

print(nb.coef_)
print(nb.classes_)

Link to dataset

这是与 5 类

一起使用的代码
reviews = pd.read_csv("amazon-unlocked-mobile.csv", encoding='utf-8')
X = reviews.iloc[:,4].values
X_clean = X[pd.notnull(X)]
y = reviews.iloc[:,3].values
y_clean = y[pd.notnull(X)]

vectorizer = CountVectorizer()
X_cnt = vectorizer.fit_transform(X_clean)

X_train, X_test, y_train, y_test = train_test_split(X_cnt, y_clean,
test_size=0.2, random_state=0)

nb = MultinomialNB(alpha=0.0)
nb.fit(X_train, y_train)

y_predicted = nb.predict(X_test)

print(nb.coef_)
print(nb.classes_)

Linkt to dataset

TL;DR:
访问 feature_log_prob_ 属性以检索所有 class 特征的所有对数概率。 coef_ 反映了那些但 return 在二进制情况下仅 class 1(真)的值。


MultinomialNB 的问题在于它不是线性 class 运算符,实际上不计算系数来确定决策函数。它通过计算样本的条件概率来工作 class 假设您有一个具有特定值的特征向量。然后认为概率最大的class最有可能class.

线性模型,如 LogisticRegression,为其 coef_ 属性声明以下内容:

coef_: ndarray of shape (1, n_features) or (n_classes, n_features)
Coefficient of the features in the decision function.

coef_ is of shape (1, n_features) when the given problem is binary.

出于兼容性原因,MultinomialNB 仍然有一个 coef_ 属性,并且显然也会 return 在像你这样的二进制情况下 (1, n_features) 形状的数组。

但要了解它实际上是什么 return,您应该看看 documentation:

coef_: ndarray of shape (n_classes, n_features)
Mirrors feature_log_prob_ for interpreting MultinomialNB as a linear model.

这意味着您在 MultinomialNBcoef_ 中实际看到的是在给定特定 class 的情况下与每个特征关联的概率的对数。或者,更准确地说:

feature_log_prob_: ndarray of shape (n_classes, n_features)
Empirical log probability of features given a class, P(x_i|y).

由于 coef_ 只是 feature_log_prob_ 的镜像,您可以通过访问 feature_log_prob_ 来获取所有这些对数概率:

from sklearn.naive_bayes import MultinomialNB
import numpy as np
import random


random.seed(10)

X = np.array([1, 0, 0]*100).reshape(-1, 3)
y = np.array([random.choice([0, 1]) for _ in range(100)])

clf = MultinomialNB()
clf.fit(X, y)

print(clf.coef_)

>>> [[-0.03571808 -4.04305127 -4.04305127]]

print(clf.feature_log_prob_)

>>> [[-0.0416727  -3.8918203  -3.8918203 ]
 [-0.03571808 -4.04305127 -4.04305127]]

在示例中,您可以看到 coef_ 仅 return 编辑了 class 1 的对数概率,而 feature_log_prob_ return 编辑了它们0 和 1。

了解这些值代表什么以及它们与线性模型的系数不同非常重要。因此,根据您的特定用例,它们可能有用也可能没用。

我认为文档在这方面可以做得更好。但我想这不会成为未来的问题:

Deprecated since version 0.24: coef_ is deprecated in 0.24 and will be removed in 1.1 (renaming of 0.26)