我想使用
以下是一些可复现的代码,首先来看
这里的准确率不仅非常低(49.6% - 大约是机会),而且正类别几乎没有被预测!所以我相信我在这里缺少了一些关键的东西,因为我认为实现应该是相当相似的,但我不确定是什么。
我已经查看了
quanteda
和caret
包一起对基于训练样本的文本进行分类。作为测试运行,我想比较quanteda
中内置的朴素贝叶斯分类器与caret
中的分类器。然而,我似乎不能使caret
正常工作。以下是一些可复现的代码,首先来看
quanteda
方面的代码:library(quanteda)
library(quanteda.corpora)
library(caret)
corp <- data_corpus_movies
set.seed(300)
id_train <- sample(docnames(corp), size = 1500, replace = FALSE)
# get training set
training_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 sentiment
nb_quanteda <- textmodel_nb(training_dfm, docvars(training_dfm, "Sentiment"))
# predict and evaluate
actual_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%,无需调整。现在相同的内容(据我所知)在caret
中。
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% - 大约是机会),而且正类别几乎没有被预测!所以我相信我在这里缺少了一些关键的东西,因为我认为实现应该是相当相似的,但我不确定是什么。
我已经查看了
quanteda
函数的源代码(希望它可能是建立在caret
或底层包之上),并看到有一些加权和平滑处理。如果我在训练之前将同样的内容应用于我的dfm(稍后设置laplace = 0
),准确性会稍微好一些。但也只有53%。
naive_bayes
假设每个连续特征(数值)都服从高斯分布。对于离散特征(字符/因子/逻辑),自动使用分类分布。可以将核密度估计应用于连续预测变量。它很快就能处理具有泊松分布的计数数据。该函数非常通用,因此速度较慢...但是相当合理。矩阵超过90%是稀疏的。naive_bayes
适用于不同类型的问题。 - Michal Majka