我有一个文件,其中包含关于二元分类问题的两个模型(A和B)的预测。现在,我想了解他们有多好预测他们最有信心的观察结果。要做到这一点,我想根据他们的自信程度将他们的预测分为10组。这些组中的每一组都应具有相同数量的观察结果。但是,当我这样做时,模型的准确性会发生很大变化!怎么可能?
我还使用n_groups=100
进行了测试,但它只是略有不同。 CSV文件为here,代码如下:
# Grouping observations
conf <- read.table(file="conf.csv", sep=',', header=T)
n_groups <- 10
conf$model_a_conf <- pmax(conf$model_a_pred_0, conf$model_a_pred_1)
conf$model_b_conf <- pmax(conf$model_b_pred_0, conf$model_b_pred_1)
conf$conf_group_model_a <- cut(conf$model_a_conf, n_groups, labels=FALSE, ordered_result=TRUE)
conf$conf_group_model_b <- cut(conf$model_b_conf, n_groups, labels=FALSE, ordered_result=TRUE)
# Test of original mean.
mean(conf$model_a_acc) # 0.78
mean(conf$model_b_acc) # 0.777
# Test for mean in aggregated data. They should be similar.
(acc_model_a <- mean(tapply(conf$model_a_acc, conf$conf_group_model_a, FUN=mean))) # 0.8491
(acc_model_b <- mean(tapply(conf$model_b_acc, conf$conf_group_model_b, FUN=mean))) # 0.7526
编辑稍微澄清。
答案 0 :(得分:2)
table(conf$conf_group_model_a)
1 2 3 4 5 6 7 8 9 10
2515 2628 2471 2128 1792 1321 980 627 398 140
您使用的群组是不平衡的。因此,当您使用tapply
这些组中的每个组的平均值时,这很好,但是之后只需要mean
就行了。
如果你想进行自己的处理,你需要按照它们的大小来加权。
这样的事情既快又脏:mean(tapply(conf$model_a_acc, conf$conf_group_model_a, FUN=mean) * (table(conf$conf_group_model_a)/nrow(conf)) * 1000)