当前位置:   article > 正文

sklearn朴素贝叶斯分类器_机器学习算法(二)朴素贝叶斯(Naive Bayes)

python的sklearn如何导入朴素贝叶斯分类器

一、实验环境要求

1. python3.7
2. numpy >= '1.16.4'
3. sklearn >= '0.23.1'

2、朴素贝叶斯的介绍

朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。

3、朴素贝叶斯的应用

朴素贝叶斯算法假设所有特征的出现相互独立互不影响,每一特征同等重要,又因为其简单,而且具有很好的可解释性一般。相对于其他精心设计的更复杂的分类算法,朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。朴素贝叶斯算法一般应用在文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等。

二、实验室要求

1、学习目标

  1. 掌握贝叶斯公式
  2. 结合两个实例了解贝朴素叶斯的参数估计
  3. 掌握贝叶斯估计

2、代码流程

  • Part 1. 莺尾花数据集--贝叶斯分类
    • Step1: 库函数导入
import 
    • Step2: 数据导入&分析

我们需要计算两个概率分别是:条件概率: ( ( )= ( )| = )

和类目 的先验概率: ( = )

通过分析发现训练数据是数值类型的数据,这里假设每个特征服从高斯分布,因此我们选择高斯朴素贝叶斯来进行分类计算。

  1. X, y = datasets.load_iris(return_X_y=True)
  2. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    • Step3: 模型训练
  1. # 使用高斯朴素贝叶斯进行计算
  2. clf = GaussianNB(var_smoothing=1e-8)
  3. clf.fit(X_train, y_train)
    • Step4: 模型预测
  1. # 评估
  2. y_pred = clf.predict(X_test)
  3. acc = np.sum(y_test == y_pred) / X_test.shape[0]
  4. print("Test Acc : %.3f" % acc)
  5. # 预测
  6. y_proba = clf.predict_proba(X_test[:1])
  7. print(clf.predict(X_test[:1]))
  8. print("预计的概率值:", y_proba)
    • Step5: 原理简析

高斯朴素贝叶斯假设每个特征都服从高斯分布,我们把一个随机变量X服从数学期望为μ,方差为σ^2的数据分布称为高斯分布。对于每个特征我们一般使用平均值来估计μ和使用所有特征的方差估计σ^2。

( ( )= ( )| = )=12 2 ⎯⎯⎯⎯⎯⎯⎯⎯√exp(−( ( )− )22 2 )

从上述例子中的预测结果中,我们可以看到类别2对应的后验概率值最大,所以我们认为类目2是最优的结果。

  • Part 2. 模拟离散数据集--贝叶斯分类
    • Step1: 库函数导入
  1. import random
  2. import numpy as np
  3. # 使用基于类目特征的朴素贝叶斯
  4. from sklearn.naive_bayes import CategoricalNB
  5. from sklearn.model_selection import train_test_split

Step2: 数据导入&分析

所有的数据特征都是离散特征,我们引入基于离散特征的朴素贝叶斯分类器。

  1. # 模拟数据
  2. rng = np.random.RandomState(1)
  3. # 随机生成600100维的数据,每一维的特征都是[0, 4]之前的整数
  4. X = rng.randint(5, size=(600, 100))
  5. y = np.array([1, 2, 3, 4, 5, 6] * 100)
  6. data = np.c_[X, y]
  7. # X和y进行整体打散
  8. random.shuffle(data)
  9. X = data[:,:-1]
  10. y = data[:, -1]
  11. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    • Step3: 模型训练&可视化
  1. clf = CategoricalNB(alpha=1)
  2. clf.fit(X_train, y_train)
  3. acc = clf.score(X_test, y_test)
  4. print("Test Acc : %.3f" % acc)
  5. # 随机数据测试,分析预测结果,贝叶斯会选择概率最大的预测结果
  6. # 比如这里的预测结果是66对应的概率最大,由于我们是随机数据
  7. # 读者运行的时候,可能会出现不一样的结果。
  8. x = rng.randint(5, size=(1, 100))
  9. print(clf.predict_proba(x))
  10. print(clf.predict(x))
    • Step4: 原理简析

2.4 原理简析

2.4.1 结果分析

可以看到测试的数据的结果,贝叶斯会选择概率最大的预测结果,比如这里的预测结果是6,6对应的概率最大,由于我们是随机数据,读者运行的时候,可能会出现不一样的结果。

这里的测试数据的准确率没有任何意义,因为数据是随机生成的,不一定具有贝叶斯先验性,这里只是作为一个列子引导大家如何使用。

alpha=1这个参数表示什么?

我们知道贝叶斯法一定要计算两个概率:条件概率: ( ( )= ( )| = )

和类目 的先验概率: ( = )

对于离散特征:

( ( )= ( )| = )=∑ =1 ( = , = )+ =1 ( = )+

我们可以看出就是对每一个变量的多加了一个频数alpha。当alphaλ=0时,就是极大似然估计。通常取值alpha=1,这就是拉普拉斯平滑(Laplace smoothing),这有叫做贝叶斯估计,主要是因为如果使用极大似然估计,如果某个特征值在训练数据中没有出现,这时候会出现概率为0的情况,导致整个估计都为0,因为引入贝叶斯估计。

其中:

:表示第j个特征的个数。

:表示第i个样本的第j维元素。

:第i个样本的label。

2.4.2 朴素贝叶斯算法
朴素贝叶斯法 = 贝叶斯定理 + 特征条件独立。
输入

空间是n维向量集合,输出空间 ={ 1, 2,..., }. 所有的X和y都是对应空间上的随机变量. ( , )是X和Y的联合概率分别. 训练数据集(由 ( , )独立同分布产生):

={( 1, 1),( 2, 2),...,( , )}

计算测试数据x的列表,我们需要依次计算 ( = | = )

,取概率最大的值,就是x对应的分类。

( = | = )

我们一般这样解释,当给定( = )的条件下, = 的概率,这就是条件概率. 这就简单了,我们只需要每个的x,计算其对应的 , ∈[1,2,..., ]

的概率,选择最大的概率作为这个x的类别进行了.

通过贝叶斯公式进行变形,得到预测的概率计算公式:

( = | = )= ( = | = ) ( = )∑ ( = | = ) ( = )

我们只需要计算以下两个概率即可,又由于朴素贝叶斯假设条件独立,我们可以单独计算每个特征的条件概率: ( ( )= ( )| = )

和类目 的先验概率: ( = )

。为了更好的理解这个公式,看下图解释:

其中:

( = )=∑ =1 ( = ) , =1,2,...,

当涉及到多个条件时,朴素贝叶斯有一个提前的假设,我们称之为 条件独立性假设(或者 简单假设:Naive):公式如下

( , | )= ( | )⋅ ( | )

这个公式是朴素贝叶斯的基础假设,即各个条件概率是相互独立的,A不影响B,B不影响A。 而对这里来说,假设 =[ 1, 2,..., ]

( = | = )= ( (1)= (1), (2)= (2),..., ( )= ( )| = )=∏ =1 ( | )

由此原式可以等价为:

( = | = )=∏ =1 ( | = ) ( = )∑ =1 ( | = ) ( = )

我们为了选择后验概率最大的结果,进行概率的比较,由于分母一致,这里直接去掉分母,得到最后的计算公式。

= ( = )∏ ( ( )= ( )| = )

47cf21615923cb1a48bcb6266df6fae0.png

我们来看一个实例,更好的理解贝叶斯的计算过程,根据天气和是否是周末预测一个人是否会出门。

index 1:
天气的好坏 2:
是否周末 :
是否出门

根据上述数据,为了更好的理解计算过程,我们给出几个计算公式:

a. 当出门的条件下,X_1是天气不好的概率:

( 1=不好| =出门)= ( 1=不好, =出门) ( =出门)=14

b. 出门的概率

( =出门)=46

c. X_1天气不好的概率、

( 1=不好)=26

d. 在X_1天气不好的情况下,出门的概率:

( =出门| 1=不好)= ( 1=不好| =出门)⋅ ( =出门) ( =不好)=14⋅4626=12

f. 在X_1天气不好的情况下,不出门的概率:

( =出门| 1=不好)=1− ( =不出门| 1=不好)=1−12=12

2.4.3 朴素贝叶斯的优缺点
优点: 朴素贝叶斯算法主要基于经典的贝叶斯公式进行推倒,具有很好的数学原理。而且在数据量很小的时候表现良好,数据量很大的时候也可以进行增量计算。由于朴素贝叶斯使用先验概率估计后验概率具有很好的模型的可解释性。
缺点: 朴素贝叶斯模型与其他分类方法相比具有最小的理论误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进,例如为了计算量不至于太大,我们假定每个属性只依赖另外的一个。解决特征之间的相关性,我们还可以使用数据降维(PCA)的方法,去除特征相关性,再进行朴素贝叶斯计算。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/869287
推荐阅读
相关标签
  

闽ICP备14008679号