首页 文章

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

提问于
浏览
4

我的训练数据集( train )是一个带有 n-features 的数据框和一个带有结果 y 的附加列 . 我 Build 了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)

如果我使用5个示例在数据框中应用每个单独的模型(结果未知),则每个模型的输出自然是5个预测:

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

现在我想使用R-Caret-Package和Random Forest的组合模型:

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

我可以观察到组合模型的 Accuracy 增加了:

predMODEL <- predict(MODEL, DF)

但是如果我在 DATA_TO_PREDICT 中应用组合模型(结果未知),则输出不仅有5个预测,而且还有重复结果且大于100的巨大列表 . 我用过:

predict(MODEL, newdata = DATA_TO_PREDICT)

示例:

这里我展示了输出错误的具体示例 . 也就是说,我想预测4 new data ,但我得到了几十个输出的结果:

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

1 回答

  • 2

    这是因为 MODEL 训练了三个单独模型的预测(测试数据为 pred1pred2pred3 ),最后一步 DATA_TO_PREDICT 被提供给 MODEL ,而后者由观察组成 . 首先,必须存储 DATA_TO_PREDICT 的各个模型的预测值,然后将其用作_2879701_ MODEL .

    # (Beginning of the example omitted)
    DF <- data.frame(p1, p2, p3, diagnosis = test$diagnosis)
    # This trains a model with predictions as inputs:
    MODEL <- train(diagnosis ~ ., data = DF, method = "rf")
    
    # This is missing ----------------------
    # To get the inputs for the ensemble model
    # the predictions for DATA_TO_PREDICT are needed
    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
    

相关问题