基于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=1NI(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)=ajlY=ck)=i=1NI(yi=ck)i=1NI(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=1nP(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=1nP(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机器学习手册

猜你喜欢

转载自blog.csdn.net/weixin_44127327/article/details/108838639