关于R语言基于贝叶斯算法的数据分析

如何利用贝叶斯算法来判断一条信息是否是垃圾短信。

代码如下:

data<-read.csv("sms_spam.csv",stringsAsFactors = FALSE)
str(data)
data

data$type<-factor(data$type)
data$text<-iconv(x = data$text,from = "WINDOWS-1252",to = "UTF-8")

library(tm)
data_corpus_text<-Corpus(VectorSource(data$text))

data_corpus_text_train<-data_corpus_text[1:5000]
data_corpus_text_test<-data_corpus_text[5001:5558]

dtm_train<-DocumentTermMatrix(x = data_corpus_text_train)
dtm_test<-DocumentTermMatrix(x = data_corpus_text_test)

inspect(dtm_test)

conver_to_matrix<-function(x){
  x<-ifelse(x>0,1,0)
  x<-factor(x,levels = c(0,1),labels = c("\"No\"","\"Yes\""))
  return(x)
}

m_dtm_train<-apply(X = dtm_train,MARGIN = 2,FUN = conver_to_matrix)

m_dtm_test<-apply(X = dtm_test,MARGIN = 2,FUN = conver_to_matrix)


library(e1071)

classifier<-naiveBayes(x = m_dtm_train,y = data$type[1:5000])
predictions<-predict(object = classifier,newdata = m_dtm_test)

library(gmodels)

CrossTable(x = data$type[5001:5558],y = predictions,dnn = c("Actual","Predict"))

关键点解释如下:

1. 第一步肯定是要通过read.csv()加载数据。其中stringAsFactors=FALSE表明了加载数据的时候不要自动的将字符型数据自动转换成因子水平,这样有利于我们之后自己决定因子

2.data$type<-factor(data$type) 。 由于type是我们将要预测的值,所以我们需要将type转换成因子

3.然后就涉及到语料库(Corpus)的概念。在处理文本类数据的时候,建议将文本转换成corpus语料库来处理,因为这样的话,tm包提供了DocumentTermMatrix函数,可以很方便的将一个语料库转换成稀疏矩阵。

稀疏矩阵:《关于R语言基于贝叶斯算法的数据分析》

Docs代表每个文本数据,and、are等下的表示该单词在Docs表示的文本中出现的次数。例如,第187的文本中and出现了2次,for出现了1次,that出现了4次等等。

4.但是在用贝叶斯算法分析的时候,要求数据框(或矩阵)必须有明确的的数据特征,也就是每个属性不是yes,就要是no. 所以,我们要修改生成的稀疏矩阵,先构建一个函数conver_to_matrix, 用来将每个输入转换成0或1的因子。0表示该单词在该文本中没有出现过,1表示该单词在文本中出现过(基于贝叶斯的特性以及需求,不用考虑单词出现的次数)。m_dtm_train<-apply(X = dtm_train,MARGIN = 2,FUN = conver_to_matrix) 这样得到的m_dtm_train就是符合贝叶斯要求的训练数据。

5.classifier<-naiveBayes(x = m_dtm_train,y = data$type[1:5000]) 之后就是构造出分类器,然后在预测的时候使用这个分类器进行判断就可以了。

6.最后当然是比较一下预测数据和真实数据的误差。

《关于R语言基于贝叶斯算法的数据分析》

可以看出结果还是很可观的。

注意,值得一提的是:

data$text<-iconv(x = data$text,from = "WINDOWS-1252",to = "UTF-8")。

我在ubuntu下写的代码,当时遇到的问题是数据中含有不能被正常编码的字符,是很生僻的那种,于是在执行tolower函数时候就会报错,执行上面代码虽然还是不可以让字符得到正确的解读,但是至少不再是不能编码了。

附上数据文件:

(数据来源:http://www.dt.fee.unicamp.br/~tiago/sms-spamcollection/)

链接: https://pan.baidu.com/s/1i49dejr 密码: nmhn

点赞