朴素贝叶斯算法-分类算法

1 概率基础

概率定义为一件事情发生的可能性

联合概率:包含多个条件,且所有条件同时成立的概率,记作P(A,B)

条件概率:事件A在另一个事件B已经发生条件下的发送概率,记作P(A|B)

在A1,A2相互独立的情况下,条件概率的特性:P(A1,A2|B)=P(A1|B)P(A2|B)

2 贝叶斯公式

W:特征向量           C:类别

贝叶斯公式最常用于文本分类,上式左边可以理解为给定一个文本词向量W,那么它属于类别C的概率是多少。式子右边分几部分,P(W∣C​​)为在给定类别的情况下,该文档的词向量(被预测文档中出现词)的概率,P(C)为每个文档类别的概率(某文档类型词数/总文档词数),P(F1,F2..)预测文档中每个词的概率

可以理解为:

C可以是不同类别

假如有个训练集统计结果如下:

特征/统计 科技 历史 汇总
诸葛亮 2 60 60
原子弹 55 20 75
飞机 60 23 83
卢沟桥事变 0 65 65
汇总 117 168 285

现有一篇被预测文档:出现了原子弹,飞机,卢沟桥事变属于科技、历史的类别概率?

因为P(原子弹,飞机,卢沟桥事变)在每个统计中都是一样的,所有忽略。

P(科技|原子弹,飞机,卢沟桥事变)=P(原子弹,飞机,卢沟桥事变|科技)P(科技)=(2/55)(60/117)(0/117)(117/285)=0

P(历史|原子弹,飞机,卢沟桥事变)=P(原子弹,飞机,卢沟桥事变|历史)P(历史)=(20/168)(23/168)(65/168)(168/285)

上面的例子中,因为某个某个词的出现概率为0导致属于某个类别为0,这是不合理的,所以引入拉普拉斯平滑

3 拉普拉斯平滑

为了避免训练集样本对一些特征的缺失,即某一些特征出现的次数为0,在计算P(X​1​​,X​2​​,X​3​​,...,X​n​​∣Y​i​​)的时候,各个概率相乘最终结果为零,这样就会影响结果。我们需要对这个概率计算公式做一个平滑处理,即拉普拉斯平滑系数

其中m为特征词向量的个数,α为平滑系数,当α=1,称为拉普拉斯平滑

4 sklearn朴素贝叶斯实现API

sklearn.naive_bayes.MultinomialNB

sklearn.naive_bayes.MultinomialNB(alpha = 1.0) 朴素贝叶斯分类 alpha:拉普拉斯平滑系数

常用方法:

名称 解释

fit(X y[,sample_weight])

根据X y拟合朴素贝叶斯分类器
get_params(deep=) 获取此估计器的参数
set_params(PARAMS) 设置此估计器的参数
partial_fit(X y[,classes,sample_weight]) 增量拟合一批样本
predict(X) 对测试向量X组执行分类
predict_log_proda(X) 返回测试矢量X的对数概率统计
predict_proda(X) 测试矢量X的返回概率估计
score(X y[,sample_weight]) 返回给定测试数据和标签的平均精度

5 朴素贝叶斯算法案例

sklearn20类新闻分类 ,20个新闻组数据集包含20个主题的18000个新闻组帖子

步骤:①加载20类新闻数据,并进行分割

②生成文章特征词

③朴素贝叶斯estimator流程进行预估

from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_report
#1加载20类新闻数据,并进行分割
newsgroups = fetch_20newsgroups(subset='all')
#分割
x_train,x_test,y_train,y_test = train_test_split(newsgroups.data,newsgroups.target,test_size=0.25)#2 生成文章特征词,对数据集进行特征抽取
tf = TfidfVectorizer()
#以训练集当中的词的列表进行每篇文章重要性统计
x_train = tf.fit_transform(x_train)
print(tf.get_feature_names())
x_test = tf.transform(x_test)# 进行朴素贝叶斯算法的预测
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train,y_train)
y_predict = mlt.predict(x_test)
print("预测的文章类别为",y_predict)
score = mlt.score(x_test,y_test)
print("准确率为:", score)
print("每个类别的精确率,召回率和F1:", classification_report(y_test, y_predict, target_names=newsgroups.target_names))

6 朴素贝叶斯分类优缺点

优点: ①朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。 ②对缺失数据不太敏感,算法也比较简单,常用于文本分类。 ③分类准确度高,速度快

缺点:需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

特点:不需要调参,如果训练集误差大,结果肯定不好。

朴素贝叶斯算法-分类算法相关推荐

  1. 机器学习(十)分类算法之朴素贝叶斯(Naive Bayes)算法

    贝叶斯定理 首先我们来了解一下贝叶斯定理: 贝叶斯定理是用来做什么的?简单说,概率预测:某个条件下,一件事发生的概率是多大? 了解一下公式 事件B发生的条件下,事件A发生的概率为: 这里写图片描述 同 ...

  2. ML之NB:朴素贝叶斯Naive Bayesian算法的简介、应用、经典案例之详细攻略

    ML之NB:朴素贝叶斯Naive Bayesian算法的简介.应用.经典案例之详细攻略 目录 朴素贝叶斯Naive Bayesian算法的简介 1.朴素贝叶斯计算流程表述 2.朴素贝叶斯的优缺点 2. ...

  3. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

  4. 朴素贝叶斯实现分类_关于朴素贝叶斯分类及其实现的简短教程

    朴素贝叶斯实现分类 Naive Bayes classification is one of the most simple and popular algorithms in data mining ...

  5. r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化

    本文内容原创,未经作者许可禁止转载! 目录 一.前言 二.摘要 三.关键词 四.算法原理 五.经典应用 六.R建模 1.载入相关包(内含彩蛋): 1.1 library包载入 1.2 pacman包载 ...

  6. 八、朴素贝叶斯中文分类实战

    1.朴素贝叶斯中文分类实战 文本分类的流程如下图所示: 朴素贝叶斯中文分类的目录结构 中文分类的目录机构包括停用词文件.训练集文件和和测试集文件,具体内容如下图所示: 2 数据准备与处理 2.1 数据 ...

  7. 朴素贝叶斯和AODE算法详解

    文章目录 一.实验要求 (1)实验目的 (2)数据集简介 (3)实验内容 (4)评价指标 二.数据集的划分 三.朴素贝叶斯 (1)朴素贝叶斯原理 (2)拉普拉斯修正 (3)函数变量解析 (4)代码如下 ...

  8. 【AI数学原理】概率机器学习(四):半朴素贝叶斯之TAN算法实例

    概率机器学习的系列博文已经写到第四篇了,依然关注者乏.虽说来只是自己的学习记录,不过这样下去显得自己贡献值比较低下.于是今天换一种模式来写博文--结合代码实现. 欢迎各位指点交流~ 预备知识: 1.朴 ...

  9. 构造matlab决策树分类器,Matlab建立逻辑回归,决策树,SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线...

    ​ 尽管对于较高的阈值,SVM可以产生更好的ROC值,但逻辑回归通常更擅长区分不良雷达收益与良好雷达.朴素贝叶斯的ROC曲线通常低于其他两个ROC曲线,这表明样本内性能比其他两个分类器方法差. 比较所 ...

  10. matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

    原文链接:http://tecdat.cn/?p=15508 绘制ROC曲线通过Logistic回归进行分类 加载样本数据.load fisheriris通过使用与versicolor和virgini ...

最新文章

  1. [20161229]linux下使用oclumon命令(rac)
  2. oracle除法向上取整函数,ORACLE取整函数
  3. django orm 常用查询筛选
  4. C语言 | 使用牛顿法求非线性方程的一个实根(附代码)
  5. Python爬虫开发教程,一看就懂!
  6. 聊聊gcc参数中的-I, -L和-l
  7. activemq网页管理端使用_iCloud大更新,移动端网页版推出 安卓也能使用
  8. linux下MySQL安装及设置
  9. js面向对象写法及栈的实现
  10. KinhDown(度盘PC下载器)
  11. ASP.NET课设——新闻发布系统
  12. [译]nanomsg和ZeroMQ的区别
  13. pyqgis iface AttributeError: ‘NoneType‘ object has no attribute ‘mapCanvas‘
  14. Android快速开发之appBase——(1).appBase介绍
  15. [学习笔记-FPGA]Vivado出现信号差分问题
  16. html5另存为本地文件,javascript实现文件另存为(web api)
  17. 美团后台开发笔试-数字字符
  18. python-pcl函数_Python简介,第4章-函数
  19. 微信小程序按钮实现点击复制功能的步骤
  20. 软件定义网络技术现状分析

热门文章

  1. SQL SERVER 查询表的行数
  2. CCF 201712-3 Crontab
  3. 转:c#委托事件实现窗体传值通信
  4. C++类中protected访问权限问题
  5. __attribute__((always_inline))
  6. 乔布斯,影响了一个时代的人
  7. 为什么不能在中断上半部休眠?
  8. 终于有人将进程间通信讲明白了
  9. linux 关联数组,linux 普通数组和关联数组
  10. 1071svm函数 r语言_R语言机器学习之核心包e1071 - 数据分析