Quanteda中的朴素贝叶斯与插入符号:结果截然不同

Quanteda中的朴素贝叶斯与插入符号:结果截然不同,第1张

概述我正在尝试使用quanteda和caret一起使用包来根据训练样本对文本进行分类.作为测试运行,我想比较quanteda的内置朴素贝叶斯分类器和插入符号中的分类器.但是,我似乎无法正确地工作. 这是一些复制代码.首先在quanteda方面: library(quanteda)library(quanteda.corpora)library(caret)corp <- data_corpus_ 我正在尝试使用quanteda和caret一起使用包来根据训练样本对文本进行分类.作为测试运行,我想比较quanteda的内置朴素贝叶斯分类器和插入符号中的分类器.但是,我似乎无法正确地工作.

这是一些复制代码.首先在quanteda方面:

library(quanteda)library(quanteda.corpora)library(caret)corp <- data_corpus_movIEsset.seed(300)ID_train <- sample(docnames(corp),size = 1500,replace = FALSE)# get training settraining_dfm <- corpus_subset(corp,docnames(corp) %in% ID_train) %>%  dfm(stem = TRUE)# get test set (documents not in ID_train,make features equal)test_dfm <- corpus_subset(corp,!docnames(corp) %in% ID_train) %>%  dfm(stem = TRUE) %>%   dfm_select(pattern = training_dfm,selection = "keep")# train model on sentimentnb_quanteda <- textmodel_nb(training_dfm,docvars(training_dfm,"Sentiment"))# predict and evaluateactual_class <- docvars(test_dfm,"Sentiment")predicted_class <- predict(nb_quanteda,newdata = test_dfm)class_table_quanteda <- table(actual_class,predicted_class)class_table_quanteda#>             predicted_class#> actual_class neg pos#>          neg 202  47#>          pos  49 202

不错.没有调整,准确率为80.8%.在插入符号中相同(据我所知)

training_m <- convert(training_dfm,to = "matrix")test_m <- convert(test_dfm,to = "matrix")nb_caret <- train(x = training_m,y = as.factor(docvars(training_dfm,"Sentiment")),method = "naive_bayes",trControl = trainControl(method = "none"),tuneGrID = data.frame(laplace = 1,usekernel = FALSE,adjust = FALSE),verbose = TRUE)predicted_class_caret <- predict(nb_caret,newdata = test_m)class_table_caret <- table(actual_class,predicted_class_caret)class_table_caret#>             predicted_class_caret#> actual_class neg pos#>          neg 246   3#>          pos 249   2

这里的准确度不仅低得惊人(49.6% – 几乎是机会),因此几乎没有预测过pos级!所以我很确定我在这里缺少一些关键的东西,因为我认为实现应该非常相似,但不确定是什么.

我已经查看了quanteda函数的源代码(希望它可能是基于插入符号或底层包构建的)并且看到有一些加权和平滑正在进行.如果我在训练之前将其应用于我的dfm(稍后设置laplace = 0),准确性会好一些.然而也只有53%.

解决方法 答案是插入符号(使用来自naivebayes包的naive_bayes)假定为高斯分布,而quanteda :: textmodel_nb()基于更适合文本的多项分布(也可选择伯努利分布).

textmodel_nb()的文档复制了IIR书中的例子(Manning,Raghavan和Schütze2008),还引用了Jurafsky和Martin(2018)的另一个例子.看到:

> Manning,Christopher D.,Prabhakar Raghavan和HinrichSchütze. 2008.信息检索简介.剑桥大学出版社(第13章). https://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf
> Jurafsky,DanIEl和James H. Martin. 2018.语音和语言处理.自然语言处理,计算语言学和语音识别简介.第3版草案,2018年9月23日(第4章). https://web.stanford.edu/~jurafsky/slp3/4.pdf

另一个软件包e1071产生与您发现的相同的结果,因为它也基于高斯分布.

library("e1071")nb_e1071 <- naiveBayes(x = training_m,"Sentiment")))nb_e1071_pred <- predict(nb_e1071,newdata = test_m)table(actual_class,nb_e1071_pred)##             nb_e1071_pred## actual_class neg pos##          neg 246   3##          pos 249   2

然而,插入符号和e1071都在密集矩阵上运行,这是他们与稀疏dfm *** 作的quanteda方法相比如此令人头脑麻木的原因之一.因此,从适当性,效率和(根据您的结果)分类器的性能的角度来看,应该非常清楚哪一个是首选的!

library("rbenchmark")benchmark(    quanteda = {         nb_quanteda <- textmodel_nb(training_dfm,"Sentiment"))        predicted_class <- predict(nb_quanteda,newdata = test_dfm)    },caret = {        nb_caret <- train(x = training_m,verbose = FALSE)        predicted_class_caret <- predict(nb_caret,newdata = test_m)    },e1071 = {        nb_e1071 <- naiveBayes(x = training_m,"Sentiment")))        nb_e1071_pred <- predict(nb_e1071,replications = 1)##       test replications elapsed relative user.self sys.self user.child sys.child## 2    caret            1  29.042  123.583    25.896    3.095          0         0## 3    e1071            1 217.177  924.157   215.587    1.169          0         0## 1 quanteda            1   0.235    1.000     0.213    0.023          0         0
总结

以上是内存溢出为你收集整理的Quanteda中的朴素贝叶斯与插入符号:结果截然不同全部内容,希望文章能够帮你解决Quanteda中的朴素贝叶斯与插入符号:结果截然不同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1075027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存