机器学习Sklearn系列:(四)朴素贝叶斯

3--朴素贝叶斯

原理

朴素贝叶斯本质上就是通过贝叶斯公式来对得到类别概率,但区别于通常的贝叶斯公式,朴素贝叶斯有一个默认条件,就是特征之间条件独立。

条件概率公式:

P(B|A)=P(A|B)P(B)P(A)

贝叶斯公式可以写成:

p(yi|x)=p(x|yi)p(yi)p(x)

如果A和B相对于C是条件独立的,那么满足P(A|C)=P(A|B,C)。 如果样本的两个特征x1x2相对于y条件独立,那么可以得到p(x1,x2|y)=p(x1|y)p(x2|y)

通过条件独立公式,上述贝叶斯公式中,p(x|yi)的计算则可以简化成如下公式:

p(x|yi)=p(x1|yi)p(x2|yi)p(x3|yi)...p(xn|yi)

实现细节

对于离散类型数据, p(xi|y)可以通过计算特征的数量得到概率。

p(xi|y)=NyiNy

唯一需要注意的就是拉普拉斯修正(Laplacian Correction),如果莫一个新的特征x从来没有出现过,那么分母就有可能为0,为了避免这种情况,可以做如下操作:

p(xi|y)=Nyi+αNy+an

而对于连续型数据,计算方法则不太相同,高斯贝叶斯认为数据服从高斯分布,所以默认为某一列特征服从高斯分布,然后通过高斯概率密度函数,就可以得到相应的概率。

假设某一列特征服从整体分布

p(xi|y)N(μy,i,σy,i2)

其中μσ为y类样本在样本x第i个属性的均值和方差,那么其计算方法如下:

首先计算出标签y在特征xi上的均值和方差,然后就可以得到其概率的计算公式了:

p(xi|y)=12πσy,iexp((xiμy,i)22σy,i2)

当具体计算的时候,可以直接对区间进行积分,然后进行化简,可以得到最终的概率值:

P(xi<x<xi+ϵ)=xixi+ϵf(x)dxf(xi)ϵ

这里就是使用高斯概率密度函数对概率进行估计的朴素贝叶斯计算方法,对于sklearn中的GaussionNB函数。

sklearn中的朴素贝叶斯方法

sklearn中的朴素贝叶斯有几种方法:

描述
naive_bayes.BernoullNB 伯努利分布下的朴素贝叶斯
naive_bayes.GaussianNB 高斯分布下的朴素贝叶斯
naive_bayes.MultinomialNB 多项式分布下的朴素贝叶斯
naive_bayes.ComplementNB 补集朴素贝叶斯
linear_model.BayesianRidge 贝叶斯岭回归,在参数估计过程中使用贝叶斯回归技术来包括正则化参数

sklearn中的朴素贝叶斯算法,就如上述所提到的,对于连续型变量,可以使用高斯正太分布进行概率估计(这里对应高斯朴素贝叶斯),当然可以使用其他不同的分布进行概率估计,比如使用伯努利分布估计的话,则对应下表中的伯努利朴素贝叶斯算法。也就是说,其差别主要在于使用不同的方法来估计概率。

使用示例:

from sklearn import naive_bayes as nb

from sklearn.preprocessing import LabelEncoder

#由于sklearn中的朴素贝叶斯默认不支持字符串形式的特征,需要将字符串编码成数字特征,
所以这里可以使用LabelEncoder,例如下面所示,会自动将字符串从0到N进行编码

X[:,1] = LabelEncoder().fit_transform(X[:,1]))

使用朴素贝叶斯:
model = nb.GaussianNB()

model.fit(X,y) 
posted @   Neo0oeN  阅读(551)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示