2016-11-23 3 views
0

Das folgende ist ein reproduzierbares Beispiel, was ich im Grunde versuche, erstellt fünf imputierten Datensatz dann anwenden SVM auf jeden imputierten Datensatz mit der Zugfunktion in Caret, dann ensemble die Ergebnis Trainingsmodell mit CaretEnsemble. Zuletzt werde ich jeden Testsatz mit dem Ensemble-Modell vorhersagen.caretEnsemble mit verschiedenen trainierten Datensätzen mit SVM (Problem)

Allerdings bekomme ich diesen Fehler

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

Gibt es um trotzdem, dass mir Ensemble Modelle unterschiedliche Ausbildung helfen kann?

Jede Hilfe wird wirklich geschätzt.

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

Ich glaube, Sie haben vergessen, Iris hier in 'Form <- Sepal.Width 'anzugeben. –

+0

Vielen Dank für das Erkennen, aber ich bekomme immer noch den gleichen Fehler. – user3895291

Antwort

0

Sie müssen Ihr Beispiel vereinfachen. Zu viele bewegliche Teile und die Schleife wird nicht benötigt, um den Fehler zu bekommen. Eines der internen CaretEntsemble-Steuerelemente verursacht diesen Fehler, aber die Nachricht ist nicht gut definiert.

Das gesagt, caretList muss ein spezifisches trainControl Objekt haben, das Sie mit jedem Zugmodell verwenden. Andernfalls wird das Resampling für jedes Modell unterschiedlich sein, und Sie werden die Fehler:

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

nächstes Problem ist, dass man verschiedene Datensätze mit jedem Zug-Objekt verwenden. CaretEnsemble soll mit dem gleichen Trainingsdatensatz verwendet werden. Ihre x1 bis x5 sind alle unterschiedlich, obwohl sie dieselbe Basis haben. Dies führt zu dem Fehler führen:

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

Last, wenn Sie einen model.list von separat ausgebildeten Modelle bauen wollen nur c(model1, model2) verwenden. siehe Dokumentation c.train

+0

Vielen Dank für Ihre Antwort, ich schätze es sehr und ich habe den Code wie vorgeschlagen vereinfacht. Kannst du mir bitte ein Beispiel für den Aufbau einer model.list aus separat trainierten Modellen geben? Und das heißt, ich kann CaretEnsemble nicht mit Modellen erstellen, die mit verschiedenen Trainingsdatensätzen verknüpft sind. – user3895291

Verwandte Themen