我是R的新手并且一直在尝试使用以下代码(感谢stackoverflow)来交叉验证MARS回归。我执行代码时遇到错误。
除上述问题外,还有办法打印交叉验证的所有结果吗?
如果有人能提供帮助,我将不胜感激。
library(earth)
library(pls)
set.seed(1)
k <- 10;
result <- 0;
folds <- cvsegments(nrow(trees), k);
for (fold in 1 : k){
currentFold <- folds[fold][[1]];
fit = earth(Volume ~ ., data=trees[-currentFold,])
pred = predict(fit, trees[currentFold,]);
result <- result + table(true=trees[currentFold,3], pred=pred)
}
答案 0 :(得分:0)
收集折叠每次迭代结果的方法是使用列表:
library(earth)
library(pls)
set.seed(1)
k <- 10;
resulti <- 0
result <- vector("list", k);
folds <- cvsegments(nrow(trees), k);
for (fold in 1 : k){
currentFold <- folds[fold][[1]];
fit = earth(Volume ~ ., data=trees[-currentFold,])
pred = predict(fit, trees[currentFold,]);
result[[fold]] <- resulti + table(true=trees[currentFold,3], pred=pred)
}
这可以纠正错误,但我不确定这是否会产生你想要的东西。
修改以获取所请求的表格,我们可以在melt
中使用reshape2
:
对于第一个result
:
require(reshape2)
df.1 <- melt(result[[1]])
df.1[df.1$value == 1, ]
答案 1 :(得分:0)
由于k-fold交叉验证在每次运行中每个案例(行)只能得到一个预测,因此您可以轻松地在向量中收集预测(或矩阵,以获得更多迭代/重复和/或每个案例的多个预测值):
library(earth)
library(pls)
set.seed(1)
k <- 10;
folds <- cvsegments(nrow(trees), k);
result <- rep (NA, nrow (trees))
for (fold in 1 : k){
currentFold <- folds[[fold]]
fit = earth(Volume ~ ., data=trees[-currentFold,])
result [currentFold] <- predict(fit, trees[currentFold,]);
}
然后,您可以随意查看结果:
> plot (trees$Volume, result)
> head (cbind (trees, pred.Vol = result))
Girth Height Volume pred.Vol
1 8.3 70 10.3 9.701729
2 8.6 65 10.3 10.627089
3 8.8 63 10.2 10.737521
4 10.5 72 16.4 16.313330
5 10.7 81 18.8 21.297516
6 10.8 83 19.7 22.408600