在 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
函数适用于任一模型对象。
我是 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
函数适用于任一模型对象。