sklearn模块全称为scikit-learn,是机器学习和人工智能领域最知名的模块之一。它提供了非常丰富的机器学习方法函数,详情可以参考scikit-learn官网文档API

本次学习的是朴素贝叶斯,官方提供了三种方式实现:

  • GaussianNB(高斯朴素贝叶斯)
  • MultinomialNB(多项式朴素贝叶斯)
  • BernoulliNB(伯努利朴素贝叶斯)

由于博主目前只涉及到一种的学习,所以其它两种后续会更新。

一、多项式朴素贝叶斯的实现

class sklearn.naive_bayes.MultinomialNB(alpha = 1.0,fit_prior = True,class_prior = None )

用于多项式模型的朴素贝叶斯分类器

多项式朴素贝叶斯分类器适用于具有离散特征的分类(例如,用于文本分类的字数)。例如文本分类单词统计,以出现的次数作为特征值(统计频数)。在实践中,诸如TF-IDF的分数计数也可以起作用。 TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。

参数 alpha : float,optional(default = 1.0)
添加拉普拉修/Lidstone平滑参数(0表示无平滑)
fit_prior : boolean,optional(default = True)
表示是否学习先验概率,参数为False表示所有类标记具有相同的先验概率
class_prior : array-like,size(n_classes,),可选(默认=None)
类别的先验概率。如果指定,则不根据数据调整先验。
属性 class_log_prior_ : array, shape (n_classes, )
各类标记的平滑先验概率对数值,其取值会受fit_prior和class_prior参数的影响
intercept_ : array, shape (n_classes, )
将多项式朴素贝叶斯解释的class_log_prior_映射为线性模型,其值和class_log_prior_相同
feature_log_prob_ : array, shape (n_classes, n_features)
给出一个类的特征条件概率P(xi | y)的对数值,返回形状为(n_classes, n_features)数组
coef_ : array, shape (n_classes, n_features)
将多项式朴素贝叶斯解释feature_log_prob_映射成线性模型,其值和feature_log_prob相同
class_count_ : array, shape (n_classes,)
训练样本中各类别对应的样本数,按类的顺序排序输出
feature_count_ : array, shape (n_classes, n_features)
各类别各个特征出现的次数,返回形状为(n_classes, n_features)数组

(1)使用MultinomialNB构建简单的模型

import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3,3],[2,0,2,1,1],[0,2,1,0,4],[1,0,3,1,3],[1,3,3,3,2]])
y = np.array([1, 2, 3, 4, 5])
clf = MultinomialNB()
clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
print(clf.predict(X[2:3]))

输出:

[3]

(2)使用属性

  • class_log_prior_:各类标记的平滑先验概率对数值,其取值会受fit_prior和class_prior参数的影响
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3,3],[2,0,2,1,1],[0,2,1,0,4],[1,0,3,1,3],[1,3,3,3,2]])
y = np.array([1, 2, 3, 4, 5])
clf = MultinomialNB()
clf.fit(X, y)
## 观察各类标记的平滑先验概率对数值
clf.class_log_prior_

输出:

array([-1.60943791, -1.60943791, -1.60943791, -1.60943791, -1.60943791])

① 若指定了class_prior参数,不管fit_prior为True或False,class_log_prior_取值是class_prior转换成log后的结果

import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3,3],[2,0,2,1,1],[0,2,1,0,4],[1,0,3,1,3],[1,3,3,3,2]])
y = np.array([1, 2, 3, 4, 5])
clf = MultinomialNB()
clf.fit(X, y)
## 观察各类标记的平滑先验概率对数值
print(clf.class_log_prior_)
## 指定先验概率
clf1 = MultinomialNB(alpha=1.0,fit_prior=False,class_prior=[0.3,0.2,0.1,0.2,0.2])
clf1.fit(X,y)
print(clf1.class_log_prior_)

输出:

[-1.60943791 -1.60943791 -1.60943791 -1.60943791 -1.60943791]
[-1.2039728  -1.60943791 -2.30258509 -1.60943791 -1.60943791]

② 若fit_prior参数为False,class_prior=None,则各类标记的先验概率相同等于类标记总个数N分之一

import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3,3],[2,0,2,1,1],[0,2,1,0,4],[1,0,3,1,3],[1,3,3,3,2]])
y = np.array([1, 2, 3, 4, 5])
clf = MultinomialNB(fit_prior=False,class_prior=None)
clf.fit(X, y)
## 观察各类标记的平滑先验概率对数值
print(clf.class_log_prior_)

# 验证是否是1/5
print(np.log(0.2))

输出:

[-1.60943791 -1.60943791 -1.60943791 -1.60943791 -1.60943791]
-1.6094379124341003

③ 若fit_prior参数为True,class_prior=None,则各类标记的先验概率等于各类标记个数除以各类标记个数之和(将y的类别稍加改动即可)

import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3,3],[2,0,2,1,1],[0,2,1,0,4],[1,0,3,1,3],[1,3,3,3,2]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(fit_prior=True,class_prior=None)
clf.fit(X, y)
## 观察各类标记的平滑先验概率对数值
print(clf.class_log_prior_)

# 验证是否是2/5 、 1/5 、1/5 、1/5
print(np.log(2/5),np.log(1/5),np.log(1/5),np.log(1/5))

输出:

[-0.91629073 -1.60943791 -1.60943791 -1.60943791]
-0.916290731874155 -1.6094379124341003 -1.6094379124341003 -1.6094379124341003
  • intercept_:将多项式朴素贝叶斯解释的class_log_prior_映射为线性模型,其值和class_log_prior_相同
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3,3],[2,0,2,1,1],[0,2,1,0,4],[1,0,3,1,3],[1,3,3,3,2]])
y = np.array([1, 2, 3, 4, 5])
clf = MultinomialNB()
clf.fit(X, y)
## 观察各类标记的平滑先验概率对数值
print(clf.class_log_prior_)

## intercept_:将多项式朴素贝叶斯解释的class_log_prior_映射为线性模型,其值和class_log_propr相同
print(clf.intercept_)

输出:

[-1.60943791 -1.60943791 -1.60943791 -1.60943791 -1.60943791]
[-1.60943791 -1.60943791 -1.60943791 -1.60943791 -1.60943791]
  • feature_log_prob_:指定类的各特征概率(条件概率)对数值,返回形状为(n_classes, n_features)数组

特征的条件概率=(指定类下指定特征出现的次数+alpha)/(指定类下所有特征出现次数之和+类的可能取值个数*alpha)

特征条件概率计算过程,以类为1各个特征对应的条件概率为例:

import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)
# 查看各特征的条件概率
print(clf.feature_log_prob_)
print('---'*10)

# 验证是否正确
print(np.log((2+2+1)/(2+1+1+3+2+2+1+4*1)),np.log((1+0+1)/(2+1+1+3+2+2+1+4*1)),
      np.log((1+2+1)/(2+1+1+3+2+2+1+4*1)),np.log((3+1+1)/(2+1+1+3+2+2+1+4*1)))

输出:

[[-1.16315081 -2.07944154 -1.38629436 -1.16315081]
 [-1.94591015 -0.84729786 -1.25276297 -1.94591015]
 [-1.5040774  -2.19722458 -0.81093022 -1.5040774 ]
 [-1.94591015 -1.25276297 -1.25276297 -1.25276297]]
------------------------------
-1.1631508098056809 -2.0794415416798357 -1.3862943611198906 -1.1631508098056809
  • coef_:将多项式朴素贝叶斯解释feature_log_prob_映射成线性模型,其值和feature_log_prob相同
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)
# 查看各特征的条件概率
print(clf.feature_log_prob_)
print('---'*10)
# coef_:将多项式朴素贝叶斯解释feature_log_prob_映射成线性模型,其值和feature_log_prob相同
print(clf.coef_)

输出:

[[-1.16315081 -2.07944154 -1.38629436 -1.16315081]
 [-1.94591015 -0.84729786 -1.25276297 -1.94591015]
 [-1.5040774  -2.19722458 -0.81093022 -1.5040774 ]
 [-1.94591015 -1.25276297 -1.25276297 -1.25276297]]
------------------------------
[[-1.16315081 -2.07944154 -1.38629436 -1.16315081]
 [-1.94591015 -0.84729786 -1.25276297 -1.94591015]
 [-1.5040774  -2.19722458 -0.81093022 -1.5040774 ]
 [-1.94591015 -1.25276297 -1.25276297 -1.25276297]]
  • class_count_:训练样本中各类别对应的样本数,按类的顺序排序输出
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)
# class_count_:训练样本中各类别对应的样本数,按类的顺序排序输出
clf.class_count_

输出:

array([2., 1., 1., 1.])
  • feature_count_:各类别各个特征出现的次数,返回形状为(n_classes, n_features)数组
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)
clf.feature_count_

输出:

array([[4., 1., 3., 4.],
       [0., 2., 1., 0.],
       [1., 0., 3., 1.],
       [1., 3., 3., 3.]])

(3)方法

fit(self, X, y, sample_weight=None) 根据X、y训练模型
get_params(deep=True) 获取分类器的参数,以各参数字典形式返回
partial_fit(X, y, classes=None, sample_weight=None) 对于数据量大时,提供增量式训练,在线学习模型参数,参数X可以是类似数组或稀疏矩阵,在第一次调用函数,必须制定classes参数,随后调用时可以忽略
predict(self, X) 在测试集X上预测,输出X对应目标值
predict_log_proba(self, X) 测试样本划分到各个类的概率对数值
predict_proba(self, X) 输出测试样本划分到各个类别的概率值
score(self, X, y[, sample_weight]) 输出对测试样本的预测准确率的平均值
set_params(self, **params) 设置估计器的参数
  • fit(X, y, sample_weight=None):根据X、y训练模型
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)

输出:

MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
  • get_params(deep=True):获取分类器的参数,以各参数字典形式返回
clf.get_params

输出:

<bound method BaseEstimator.get_params of MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)>
  • partial_fit(X, y, classes=None, sample_weight=None):对于数据量大时,提供增量式训练,在线学习模型参数,参数X可以是类似数组或稀疏矩阵,在第一次调用函数,必须制定classes参数,随后调用时可以忽略
    • 参数:classes : array-like, shape = [n_classes] (default=None)
    • 可能出现在y向量中的所有类的列表。 必须在第一次调用partial_fit时提供,在后续调用中可以省略。
## 使用partial_fit
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.partial_fit(X,y)

输出:

ValueError: classes must be passed on the first call to partial_fit.

添加classes=[1,2,3,4]

## 使用partial_fit
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.partial_fit(X,y,classes=[1,2,3,4])

输出:

MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
  • predict(X):在测试集X上预测,输出X对应目标值
clf.predict([[2,1,4,4],[2,0,1,1]])

输出:

array([1, 1])
  • predict_log_proba(X):测试样本划分到各个类的概率对数值
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)
clf.predict_log_proba([[3,4,5,4],[1,3,5,6]])

输出:

array([[-1.34753906, -1.92376992, -2.02148376, -0.77304163],
       [-1.57810037, -3.38647492, -2.13426204, -0.44398716]])
  • predict_proba(X):输出测试样本划分到各个类别的概率值
clf.predict_proba([[3,4,5,4],[1,3,5,6]])

输出:

array([[0.25987902, 0.14605531, 0.13245878, 0.46160689],
       [0.20636675, 0.03382771, 0.11833188, 0.64147366]])
  • score(X, y, sample_weight=None):输出对测试样本的预测准确率的平均值
clf.score([[2,1,4,4],[2,0,1,1]],[1,2])

输出:

0.5
  • **set_params(params):设置估计器的参数
import numpy as np
from sklearn.naive_bayes import MultinomialNB
X = np.array([[2,1,1,3],[2,0,2,1],[0,2,1,0],[1,0,3,1],[1,3,3,3]])
y = np.array([1, 1, 2, 3, 4])
clf = MultinomialNB(alpha=1.0,fit_prior=True)
clf.fit(X, y)

## 设置参数
clf.set_params(alpha=2.0)

输出:

MultinomialNB(alpha=2.0, class_prior=None, fit_prior=True)

参考博客:https://blog.csdn.net/kancy110/article/details/72763276
如有版权问题请与我联系。