R 基于朴素贝叶斯模型实现手机垃圾短信过滤
# 读取数数据, 查看数据结构
df_raw <- read.csv("sms_spam.csv", stringsAsFactors=F)
str(df_raw)
length(df_raw$type) # 将数据分为特征值矩阵 X 和 类标向量y 两部分,将 y 换为因子
X <- df_raw$text
y <- factor(df_raw$type)
length(y) # 查看类标向量 y 的结构和组成
str(y)
table(y) # 安装和加载文本挖掘包
#install.packages("tm")
library(NLP)
library(tm) # 创建语料库
X_corpus <- VCorpus(VectorSource(X))
######## 1 清洗文本数据 ########
# 1.1 将文本中的字母转换为小写
X_corpus_clean <- tm_map(X_corpus, content_transformer(tolower))
# 1.2 去除文本中的数字
X_corpus_clean <- tm_map(X_corpus_clean, removeNumbers) # 1.3 去除文本中的停用词
X_corpus_clean <- tm_map(X_corpus_clean, removeWords, stopwords()) # 1.4 去除文本中的标点符号
X_corpus_clean <- tm_map(X_corpus_clean, removePunctuation) # 添加包
#install.packages("SnowballC")
library(SnowballC)
# 1.5 提取文本中每个单词的词干
X_corpus_clean <- tm_map(X_corpus_clean, stemDocument) # 1.6 删除额外的空白
X_corpus_clean <- tm_map(X_corpus_clean, stripWhitespace) # 1.7 将文本文档拆分成词语, 创建文档——单词矩阵
X_dtm <- DocumentTermMatrix(X_corpus_clean) ############# 2 准备输入数据 #############
# 2.1 划分训练数据集和测试数据集
X_dtm_train <- X_dtm[1:4169, ]
X_dtm_test <- X_dtm[4170:5559, ] y_train <- y[1:4169]
y_test <- y[4170:5559]
# 说明:因为原始数据 df_raw 是随机选取的,所以可以直直接去前 75% 的数据为测试数据 # 2.2 检查样本分分布是否偏斜
prop.table(table(y_train))
prop.table(table(y_test)) # 2.3 过滤 DTM, 选取频繁出现的单词
X_freq_words <- findFreqTerms(X_dtm_train, 5) # 此处可以试错调整,以调节模型的性能
# 过滤 DTM
X_dtm_train_freq <- X_dtm_train[, X_freq_words]
X_dtm_test_freq <- X_dtm_test[, X_freq_words] # 2.4 将矩阵文本编码为数值
# 2.4.1定义一个变量转换函数
convert_counts <- function(x) {
x <- ifelse(x > 0, "Yes", "No")
} # 2.4.2 转换训练矩阵和测试矩阵
X_train <- apply(X_dtm_train_freq, MARGIN=2, convert_counts)
X_test <- apply(X_dtm_test_freq, MARGIN=2, convert_counts) ############# 3 基于数据训练模型 ############
# install.packages("e1071")
library(e1071) # 训练模型, 拉普拉斯估计参数默认为 0
NB_classifier <- naiveBayes(X_train, y_train) ############## 4 评估模型的性能 ############# # 4.1 对测试集中的样本进行预测
y_pred <- predict(NB_classifier, X_test) # 比较预测值和真实值
# library(gmodels)
CrossTable(x=y_test, y=y_pred,
prop.chisq = F, prop.t = F, prop.c = F,
dnn = c("actural", "predict"))
模型 NB_classifier 在测试集上进行预测的混淆矩阵为:

准确率 = 0.864 + 0.110 = 0.974
对模型调参
################## 5 提高模型的性能 ################## # 5.1 添加拉普拉斯估计,训练模型
NB_classifier2 <- naiveBayes(x = X_train, y = y_train, laplace = 1) # 5.2 对测试集中的样本进行预测
y_pred2 <- predict(NB_classifier2, X_test) # 5.3 比较预测值和真实值
CrossTable(x = y_test, y = y_pred2,
prop.chisq = F, prop.t = T, prop.c = F,
dnn = c("actural", "predict"))
经过参数调优后的模型 NB_classifier2 在测试集上进行预测的混淆矩阵为:

准确率 = 0.865 + 0.112 =0.977
按语:
经过拉普拉斯估计参数的调节,模型准确率有 0.974 提高至 0.977,在高准确的前提下能有提升,实属不易。
R 基于朴素贝叶斯模型实现手机垃圾短信过滤的更多相关文章
- 机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型
该系列来自于我<人工智能>课程回顾总结,以及实验的一部分进行了总结学习机 垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识.则以及朴素贝叶斯模型的思想.最后给出了垃圾 ...
- 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3
一步步教你轻松学朴素贝叶斯深度篇3(白宁超 2018年9月4日14:18:14) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...
- Java实现基于朴素贝叶斯的情感词分析
朴素贝叶斯(Naive Bayesian)是一种基于贝叶斯定理和特征条件独立假设的分类方法,它是基于概率论的一种有监督学习方法,被广泛应用于自然语言处理,并在机器学习领域中占据了非常重要的地位.在之前 ...
- PGM:贝叶斯网表示之朴素贝叶斯模型naive Bayes
http://blog.csdn.net/pipisorry/article/details/52469064 独立性质的利用 条件参数化和条件独立性假设被结合在一起,目的是对高维概率分布产生非常紧凑 ...
- 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示
第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...
- 详解基于朴素贝叶斯的情感分析及 Python 实现
相对于「 基于词典的分析 」,「 基于机器学习 」的就不需要大量标注的词典,但是需要大量标记的数据,比如: 还是下面这句话,如果它的标签是: 服务质量 - 中 (共有三个级别,好.中.差) ╮(╯-╰ ...
- 统计学习1:朴素贝叶斯模型(Numpy实现)
模型 生成模型介绍 我们定义样本空间为\(\mathcal{X} \subseteq \mathbb{R}^n\),输出空间为\(\mathcal{Y} = \{c_1, c_2, ..., c_K\ ...
- 11.sklearn中的朴素贝叶斯模型及其应用
#1.使用朴素贝叶斯模型对iris数据集进行花分类 #尝试使用3种不同类型的朴素贝叶斯: #高斯分布型,多项式型,伯努利型 from sklearn import datasets iris=data ...
- Python实现 利用朴素贝叶斯模型(NBC)进行问句意图分类
目录 朴素贝叶斯分类(NBC) 程序简介 分类流程 字典(dict)构造:用于jieba分词和槽值替换 数据集构建 代码分析 另外:点击右下角魔法阵上的[显示目录],可以导航~~ 朴素贝叶斯分类(NB ...
随机推荐
- vue之tab切换
<style> .active{ color: red; } div a{ display: block; } </style> <script src="ht ...
- 用Python打印九九乘法表与金字塔(*)星号
''' 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 ...
- Apache(基于主机名)
1.配置hosts文件 (1).hosts文件作用是定义IP地址与主机名的映射关系,即强制将某个主机名地址解析到指定的IP地址. (2)输入命令“vi /etc/hosts”,打开hosts文件,输入 ...
- 2019.6.11_MySQL进阶一:索引
所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.MySQL索引的建立对于MySQL的高效运行是很重要的,索引可 ...
- Python tempfile (临时文件)
Python tempfile 大量临时数据放在内存中会占用大量资源,可以使用临时文件来进行储存 临时文件不用命名,且使用后会被自动删除 TemporaryFile 使用 TemporaryFile ...
- django restful framework教程大全
一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...
- [LeetCode] 11. Container With Most Water 装最多水的容器
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...
- windows/tomcat 修改java虚拟机JVM以utf-8字符集加载class文件的两种方式
1.情景展示 做了这么长时间的java开发,但是,你知道JVM是以怎样的编码加载.解析class文件的吗? 我们知道,通常情况下,我们会将java文件的字符集修改成utf-8,这样,理所当然地就认 ...
- 【08月14日】A股ROE最高排名
个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名 兰州民百(SH600738) - ROE_TTM:86.45% - ...
- ShellScript值传递参数
Shell传递参数 ######################################摘自菜鸟教程:http://www.runoob.com/linux/linux-shell-passi ...