Advertisement

python数据分析之朴素贝叶斯实践

阅读量:

文章目录

          • 1、概率基础
        • 1.1 随机事件
        • 1.2 样本空间
        • 1.3 概率
        • 1.4 联合概率
        • 1.5 条件概率
        • 1.6 独立性
        • 1.7 先验概率与后验概率
      • 2、 全概率公式

      • 3、贝叶斯公式

      • 4、 朴素贝叶斯算法

        • 4.1 算法原理
        • 4.2 平滑改进
        • 4.3 算法优点
      • 5、 常用朴素贝叶斯

        • 5.1 高斯朴素贝叶斯(连续变量&高斯分布)
        • 5.2 伯努利朴素贝叶斯(离散变量&伯努利分布)
        • 5.3 多项式朴素贝叶斯(离散变量&多项式分布)
1、概率基础
1.1 随机事件
  • 随机事件,指可能发生,也可能不发生的事件。
  • 例如,当我们抛硬币时,设出现正面为事件A,则事件A可能发生,也可能不发生。
1.2 样本空间
  • 样本空间,即我们进行随机试验时,所有可能结果构成的集合,习惯使用S表示。
1.3 概率
  • 概率,用来反映一个随机事件出现的可能性大小,习惯使用 P(A)来表示事件A的概率。
    在这里插入图片描述
1.4 联合概率
  • 联合概率,指多个事件同时发生的概率,例如, P(AB) 表示事件A与事件B的联合概率。
1.5 条件概率

条件概率,指在事件A发生的前提下,事件B发生的概率,使用 P(B|A)表示。

关于条件概率,有以下一个重要的定义:
在这里插入图片描述

需要注意的是,P(B|A) 与 P(B) 是不同的,二者很可能也不相等。因为在事件A发生的前提下,会导致样本空间的收缩,从而会改变概率。

1.6 独立性
  • 如果两事件A、B, 满足 P(AB) = P(A)P(B) 则称A与B相互独立。
  • 因为 P(AB) = P(A)P(B|A),所以当两事件A,B独立时:P(B|A) = P(B)。
  • 当两个事件独立时,一个事件发生与否,对另外一个事件完全没有任何影响。
1.7 先验概率与后验概率
  • 由以往的数据分析而得到的概率,称为先验概率。
  • 当得到某些信息后,在先验概率的基础上进行修正,从而得到的概率,称为后验概率。
2、 全概率公式
  • 设实验的样本空间为S, A为E的事件,B1 ,B2 ,…,Bn 为S的一个划分(任意两个事件交集为空,所以事件并集为整个样本空间S),且P(Bi) > 0(i=1,2,…,n ),则以下式子称为全概率公式:
    在这里插入图片描述

  • 有的时候, P(A) 可能不易求出,但是,我们可以在S上寻找一个划分(i=1,2,……),并且 Bi与P(A|Bi) 的概率容易获取,这样,我们就可以使用全概率公式来求解P(A)。

例子:假设张三逃课的概率是0.4,当张三逃课时李四逃课的概率是0.5,当张三上课时李四逃课的概率是0.3,那么李四逃课的概率是多少呢?
这种情况直接求李四逃课的概率不好求,就可以利用全概率公式进行求解:P(李四逃课)= 0.4 x 0.5 + 0.6 x 0.3

3、贝叶斯公式

设实验的样本空间为S, A为E的事件,B1 ,B2 ,…,Bn 为S的一个划分(任意两个事件交集为空,所以事件并集为整个样本空间S),且P(A) > 0 ,P(Bi) >0 (i=1,2,…,n ),则以下式子称为贝叶斯公式:
在这里插入图片描述

贝叶斯公式的核心思维就是将求解 P(B|A) 的概率转换成求解 P(A|B) 的概率。有时候,求解P(B|A)难度较大,但是求解P(A|B)比较容易,在这样的情况下,我们就可以考虑应用贝叶斯公式进行转换,从而解决问题。

例子: 对以往数据分析结果表明,当机器调整得良好时,产品的合格率是为98%,而当机器发生某种故障时,其合格率为55%。每天早上机器开动时,机器调整良好的概率为95%。试求已知某日早上第一件产品是合格品时,机器调整良好的概率是多少?

设A为事件“产品合格”,B 为事件“机器调整良好”, ~B 为事件“机器发生故障” ,则P(B|A)即为在第一件产品合格下机器调整良好的概率,根据贝叶斯公式可将其转化为以B条件下A发生的概率进行求解,结合全概率公式即可得出答案:
在这里插入图片描述

这个例子中, 95%是由以往的数据分析而得到的概率 ,即为先验概率;而97%是在得知第一件产品是合格品时得到的概率,即为后验概率。

4、 朴素贝叶斯算法
  • 朴素贝叶斯算法是基于概率的分类算法,之所以称为“朴素”,是因为其假设特征之间是独立的, 且对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
  • 朴素贝叶斯算法设计比较简单,实际上使用的就是全概率公式与贝叶斯公式。
4.1 算法原理

(1)假设 x = {x1,x2,…,xn}为一个待分类项,x含有n个特征属性。

(2)假设类别集合 y={y1,y2,…,yn}

(3)想要预测待分类项x所属的类别y,则只需要计算x属于每个类别 y 的概率是多少,预测结果就是概率最大的那个类别,即我们要计算:
在这里插入图片描述

然而,有时候以上的概率我们并不容易求解,不过,根据贝叶斯公式,我们可以进行如下的转换:
在这里插入图片描述

(4) 因为朴素贝叶斯算法的前提假设为各个特征之间都是独立的,则 P(x1…xn) = P(x1)…P(xn),因此有:
在这里插入图片描述

(5)将(2)代入(1)式,可得:
在这里插入图片描述

(6)因为分母部分不变,所以比较概率的大小,只需要比较分子部分就可以了,则算法最终预测的类别,就是能够使得分子部分最大的那个类别,即 :
在这里插入图片描述

(7)若要预测样本的类别,只需要求解P(y)与P(xi| y)即可,而这两个概率,都可以从训练集中获取。

4.2 平滑改进
  • 由于在计算p(xi|y)时,是各个概率的乘积,因此,一旦有一个概率为0,即使其他的概率值较大,也一律会得到0值。这会严重影响预测的准确性,为了避免这种情况的发生,我们在计算概率时,采用平滑改进:
    在这里插入图片描述

其中,k 为特征xi可能的取值数, α(α>0 )称为平滑系数,当α=1时,称为拉普拉斯平滑(Laplace smoothing),当α<1时,称为Lidstone smoothing平滑。

4.3 算法优点
  • 即使训练集数据较少,也能够实现预测,并且效果不错。
  • 算法的训练速度非常快,因为算法假设特征之间是独立的,这意味着每个特征可以单独当成一维分布而进行评估,无需考虑与其他特征之间的关联性。

举个栗子:假设某学生上课和逃课情况如下,请根据以下数据算出第11和12条记录属于上课还是逃课?

序号 天气(X1) 上课距离(X2) 学生成绩(X3) 课程类别(X4) 上课情况(Y)
1 选修 逃课
2 必修 上课
3 必修 上课
4 选修 逃课
5 选修 上课
6 必修 上课
7 选修 逃课
8 必修 上课
9 必修 逃课
10 选修 逃课
11 选修
12 选修

根据朴素贝叶斯算法,想要预测这两条记录所属的类别,则只需要计算出X属于每个类别Y的概率是多少,预测结果就是概率最大的那个类别。

(1)对于第11条记录,我们就可以分别计算在上课与逃课的情况下,各自的概率值是多少:
在这里插入图片描述

从以上结果可以看出,学生逃课的概率大于上课的概率,则预测结果为逃课。(注意此处计算出来的上课和逃课的概率之和不为1是因为省略了分母,只计算了分子)

(2)对于第12条记录,因为 P(xi = 远 | y = 上课)的值为0,所以需要对数据 采用平滑改进处理,其余计算方式和第11条记录相同。

5、 常用朴素贝叶斯
  • 在sklearn中,提供了若干种朴素贝叶斯的实现算法,不同的朴素贝叶斯算法,主要是对 P(xi | y) 的分布假设不同,进而采用不同的参数估计方式。
  • 常用的三种朴素贝叶斯为:高斯朴素贝叶斯,伯努利朴素贝叶斯,多项式朴素贝叶斯。
5.1 高斯朴素贝叶斯(连续变量&高斯分布)
  • 高斯朴素贝叶斯,适用于连续变量。其假定各个特征xi在各个类别y下是服从高斯分布(正态分布),算法内部使用正态分布的概率密度函数来计算概率P(xi | y),如下:
    在这里插入图片描述
复制代码
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import GaussianNB
    
    X, y = load_iris(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0) 
    model = GaussianNB()
    model.fit(X_train, y_train)
    print("高斯朴素贝叶斯:",model.score(X_test, y_test))
    --------------------------------------------------
    高斯朴素贝叶斯: 1.0
    
    
    AI写代码python
    
    运行
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/q2vxeD8PHowKYZFWrXupVh0JI9ET.png)
5.2 伯努利朴素贝叶斯(离散变量&伯努利分布)

设实验E只有两个可能的结果: A与非A,则称E为伯努利实验。

伯努利朴素贝叶斯,适用于离散变量,其假设各个特征xi 在各个类别y下是服从n 重伯努利分布(二项分布)的,因为伯努利试验仅有两个结果,因此,算法会首先对特征值进行二值化处理(假设二值化的结果为1与0)。
P(xi | y)计算方式如下:
在这里插入图片描述

在训练集中,会进行如下的估计:
在这里插入图片描述

因为在数据集中,只有两种取值(1与0),因此,对于给定的类别与特征,只需要计算P(xi =1 | y)就可以了,而P(xi = 0 | y)的概率,用1减去P(xi =1 | y)即可得出。

复制代码
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import BernoulliNB
    
    X, y = load_iris(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0) 
    model = BernoulliNB()
    model.fit(X_train, y_train)
    print("伯努利朴素贝叶斯:",model.score(X_test, y_test))
    -------------------------------------------------------
    伯努利朴素贝叶斯: 0.23684210526315788
    
    
    AI写代码python
    
    运行
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/VyvtI0zK4qco1MDJmrkYhjTiuCnN.png)
5.3 多项式朴素贝叶斯(离散变量&多项式分布)
  • 多项式朴素贝叶斯,适用于离散变量,其假设各个特征xi在各个类别y下是服从多项式分布的,故每个特征值不能是负数。
    P(xi | y)计算如下:
    在这里插入图片描述
复制代码
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import MultinomialNB
    
    X, y = load_iris(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0) 
    model = MultinomialNB()
    model.fit(X_train, y_train)
    print("多项式朴素贝叶斯:",model.score(X_test, y_test))
    ---------------------------------------------------
    多项式朴素贝叶斯: 0.5789473684210527
    
    
    AI写代码python
    
    运行
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/y8P9mzuNhKR37J6QorUHXvG1LWgV.png)

全部评论 (0)

还没有任何评论哟~