2016-11-23 8 views
0

以下は再現可能な例です。基本的には、5つの帰属データセットを作成し、 caretEnsembleを使用したトレーニングモデルを作成しました。最後に、アンサンブルモデルを使用して各テストセットを予測しています。caretはSVMで訓練されたさまざまなデータセットを使用します。

はしかし、私はそれが私のアンサンブル異なるトレーニングモデルを助けることができるの周りにこのエラー

Error in check_bestpreds_obs(modelLibrary) :
Observed values for each component model are not the same. Please re-train the models with the same Y variable

がとにかくあり得ますか?

本当にありがとうございます。

library(mice) 
    library(e1071) 
    library(caret) 
    library("caretEnsemble") 

data <- iris 
#Generate 10% missing values at Random 
iris.mis <- prodNA(iris, noNA = 0.1) 
#remove categorical variables 
iris.mis <- subset(iris.mis, select = -c(Species)) 

# 5 Imputation using mice pmm 

imp <- mice(iris.mis, m=5, maxit = 10, method = 'pmm', seed = 500) 

# save 5 imputed dataset. 
x1 <- complete(imp, action = 1, include = FALSE) 
x2 <- complete(imp, action = 2, include = FALSE) 
x3 <- complete(imp, action = 3, include = FALSE) 
x4 <- complete(imp, action = 4, include = FALSE) 
x5 <- complete(imp, action = 5, include = FALSE) 

## Apply the following method for each imputed set 

form <- iris$Sepal.Width # target column 
n <- nrow(x1) # since all data sample are the same length 
prop <- n%/%fold 
set.seed(7) 
newseq <- rank(runif(n)) 
k <- as.factor((newseq - 1)%/%prop + 1) 
CVfolds <- 10 


CVrepeats <- 3 
    indexPreds <- createMultiFolds(x1[k != i,]$Sepal.Width, CVfolds, CVrepeats) 
    ctrl <- trainControl(method = "repeatedcv", repeats = CVrepeats,number = CVfolds, returnResamp = "all", savePredictions = "all", index = indexPreds) 




fit1 <- train(Sepal.Width ~., data = x1[k !=i, ],method='svmLinear2',trControl = ctrl) 
fit2 <- train(Sepal.Width ~., data = x2[k != i, ],method='svmLinear2',trControl = ctrl) 
fit3 <- train(Sepal.Width ~., data = x3[k != i, ],method='svmLinear2',trControl = ctrl) 
fit4 <- train(Sepal.Width ~., data = x4[k != i, ],method='svmLinear2',trControl = ctrl) 
fit5 <- train(Sepal.Width ~., data = x5[k != i, ],method='svmLinear2',trControl = ctrl) 




#combine the created model to a list 
     svm.fit <- list(svmLinear1 = fit1, svmLinear2 = fit2, svmLinear3 = fit3, svmLinear4 = fit4, svmLinear5 = fit5) 

    # convert the list to cartlist 
    class(svm.fit) <- "caretList" 

    #create the ensemble where the error occur. 
    svm.all <- caretEnsemble(svm.fit,method='svmLinear2') 
+0

私はここでアイリスを指定するのを忘れたと思う 'form < - Sepal.Width'。 –

+0

ありがとうございましたが、同じエラーが表示されます。 – user3895291

答えて

0

例を単純化する必要があります。移動する部品が多すぎるため、エラーを取得するためにループは必要ありません。内部のcaretEnsembleコントロールの1つがこのエラーをスローしていますが、メッセージは明確に定義されていません。

つまり、 キャレットリストには、列車モデルごとに指定したtrainControlオブジェクトが必要です。そうしないとリサンプリングは、機種ごとに異なることになり、エラーが発生します:

"Component models do not have the same re-sampling strategies"

次の問題は、各列車のオブジェクトと異なるデータセットを使用していることです。 CaretEnsembleは、同じトレーニングデータセットで使用するためのものです。あなたのx1からx5は、同じ基礎を持っていてもすべて異なっています。これはエラーにつながる:

"Observed values for each component model are not the same. Please re-train the models with the same Y variable"

最後に、あなただけのc(model1, model2)を使用し、別々に訓練されたモデルからmodel.listを構築したい場合。ドキュメントを参照してくださいc.train

+0

ご返信いただきありがとうございます。本当にありがとうと思いますし、提案通りにコードを簡素化しました。別に訓練されたモデルからmodel.listを作成する例を私に教えてください。それは、異なるトレーニングデータセットに関連付けられたモデルでcaretEnsembleを構築できないということです。 – user3895291

関連する問題