在 R 中使用交叉验证循环 C5.0 决策树时如何存储单个预测模型?

How to store individual prediction models when looping over a C5.0 decision tree with cross validation in R?

我是 R 的新手,我正在使用 for 循环,以便使用 C5.0 决策树对作业实施 5 折交叉验证。我的数据集如下所示:

head(data_known)
order_item_id order_date item_id item_size brand_id item_price user_id
1             1    2012-09    1507   UNSIZED      102       24.9   4694
2             2    2012-11    1745        10       64       75.0   6097
3             3    2013-01    2588       XXL       42       79.9   7223
4             4    2012-08     164        40       47       79.9   4124
5             5    2012-09    1640         L       97       69.9    881
6             6    2013-03    2378        38       72      129.9   1576
user_title user_dob             user_state user_reg_date
1        Mrs  1964-11   Rhineland-Palatinate       2011-02
2        Mrs  1973-08            Brandenburg       2011-05
3        Mrs  1949-08               Saarland       2013-01
4        Mrs  1960-12              Thuringia       2012-08
5        Mrs  1971-06     Baden-Wuerttemberg       2012-01
6        Mrs  1965-10 North Rhine-Westphalia       2011-02   
delivery_time_days user_title_NA item_size_NA user_dob_NA    target
1                  2             0            0           0    Return
2                  4             0            0           0 No Return
3                  2             0            0           0    Return
4                  5             0            0           0    Return
5                  3             0            0           0    Return
6                 11             0            0           0    Return

现在,我的循环是:

explanatory_variables.dt<-names(data_known)[-16]
form.dt<-as.formula(paste("target ~", paste(explanatory_variables.dt,    
collapse = "+")))  
folds.dt<-split(data_known,cut(sample(1:nrow(data_known)),5))
errs.c50.dt<-rep(NA,length(folds.dt))

for (i in 1:length(folds.dt)) {
test.dt<-ldply(folds.dt[i],data.frame)
train.dt<-ldply(folds.dt[-i],data.frame)
tmp.model.dt<-C5.0(form.dt,train.dt)                      
tmp.predict.dt<-predict(tmp.model.dt, newdata=test.dt)      
conf.mat.dt<-table(test.dt$target,tmp.predict.dt)
errs.c50.dt[i]<-1-sum(diag(conf.mat.dt))/sum(conf.mat.dt)        
  }
print(sprintf("average error using k-fold cross validation and C5.0       
decision tree algorithm: %.3f percent", 100*mean(errs.c50.dt)))

我如何 access/safe 循环中的整个树模型以预测另一个数据集中目标变量的结果,而其真实实现仍然未知?或者在使用交叉验证时我是否必须单独根据 tmp.model.dt 进行预测?

提前感谢您的帮助。

最佳,

妮可

这是一个简单的可重现的答案,它扩展了 Roman 的评论。

list_models <- list()
for (i in 1:2){
   tmp_data <- mtcars[,c(1, i+1)]
   list_models[[i]] <- lm(mpg ~ ., data = tmp_data)
}
head(predict(list_models[[1]], newdata = mtcars))
head(predict(list_models[[2]], newdata = mtcars))

我在这里使用的是 lm,但这与 C5.0 一样适用,因为 predict 函数适用于任一模型对象。