# 读取数数据, 查看数据结构
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 基于朴素贝叶斯模型实现手机垃圾短信过滤的更多相关文章

  1. 机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型

    该系列来自于我<人工智能>课程回顾总结,以及实验的一部分进行了总结学习机 垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识.则以及朴素贝叶斯模型的思想.最后给出了垃圾 ...

  2. 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3

    一步步教你轻松学朴素贝叶斯深度篇3(白宁超   2018年9月4日14:18:14) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...

  3. Java实现基于朴素贝叶斯的情感词分析

    朴素贝叶斯(Naive Bayesian)是一种基于贝叶斯定理和特征条件独立假设的分类方法,它是基于概率论的一种有监督学习方法,被广泛应用于自然语言处理,并在机器学习领域中占据了非常重要的地位.在之前 ...

  4. PGM:贝叶斯网表示之朴素贝叶斯模型naive Bayes

    http://blog.csdn.net/pipisorry/article/details/52469064 独立性质的利用 条件参数化和条件独立性假设被结合在一起,目的是对高维概率分布产生非常紧凑 ...

  5. 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示

    第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...

  6. 详解基于朴素贝叶斯的情感分析及 Python 实现

    相对于「 基于词典的分析 」,「 基于机器学习 」的就不需要大量标注的词典,但是需要大量标记的数据,比如: 还是下面这句话,如果它的标签是: 服务质量 - 中 (共有三个级别,好.中.差) ╮(╯-╰ ...

  7. 统计学习1:朴素贝叶斯模型(Numpy实现)

    模型 生成模型介绍 我们定义样本空间为\(\mathcal{X} \subseteq \mathbb{R}^n\),输出空间为\(\mathcal{Y} = \{c_1, c_2, ..., c_K\ ...

  8. 11.sklearn中的朴素贝叶斯模型及其应用

    #1.使用朴素贝叶斯模型对iris数据集进行花分类 #尝试使用3种不同类型的朴素贝叶斯: #高斯分布型,多项式型,伯努利型 from sklearn import datasets iris=data ...

  9. Python实现 利用朴素贝叶斯模型(NBC)进行问句意图分类

    目录 朴素贝叶斯分类(NBC) 程序简介 分类流程 字典(dict)构造:用于jieba分词和槽值替换 数据集构建 代码分析 另外:点击右下角魔法阵上的[显示目录],可以导航~~ 朴素贝叶斯分类(NB ...

随机推荐

  1. centos7下关闭防火墙

    查看防火墙:systemctl status firewalld.service 关闭防火墙:systemctl stop firewalld.service 以上方式是暂时的,重启系统则防火墙仍然开 ...

  2. httpd虚拟主机起不来!!

    前几天在公司,练习负载均衡配置.在配置虚拟主机的web服务(apache) ,创建好虚拟主机的配置文件 ss -tnl  查看监控端口80已起来,通过本地浏览器访问一直显示默认的欢迎页... 一个下午 ...

  3. 【简单的spfa+优先队列】

    题目是给出只有x和y构成的图,相同元素走路不花费,不同元素间花费1,给出起点终点,最少花费是 #include<cstdio>#include<algorithm>#inclu ...

  4. 在Python中用许多点找到两个最远点的点

    我需要找到距离彼此最远的两个点. 正如屏幕截图所示,我有一个包含其他两个数组的数组.一个用于X,一个用于Y坐标.确定数据中最长线的最佳方法是什么?通过这样说,我需要选择情节中最远的两个点.希望你们能帮 ...

  5. [C4] 前馈神经网络(Feedforward Neural Network)

    前馈神经网络(Feedforward Neural Network - BP) 常见的前馈神经网络 感知器网络 感知器(又叫感知机)是最简单的前馈网络,它主要用于模式分类,也可用在基于模式分类的学习控 ...

  6. CF455C Civilization 树的直径

    问题描述 LG-CF455C 题解 首先,题目给出了 \(m\) 条边,对这 \(n\) 个点, \(m\) 条边组成的森林,跑出每棵树的直径,同时使用并查集维护树的连通性. 考虑合并两棵树的情况:设 ...

  7. STS 创建 Maven 项目填坑

    用 STS 创建 Maven 项目并不复杂,只是其中有一些坑在里面,我在解决这些坑的时候发现很多人都遇到了相同的问题,因此把创建的步骤记录在这里.所有的步骤不外乎就是一些套路,并没有什么复杂的地方,只 ...

  8. [LeetCode#180]Consecutive Numbers

    Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...

  9. Vue.js 源码分析(二十) 指令篇 v-once指令详解

    数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值,例如:<p>Message: {{ msg }}</p>以后每当msg属性发生了改变,插值处的内 ...

  10. SiftingAppender logback 动态 输出 日志 到指定日志文件

    SiftingAppender https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/