朴素贝叶斯

原理介绍

基于贝叶斯方法的分类器是利用训练数据并根据特征的取值来计算每个类别被观察到的概率。当分类器之后被用于无标签数据时,分类器就会根据观测的概率来预测新的特征值最有可能属于哪个类别。

主要应用领域

  • 文本分类,例如垃圾邮件过滤、作者识别和主题分类等。
  • 在计算机网络中进行入侵检测或者异常检测。
  • 根据一组观察到的症状,诊断身体情况。
文本分析 应用场景
情绪分析 最简单是一个二分类任务,可以考虑在评论中提取正面和负面的短语进行分类。
垃圾邮件检测 重要的商业应用程序,将电子邮件分为垃圾邮件或非垃圾邮件两类的二进制分类任务,可以使用许多词汇和其他特性来执行这种分类。

基于贝叶斯定理的条件概率

贝叶斯定理提供了一种从P©,P(x)和P(x|c)计算后验概率的方法。

公式 含义
x 属性
c 类别
P(c\x) 后验概率(给定预测变量的类的后验概率)
P(x\c) 似然概率(预测器给定类的概率的可能性)
P( c ) 先验概率(类的先验概率)
P( x ) 边际似然概率(预测器的先验概率)

贝叶斯算法的优点和缺点

优点:

  • 预测测试数据集的类别是容易、快速的,它在多分类预测中也表现良好。
  • 当独立性假设成立时,朴素贝叶斯分类器与逻辑回归等其他模型相比表现更好,且需要更少的训练数据。
  • 与数值变量相比,它在分类输入变量的情况下变现良好。

缺点:

  • 如果分类变量在测试数据集里面有类别,但在训练数据集中未观察到该类别,则模型将分配0概率。为解决这个问题,我们可以使用平滑技术。
  • 朴素贝叶斯局限于是独立预测因子的假设。在现实生活中,我们得到一组完全独立的预测变量是几乎不可能的。

代码

方法一(设计函数的形式)

#构造训练集
data <- matrix(c("sunny","hot","high","weak","no","sunny","hot","high","strong","no","overcast","hot","high","weak","yes","rain","mild","high","weak","yes","rain","cool","normal","weak","yes","rain","cool","normal","strong","no","overcast","cool","normal","strong","yes","sunny","mild","high","weak","no","sunny","cool","normal","weak","yes","rain","mild","normal","weak","yes","sunny","mild","normal","strong","yes","overcast","mild","high","strong","yes","overcast","hot","normal","weak","yes","rain","mild","high","strong","no"), byrow = TRUE,dimnames = list(day = c(),condition = c("outlook","temperature","humidity","wind","playtennis")), nrow=14, ncol=5);#计算先验概率
prior.yes = sum(data[,5] == "yes") / length(data[,5]);
prior.no  = sum(data[,5] == "no")  / length(data[,5]);#模型
naive.bayes.prediction <- function(condition.vec) {# Calculate unnormlized posterior probability for playtennis = yes.playtennis.yes <-sum((data[,1] == condition.vec[1]) & (data[,5] == "yes")) / sum(data[,5] == "yes") * # P(outlook = f_1 | playtennis = yes)sum((data[,2] == condition.vec[2]) & (data[,5] == "yes")) / sum(data[,5] == "yes") * # P(temperature = f_2 | playtennis = yes)sum((data[,3] == condition.vec[3]) & (data[,5] == "yes")) / sum(data[,5] == "yes") * # P(humidity = f_3 | playtennis = yes)sum((data[,4] == condition.vec[4]) & (data[,5] == "yes")) / sum(data[,5] == "yes") * # P(wind = f_4 | playtennis = yes)prior.yes; # P(playtennis = yes)# Calculate unnormlized posterior probability for playtennis = no.playtennis.no <-sum((data[,1] == condition.vec[1]) & (data[,5] == "no"))  / sum(data[,5] == "no")  * # P(outlook = f_1 | playtennis = no)sum((data[,2] == condition.vec[2]) & (data[,5] == "no"))  / sum(data[,5] == "no")  * # P(temperature = f_2 | playtennis = no)sum((data[,3] == condition.vec[3]) & (data[,5] == "no"))  / sum(data[,5] == "no")  * # P(humidity = f_3 | playtennis = no)sum((data[,4] == condition.vec[4]) & (data[,5] == "no"))  / sum(data[,5] == "no")  * # P(wind = f_4 | playtennis = no)prior.no; # P(playtennis = no)return(list(post.pr.yes = playtennis.yes,post.pr.no  = playtennis.no,prediction  = ifelse(playtennis.yes >= playtennis.no, "yes", "no")));
}#预测
naive.bayes.prediction(c("rain",     "hot",  "high",   "strong"));
naive.bayes.prediction(c("sunny",    "mild", "normal", "weak"));
naive.bayes.prediction(c("overcast", "mild", "normal", "weak"));
> naive.bayes.prediction(c("rain",     "hot",  "high",   "strong"));
$post.pr.yes
[1] 0.005291005$post.pr.no
[1] 0.02742857$prediction
[1] "no"> naive.bayes.prediction(c("sunny",    "mild", "normal", "weak"));
$post.pr.yes
[1] 0.02821869$post.pr.no
[1] 0.006857143$prediction
[1] "yes"> naive.bayes.prediction(c("overcast", "mild", "normal", "weak"));
$post.pr.yes
[1] 0.05643739$post.pr.no
[1] 0$prediction
[1] "yes"

上述的数据需要处理一下

library(tidyverse)
Train <- as.data.frame(data[,1:5])
Test <- as.data.frame(data2[,1:4])
glimpse(Train)
#将所有字符型变量变为因子型
Train$temperature<-as.factor(Train$temperature)
Train$outlook<-as.factor(Train$outlook)
Train$humidity<-as.factor(Train$humidity)
Train$wind<-as.factor(Train$wind)
Train$playtennis<-as.factor(Train$playtennis)
Train
Test$outlook<-as.factor(Test$outlook)
Test$temperature<-as.factor(Test$temperature)
Test$humidity<-as.factor(Test$humidity)
Test$wind<-as.factor(Test$wind)

方法2(e1071包中的naiveBayes函数)

library(mlr3verse)
library(tidyverse)
library(e1071)  #包中有naiveBayes函数
require(e1071)
#确保目标变量是两分类
levels(Train$playtennis)
model <- naiveBayes(playtennis~., data = Train)
class(model)
pred <- predict(model,Test)
table(pred)  #只能判断出yes和no的个数
> levels(Train$playtennis)
[1] "no"  "yes"
> model <- naiveBayes(playtennis~., data = Train)
> class(model)
[1] "naiveBayes"
> pred <- predict(model,Test)
> table(pred)  #只能判断出yes和no的个数
predno yes 1   2

方法3(klaR包中NaiveBayes函数)

NaiveBayes()
默认情况:
Naivebayes(x,grouping,prior,usekernd=FALSE,fL=0,…)
对象为公式时:
Naivebayes(formula,data,…,subset,na.nation=na.pass)

参数 解释
x 要处理的数据库data.frame或者数据矩阵matrix
formula 放置生成判别规则的公式
data/subset 以formula为对象的函数格式中,分别用于指明该formula中变量所来自的数据集名称和纳入规则建立规程的样本
grouping 指明每个观测样本属于的类别
prior 设置各类别的先验概率
na.action 默认na.pass不会将缺失值纳入计算,不会以你选哪个函数运行,取值为ma.omit时便是删除相应的含有缺失值的观测变量样本。
library(klaR)
library(MASS)
glimpse(Train)
res<-NaiveBayes(playtennis~., Train)
res
> library(MASS)
> library(klaR)
> res<-NaiveBayes(playtennis~., Train)
> res
$apriori
groupingno       yes
0.3571429 0.6428571 $tables
$tables$outlookvar
grouping  overcast      rain     sunnyno  0.0000000 0.4000000 0.6000000yes 0.4444444 0.3333333 0.2222222$tables$temperaturevar
grouping      cool       hot      mildno  0.2000000 0.4000000 0.4000000yes 0.3333333 0.2222222 0.4444444$tables$humidityvar
grouping      high    normalno  0.8000000 0.2000000yes 0.3333333 0.6666667$tables$windvar
grouping    strong      weakno  0.6000000 0.4000000yes 0.3333333 0.6666667$levels
[1] "no"  "yes"$call
NaiveBayes.default(x = X, grouping = Y)$xoutlook temperature humidity   wind
1     sunny         hot     high   weak
2     sunny         hot     high strong
3  overcast         hot     high   weak
4      rain        mild     high   weak
5      rain        cool   normal   weak
6      rain        cool   normal strong
7  overcast        cool   normal strong
8     sunny        mild     high   weak
9     sunny        cool   normal   weak
10     rain        mild   normal   weak
11    sunny        mild   normal strong
12 overcast        mild     high strong
13 overcast         hot   normal   weak
14     rain        mild     high strong$usekernel
[1] FALSE$varnames
[1] "outlook"     "temperature"
[3] "humidity"    "wind"       attr(,"class")
[1] "NaiveBayes"

参考文献:
1、https://blog.csdn.net/yucan1001/article/details/23033931?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159160213319725222426537%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159160213319725222426537&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-7-23033931.first_rank_v2_rank_v25&utm_term=%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AFR

2、https://blog.csdn.net/ISMedal/article/details/79428335?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1

学习不易,请留下你的痕迹!
点个赞,分享一下!

朴素贝叶斯——R语言相关推荐

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

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

  2. R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 一.贝叶斯网络与朴素贝叶斯的区别 朴素贝叶斯的 ...

  3. R语言垃圾邮件分类--朴素贝叶斯(机器学习)

    邮件分类练习–朴素贝叶斯 思路 数据导入 数据处理 构建训练集和测试集 词云展示 数据降维 训练模型 模型测试 提升模型 一.数据导入 文件目录为:C:\Users\kelanj\Documents\ ...

  4. 机械学习与R语言--Naive Bayes 朴素贝叶斯在R语言中的实现

    为什么天气预报说70%概率下雨?为什么垃圾短信垃圾邮件被自动归类?这一切的基础算法便是朴素贝叶斯理论(算法有很多,这仅是其中之一). 1.由贝叶斯理论到朴素贝叶斯(naive bayes) 理论的基础 ...

  5. R语言应用实战系列(五)-朴素贝叶斯算法以及ROC和PR曲线

    前言 朴素贝叶斯(Naviebayes)的原理很简单:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为该代分项属于哪个类别? 以下是我为大家准备的几个精品专栏,喜欢的小伙 ...

  6. 先马后看!详解线性回归、朴素贝叶斯、随机森林在R和Python中的实现应用!(附代码)...

    来源| analyticsvidhya 编译| 火火酱,责编| Carol 出品 | AI科技大本营(ID:rgznai100) 谷歌的自动驾驶汽车和机器人得到了媒体的广泛关注,但是公司真正的未来是在 ...

  7. 数据挖掘-朴素贝叶斯算法的R实现

    本次为学生时期所写的实验报告,代码程序为课堂学习和自学,对网络程序有所参考,如有雷同,望指出出处,谢谢! 基础知识来自教材:李航的<统计学习方法> 本人小白,仍在不断学习中,有错误的地方恳 ...

  8. 机器学习与R之朴素贝叶斯分类器

    朴素贝叶斯 1联合概率分布 p(x,y)=p(y)P(x|y)  或者p(A交B)=p(A)xp(B)  p(A交B)不容易求,假设条件独立拆分成两个事件的乘积 2基本假设条件独立性 3利用贝叶斯定理 ...

  9. #第26篇分享:一个文本分类的数据挖掘(python语言:sklearn 朴素贝叶斯NB)(2)

    #sklearn 朴素贝叶斯NB算法常用于文本分类,尤其是对于英文等语言来说,分类效果很好:它常用于垃圾文本过滤.情感预测.推荐系统等:是基于概率进行预测的模型,可以做二分类及多分类( 朴素贝叶斯是个 ...

  10. c语言性别体重身高的程序,1-1 C语言手撕高斯-朴素贝叶斯 - 通过身高和体重推测性别(机器学习)...

    目录 目录 目录 项目介绍 项目1-1的准确度 项目可行性:原理简介 高斯分布(正态分布) 朴素贝叶斯 代码流程 获取数据(数据清洗) 代码实现 头文件 allHead.h 源文件 handleDat ...

最新文章

  1. 电脑显示没有被指定在上运行_win10系统运行程序提示“dll没有被指定在windows上运行”的办法...
  2. python中将字符变为大写_Python笔记(一)
  3. 转:inux shell脚本的字符串截取
  4. 小学五年级就已经开始编程啦吗???
  5. mac 安装nvm和nvm常见的命令
  6. SAP CRM和SAP Hybris的订单日志
  7. 牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案
  8. 【51单片机快速入门指南】5:软件SPI
  9. apache ignite系列(九):ignite调优
  10. 原来这样做模型分数,稳定性与灵活性可以双保障!
  11. [JSOI2009]球队收益
  12. win10执行npm出现Error: EBUSY: resource busy or locked 错误解决方法
  13. ECSHOP首页调用指定分类推荐商品/热卖商品/新品商品
  14. python opencv二值化阈值图像分割
  15. 如何实现一个 Email HTML 邮件模板
  16. vm镜像 黑群晖_使用Vmware Workstation安装黑群晖
  17. html5给文字添加拼音,word怎么为文字添加拼音
  18. 探究ESP32S【第六天】——接入米家(插曲)
  19. CyclicBarrier多任务协同的利器
  20. python编程实例教程-Python程序设计实例教程

热门文章

  1. Vue核心技术-40,vue-router-编程式路由导航
  2. 百度技术类笔试题经验
  3. python求几何平均_算术平均、几何平均、调和平均、平方平均和移动平均
  4. 程序员生活_程序员,请您不要老是熬夜
  5. 2022年要知悉的9大互联网前沿科技
  6. 解决刷GApps时的Error 70报错或64
  7. 苹果计算机符号怎么打开,Mac电脑如何输入command(⌘)、option(⌥)、shift(⇧)等特殊符号...
  8. YoungTalk-STM32入门100步-回顾总结与展望(98-100)
  9. 干货!假新闻检测:观察新闻本身,更要观察它所在的新闻环境
  10. 如何制作手机自适应网页