R中的朴素贝叶斯

4

在R中运行朴素贝叶斯分类器时,我遇到了错误。我使用以下代码-

mod1 <- naiveBayes(factor(X20) ~ factor(X1) + factor(X2) +factor(X3) +factor(X4)+factor(X5)+factor(X6)+factor(X7)
               +factor(X8)+factor(X9)
               +factor(X10)+factor(X11)+ factor(X12)+factor(X13)+factor(X14)
               +factor(X15)
               +factor(X16)+factor(X17)
               +factor(X18)+factor(X19),data=intent.test)

res1 <- predict(mod1)$posterior

该代码的第一部分运行良好。但是,当它尝试预测后验概率时,会引发以下错误-
**Error in as.data.frame(newdata) : 
argument "newdata" is missing, with no default**

我尝试运行类似以下的代码:
res1 <- predict(mod1,new_data=intent.test)$posterior

但这也会出现相同的错误。

3
正确的拼写是newdata,不带下划线(就像错误信息中所示),但它是一个可选参数:即使没有它,它也应该可以工作。你的数据集可能存在一些问题,但你没有提供任何相关信息。在数据框架中已经编码为因子的数据可能有所帮助。如果你正在尝试用其他列来预测最后一列,那么模型可以更简洁地写成 X20 ~ . - Vincent Zoonekynd
1个回答

9
你好,看起来你正在使用e1071::naiveBayes算法,该算法需要一个newdata参数进行预测,这就是在运行代码时出现两个错误的原因。(你可以在CRAN上查看predict.naiveBayes函数的源代码; 代码的第二行期望有一个newdata,如newdata <- as.data.frame(newdata)。) 此外,正如@Vincent所指出的,最好在调用NB算法之前将变量转换为因子,尽管这显然与上述错误无关。
如果使用klar包中的NaiveBayes,则不会出现此问题。例如,
data(spam, package="ElemStatLearn")
library(klaR)

# set up a training sample
train.ind <- sample(1:nrow(spam), ceiling(nrow(spam)*2/3), replace=FALSE)

# apply NB classifier
nb.res <- NaiveBayes(spam ~ ., data=spam[train.ind,])

# predict on holdout units
nb.pred <- predict(nb.res, spam[-train.ind,])

# but this also works on the training sample, i.e. without using a `newdata`
head(predict(nb.res))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接