ML(3.1): NavieBayes R_e1071
朴素贝叶斯方法是一种使用先验概率去计算后验概率的方法, 具体见ML(3): 贝叶斯方法
R包
① e1071::e1071
② klaR::klaR
参考资料:https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Classification/Na%C3%AFve_Bayes
算法包:e1071
函数:navieBayes(formule,data,laplace=0,...,subset,na.action=na.pass)
- Formule: 公式的形式:class~x1 + x2 + ..... 相互作用是不允许的
- data: 数据集
- lapace: 正面双控制拉普拉期平滑。默认值(0)禁用拉普拉斯平滑。它的思想非常简单,就是对没类别下所有划分的计数为1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的局面。【在训练样本中,某一特征的属性值可能没有出现,为了保证一个属性出现次数为0时,能够得到一个很小但是非0的概率值】
R手机短信过滤示例
参考:https://zhuanlan.zhihu.com/p/22615168
原理: http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_two.html
代示示例:
- 首先,导入数据(注:第二列文本中带“...”会导制后面的数据读不进来)
- #数据导入
- sms <- read.csv("sms.csv",header=TRUE,stringsAsFactors=FALSE)
- sms$type <- factor(sms$type)
- str(sms)
- table(sms$type)
- #数据导入
- 数据清洗: sms$text 文本中包含着数字、缩略的短语和标点符号等,对于NaiveBayesClassifier而言,这些信息是有干扰的,因此,在建模之前需要在语料库中对数据进行清洗。
- 添加tm包 【参见tm包使用: http://www.cnblogs.com/tgzhu/p/6680525.html】,创建语料库,如下:语料库包含5574个document
- #创建语料库
- library(NLP)
- library(tm)
- sms_corpus <- Corpus(VectorSource(sms$text))
- #clear corpus
- sms_corpus <- tm_map(sms_corpus, PlainTextDocument)
- # 所有字母转换成小写
- sms_corpus <- tm_map(sms_corpus, tolower)
- # 去除text中的数字
- sms_corpus <- tm_map(sms_corpus, removeNumbers)
- # 去除停用词,例如and,or,until...
- sms_corpus <- tm_map(sms_corpus, removeWords, stopwords())
- # 去除标点符号
- sms_corpus <- tm_map(sms_corpus, removePunctuation)
- # 去除多余的空格,使单词之间只保留一个空格
- sms_corpus <- tm_map(sms_corpus, stripWhitespace)
- #查看一下清理后的语料库文本
- inspect(sms_corpus[1])
- #创建语料库
- 标记化:将文本分解成由单个单词组成的组,实际就是实现语料库向稀疏矩阵的转变 corpus_clean -> sms_dtm,建立训练集和测试集数据
- #将文本信息转化成DocumentTermMatrix类型的稀疏矩阵
- dtm <- DocumentTermMatrix(sms_corpus)
- Sys.setlocale(category = "LC_ALL", locale = "us")
- #训练集和测试集数据,查看垃圾与正常邮件占比
- trainSet <- sms[1:4169,]
- testset <- sms[4170:5574,]
- #将文本信息转化成DocumentTermMatrix类型的稀疏矩阵
- 创建可视化词云,通过词云可以大致浏览一下哪些词在spam中经常出现,哪些词在ham中经常出现。当然,前者对于垃圾短信的过滤相对重要一点。绘制词云可以通过添加包wordcloud实现 install.packages("wordcloud")
- 为了查看spam和ham各自的多频词,首先取trainset的子集,如下:
- > #创建可视化词云,大致浏览一下哪些词在spam中经常出现
- > library(RColorBrewer)
- > library(wordcloud)
- > #取trainset对spam和ham的子集
- > spam <- subset(trainSet, type == "spam")
- > ham <- subset(trainSet, type == "ham")
- > #创建词云
- > wordcloud(spam$text, max.words=40, scale=c(3,0.5))
- > #创建可视化词云,大致浏览一下哪些词在spam中经常出现
- 显示结果如下:
- 缩减特征:在面临问题是稀疏矩阵的特征太多了,而且很多词在所有text中可能都没怎么出现过,为减少运算量对特征瘦瘦身。先留下来在所有text中出现至少5次的词
- dtm_train <- dtm[1:4169,]
- > dtm_test <- dtm[4170:5574,]
- > findFreqTerms(dtm_train,5)
- [1] "available" "bugis" "cine" "crazy" "got" "great" "point" "wat"
- [9] "world" "lar" "wif" "apply" "comp" "cup" "entry" "final"
- [17] "free" "may" "receive" "text" "txt" "win" "wkly" "already"
- [25] "dun" "early" "say" "around" "goes" "nah" "think" "though"
- [33] "usf" "back" "freemsg" "fun" "hey" "like" "now" "send"
- [41] "std" "still" "weeks" "word" "xxx" "brother" "even" "speak"
- [49] "treat" "callers" "callertune" "copy" "friends" "melle" "per" "press"
- ........................
- dtm_train <- dtm[1:4169,]
将这些词设置成指示标识,下面建模时用这个指示标识提示模型只对这些词进行计算
- > #缩减特征
- > d <- findFreqTerms(dtm,5)
- > corpus_train = sms_corpus[1:4169]
- > corpus_test = sms_corpus[4170:5574]
- > dtm_train <- DocumentTermMatrix(corpus_train,list(dictionary=d))
- > dtm_test <- DocumentTermMatrix(corpus_test,list(dictionary=d))
- > #缩减特征
train和test都是计数矩阵,如果一条text中某个单词出现2次,那么这个单词在这条文本下会被记上2,NB只想知道这个单词出现了或者没出现,因此需要对矩阵进行转化成因子矩阵。
- > #对矩阵进行转化成因子矩阵
- > convert_counts <- function(x){
- + x <- ifelse(x>0,1,0)
- + x <- factor(x, levels=c(0,1),labels=c("No","Yes"))
- + return(x)
- + }
- > dtm_train <- apply(dtm_train, MARGIN=2, convert_counts)
- > dtm_test <- apply(dtm_test, MARGIN=2, convert_counts)
- > #对矩阵进行转化成因子矩阵
训练模型
- > #需要的包是e1071
- > #install.packages("e1071")
- > library(e1071)
- > sms_classifier <- naiveBayes(dtm_train,trainSet$type)
- > sms_prediction <- predict(sms_classifier, dtm_test)
- >
- > #需要的包是e1071
评估模型: 用交叉表来看看test中多少预测对了
- > library(gmodels)
- > CrossTable(sms_prediction,testset$type,prop.chisq=TRUE,prop.t=FALSE, dnn=c("predicted","actual"))
- Cell Contents
- |-------------------------|
- | N |
- | Chi-square contribution |
- | N / Row Total |
- | N / Col Total |
- |-------------------------|
- Total Observations in Table: 1405
- | actual
- predicted | ham | spam | Row Total |
- -------------|-----------|-----------|-----------|
- ham | 1124 | 150 | 1274 |
- | 0.229 | 1.531 | |
- | 0.882 | 0.118 | 0.907 |
- | 0.920 | 0.820 | |
- -------------|-----------|-----------|-----------|
- spam | 98 | 33 | 131 |
- | 2.229 | 14.886 | |
- | 0.748 | 0.252 | 0.093 |
- | 0.080 | 0.180 | |
- -------------|-----------|-----------|-----------|
- Column Total | 1222 | 183 | 1405 |
- | 0.870 | 0.130 | |
- -------------|-----------|-----------|-----------|
- > library(gmodels)
ham-ham和spam-spam是预测正确的,spam-ham:本身不是垃圾短信却被认为是垃圾短信过滤掉,由于Classifier1没有设置拉普拉斯估计,下面再尝试建立classifier2,看结果是否被优化。
- > #设置拉普拉斯估计
- > sms_classifier <- naiveBayes(dtm_train,trainSet$type,laplace = 1)
- > sms_prediction <- predict(sms_classifier, dtm_test)
- > CrossTable(sms_prediction,testset$type,prop.chisq=TRUE,prop.t=FALSE, dnn=c("predicted","actual"))
- Cell Contents
- |-------------------------|
- | N |
- | Chi-square contribution |
- | N / Row Total |
- | N / Col Total |
- |-------------------------|
- Total Observations in Table: 1405
- | actual
- predicted | ham | spam | Row Total |
- -------------|-----------|-----------|-----------|
- ham | 1105 | 132 | 1237 |
- | 0.788 | 5.262 | |
- | 0.893 | 0.107 | 0.880 |
- | 0.904 | 0.721 | |
- -------------|-----------|-----------|-----------|
- spam | 117 | 51 | 168 |
- | 5.803 | 38.747 | |
- | 0.696 | 0.304 | 0.120 |
- | 0.096 | 0.279 | |
- -------------|-----------|-----------|-----------|
- Column Total | 1222 | 183 | 1405 |
- | 0.870 | 0.130 | |
- -------------|-----------|-----------|-----------|
- > #设置拉普拉斯估计
spam人预测结果有改进,尝试继续优化,下一步以评论分类进行中文分类模拟
iris分类预测
- 安装加载包
- #安装加载e1071
- #install.packages("e1071")
- library(e1071)
- #安装加载e1071
- iris数据集分为训练集和测试集
- index <-sample(1:nrow(iris), 100)
- iris.train <-iris[index, ]
- iris.test <-iris[-index, ]
- index <-sample(1:nrow(iris), 100)
- 利用朴素贝叶斯算法构建模型
- model.NaiveBayes <-naiveBayes(x =subset(iris.train,select=-Species), y= iris.train$Species)
- str(model.NaiveBayes)
- summary(model.NaiveBayes)
- model.NaiveBayes <-naiveBayes(x =subset(iris.train,select=-Species), y= iris.train$Species)
用模型对测试集做测试
- > results.NaiveBayes <-predict(object = model.NaiveBayes, newdata =iris.test, type="class")
- > table(results.NaiveBayes, iris.test$Species)
- results.NaiveBayes setosa versicolor virginica
- setosa 14 0 0
- versicolor 0 17 2
- virginica 0 1 16
- > results.NaiveBayes <-predict(object = model.NaiveBayes, newdata =iris.test, type="class")
ML(3.1): NavieBayes R_e1071的更多相关文章
- ML(3.2): NavieBayes R_kalR
ML3.1 介绍e1071包实施朴素贝叶斯分类的函数,本例使用klaR包中的NaiveBayes函数,因为该函数较之前者增加了两个功能,一个是可以输入先验概率,另一个是在正态分布基础上增加了核平滑密度 ...
- ML(4): NavieBayes在R中的应用
朴素贝叶斯方法是一种使用先验概率去计算后验概率的方法, 具体见上一节. 算法包:e1071 函数:navieBayes(formule,data,laplace=0,...,subset,na.act ...
- 贝叶斯、朴素贝叶斯及调用spark官网 mllib NavieBayes示例
贝叶斯法则 机器学习的任务:在给定训练数据A时,确定假设空间B中的最佳假设. 最佳假设:一种方法是把它定义为在给定数据A以及B中不同假设的先验概率的有关知识下的最可能假设 贝叶斯理论提供了 ...
- Spark2 ML 学习札记
摘要: 1.pipeline 模式 1.1相关概念 1.2代码示例 2.特征提取,转换以及特征选择 2.1特征提取 2.2特征转换 2.3特征选择 3.模型选择与参数选择 3.1 交叉验证 3.2 训 ...
- [Machine Learning & Algorithm]CAML机器学习系列2:深入浅出ML之Entropy-Based家族
声明:本博客整理自博友@zhouyong计算广告与机器学习-技术共享平台,尊重原创,欢迎感兴趣的博友查看原文. 写在前面 记得在<Pattern Recognition And Machine ...
- [Machine Learning & Algorithm]CAML机器学习系列1:深入浅出ML之Regression家族
声明:本博客整理自博友@zhouyong计算广告与机器学习-技术共享平台,尊重原创,欢迎感兴趣的博友查看原文. 符号定义 这里定义<深入浅出ML>系列中涉及到的公式符号,如无特殊说明,符号 ...
- 机器学习 - ML
CNCC - 2016 | 机器学习(原文链接) Machine Learning - ML,机器学习起源于人工智能,是AI的一个分支. 机器学习的理论基础:计算学习理论 - Computationa ...
- ML 基础知识
A computer program is said to learn from experience E with respect to some task T and some performan ...
- [OpenCV] Samples 06: [ML] logistic regression
logistic regression,这个算法只能解决简单的线性二分类,在众多的机器学习分类算法中并不出众,但它能被改进为多分类,并换了另外一个名字softmax, 这可是深度学习中响当当的分类算法 ...
随机推荐
- SMTP 通过 ssh 通道发送垃圾邮件
通过SSH隧道传输SMTP 根据设计,我们不允许校外机器使用我们的SMTP服务器.如果我们允许它,我们将允许任何和所有使用我们的SMTP服务器来分发垃圾邮件.但是也可以通过我们的SMTP服务器发送邮件 ...
- 小程序animation动画效果综合应用案例(交流QQ群:604788754)
如果案例有问题,可到QQ群找到今日相关压缩文件下载测试. WXML: <view class="cebian"> <view animation="{{ ...
- js在类似数组的对象中使用push
let obj = { "2": "a", "3": "b", length: 3, push: Array.proto ...
- 一个在windows电脑上控制比较全的文件夹的设置方式
一个在windows电脑上控制比较全的文件夹的设置方式: 1.在桌面上创建一个新建文件夹 2.将新建文件夹重命名为 万能控制模式.{ED7BA470-8E54-465E-825C-99712043E ...
- 打开ahci模式
打开ahci模式(sata)的正确步骤: 1.安装系统前在bios中将硬盘模式设置为ide兼容模式(别说你不会哦),然后安装系统,建议安装微软原版系统或是官方oem原版系统: 2.系统安装 ...
- CUDA ---- CUDA库简介
CUDA Libraries简介 上图是CUDA 库的位置,本文简要介绍cuSPARSE.cuBLAS.cuFFT和cuRAND,之后会介绍OpenACC. cuSPARSE线性代数库,主要针对稀疏矩 ...
- ORM与hibernate概述
JDBC是什么? JDBC代表java数据库连接,并提供一组java API,用于java成许访问关系数据库.这些Java的API允许Java程序执行SQL语句,并与任何SQL兼容的数据库进行交互. ...
- git添加本地项目到git
1.切换到项目所在文件夹下:git int 2.git add -A 3.git commit -m '11' 4.git remote add origin https://github.com/g ...
- conan-transit服上的库列表
conan-transit服上的库列表 因为获取列表比较慢,所以获取后在此记录,以备查找.conan-transit 是个只读库,不会有更新.新的库将上传到 conan-center. conan是C ...
- Python3下安装pip和MySQLdb
MySQLdb的安装更曲折了.还是按照正常方法安装,下载MySQL-python-1.2.5版本,解压后python setup.py install,发现怎么装都会报错“ConfigParser.N ...