我做了一个交叉验证功能,可以为几个模型做到这一点。
我有一个我想要计算的模型的函数,在交叉验证中我调用它,所以我得到一个名为results
的数据框,带有类或标签,针对每次迭代的每个预测:
head(results)
iteration class ksvm rf
65 1 4 4 4
306 1 2 2 2
300 1 4 4 4
385 1 2 2 2
431 1 2 2 2
205 1 4 4 4
(索引可以忽略,因为它来自被采样的数据)。
由于我有5倍交叉验证,我有5次迭代预测在这种情况下ksvm
和rf
。 (这些存储在名为algorithms
的变量中。
在此之后我以这种方式计算准确度:
results %>%
group_by(iteration) %>%
summarise(acc_ksvm = sum(ksvm == class) / n() , acc_rf = sum(rf == class) / n() )
输出:
iteration acc_ksvm acc_rf
(int) (dbl) (dbl)
1 1 0.9603175 0.9603175
2 2 0.9760000 0.9680000
3 3 0.9603175 0.9523810
4 4 0.9840000 0.9920000
5 5 0.9444444 0.9523810
问题:
有没有办法优化它?我最终会增加模型,我只想在函数中传递algorithms
变量,并计算所有模型的准确度,而无需为每个模型手动编写summarise(acc_ksvm = sum(ksvm == class) / n() , acc_rf = sum(rf == class) / n() )
。
这可以通过申请来完成吗?或者我是否必须更改df
的构建方式,以便按模型分组?
谢谢!
答案 0 :(得分:1)
由于sum(ksvm == class) / n()
实际上是算法列的TRUE
与类的组平均值,因此请考虑首先创建逻辑值列(TRUE/FALSE
匹配),然后在所有其他列中使用dplyr的summarise_each
:
algorithms <- c("alg1", "alg2", "alg3", "alg4", "alg5")
results[algorithms] <- sapply(algorithms, function(i){
results[i] == results$class
})
summarydf <-
results[c("iteration", algorithms)] %>%
group_by(iteration) %>%
summarise_each(funs(mean)) %>%
setNames(c("iteration", paste0("acc_", algorithms)))