基本モデルの出力のみをトレーニングする混合モデルを作成する方法を学ぼうとしています。(Johns Hopkins DataScience コースから) オンラインで見つかった提案に従って、私が予測するのと同じラベル付けされたテスト データでモデルをトレーニングできるという些細なケースでは、これをうまく行うことができます。
理論的には、プロセスは比較的単純です。
- ベースモデルの構築
- モデルごとに、テスト データで予測する
- newDF で予測を結合し、testingData からのラベル付けされた結果を追加の列として含めます。
- newDF で結合された、または「メタ」モデルをトレーニングします。このモデルは、次のように「言う」ことを学習する必要があります。
- 検証データに対して手順 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
単純な概念が欠けていると確信しています。それが何であるかはわかりません。