#----------------------------------------
# 功能描述:演示NB建模过程
# 数据集:SMS文本信息
# tm包:维也纳财经大学提供
#---------------------------------------- #第一步:收集数据
# import the CSV file
sms_raw <- read.csv("/Users/chenyangang/R语言/data/sms_spam.csv", stringsAsFactors = FALSE) #第二步:探索和准备数据
# 分类变量因子化 spam/ham
sms_raw$type <- factor(sms_raw$type) # 加载文本挖掘包
library(tm) #创建语料库
sms_corpus <- Corpus(VectorSource(sms_raw$text)) #查看数据
print(sms_corpus)
inspect(sms_corpus[1:3]) #新增停用词
stopwordVector <- c("supplier","order") # clean up the corpus using tm_map()
corpus_clean <- tm_map(sms_corpus, tolower)
corpus_clean <- tm_map(corpus_clean, removeNumbers)
corpus_clean <- tm_map(corpus_clean, removeWords, stopwords())
corpus_clean <- tm_map(corpus_clean, removePunctuation)
corpus_clean <- tm_map(corpus_clean, stripWhitespace) #去掉新增停用词
corpus_clean <- tm_map(corpus_clean, removeWords, stopwordVector) #PlainTextDocument 对象,最后处理
corpus_plain <- tm_map(corpus_clean, PlainTextDocument) # 创建稀疏矩阵
sms_dtm <- DocumentTermMatrix(corpus_plain,control = list()) # 创建测试数据集和训练数据集
sms_raw_train <- sms_raw[1:4169, ]
sms_raw_test <- sms_raw[4170:5559, ] #然后是文本-单词矩阵
sms_dtm_train <- sms_dtm[1:4169, ]
sms_dtm_test <- sms_dtm[4170:5559, ] #最后得到语料库
sms_corpus_train <- corpus_plain[1:4169]
sms_corpus_test <- corpus_plain[4170:5559] # 查看训练数据集和测试数据集中的占比
prop.table(table(sms_raw_train$type))
prop.table(table(sms_raw_test$type)) #加载词云包
library(wordcloud) #这里最好用有区分的颜色,RColorBrewer中的Dark2和Set1推荐使用
pal2 <- brewer.pal(8,"Dark2")
wordcloud(corpus_plain, scale=c(3, 0.5),min.freq=10, min.words = 10, random.order=FALSE, rot.per=.15, colors=pal2)
wordcloud(sms_corpus_train, min.freq = 40, random.order = FALSE, rot.per=.15, colors=pal2) # 训练数据区分垃圾邮件和非垃圾邮件
spam <- subset(sms_raw_train, type == "spam")
ham <- subset(sms_raw_train, type == "ham") #分别查看垃圾邮件和非垃圾邮件词云图,如果需要保存图片采用png方法
#--png(file = "/Users/chenyangang/01.png", bg = "transparent")
#--dev.off() wordcloud(spam$text, max.words = 40, scale = c(3, 0.5), random.order = FALSE, rot.per=.15, colors=pal2)
wordcloud(ham$text, max.words = 40, scale = c(3, 0.5), random.order = FALSE, rot.per=.15, colors=pal2) # 标示大于5次的关键词(为频繁出现的单词创建指示特征)
sms_term <- TermDocumentMatrix(sms_corpus,control = list(removePunctuation = TRUE,stopwords = TRUE)) #获取次数大于5次的词组成字典(未调通代码)
#sms_dict <- Dictionary(findFreqTerms(sms_dtm_train, 5))
#sms_list <- Terms(findFreqTerms(sms_term, 5))
sms_dict <- findFreqTerms(sms_term, 5) sms_train <- DocumentTermMatrix(sms_corpus_train, list(dictionary = sms_dict))
sms_test <- DocumentTermMatrix(sms_corpus_test, list(dictionary = sms_dict)) # 转换为因子变量
convert_counts <- function(x) {
x <- ifelse(x > 0, 1, 0)
x <- factor(x, levels = c(0, 1), labels = c("No", "Yes"))
} # 将训练数据和测试数据按列转换为因子变量
sms_train <- apply(sms_train, MARGIN = 2, convert_counts)
sms_test <- apply(sms_test, MARGIN = 2, convert_counts) ## 第三步: 训练模型
#----------------------------------------------
#创建分类器:
# m <- naiveBayes(train, class, laplace = 0)
# train: 数据框或包含训练数据的矩阵
# class: 包含训练数据的每一行的分类的一个因子向量
# laplace: 控制拉普拉斯估计的一个数值(默认为0)
# 该函数返回一个朴素贝叶斯对象,该对象能够用于预测
#
# 进行预测:
# p <- predict(m, test, type = "class")
# m: 由naiveBayes(train, class, laplace = 0) 训练的模型对象
# test:数据框或包含测试数据的矩阵,包含用来建立分类器的训练数据相同的特征
# type:值为“class”或“raw”,标示预测是最可能的类别值或者原始的预测概率
# 该函数返回一个向量,根据参数type的值,该向量含有预测的类别值或者原始的预测概率
# example:
# sms_classifier <- naiveBayes(sms_train, sms_raw_train$type)
# sms_test_pred <- predict(sms_classifier, sms_test)
#----------------------------------------------
library(e1071)
sms_classifier <- naiveBayes(sms_train, sms_raw_train$type)
sms_classifier ## 第四步: 评估模型性能
sms_test_pred <- predict(sms_classifier, sms_test) library(gmodels)
CrossTable(sms_test_pred, sms_raw_test$type,
prop.chisq = TRUE, prop.t = TRUE, prop.r = TRUE,
dnn = c('predicted', 'actual')) ## 第五步: 提升模型性能(应用拉普拉斯估计:本质是给频率数的每个计数加上一个较小的数)
sms_classifier2 <- naiveBayes(sms_train, sms_raw_train$type, laplace = 1)
sms_test_pred2 <- predict(sms_classifier2, sms_test)
CrossTable(sms_test_pred2, sms_raw_test$type,
prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
dnn = c('predicted', 'actual'))

  

机器学习与R语言:NB的更多相关文章

  1. 【机器学习与R语言】3-概率学习朴素贝叶斯(NB)

    目录 1.理解朴素贝叶斯 1)基本概念 2)朴素贝叶斯算法 2.朴素贝斯分类应用 1)收集数据 2)探索和准备数据 3)训练模型 4)评估模型性能 5)提升模型性能 1.理解朴素贝叶斯 1)基本概念 ...

  2. 【机器学习与R语言】13- 如何提高模型的性能?

    目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...

  3. 【机器学习与R语言】12- 如何评估模型的性能?

    目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...

  4. 【机器学习与R语言】11- Kmeans聚类

    目录 1.理解Kmeans聚类 1)基本概念 2)kmeans运作的基本原理 2.Kmeans聚类应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解Km ...

  5. 【机器学习与R语言】10- 关联规则

    目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...

  6. 【机器学习与R语言】9- 支持向量机

    目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...

  7. 【机器学习与R语言】8- 神经网络

    目录 1.理解神经网络 1)基本概念 2)激活函数 3)网络拓扑 4)训练算法 2.神经网络应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 1.理解神经网络 1) ...

  8. 【机器学习与R语言】7-回归树和模型树

    目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...

  9. 【机器学习与R语言】6-线性回归

    目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...

  10. 【机器学习与R语言】5-规则学习算法

    目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...

随机推荐

  1. c#基础 第八讲

    static void Main(string[] args) { while (true)//一直循环 { Random r = new Random();//创建随机函数r int[] caipi ...

  2. VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...

  3. Arduino开发版学习计划

    制定学习开发版的计划,今天先大体过一下整个教程. http://www.bilibili.com/video/av6105302/ 视频中说可以自己制造亦可卫星放上天. Arduino使用C/C++编 ...

  4. 页面操作表单不会调用表单 value 属性的 set 函数

    在 ES5 通过 Object.defineProperty 数据绑定可以监听数据的变化,实现类似的效果,demo 执行如图: 但是这样把 表单元素的 value 属性设置为 访问器属性 后,有个问题 ...

  5. git学习(4)远程库和分支管理

    git学习(4)远程库和分支管理 1.1建立本地git库和远程库联系 我使用的是GitHub上的库,首先在GitHub上新建一个库,在建立与远程库的联系之前需要建立ssh key.建立ssh key可 ...

  6. file结构中的private_data

    private_data是Linux下连接VFS文件系统框架和不同文件/文件系统底层实现之间的一个核心数据结构,虽然它只是一个指针,但是一个指针可以解决所有问题. 因 为file是VFS框架的一个基本 ...

  7. d3.js:数据可视化利器之 交互行为:响应DOM事件

    selection.on:事件监听操作符 on()操作符可以添加或移除选择集中每个 DOM元素的事件监听函数: selection.on(type[,listener[,capture]]) 参数ty ...

  8. linux伙伴系统接口alloc_page分析1

    在内核中分配内存,最后要通过伙伴系统接口进行实际物理页面的分配,一个重要的接口便是alloc_page.本文介绍下alloc_page的主要流程,各个部分的执行.主要包含正常分配流程,当页面不足的时候 ...

  9. 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)

    一.背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画.而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取.Gif ...

  10. 具体解释linux下的串口通讯开发

    串行口是计算机一种经常使用的接口,具有连接线少.通讯简单,得到广泛的使用.经常使用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统. ...