R-Caret: 如何使用多个模型构建更高效的模型并预测新结果

我的训练数据集(train)是一个包含n-features和一个额外结果列y的数据框架。我构建了3个独立的模型,例如:

m1 <- train(y ~ ., data = train, method = "lda")m2 <- train(y ~ ., data = train, method = "rf")m3 <- train(y ~ ., data = train, method = "gbm")

使用测试数据集(test)我可以评估这些独立模型的质量(自然,它也包含结果y):

pred1 <- predict(m1, newdata = test)pred2 <- predict(m2, newdata = test)pred3 <- predict(m3, newdata = test)

如果我将每个独立模型应用于一个结果未知的DATA_TO_PREDICT数据框架(包含5个示例),每个独立模型的输出自然是5个预测结果:

predict(m1, DATA_TO_PREDICT)predict(m2, DATA_TO_PREDICT)predict(m3, DATA_TO_PREDICT)

现在我想使用R-Caret包中的随机森林来构建一个组合模型:

DF <- data.frame(pred1, pred2, pred3, y = test$y)MODEL <- train(y ~ ., data = DF, method = "rf")

我观察到组合模型的准确率有所提高:

predMODEL <- predict(MODEL, DF)

但是,当我将组合模型应用于DATA_TO_PREDICT(结果未知)时,输出不仅有5个预测结果,而是有一大串重复的结果,数量超过百个。我使用了:

predict(MODEL, newdata = DATA_TO_PREDICT)

示例:

这里我展示了一个具体的例子,输出是错误的。也就是说,我想预测4个新数据,但我得到的结果却有数十个输出:

library(caret)library(gbm)set.seed(10)library(AppliedPredictiveModeling)data(AlzheimerDisease)adData = data.frame(diagnosis,predictors)inTrain = createDataPartition(adData$diagnosis, p = 3/4)[[1]]training = adData[ inTrain,]testing = adData[-inTrain,]inTEST <- (5:nrow(testing))test <- testing[inTEST,]DATA_TO_PREDICT <- testing[-inTEST,]m1 <- train(diagnosis ~ ., data=training, method="rf")m2 <- train(diagnosis ~ ., data=training, method="gbm")m3 <- train(diagnosis ~ ., data=training, method="lda")p1 <- predict(m1, newdata = test)p2 <- predict(m2, newdata = test)p3 <- predict(m3, newdata = test)DF <- data.frame(p1, p2, p3, diagnosis = test$diagnosis)MODEL <- train(diagnosis ~ ., data = DF, method = "rf")predMODEL <- predict(MODEL, DF)

然后,如果我构建了组合模型:

pred1 <- predict(m1, DATA_TO_PREDICT)pred2 <- predict(m2, DATA_TO_PREDICT)pred3 <- predict(m3, DATA_TO_PREDICT)DF2 <- data.frame(pred1, pred2, pred3)predict(MODEL, newdata = DF2) 

请注意,DATA_TO_PREDICT只有4个示例,而输出是:

  [1] Control Control Control Control Control Control Control Control  [9] Control Control Control Control Control Control Control Control [17] Control Control Control Control Control Control Control Control [25] Control Control Control Control Control Control Control Control [33] Control Control Control Control Control Control Control Control [41] Control Control Control Control Control Control Control Control [49] Control Control Control Control Control Control Control Control [57] Control Control Control Control Control Control Control Control [65] Control Control Control Control Control Control Control Control [73] Control Control Control Control Control Control Levels: Impaired Control

回答:

这是因为MODEL是在三个独立模型(pred1pred2pred3)对测试数据的预测结果上训练的,而在最后一步中,DATA_TO_PREDICT被提供给MODEL,但它实际上包含的是观测值。首先,需要存储独立模型对DATA_TO_PREDICT的预测值,然后将这些预测值作为newdata用于MODEL

#(示例开头部分已省略)DF <- data.frame(p1, p2, p3, diagnosis = test$diagnosis)# 这是在使用预测结果作为输入来训练模型:MODEL <- train(diagnosis ~ ., data = DF, method = "rf")# 这部分缺失 ----------------------# 为了获得组合模型的输入# 需要对DATA_TO_PREDICT进行预测p1b <- predict(m1, newdata = DATA_TO_PREDICT)p2b <- predict(m2, newdata = DATA_TO_PREDICT)p3b <- predict(m3, newdata = DATA_TO_PREDICT)DFb <- data.frame(p1b, p2b, p3b)colnames(DFb) <- c("p1", "p2", "p3")#----------------------------------------predMODEL <- predict(MODEL, DFb)# [1] Control Control Control Control 

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注