我正在尝试在 WESBROOK 数据集上使用 k 折交叉验证。它使用
train
包中的 caret
函数来执行此操作。到目前为止,这个函数对我来说已经适用于 svm
、knn
和 rpart
等方法,但是使用 nb
(朴素贝叶斯)方法,我收到以下错误:
Error in { :
task 1 failed - "Not all variable names used in object found in newdata"
这就是我的
train
函数的样子:
k_folds <- 5
train_control <- trainControl(method = "cv", number = k_folds, classProbs = TRUE, summaryFunction = twoClassSummary)
nb_model <- train(
TOTLGIVE ~ ., data = train_data,
method = "nb",
trControl = train_control
)
我检查了,没有丢失数据,训练集和测试集中的列名和列类型是相同的。
检查因子变量的水平是否相同:
lapply(train_data, levels)
lapply(test_data, levels)
一般来说,对列进行更改后的一个好习惯是为训练集和测试集提供通用名称。这样可以防止此类问题发生。
library(dplyr)
test_data <- test_data %>%
select(intersect(names(train_data), names(test_data)))
如果此错误仍然存在,请尝试使用
naive_bayes
包中的替代 naivebayes
方法。
nb_model <- train(
TOTLGIVE ~ ., data = train_data,
method = "naive_bayes",
trControl = train_control
)