机器学习笔记(朴素贝叶斯)

贝叶斯原理

贝叶斯最主要的想法是用先验概率来计算后验概率,先验概率指的是没有任何提示信息时的事件C概率,来计算掌握一定信息时事件C概率,用公式:
P ( C ∣ X ) = P ( C ) ⋅ P ( X ∣ C ) P ( X ) P(C|X)=\frac{P(C)·P(X|C)}{P(X)} P(CX)=P(X)P(C)P(XC)
也就是:
P ( 类 别 ∣ 特 征 ) = P ( 类 别 ) ⋅ P ( 特 征 ∣ 类 别 ) P ( 特 征 ) P(类别|特征)=\frac{P(类别)·P(特征|类别)}{P(特征)} P()=P()P()P()
由于P(类别1|特征)和P(类别1|特征)中分母相同,所以找到 P ( 类 别 ) ⋅ P ( 特 征 ∣ 类 别 ) {P(类别)·P(特征|类别)} P()P()的最大值对应的类别,为该特征的样本所属于的类别。

朴素贝叶斯:

假设所有的特征之间是相互独立的,也就是 P ( 特 征 ∣ 类 别 ) = ∏ i = 1 d P ( 特 征 i ∣ 类 别 ) P(特征|类别)=\prod_{i=1}^d P(特征i|类别) P()=i=1dP(i)这样可以更方便的计算出后验概率。
相对应的可以放松独立性假设,得到ODE,AODE

度依赖估计(ODE)

假设每个属性及依赖于最多一个属性(除自身外),被依赖属性称为超父属性,就是让下式最大化
P ( C j ) ∏ i = 1 d P ( X i ∣ C j , p a i ) P(C_j)\prod_{i=1}^d P(X_i|C_j,pai) P(Cj)i=1dP(XiCj,pai)

AODE

每个属性轮流做超父属性,就是让下式最大化
∑ i = 1 d P ( C j , X k ) ∏ i = 1 d P ( X i ∣ C j , X k ) \sum_{i=1}^dP(C_j,X_k)\prod_{i=1}^d P(X_i|C_j,X_k) i=1dP(Cj,Xk)i=1dP(XiCj,Xk)

拉普拉斯修正

训练集中有的分类没有某特征,并不代表该特征不可能存在于这个分类,但是此时该分类中这个特征的概率为0,进而计算出包含该特征的样本出现在该分类的概率为0。所以需要进行修正。对 P ( 特 征 ∣ 类 别 ) P(特征|类别) P()进行修改
P ( X i ∣ C ) = ∣ D c , x i ∣ + 1 ∣ D c ∣ + N i P(X_i|C) = \frac{|D_{c,x_i}|+1}{|D_c|+N_i} P(XiC)=Dc+NiDc,xi+1
N i N_i Ni X i X_i Xi一共有多少类。以下例子中会详细说明为什么需要修正,以及如何修正。

例子

体积颜色形状分类
绿不甜
绿不甜
绿

1.一个苹果如果(小,绿,圆)则苹果是甜还是不甜
P(甜|小,绿,圆)P(小,绿,圆)=P(小|甜)P(绿|甜)P(圆|甜)P(甜) = 1/15
P(不甜|小,绿,圆)P(小,绿,圆)=P(小|不甜)P(绿|不甜)P(圆|不甜)P(不甜) = 3/20
得出结论·:苹果不甜

2.一个苹果如果(大,绿,扁)则苹果是甜还是不甜
可以看出在给出的几行数据里,甜苹果里没有扁的,则这个苹果甜的概率为0,但是给出的数据里甜苹果里没有扁的,不代表甜苹果里一定没有扁的。所以为了优化需要进行拉普拉斯修正
此时,P(甜|大,绿,扁)P(大,绿,扁)=P(大|甜)P(绿|甜)P(扁|甜)P(甜)
P(大|甜) = 2 + 1 3 + 2 = 3 5 \frac{2+1}{3+2}=\frac{3}{5} 3+22+1=53
P(绿|甜) = 2 + 1 3 + 2 = 3 5 \frac{2+1}{3+2}=\frac{3}{5} 3+22+1=53
P(扁|甜) = 1 3 + 2 = 1 5 \frac{1}{3+2}=\frac{1}{5} 3+21=51
p(甜) = 3 + 1 5 + 2 = 4 7 \frac{3+1}{5+2 }= \frac47 5+23+1=74
P(甜|大,绿,扁)P(大,绿,扁) = 36 875 \frac{36}{875} 87536
同理可得:
P(不甜|大,绿,扁)P(大,绿,扁)=P(大|不甜)P(绿|不甜)P(扁|不甜)P(不甜)= 4 21 \frac{4}{21} 214
这个苹果不甜

代码

调用sklearn来实现,选用的数据集是手写数字:

from sklearn.datasets import load_digits
digits = load_digits()
x = digits.data
y = digits.target
# 数据分类
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
# 模型训练与预测
from sklearn.naive_bayes import MultinomialNB, GaussianNB
Bys1 = GaussianNB()
Bys2 =MultinomialNB()
Bys1.fit(x_train,y_train)
Bys2.fit(x_train,y_train)
import numpy as np
from sklearn import metrics
pred1 = Bys1.predict(x_test)
pred2 = Bys2.predict(x_test)
accuracy1 = metrics.accuracy_score(y_test,pred1)
accuracy2 = metrics.accuracy_score(y_test,pred2)
print(accuracy1,accuracy2)

输出:0.8240740740740741 0.9055555555555556

代码解释:

朴素贝叶斯常用的三个模型:MultinomialNB, GaussianNB,BernoulliNB

MultinomialNB:假设先验分布是多项式分布,上面苹果例子中就是假设先验分布为多项式分布, P ( X i ∣ C k ) = ∣ D c k , x i ∣ ∣ D c k ∣ P(X_i|C_k) = \frac{|D_{c_k,x_i}|}{|D_{c_k}|} P(XiCk)=DckDck,xi
参数:
alpha : float, default=1.0,惩罚项(参数2范数的平方)的参数λ ,如果设置为0则表示完全没有惩罚项
fit_prior : bool, default=True,是否要学习先验概率,如果为False,则所有样本输出时使用统一的类别先验概率(1 / 类别数)。
如果为True时,则可以利用第三个参数class_piror输入先验概率,或者不输入第三个参数,可以从训练集中自己计算先验概率,此时,第k个类别的先验概率=第k个类别样本数 / 总的样本数
class_prior : array-like of shape (n_classes,), default=None,类的先验概率。

GaussianNB:假设先验分布是高斯分布,上面的苹果例子中大小用苹果周长来衡量,此时这个特征对应的就应该是高斯分布, P ( X i ∣ C k ) = 1 2 π σ k 2 e x p ( − ( x i − μ k ) 2 2 σ k 2 ) P(X_i|C_k) = \frac1{\sqrt{2πσ_k^2}}exp(-\frac{(x_i-μ_k)^2}{2σ_k^2}) P(XiCk)=2πσk2 1exp(2σk2(xiμk)2)其中 σ k σ_k σk μ k μ_k μk是用 C k C_k Ck中所有的样本通过极大似然求得
参数:
priors : array-like of shape (n_classes,),类的先验概率。如果指定,则先验数据不会根据数据进行调整

BernoulliNB:假设先验分布是伯努利分布,还是上面苹果的例子进行改造,现在苹果是按照筐卖,每筐可以分为上等品和次品,计算筐子里有(大,绿,圆)则这一筐是什么等级?此时 P ( X 2 = 绿 ∣ C = 上 等 品 ) = ∣ D 上 等 品 , 含 绿 色 ∣ ∣ D 上 等 品 ∣ P(X_2 =绿|C=上等品) = \frac{|D_{上等品,含绿色}|}{|D_{上等品}|} P(X2=绿C=)=DD,绿,此时计数的单位改成了筐,并且满足伯努利分布,
P ( 上 等 品 ∣ 大 , 绿 , 圆 ) = P ( 上 等 品 ) P ( 大 ∣ 上 等 品 ) [ 1 − P ( 大 ∣ 上 等 品 ) ] 0 ⋅ P ( 上 等 品 ) P ( 绿 ∣ 上 等 品 ) [ 1 − P ( 绿 ∣ 上 等 品 ) ] 0 ⋅ P ( 上 等 品 ) P ( 圆 ∣ 上 等 品 ) [ 1 − P ( 圆 ∣ 上 等 品 ) ] 0 P(上等品|大,绿,圆)=P(上等品)P(大|上等品)[1-P(大|上等品)]^0· P(上等品)P(绿|上等品)[1-P(绿|上等品)]^0· P(上等品)P(圆|上等品)[1-P(圆|上等品)]^0 P(绿)=P()P()[1P()]0P()P(绿)[1P(绿)]0P()P()[1P()]0
参数:
比多项式贝叶斯只多了一个参数
binarize : float或None,default =0,将特征二值化的阈值,如果设定为None,则假定为特征已经被二值化完毕

推荐博客:
朴素贝叶斯,ODE,AODE:
https://blog.csdn.net/xo3ylAF9kGs/article/details/78643424?spm=1001.2014.3001.5506
这个文章里举的例子非常好!:
https://blog.csdn.net/qq_36134437/article/details/103065030
这个文章展示了如何调参:
https://blog.csdn.net/dingming001/article/details/80686600

贝叶斯方法缺点:没有太多的参数可以调整,因此贝叶斯算法的成长空间并不是太大,如果贝叶斯算法的效果不是太理想,一般都会考虑换模型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值