2016-10-01 10 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なしですべてのモデルの精度を計算したい各モデルにはsummarise(acc_ksvm = sum(ksvm == class)/n() , acc_rf = sum(rf == class)/n())と書いてください。

これは適用することができますか?または、モデル別にグループ化するために私のdfの方法を変更する必要がありますか?

ありがとうございました!その後、

+0

何最適化を目指していますか?速度?これはこれまでのところかなり優雅な解決策であるようです。あなたが探しているのは 'アルゴリズム 'ベクトルにモデルを追加することだけだとすれば、あなたのデータが巨大ではないと仮定した上で、' dplyr'コードはかなりうまくいくと思います。多くのモデル。 – blacksite

+0

あなたは正しいです、多分私は* Optimize *の代わりに* Automate *を書くべきでした。 –

答えて

1

sum(ksvm == class)/n()が本当にクラスにアルゴリズム列のTRUE試合のグループ平均であるため、第1の論理値列(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

これは本当に面白いです、私はそれを感謝します! –

関連する問題