插入符号:尝试预测但预测行不同

caret: Attempt to Predict but prediction row differs

我已经创建并调整了多个模型,但是当我试图预测它们时,我 运行 遇到了问题。我首先 运行 我的代码如下调整 LDA 模型。

library(MASS)
library(caret)
library(randomForest)
data(survey)
data<-survey

#create training and test set
split <- createDataPartition(data$W.Hnd, p=.8)[[1]]
train<-data[split,]
test<-data[-split,]


#creating training parameters
control <- trainControl(method = "cv",
                        number = 10, 
                        p =.8, 
                        savePredictions = TRUE, 
                        classProbs = TRUE, 
                        summaryFunction = twoClassSummary)

#fitting and tuning model
lda_tune <- train(W.Hnd ~ . , 
            data=train, 
            method = "glm" ,
            metric = "ROC",
            trControl = control)

然而当我运行 results <- predict(rf_tune, newdata=test),

当测试集有 46 行时,输出只有 32 行。这是有问题的,因为我使用来自多个模型的预测值创建了测试结果的 data.frame,以便使用混淆矩阵进行分析。例如,当我 运行 这个

results<-data.frame(obs = test$W.Hnd, lda = predict(lda_tune, newdata = test))

我收到错误 Error in$<-.data.frame(tmp, "rf_results", value = c(2L, 2L, 2L, : replacement has 32 rows, data has 46

有人可以向我解释为什么当明显有 46 个值要预测时或当我明确调用模型来预测测试集中的值时插入符号返回 32 个预测值吗?

运行 你的代码导致了我这边的错误。 twoClasSummary returns 一个错误。但是忽略这一点,您首先在谈论 lda_tune,然后在谈论 rf_tune。

考虑到这些问题,问题在于您的测试集中缺少值。如果您检查 nrow(test[complete.cases(test), ]),您会看到 returns 33 个案例。这正是预测 returns.

我添加了下面的代码以供参考。包括 rf_tune 和 lda_tune + 他们的结果。

library(MASS)
library(caret)
library(randomForest)
data(survey)
data<-survey

#create training and test set
split <- createDataPartition(data$W.Hnd, p=.8)[[1]]
train<-data[split,]
test<-data[-split,]


#creating training parameters
control <- trainControl(method = "cv",
                        number = 10, 
                        p =.8, 
                        savePredictions = TRUE, 
                        classProbs = TRUE)

#fitting and tuning model
lda_tune <- train(W.Hnd ~ . , 
                  data=train, 
                  method = "glm" ,
                  metric = "ROC",
                  trControl = control)

rf_tune <- train(W.Hnd ~ . , 
                  data=train, 
                  method = "rf" ,
                  metric = "ROC",
                  trControl = control)

lda_results <- data.frame(obs = test$W.Hnd[complete.cases(test)], lda = predict(lda_tune, newdata = test))
rf_results <- data.frame(obs = test$W.Hnd[complete.cases(test)], lda = predict(rf_tune, newdata = test))