如何在循环中训练几个模型

时间:2017-05-02 11:42:29

标签: r for-loop machine-learning subset r-caret

我想培训几个带caret包的模型(7个响应变量各有一个)循环中。

我的data.frame data有46个预测变量(所有模型都用于训练所有模型)和7个响应。

我尝试了一些Rcode,但失败了:

models.list = list()
Ynames = names(data)[47:ncol(data)]
for(y in Ynames)
{
models.list[[y]] = train(as.name(y)~., subset(data,select=-Ynames[-y]),method="".....)
}

我的变量Ynames包含所有回复。 每个模型必须使用单个响应变量进行训练。 因此,对于迭代1,我们将训练Ynames[1]响应的模型和所有46个预测变量,但是必须从数据集data中排除所有非第一响应变量({{1} })。

2 个答案:

答案 0 :(得分:1)

如果您避开公式类并使用一个矩阵或data.frame作为答案而另一个矩阵或data.frame用于预测变量,则会更容易:

Y <- matrix(runif(700, 0, 100), ncol = 7)
X <- matrix(runif(4600, 0, 100), ncol = 46)
colnames(Y) <- paste("Y", 1:ncol(Y))
colnames(X) <- paste("X", 1:ncol(X))

library(caret)

models.list = as.list(vector(length = ncol(Y)))
for(i in 1:ncol(Y)) {
    models.list[[i]] <- train(x = X, y = Y[,i], method = "lm")
}

答案 1 :(得分:1)

这可能是与您的示例相匹配的替代方案(使用虹膜)。子集化基于以下帖子:removing a list of columns from a data.frame using subset

models.list = list()
Ynames = names(iris)[3:ncol(iris)]

for(y in Ynames)
{
  to.remove <- Ynames[!Ynames==y]
  `%ni%` <- Negate(`%in%`)
  models.list[[y]] = train(as.name(y)~., subset(iris,select = names(iris) %ni% to.remove),method="".....)
}