使用SVM(问题)使用不同的训练数据集进行插入

时间:2016-11-23 13:51:03

标签: svm r-caret ensemble-learning

以下是一个可重复的示例,基本上我正在尝试做的是创建五个插补数据集,然后使用插入符号中的训练函数将SVM应用于每个插补数据集,然后使用caretEnsemble整合生成的训练模型。最后,我使用整体模型预测每个测试集。

但是,我收到此错误

  

check_bestpreds_obs(modelLibrary)中的错误:
  每个组件模型的观察值都不相同。请使用相同的Y变量重新训练模型

反正有可以帮助我合奏不同的训练模型吗?

真的很感激任何帮助。

    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')

1 个答案:

答案 0 :(得分:0)

你必须简化你的例子。获取错误不需要太多的移动部件和循环。其中一个内部caretEnsemble控件正在抛出此错误,但消息定义不明确。

话虽如此, caretList需要有一个指定的trainControl对象,您可以将其与每个列车模型一起使用。否则,每个型号的重新采样将有所不同,您将收到错误:

  

&#34;组件模型没有相同的重新采样策略&#34;

下一个问题是您对每个列车对象使用不同的数据集。 CaretEnsemble旨在与相同的训练数据集一起使用。你的x1到x5都是不同的,即使它们具有相同的基础。这将导致错误:

  

&#34;每个组件模型的观察值不相同。请   使用相同的Y变量重新训练模型&#34;

最后,如果您想从经过单独培训的模型中构建model.list,请使用c(model1, model2)。请参阅文档c.train