Python实现朴素贝叶斯分类器

朴素贝叶斯分类器

文章目录

一、贝叶斯分类器是什么?

贝叶斯分类器是以贝叶斯决策论为基础的一类分类器。和频率决策论不同,贝叶斯决策论使用后验概率来计算将某个数据data分类为某一类c的风险概率。对分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

贝叶斯判定准则

假设对于数据集D,有N种可能的类别标记,即Y = { c 1 , c 2 . . . c n , } Y={c_{1},c_{2}…c_{n},}Y ={c 1 ​,c 2 ​…c n ​,},λ i j \lambda_{ij}λi j ​是将一个真实标记为c j c_{j}c j ​的样本误分类为c i c_{i}c i ​的损失,基于后验概率P ( c i ∣ x ) P(c_{i}|x)P (c i ​∣x )可获得将样本x分类为c i c_{i}c i ​所产生的期望损失,即在样本x上的”条件概率”。R ( c i ∣ x ) = ∑ j = i N λ i j P ( c j ∣ x ) R(c_{i}|x)=\sum^{N}{j=i}{\lambda{ij}P(c_{j}|x)}R (c i ​∣x )=j =i ∑N ​λi j ​P (c j ​∣x )
我们的任务就是寻找一个判定标准h : X → Y h:X\rightarrow Y h :X →Y以最小化总体风险。
R ( h ) = E x [ R ( h ( x ) ∣ x ) ] R(h)=E_{x}[R(h(x)|x)]R (h )=E x ​[R (h (x )∣x )]
对于每个样本x,若h能以最小化条件风险R(h(x)|x),则总体风险R(h)也将被最小化。这就产生了贝叶斯判定准则(Bayes decision rule):为最小化总体风险,只需在每个样本上选择那个能使条件风险R(c|x)最小的类别标记,即h ∗ ( x ) = a r g m i n c ∈ Y R ( c ∣ x ) h^{}(x)=arg\quad min_{c\in Y}{R(c|x)}h ∗(x )=a r g m i n c ∈Y ​R (c ∣x )此时,h ∗ h^{}h ∗称为贝叶斯最优分类器,与之对应的总体风险R(h)称为在贝叶斯风险。
具体来说,若目标是最小化分类风险,那么 λ i j = { 0 i f i = j 1 o t h e r w i s e \lambda_{ij}=\begin{cases}0&if\quad i=j\1&otherwise\end{cases}λi j ​={0 1 ​i f i =j o t h e r w i s e ​
此时条件风险R ( c ∣ x ) = 1 − P ( c ∣ x ) R(c|x)=1-P(c|x)R (c ∣x )=1 −P (c ∣x )于是,最小化分类错误率的贝叶斯最优分类器为h ∗ ( x ) = a r g m a x c ∈ Y P ( c ∣ x ) ( 1.1 ) h^{
}(x)=arg\quad max_{c\in Y}P(c|x)\quad(1.1)h ∗(x )=a r g m a x c ∈Y ​P (c ∣x )(1 .1 ) ,即对每个样本x,选择能使后验概率P ( c ∣ x ) P(c|x)P (c ∣x )最大的类别标记。基于贝叶斯定理,P ( c ∣ x ) P(c|x)P (c ∣x )可写为P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) ( 1.2 ) P(c|x)=\dfrac{P(c)P(x|c)}{P(x)}\quad(1.2)P (c ∣x )=P (x )P (c )P (x ∣c )​(1 .2 ),其中,P ( c ) P(c)P (c )是类”先验(prior)”概率;P ( x ∣ c ) P(x|c)P (x ∣c )是样本x相对于类别标记c的条件概率。

朴素贝叶斯分类器

不难发现,基于贝叶斯公式来估计后验概率P ( c ∣ x ) P(c|x)P (c ∣x )的主要难度在于类条件概率P ( x ∣ c ) P(x|c)P (x ∣c )是所有属性的联合概率,难以从有限的训练集上进行直接计算。为了避开这个坑,朴素贝叶斯分类器的做法是,假设所有属性都互相独立。那么,基于属性条件独立假设,式(1.2)可重写为
P ( c ∣ x ) = P ( c ) P ( x ) ∏ i = 1 d P ( x i ∣ c ) ( 1.3 ) P(c|x)=\dfrac{P(c)}{P(x)}\prod^{d}{i=1}{P(x{i}|c)}\quad(1.3)P (c ∣x )=P (x )P (c )​i =1 ∏d ​P (x i ​∣c )(1 .3 )
其中d d d为属性数目,x i x_{i}x i ​为x \mathbf{x}x在第i i i个属性上的取值。
由于对于所有类别来说P ( x ) P(x)P (x )相同,因此基于式(1.1)的贝叶斯判定准则有h n b ( x ) = a r g m a x c ∈ Y P ( c ) ∏ i = 1 d P ( x i ∣ c ) h_{nb}(x)=argmax_{c\in Y}P(c)\prod^{d}{i=1}P(x{i}|c)h n b ​(x )=a r g m a x c ∈Y ​P (c )i =1 ∏d ​P (x i ​∣c )。
显然,朴素贝叶斯分类器的训练过程就是基于训练集D来估计先验概率P ( c ) P(c)P (c ),并为每个属性估计条件概率P ( x i ∣ c ) P(x_{i}|c)P (x i ​∣c )。令D c D_{c}D c ​表示训练集D种第c c c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率P ( c ) = ∣ D c ∣ ∣ D ∣ P(c)=\dfrac{|D_{c}|}{|D|}P (c )=∣D ∣∣D c ​∣​。
对于离散属性而言,令D c , x i D_{c,x_{i}}D c ,x i ​​表示D c D_{c}D c ​中在第i i i个属性上取值为x i x_{i}x i ​的样本组成的集合,则条件概率P ( x i ∣ c ) P(x_{i}|c)P (x i ​∣c )可估计为P ( x i ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ P(x_{i}|c)=\dfrac{|D_{c,x_{i}}|}{|D_{c}|}P (x i ​∣c )=∣D c ​∣∣D c ,x i ​​∣​。
对于连续属性可考虑概率密度函数,假定p ( x i ∣ c ) N ( μ c , i , σ c , i 2 ) p(x_{i}|c)~\mathcal{N}(\mu_{c,i},\sigma^{2}{c,i})p (x i ​∣c )N (μc ,i ​,σc ,i 2 ​),其中μ c , i \mu{c,i}μc ,i ​和σ c , i 2 \sigma^{2}{c,i}σc ,i 2 ​分别是第c c c类样本在第i i i个属性上取值的均值和方差,则有p ( x i ∣ c ) = 1 2 π σ c , i e x p ( − ( x i − μ c , i ) 2 2 σ c , i 2 ) p(x{i}|c)=\dfrac{1}{\sqrt{2\pi }\sigma_{c,i}}exp(-\dfrac{(x_{i}-\mu_{c,i})^{2}}{2\sigma^{2}_{c,i}})p (x i ​∣c )=2 π​σc ,i ​1 ​e x p (−2 σc ,i 2 ​(x i ​−μc ,i ​)2 ​)

举个栗子

Python实现朴素贝叶斯分类器
如上图所示的西瓜数据集,对测试样例编号1进行分类。对于先验概率P ( c ) P(c)P (c ),有P ( 好 瓜 = 是 ) = 8 17 P(好瓜=是)=\dfrac{8}{17}P (好瓜=是)=1 7 8 ​P ( 好 瓜 = 否 ) = 9 17 P(好瓜=否)=\dfrac{9}{17}P (好瓜=否)=1 7 9 ​
然后为每个属性估计条件概率P ( x i ∣ c ) P(x_{i}|c)P (x i ​∣c ):
P 青 绿 ∣ 是 = P ( 色 泽 = 青 绿 ∣ 好 瓜 = 是 ) = 3 8 P_{青绿|是}=P(色泽=青绿|好瓜=是)=\dfrac{3}{8}P 青绿∣是​=P (色泽=青绿∣好瓜=是)=8 3 ​
P 蜷 缩 ∣ 是 = P ( 根 蒂 = 蜷 缩 ∣ 好 瓜 = 是 ) = 5 8 P_{蜷缩|是}=P(根蒂=蜷缩|好瓜=是)=\dfrac{5}{8}P 蜷缩∣是​=P (根蒂=蜷缩∣好瓜=是)=8 5 ​…

p 密 度 : 0.697 ∣ 是 = p ( 密 度 = 0.697 ∣ 好 瓜 = 是 ) = 1 2 π ∗ 0.129 e x p ( − ( 0.697 − 0.574 ) 2 2 ∗ 0.12 9 2 ) p_{密度:0.697|是}=p(密度=0.697|好瓜=是)=\dfrac{1}{\sqrt{2\pi}0.129}exp(-\dfrac{(0.697-0.574)^{2}}{20.129^{2}})p 密度:0 .6 9 7 ∣是​=p (密度=0 .6 9 7 ∣好瓜=是)=2 π​∗0 .1 2 9 1 ​e x p (−2 ∗0 .1 2 9 2 (0 .6 9 7 −0 .5 7 4 )2 ​)
其余属性条件概率略
最后,P ( 好 瓜 = 是 ) ≈ 0.063 P(好瓜=是)\approx 0.063 P (好瓜=是)≈0 .0 6 3 P ( 好 瓜 = 否 ) ≈ 6.80 ∗ 1 0 − 5 P(好瓜=否)\approx 6.8010^{-5}P (好瓜=否)≈6 .8 0 ∗1 0 −5
由于0.063 > 6.80 ∗ 1 0 − 5 0.063>6.80
10^{-5}0 .0 6 3 >6 .8 0 ∗1 0 −5因此将样例1判定为”好瓜”。

; 二、相关代码

1.数据处理

该数据集是我通过西瓜书上的西瓜数据集随机生成的10000条数据。需要的评论留言。

代码如下(示例):

import numpy as np
import pandas as pd
data=pd.read_csv("DataOrDocu/NewWatermelon2.csv",index_col=0)
attributes=data.columns
path="DataOrDocu/PosterProbDict.npy"
feature=data[:,:-1]
label=data[:,-1]
featureTrain,featureTest,labelTrain,labelTest=train_test_split(feature,label,train_size=0.7,random_state=10)
labelTrain=np.reshape(labelTrain,(labelTrain.shape[0],1))
labelTest=np.reshape(labelTest,(labelTest.shape[0],1))

dataTrain=np.concatenate((featureTrain,labelTrain),axis=1)
dataTrain=pd.DataFrame(dataTrain,columns=attributes,index=None)
dataTest=np.concatenate((featureTest,labelTest),axis=1)
dataTest=pd.DataFrame(dataTest,columns=attributes,index=None)

2.生成朴素贝叶斯表(字典)

逻辑很简单,即根据式(1.3),先计算《好瓜=是|否》的先验概率,即P ( 好 瓜 = 是 ) P(好瓜=是)P (好瓜=是)和P ( 好 瓜 = 否 ) P(好瓜=否)P (好瓜=否),并以字典形式返回。然后计算各种条件概率比如P ( 色 泽 = 青 绿 ∣ 好 瓜 = 是 ) P(色泽=青绿|好瓜=是)P (色泽=青绿∣好瓜=是)等等,如果是离散属性,那么保存P ( a = a i ∣ 好 瓜 = 是 o r 否 ) P(a=a_{i}|好瓜=是or否)P (a =a i ​∣好瓜=是o r 否)等一系列条件概率;如果是连续属性,那么保存p 好 瓜 , 属 性 a p_{好瓜,属性a}p 好瓜,属性a ​的均值和方差。最后,将生成的字典保存成npy文件,方便后续使用。

关于如何判断属性的连续或离散性

此外,有一个问题其中有一个函数,用于判断某个属性是离散属性还是连续属性,我考虑了2种方案,但实际上并不都是完美的逻辑,只是针对具体的数据集具有逻辑的相对完备性。一是判断数据是否为字符类型,一般字符类型将其判断为离散属性,其他判断为连续属性,但很容易在其他数据集上发现例外;二是计算某属性的所有数据集中包含的值的所有种类,如果种类数量

Original: https://blog.csdn.net/lyx369639/article/details/125600236
Author: 山隆木对
Title: Python实现朴素贝叶斯分类器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/647297/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球