如何优化R中多个预测模型的准确度代码?

时间:2016-10-01 22:27:15

标签: r loops dataframe dplyr apply

我做了一个交叉验证功能,可以为几个模型做到这一点。

我有一个我想要计算的模型的函数,在交叉验证中我调用它,所以我得到一个名为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次迭代预测在这种情况下ksvmrf。 (这些存储在名为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的构建方式,以便按模型分组?

谢谢!

1 个答案:

答案 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)))