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_)
这是与 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_)
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.
这意味着您在 MultinomialNB
的 coef_
中实际看到的是在给定特定 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)
我训练了一个朴素贝叶斯 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_)
这是与 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_)
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)
Mirrorsfeature_log_prob_
for interpreting MultinomialNB as a linear model.
这意味着您在 MultinomialNB
的 coef_
中实际看到的是在给定特定 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)