机器学习:朴素贝叶斯

  • 1 朴素贝叶斯应用场景
  • 2 朴素贝叶斯相关公式
  • 3 sklearn库中朴素贝叶斯运用
    • 3.1 伯努利朴素贝叶斯
    • 3.2 多项式朴素贝叶斯
    • 3.3 高斯朴素贝叶斯
  • 4 代码
    • 4.1建模
    • 4.2 BernoulliNB调参
    • 4.3 MultinomialNB调参
    • 4.4 GaussianNB调参
    • 4.5 结论

1 朴素贝叶斯应用场景

最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。而常见朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。朴素贝叶斯主要运用于文本分类,垃圾邮件分类,信用评估,钓鱼网站检测等领域。

2 朴素贝叶斯相关公式

  • 条件概率、概率乘法定理、全概率以及事件独⽴性(公式省略)。
  • 贝叶斯公式
    • P(Bi∣A)=P(BiA)P(A)=P(A∣Bi)P(Bi)∑j=1nP(A∣Bj)P(Bj)P(B_i|A)=\frac{P(B_iA)}{P(A)}=\frac{P(A|B_i)P(B_i)}{\sum_{j=1}^nP(A|B_j)P(B_j)}P(Bi​∣A)=P(A)P(Bi​A)​=∑j=1n​P(A∣Bj​)P(Bj​)P(A∣Bi​)P(Bi​)​
  • 贝叶斯定理常用形态
    • P(A)=P(A∣B)P(B)+P(A∣B‾)P(B‾)P(A)={P(A|B)}{P(B)}+{P(A|\overline{B})P(\overline{B})}P(A)=P(A∣B)P(B)+P(A∣B)P(B)
    • P(B∣A)=P(AB)P(A)=P(A∣Bi)P(Bi)P(A∣B)P(B)+P(A∣B‾)P(B‾)P(B|A)=\frac{P(AB)}{P(A)}=\frac{P(A|B_i)P(B_i)}{P(A|B)P(B)+P(A|\overline{B})P(\overline{B})}P(B∣A)=P(A)P(AB)​=P(A∣B)P(B)+P(A∣B)P(B)P(A∣Bi​)P(Bi​)​
  • 朴素贝叶斯公式推导过程(朴素的含义是事件具有独立性)
    • p(Ck∣x)=p(Ck)P(x∣Ck)P(x)p(C_k|x)=\frac{p(C_k)P(x|C_k)}{P(x)}p(Ck​∣x)=P(x)p(Ck​)P(x∣Ck​)​
    • 当数据是确定的时候 CkC_kCk​,P(x)P(x)P(x)定值

3 sklearn库中朴素贝叶斯运用

3.1 伯努利朴素贝叶斯

  • sklearn.naive_bayes.BernoulliNB
  • 数据库特征符合二项分布
  • 参数:
    • alpha : float, optional (default=1.0) 拉普拉斯平滑系数
    • fit_prior:bool, optional (default=True)是否从数据集中学习先验概率,如果false,就用平均概率值
    • class_prior:array-like, size=[n_classes,], optional (default=None)先验概率的值,认为指定先验概率.如果指定了,就按照指定的先验概率来进行计算.
  • 属性:
    • class_count_ :array, shape = [n_classes] 没个类别有多少个样本
    • class_log_prior_:array, shape = [n_classes] 每个类别先验概率的对数值
    • classes_array, shape (n_classes,) 有哪些类别标签
    • feature_count_ :array, shape = [n_classes, n_features] 特征级数
    • feature_log_prob_array, shape = [n_classes, n_features] 给定类的特征的经验对数概率
    • n_features_ :int 每个样本的特征个数

3.2 多项式朴素贝叶斯

  • sklearn.naive_bayes.MultinomialNB
  • 假设特征符合多项式分布,常用与文本分类,特征是单词值是单词出现的次数
  • 参数属性同上。

3.3 高斯朴素贝叶斯

  • sklearn.naive_bayes.GaussianNB
  • 有些特征可能是连续型变量,高斯朴素贝叶斯模型假设这些特征属于某个类别的观测值符合高斯分布。
  • 参数:
    • priors :array-like, shape (n_classes,)* 类别的先验概率
    • var_smoothing : float, optional (default=1e-9) 方差平滑系数

详细介绍查看文档naive_bayes.

4 代码

4.1建模

# 数据集: 加载手写数字识别数据集
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
# 调用函数载入数据集
digits = load_digits()
#查看数据集信息
digits.keys()

dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])

print(digits.DESCR) # 数据集详细信息描述
digits.target_names # 数据集中有哪些标签
digits.data[0] # 第一个样本的数据
digits.images[0] # 第一个样本的images
# 将数字矩阵转换成图像进行观察 imshow函数示范 - images_show
# 对模型无用,仅展示用法
# cmap 参数: 颜色映射方案, 黑白的映射方案
index = 100
plt.imshow(digits.images[index],cmap = 'binary')

输出图片

# 拆分训练集和测试集
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 BernoulliNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score # 交叉验证
# 模型实例化
bnb = BernoulliNB()
mnb = MultinomialNB()
gnb = GaussianNB()
# 使用默认参数
# 训练模型
bnb.fit(X_train,y_train)
mnb.fit(X_train,y_train)
gnb.fit(X_train,y_train)
# 评估模型
# 分别看一下三个模型,在训练集和测试集的分数
print('bnb模型训练集分数:',bnb.score(X_train,y_train))
print('bnb模型测试集分数:',bnb.score(X_test,y_test))
print('-'*40)
print('mnb模型训练集分数:',mnb.score(X_train,y_train))
print('mnb模型测试集分数:',mnb.score(X_test,y_test))
print('-'*40)
print('gnb模型训练集分数:',gnb.score(X_train,y_train))
print('gnb模型测试集分数:',gnb.score(X_test,y_test))

输出3种模型的分数
bnb模型训练集分数: 0.8647573587907716
bnb模型测试集分数: 0.8592592592592593
----------------------------------------
mnb模型训练集分数: 0.9029435163086714
mnb模型测试集分数: 0.9166666666666666
----------------------------------------
gnb模型训练集分数: 0.8687350835322196
gnb模型测试集分数: 0.8555555555555555

4.2 BernoulliNB调参

bnb_train_score = []
bnb_test_score = []
bnb_cross_score = []
alpha=np.arange(0.01,1.01,0.01)
# 因为模型只有一个参数可调,所以这里我们使用学习曲线进行调参
# alpha=1.0,  0.01 -- 1  0.01,0.02,0.03---1
for i in alpha:# 建立模型bnb = BernoulliNB(alpha=i)# 训练模型bnb.fit(X_train,y_train)bnb_train_score.append( bnb.score(X_train,y_train) )bnb_test_score.append(bnb.score(X_test,y_test) )cross = cross_val_score(bnb,X_train,y_train,cv=5).mean() bnb_cross_score.append(cross) # 保存交叉验证分数
# 绘制出学习曲线的变化
plt.plot(np.arange(0.01,1.01,0.01),bnb_train_score ,color='blue')
plt.plot(np.arange(0.01,1.01,0.01),bnb_test_score ,color='green')
plt.plot(np.arange(0.01,1.01,0.01),bnb_cross_score ,color='red')

输出下图

有点过拟合

# 继续缩小范围
# 1,0.1,0.01,0.001,0.0001 ,  10-9bnb_train_score = []
bnb_test_score = []
bnb_cross_score = []
n = 1
for i in range(10):# 建立模型bnb = BernoulliNB(alpha=n)# 训练模型bnb.fit(X_train,y_train)bnb_train_score.append( bnb.score(X_train,y_train) )bnb_test_score.append(bnb.score(X_test,y_test) )cross = cross_val_score(bnb,X_train,y_train,cv=5).mean()bnb_cross_score.append(cross) # 保存交叉验证分数n /= 10
# 绘制出学习曲线的变化
plt.plot(bnb_train_score ,color='blue')
plt.plot(bnb_test_score ,color='green')
plt.plot(bnb_cross_score ,color='red');
plt.xlabel(pow(0.1,np.arange(10)))

max(bnb_cross_score)

0.8544722213508174
确定 alpha参数 = 0.01最佳,但模型仍然不太理想。

4.3 MultinomialNB调参

# MultinomialNB
# 调参范围mnb_train_score = []
mnb_test_score = []
mnb_cross_score = []
n = 1
for i in range(10):# 建立模型mnb = MultinomialNB(alpha=n)# 训练模型mnb.fit(X_train,y_train)mnb_train_score.append( mnb.score(X_train,y_train) )mnb_test_score.append(mnb.score(X_test,y_test) )cross = cross_val_score(mnb,X_train,y_train,cv=5).mean()mnb_cross_score.append(cross) # 保存交叉验证分数n /= 10
# 绘制出学习曲线的变化
plt.plot(mnb_train_score ,color='blue')
plt.plot(mnb_test_score ,color='green')
plt.plot(mnb_cross_score ,color='red')
plt.xlabel(pow(0.1,np.arange(10)))


测试集比训练集高 。

mnb_train_score = []
mnb_test_score = []
mnb_cross_score = []for i in np.arange(0.1,10.1,0.1):# 建立模型mnb = MultinomialNB(alpha=i)# 训练模型mnb.fit(X_train,y_train)mnb_train_score.append( mnb.score(X_train,y_train) )mnb_test_score.append(mnb.score(X_test,y_test) )cross = cross_val_score(mnb,X_train,y_train,cv=5).mean()mnb_cross_score.append(cross) # 保存交叉验证分数
# 绘制出学习曲线的变化
plt.plot(np.arange(0.1,10.1,0.1),mnb_train_score ,color='blue')
plt.plot(np.arange(0.1,10.1,0.1),mnb_test_score ,color='green')
plt.plot(np.arange(0.1,10.1,0.1),mnb_cross_score ,color='red');

np.max(mnb_cross_score)
# 找序列中最大值所对应的索引值
np.argmax(mnb_cross_score)
mnb_cross_score[46]
# 索引46,在参数序列中对应的参数值
np.arange(0.1,10.1,0.1)[46]

4.7

4.4 GaussianNB调参

# GaussianNB
# 调参范围
# 1,0.1,0.01,0.001,0.0001 ,  10-9gnb_train_score = []
gnb_test_score = []
gnb_cross_score = []
n = 1e-9 # 从小到大循环
for i in range(10):# 建立模型gnb = GaussianNB(var_smoothing=n)# 训练模型gnb.fit(X_train,y_train)gnb_train_score.append( gnb.score(X_train,y_train) )gnb_test_score.append(gnb.score(X_test,y_test) )cross = cross_val_score(gnb,X_train,y_train,cv=5).mean()gnb_cross_score.append(cross) # 保存交叉验证分数print(n)n *= 10
# 绘制出学习曲线的变化
plt.plot(gnb_train_score ,color='blue')
plt.plot(gnb_test_score ,color='green')
plt.plot(gnb_cross_score ,color='red');

根据曲线,在参数为1e-9*8=0.1中得到了最高值

np.max(gnb_cross_score)
# 我们在0.1的前后范围内再次进行调参,看看有没有更好的结果gnb_train_score = []
gnb_test_score = []
gnb_cross_score = []# 0.01 , 2  0.01
for i in np.arange(0.01,1,0.01):# 建立模型gnb = GaussianNB(var_smoothing=i)# 训练模型gnb.fit(X_train,y_train)gnb_train_score.append( gnb.score(X_train,y_train) )gnb_test_score.append(gnb.score(X_test,y_test) )cross = cross_val_score(gnb,X_train,y_train,cv=5).mean()gnb_cross_score.append(cross) # 保存交叉验证分数
# 绘制出学习曲线的变化
plt.plot(np.arange(0.01,1,0.01),gnb_train_score ,color='blue')
plt.plot(np.arange(0.01,1,0.01),gnb_test_score ,color='green')
plt.plot(np.arange(0.01,1,0.01),gnb_cross_score ,color='red');

np.max(gnb_cross_score) # 有所增加

0.9173462706957286

np.argmax(gnb_cross_score)

1

# 索引为1 ,对应的参数值为
np.arange(0.01,1,0.01)[1]

0.02

4.5 结论

  • 选用高斯朴素贝叶斯 GaussianNB
  • 参数var_smoothing = 0.02中,交叉验证分数达到最高值,为0.917
- END -

机器学习:朴素贝叶斯相关推荐

  1. 秒懂机器学习---朴素贝叶斯

    秒懂机器学习---朴素贝叶斯 一.总结 一句话总结: 尽管朴素贝叶斯的条件独立性假设存在一定的问题,但是朴素贝叶斯算法仍然能取得比较理想的分类预测结果. 1.朴素贝叶斯分类算法 和 KNN分类算法和决 ...

  2. 机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类

    机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类 一.界面实现 from tkinter import * from tkinter import ttk import NBdef ma ...

  3. 机器学习朴素贝叶斯算法_机器学习中的朴素贝叶斯算法

    机器学习朴素贝叶斯算法 朴素贝叶斯算法 (Naive Bayes Algorithm) Naive Bayes is basically used for text learning. Using t ...

  4. python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估(完整代码+实现效果)

    实现功能: python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估. 实现代码: # 导入需要的库 from warnings import simplefilter simplef ...

  5. 机器学习 | 朴素贝叶斯法知识总结

    机器学习 | 朴素贝叶斯法理论知识 贝叶斯决策论是概率框架下实施决策的基本方法.对分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记.朴素贝 ...

  6. 机器学习朴素贝叶斯_机器学习基础朴素贝叶斯分类

    机器学习朴素贝叶斯 In the previous stories, I had given an explanation of the program for implementation of v ...

  7. 机器学习---朴素贝叶斯模型

    机器学习-朴素贝叶斯模型 1.通俗解释: 朴素贝叶斯模型的基本思路就是利用贝叶斯的后验概率公式来推算当前属性下的数据样本属于哪一个类别.直白一点说,就是在特征属性为当前取值的条件下,该样本归属于那个类 ...

  8. 机器学习-朴素贝叶斯(基础讲解+代码实现+图像展示)

    朴素贝叶斯 定理: 某晚,C准备收拾东西接女朋友,那么小C要不要带伞呢. 已知:天气预报说今日降水概率为50%–P(A) 晚高峰堵车的概率为80%–P(B) 如果下雨,晚高峰堵车的概率是95%–P(B ...

  9. 5 机器学习 朴素贝叶斯算法 高斯模型 多项式模型 伯努利模型 拉普拉普平滑系数 TfidfVectorizer

    机器学习 1 朴素贝叶斯算法 1.1 朴素贝叶斯算法介绍 朴素贝叶斯算法是一种衡量标签和特征之间概率关系的监督学习算法,是一种专注于分类的算法."朴素"二字表示这个算法基于一个朴素 ...

  10. 机器学习-朴素贝叶斯。

    前言: 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯原理简单,也很容易实现,多用于文本分类,比如垃圾邮件过滤. 1.算法思想--基于概率的预测 决策树算法中提到朴 ...

最新文章

  1. mysql 过程和函数 变量的值_MySQL数据库提升篇-----存储过程和函数
  2. C#过滤重复数据,使用泛型
  3. matlab中 注意事项--字符串
  4. 自己常用的Linux命令总结
  5. C++(18)--复制构造函数
  6. 禁用计算机组策略和管理,计算机正在使用时,禁用或关闭组策略刷新 | MOS86
  7. Sharding-JDBC(操作公共表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记013
  8. gateway中的局部过滤器_vue 过滤器
  9. 从RDS中获取binlog
  10. 来谈谈C++ 位运算 | ^ ~ %
  11. 万万没 想到,Redis性能测试还能这样做
  12. matlab ga工具箱 使用教程,MATLAB深度学习工具箱使用教程
  13. HTML&CSS:制作简易电商网站
  14. 如何关闭JxBrowser,正确退出JxBrowser的方法
  15. python进程池Pool的apply与apply_async到底怎么用?
  16. java 水晶按钮_java渲染水晶按钮
  17. 中国剩余定理证明及代码实现
  18. xss基础认证钓鱼代码收集
  19. 安装丰巢价格是多少_马桶后方1㎡好几万你不在意,丰巢涨价5毛钱你却斤斤计较...
  20. Python学习笔记之 中英文文本情感分析

热门文章

  1. 计算机英语名词简释(转载)
  2. 【Python】用pyecharts绘制我国人口分布和迁移地图
  3. 技术外部创新的类型和要素
  4. eja变送器故障代码al01_EJA的差压变送器三种常见故障
  5. 天刀各区服务器位置,天刀服务器人数统计2017 | 手游网游页游攻略大全
  6. Latex各种箭号符号,以及在箭头上方添加字母等符号的方法
  7. Multisim基础 DIP开关 添加元件的位置
  8. 2020年中国第七次人口普查各省总人口数据可视图(1)
  9. 15 | SpringBoot + thymeleaf 的登陆页面如何实现国际化
  10. 使用MRC(机器阅读理解)方式做事件抽取任务,基于2020百度事件抽取任务