【发布时间】:2018-04-18 21:08:51
【问题描述】:
我一直在按照 Lantz 的书名为“Machine Learning with R”的贝叶斯分类器示例。该案例是一个垃圾邮件分类器,它使用以下链接的数据:
http://www.dt.fee.unicamp.br/~tiago/smsspamcollection/
在代码中我这部分有问题:
sms_train<-DocumentTermMatrix(sms_corpus_train,list(dictionary=sms_dict))
sms_test<-DocumentTermMatrix(sms_corpus_test,list(dictionary=sms_dict))
因为它说我应该使用以下指令:
sms_dict <- Dictionary(findFreqTerms(sms_dtm_train, 5))
问题在于 Dictionary() 函数已从新版本的 tm 中弃用。我应该怎么做才能完成书中所说的:
字典是一种数据结构,允许我们指定哪些单词 应该出现在文档术语矩阵中。限制我们的培训和 仅对前面字典中的单词进行测试矩阵,使用 下面的命令
我做了以下事情:
sms_dict<-findFreqTerms(sms_dtm_train,5)
sms_train<-DocumentTermMatrix(sms_corpus_train,list(dictionary=sms_dict))
sms_test<-DocumentTermMatrix(sms_corpus_test,list(dictionary=sms_dict))
但我确信我并没有限制书中所说的测试矩阵。即使代码正常工作,它也没有给我正确的结果。在这种情况下我可以修改什么?
用于跟踪目的的完整代码如下:
sms_raw<-read.csv("sms_spam.csv",stringsAsFactors=FALSE)
install.packages("tm")
library(tm)
sms_corpus<-Corpus(VectorSource(sms_raw$text))
corpus_clean<-tm_map(sms_corpus,content_transformer(tolower))
corpus_clean<-tm_map(corpus_clean,removeNumbers)
corpus_clean<-tm_map(corpus_clean,removeWords,stopwords())
corpus_clean<-tm_map(corpus_clean,stripWhitespace)
sms_dtm<-DocumentTermMatrix(corpus_clean)
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_clean[1:4169]
sms_corpus_test<-corpus_clean[4170:5559]
sms_dict<-findFreqTerms(sms_dtm_train,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"))
return(x)
}
sms_train<-apply(sms_train,MARGIN=2,convert_counts)
sms_test<-apply(sms_test,MARGIN=2,convert_counts)
library(e1071)
sms_classifier<-naiveBayes(sms_train,sms_raw_train$type)
sms_test_pred<-predict(sms_classifier,sms_test)
install.packages("gmodels")
library(gmodels)
CrossTable(sms_test_pred,sms_raw_test$type,prop.chisq=FALSE,prop.t=FALSE,dnn=c('predicted','actual'))
谢谢
【问题讨论】:
-
我认为您已经正确地将
findFreqTerms用作字典。您的方式完全取代了以前的Dictionary()功能,请查看此答案link。您能否更清楚地解释您的预期输出与您目前得到的输出有何不同?这将使追查问题变得更加容易。 -
这不是
[1:4169,]和[4170:5559]实际上限制了您的测试矩阵吗?由于您将大部分用于训练,然后您的测试集较小。但也许我完全离开了,因为我不理解你的代码。没有适当的间距和不合逻辑的变量名称很难阅读。
标签: r dictionary