我正在尝试学习如何创建一个混合模型,该模型专门训练基本模型的输出。按照网上的建议(来自约翰霍普金斯大学数据科学课程),我可以在能够在相同的标记测试数据上训练我的模型的小例子中成功地做到这一点,然后我预测。
理论上,这个过程相对简单。
- 建立基础模型
- 对于每个模型,预测测试数据
- 结合 newDF 中的预测,将 testingData 中的标记结果作为附加列包含在内。
- 在 newDF 上训练组合或“元”模型。这个模型应该学会“说”这样的话:“当 mod1 预测 0,mod2 预测 1 等等,最可能的真实结果是 0”
- 对验证数据重复步骤 2 和 3
- 使用组合模型对验证数据进行最终预测。
下面显示了一个有效的过程:
library(caret)
library(gbm)
set.seed(3433)
library(AppliedPredictiveModeling)
data(AlzheimerDisease)
adData = data.frame(diagnosis,predictors)
inTrain = createDataPartition(adData$diagnosis, p = 3/4)[[1]]
training = adData[ inTrain,]
testing = adData[-inTrain,]
set.seed(62433)
modRF <- train(diagnosis ~., method = "rf", data = training)
modGBM <- train(diagnosis ~., method = "gbm", data = training)
modLDA <- train(diagnosis ~., method = "lda", data = training, preProcess=c("center","scale"))
# STACK THE PREDICTIONS
# make predictions
predRF <- predict(modRF,testing)
predGBM <- predict(modGBM, testing)
predLDA <- predict(modLDA, testing)
# Fit a model that combines all (both of the predictors)
predDF <- data.frame(predRF,predGBM,predLDA,diagnosis=testing$diagnosis)
#train a new model on the predictions
combModFit <- train(diagnosis ~.,method="rf",data=predDF)
predComb <- predict(combModFit,testing)
然而,下面的代码似乎表明组合模型没有产生新的预测,它只是回收它的训练信息。有效的代码(上图)和无效的代码(下图)之间的具体区别在于前者有效地训练和预测相同大小的标记数据帧,而后者在 1 大小的 DF 上训练并预测另一个大小的未标记 DF。
#create a sudo holdout set by modifying the existing test set
library(dplyr)
otherTest <- testing %>% select(-diagnosis) #remove diagnosis so df is unlabled
otherTest <- otherTest[1:70,] # remove rows so that the test set changes size
newPreds <- predict(combModFit, otherTest)
# Warning message: 'newdata' had 70 rows but variables found have 82 rows
# newPreds now has 82 rows, but there were only 70 rows in otherTest to predict on.
identical(predComb,newPreds) #TRUE
我完全确定我错过了一个简单的概念,我只是不确定它是什么。