按组计算准确率。

3

我有一个数据框,长这样:

df<- data.frame("iteration" = c(1,1,1,1,1,1), 
    "model" = c("RF","RF","RF","SVM", "SVM","SVM"),
    "label" = c(0,0,1,0,0,1), "prediction" = c(0,1,1,0,1,1))

  iteration model label prediction
1         1    RF     0          0
2         1    RF     0          1
3         1    RF     1          1
4         1   SVM     0          0
5         1   SVM     0          1
6         1   SVM     1          1

实际上,它有10次迭代,每个模型都有更多的数据。我想要做的基本上是获取每个模型的准确性。

因此,我想对每个模型组(RF,SVM)应用这个方法:

table(df$label,df$prediction)

    0 1
  0 2 2
  1 0 2

将对角线上的数字相加,然后除以总数:
sum(diag(table(df$label,df$prediction)))/sum(table(df$label,df$prediction))
[1] 0.6666667

这是一个可以使用 tapply 还是 dplyr 更加方便的情况吗?
我感到有些迷茫。
3个回答

5

尝试:

library(dplyr)

df %>% 
  group_by(iteration, model) %>% 
  summarise(accuracy = sum(label == prediction) / n())

这会得到:

#Source: local data frame [2 x 3]
#Groups: iteration [?]
#
#  iteration  model  accuracy
#      (dbl) (fctr)     (dbl)
#1         1     RF 0.6666667
#2         1    SVM 0.6666667

这个想法是将label == prediction返回TRUE的次数相加,然后除以分区的大小n()


这太棒了@Steven Beaupré,你能解释一下准确性的部分吗?我不明白为什么这个可以工作sum(label == prediction) / n() - Saul Garcia
@SaulGarcia 很高兴能帮到你。请查看更新以获取更多关于此工作原理的详细信息。如果这回答了你的问题,请随意将其标记为已回答。 - Steven Beaupré
1
当然!哈哈,你真快,但仍需要我等一分钟。 - Saul Garcia

1
  df2<-df %>% mutate(acc=ifelse(label==prediction,1,0)) %>%
 group_by(iteration,model) %>%
 summarise(accuracy=sum(acc)/n())

df2

 iteration  model  accuracy
  (dbl) (fctr)     (dbl)
 1         1     RF 0.6666667
 2         1    SVM 0.6666667

请看我3分钟前发布的答案。 - Steven Beaupré

1
使用 data.table
library(data.table)
setDT(df)[, .(accuracy= mean(label==prediction)) , .(iteration, model)]
#   iteration model  accuracy
#1:         1    RF 0.6666667
#2:         1   SVM 0.6666667

或者用基本R也可以完成这个操作

aggregate(cbind(accuracy = label == prediction)~iteration + model, df, mean)
#  iteration model  accuracy
#1         1    RF 0.6666667
#2         1   SVM 0.6666667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接