2016-10-01 3 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 и rf. (Они хранятся в переменной с именем 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

Вы правы, может, мне следовало написать * Automate * вместо * Optimize *. –

ответ

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

Это действительно интересно, я ценю это! –

Смежные вопросы