朴素贝叶斯分类之垃圾短信识别_光环大数据培训机构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
朴素贝叶斯分类之垃圾短信识别_光环大数据培训机构
算法思想
该算法根据训练数据集的取值计算已知分类的各种概率,在完成学习的过程后,如果将一个未分类的样本带入到算法中,分类器根据样本的特征计算概率并将其判为应该属于的类。
贝叶斯条件概率
上文中提到的概率都是基于贝叶斯条件概率公式计算所得,具体公式如下:
该公式表示,已知事件B发生的条件下,事件A发生的概率。举个例子说,已知某人吸烟的情况下,其可能得肺癌的概率就可以根据该公式计算所得。
这里需要注意的是,贝叶斯条件概率计算的是某事件发生的概率,所以对原始数据有一个潜在的假设,即变量值尽可能的离散化(成为独立的事件),如果变量值是大量的连续数据,算法可能得到不理想的分类结果。
应用–垃圾短信识别
接下来将使用该算法实现垃圾短信的识别,垃圾短信的识别又将涉及到文本
文字的处理,数据来源于http://www.dt.fee.unicamp.br/~tiago/smsspamcollection/。
一、读取数据
sms_rawdata <- read.csv(file = file.choose(), header = TRUE, stringsAsFactors = FALSE)
#查看数据前6行
head(sms_rawdata)
#查看数据概要
str(sms_rawdata)
由于短信的类型是分类变量,这里进一步将其处理为因子
sms_rawdata$type <- factor(sms_rawdata$type)
#查看短信类型的数量
table(sms_rawdata$type)
prop.table(table(sms_rawdata$type))
垃圾短信有747条,占了13.4%的比重。
二、文本处理
在文本分析之前需要使用tm包将文本处理干净,主要是文本信息中含有的一些没有意义的内容,如标点符号、数字、停止词等。
#下载并加载tm包
if(!suppressWarnings(require('tm'))){
install.packages('tm')
require('tm')
}
#首先将文本数据导入为语料库(Corpus函数)
sms_corpus <- Corpus(VectorSource(sms_rawdata$text))
#查看语料库
sms_corpus
发现语料库中包含5558个文件即短信。
使用tm_map函数将没有意义的信息剔除
#所有单词转化为小写
sms_clean <- tm_map(sms_corpus,content_transformer(tolower)) #剔除所有标点符号
sms_clean <- tm_map(sms_clean,removePunctuation)
#剔除所有数字
sms_clean <- tm_map(sms_clean,removeNumbers)
#剔除所有停止词,如a/the等,使用tm包自带的停止词
sms_clean <- tm_map(sms_clean,removeWords,stopwords())
#剔除所有空格
sms_clean <- tm_map(sms_clean,stripWhitespace)
创建符合贝叶斯算法的数据集(文档词条矩阵),矩阵的行表示短信条数,矩阵的列表示单词。
sms_dtm <- DocumentTermMatrix(x = sms_clean)
sms_dtm
该文档词条矩阵包含了8300多列,超过了短信的条数,这将导致算法无法准确分类,为了减少矩阵的列数,我们将剔除同一个单词出现在少于5条短信的单词。这里的5表示总短信条数的0.1%。
#将文档词条矩阵转化为数据框
sms_dtm2 <- as.data.frame(inspect(sms_dtm))
sms_dtm2 <- sms_dtm2[,findFreqTerms(sms_dtm,5)]
dim(sms_dtm2)
[1] 5558 1542
#现在还剩1542列
三、文本探索
在建模之前,我们对文本进行一个初步的探索–词云
#下载并加载wordcloud包
if(!suppressWarnings(require('wordcloud'))){
install.packages('wordcloud')
require('wordcloud')
}
#绘制文字云
par(bg='black')
wordcloud(words = sms_clean, min.freq = 50, scale = c(2.5,0.5),colors=rainbow(10))
四、建模
由于文档词条矩阵中的数值表示某个单词出现在一条短信中的次数,所以需要将连续数值离散化,这里将大于等于1的值用YES表示,否则用NO表示。
#构建离散化的自定义函数
numtochar <- function(x){
ifelse(x >= 1, 'YES', 'NO')
}
#将自定义函数应用到数据框中的每一列
sms_dtm2 <- sapply(sms_dtm2, numtochar)
#创建训练集和测试集
set.seed(1234)
index <- sample(1:2, size = nrow(sms_rawdata), replace = TRUE, prob = c(0.7,0.3))
train_data <- sms_dtm2[index == 1,]
train_Y <- sms_rawdata[index == 1, 1]
test_data <- sms_dtm2[index == 2,]
test_Y <- sms_rawdata[index == 2, 1]