2015-10-29 59 views
-5

我有一個文件,其中包含關於二元分類問題的兩個模型(A和B)的預測。現在我想了解他們對他們最有信心的觀察結果有多好。爲此,我想根據他們的自信程度將他們的預測分成10組。這些組中的每一個應該具有相同數量的觀察值。但是,當我這樣做時,模型的準確性會發生顯着變化!怎麼可能?R中的分組變化大致意味着

我也有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 

編輯以稍微澄清。

+1

也許比較'平均(1:10)'和'平均(C(均值(1:2),平均(3:10)))'會有幫助嗎? – joran

+0

有人可以解釋爲什麼這個問題已被低估並投票結束?我一直在尋找http://meta.stackexchange.com/questions/10582/what-is-a-closed-or-on-hold-question,但看不到一個合適的理由。它太不清楚了嗎? – pir

回答

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) 
+0

啊,謝謝!切割函數顯然被數值所分割,而不是分割觀察值。你知道如何根據信心平均分成n組嗎? – pir

+0

@felbo'cut'不做任何劃分,它只是簡單地將觀察結果分成10組。問題是,你可能沒有將觀察分爲10組。 – joran

+0

@joran我本可以更清楚地表達自己。我的意思是,削減顯然是將「價值譜」分成10個不同的組別,然後根據這些組織觀察結果,而我想根據它們的價值將觀察組織成10個大小不等的組。 'N = 15000',所以平均分割觀測不應該是一個問題;) – pir