2016-10-01 41 views
0

我做了一個交叉驗證函數,它爲幾個模型。如何優化R中多個預測模型的準確性代碼?

我有我想要計算模型的功能,並在交叉驗證我打電話,所以我會得到一個名爲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和​​。 (這些被存儲在一個名爲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變量在一個函數中,並計算所有模型的準確性,而不需要manuall y爲每個型號書寫summarise(acc_ksvm = sum(ksvm == class)/n() , acc_rf = sum(rf == class)/n())

這可以通過應用來完成嗎?或者我是否必須改變我的df的構建方式,以便按模型分組?

謝謝!

+0

什麼你在尋找優化嗎?速度?這似乎是迄今爲止相當優雅的解決方案。如果你所要做的只是將模型添加到'算法'向量中,我認爲你上面的'dplyr'代碼做得很好,假設你的數據不是*巨大的*,並且你沒有測試許多參數許多型號。 – blacksite

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

這真的很有趣,我很感激! –