朴素贝叶斯_sklearn
1.朴素贝叶斯算法
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的数据集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
朴素贝叶斯是典型的生成学习方法。
1.1 朴素贝叶斯法的学习与分类
-
基本方法
-
后验概率最大化的含义
1.2 朴素贝叶斯法的参数估计
-
极大似然估计
-
学习与分类算法
- 朴素贝叶斯算法(naive Bayes algorithm)
1.计算先验概率以及条件概率
P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , . . . , K P(Y=c_k)={\displaystyle\sum_{i=1}^N I(y_i=c_k) \over N},k=1,2,...,K P(Y=ck)=Ni=1∑NI(yi=ck),k=1,2,...,K
P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) P(X^{(j)}=a_{jl}|Y=c_k)={
{\displaystyle\sum_{i=1}^N I(x_i^{(j)}=a_jl,y_i=c_k)} \over {\displaystyle\sum_{i=1}^N I(y_i=c_k)}} P(X(j)=ajl∣Y=ck)=i=1∑NI(yi=ck)i=1∑NI(xi(j)=ajl,yi=ck)
j = 1 , 2 , . . . , n ; l = 1 , 2 , . . . , S j ; k = 1 , 2 , . . . , K j=1,2,...,n; l=1,2,...,S^j; k=1,2,...,K j=1,2,...,n;l=1,2,...,Sj;k=1,2,...,K
2.对于给定的示例 x = ( x ( 1 ) , x ( 2 ) , . . . , x ( n ) ) T x=(x^{(1)},x^{(2)},...,x^{(n)})^T x=(x(1),x(2),...,x(n))T,计算:
P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) P(Y=c_k) \displaystyle\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k) P(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck)
k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K
3.确定实例的类
y = a r g max c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) y = arg \displaystyle\max_{c_k} P(Y=c_k) \displaystyle\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k) y=argckmaxP(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck)
2.算法应用
2.1 为连续的数据训练分类器
问题描述:数据的特征是连续的(非离散值),训练一个朴素贝叶斯分类器
解决方案:
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建高斯朴素贝叶斯对象
classifer = GaussianNB()
#训练模型
model = classifer.fit(features,target)
2.2 为离散数据和计数数据训练分类器
问题描述:给定离散数据或者计数数据(count data),训练一个朴素贝叶斯分类器
解决方案:使用多项式朴素贝叶斯分类器
import numpy as np
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
#创建文本
text_data = np.array(['I love Brazil.Brazil!',
'Brazil is beat',
'Germany beats both'])
#创建词袋
count = CountVectorizer()
bag_of_words = count.fit_transform(text_data)
#创建特征矩阵
features = bag_of_words.toarray()
#创建目标向量
target = np.array([0,0,1])
#给定每个分类的先验概率,创建一个多项式朴素贝叶斯对象
classifer = MultinomialNB(class_prior=[0.25,0.5])
#训练模型
model = classifer.fit(features,target)
多项式朴素贝叶斯分类器与高斯朴素贝叶斯分类器的工作原理类似,但是样本数据的特征为服从多项式分布。在实际应用中,这意味着这种分类器主要用于数据是离散的情况(比如对电影的评分,从1到5)。最常见的使用多项式朴素贝叶斯分类器的场景是文本分类,使用词袋或者TF-IDF方法。
2.3 为具有二元特征的数据训练朴素贝叶斯分类器
问题描述:一些具有二元特征的数据,需要训练一个朴素贝叶斯分类器
解决方案:使用伯努利朴素贝叶斯分类器
import numpy as np
from sklearn.naive_bayes import BernoulliNB
#创建三个二元特征
features = np.random.randint(2,size=(100,3))
#创建一个二元目标向量
target = np.random.randint(2,size=(100,1)).ravel()
#给定每个分类的先验概率,创建一个多项式伯努利朴素贝叶斯对象
classifer = BernoulliNB(class_prior=[0.25,0.5])
#训练模型
model = classifer.fit(features,target)
伯努利朴素贝叶斯分类器假设所有的特征都是二元分类的,这样它们就只有两种值(比如,经过one-hot编码的名义上的分类特征)。伯努利朴素贝叶斯经常被用于文本分类,这时特征矩阵表示的是某个词是否在一个文档中出现了。
2.4 校准预测概率
问题描述:校准由朴素贝叶斯分类器得出的分类概率,使他们可以被解释
解决方案:使用CalibratedClassifierCV
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.calibration import CalibratedClassifierCV
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建高斯朴素贝叶斯对象
classifer = GaussianNB()
#创建使用sigmoid校准调校过的交叉验证模型
classifer_sigmoid = CalibratedClassifierCV(classifer,cv=2,method='sigmoid')
#校准概率
classifer_sigmoid.fit(features,target)
#创建新的观察值
new_observation = [[2.6,2.6,2.6,0.4]]
#查看校准过的概率
classifer_sigmoid.predict_proba(new_observation)
—>
array([[0.31859969, 0.63663466, 0.04476565]])
- 参考:Python机器学习手册