2016-09-16 5 views
4

Ich möchte die Modellleistung für eine Reihe von Modellen vergleichen, die die gleichen Prädiktoren, aber unterschiedliche Modellparameter verwenden. Dies scheint der Ort zu sein, an dem man broom verwenden kann, um eine saubere Ausgabe zu erstellen, aber ich kann es nicht herausfinden. Hier einige nicht-funktionierenden Code, der vorschlagen hilft, was ich denke:ordentliche Methode zum Testen von Modellparametern

seq(1:10) %>% 
do(fit = knn(train_Market, test_Market, train_Direction, k=.), score = mean(fit==test_Direction)) %>% 
tidy() 

Weitere Zusammenhang dieser Teil eines der ISLR Labors ist, die wir tidyverse-ify versuchen. Sie können das gesamte Labor sehen hier: https://github.com/AmeliaMN/tidy-islr/blob/master/lab3/lab3.Rmd

[Update: reproduzierbares Beispiel] Es ist schwer, ein minimales Beispiel hier, weil der Bedarf an Daten vor Modellanpassung Gerangel zu machen, aber dies sollte reproduzierbar sein:

library(ISLR) 
library(dplyr) 

train = Smarket %>% 
    filter(Year < 2005) 
test = Smarket %>% 
    filter(Year >= 2005) 

train_Market = train %>% 
    select(Lag1, Lag2) 
test_Market = test %>% 
    select(Lag1, Lag2) 

train_Direction = train %>% 
    select(Direction) %>% 
    .$Direction 

set.seed(1) 
knn_pred = knn(train_Market, test_Market, train_Direction, k=1) 
mean(knn_pred==test_Direction) 

knn_pred = knn(train_Market, test_Market, train_Direction, k=3) 
mean(knn_pred==test_Direction) 

knn_pred = knn(train_Market, test_Market, train_Direction, k=4) 
mean(knn_pred==test_Direction) 

usw.

+0

Vielen Dank für mich zu halten ehrlich, Alex. – AmeliaMN

+0

Versuchen Sie, bei dplyr/'do' zu bleiben? Dies scheint eine gute Wahl für List-Loops a la 'lapply' oder purrr zu sein. – aosmith

+0

Sorry Amelia. Es ist nur so, dass ich den Link durchging und meine Aufmerksamkeit verlor. –

Antwort

3

Da Ihr Ausgang jedes knn (und oracle) ein Vektor ist, ist dies ein guter Fall für tidyr der unnest (in Kombination mit purrr der map und rep_along:

wenn es

predictions %>% 
    group_by(k) %>% 
    summarize(accuracy = mean(prediction == oracle)) 

Wieder Sie Besen nicht brauchen, da jeder Ausgang ist ein Faktor, aber:

Die predictions Variable organisiert wird dann als:

# A tibble: 1,260 x 3 
     k prediction oracle 
    <int>  <fctr> <fctr> 
1  1   Up  Up 
2  1  Down  Up 
3  1   Up Down 
4  1   Up  Up 
5  1   Up  Up 
6  1  Down  Up 
7  1  Down Down 
8  1  Down  Up 
9  1  Down  Up 
10  1   Up  Up 
# ... with 1,250 more rows 

, die leicht zusammenfassen lassen Wäre ein Model, könntest Du tidy oder augment von Broom benutzen und es dann auf eine ähnliche Art und Weise veredeln.


Ein wichtiger Aspekt dieses Ansatzes ist, dass es zu viele Kombinationen von Parametern flexibel ist, indem man sie mit tidyr der crossing (oder expand.grid) kombiniert und mit invoke_rows die Funktion jeder Zeile anzuwenden. Zum Beispiel könnten Sie Variationen von l neben k versuchen:

crossing(k = 2:5, l = 0:1) %>% 
    invoke_rows(knn, ., train = train_Market, test = test_Market, cl = train_Direction) %>% 
    unnest(prediction = .out) %>% 
    mutate(oracle = rep_along(prediction, test_Direction)) %>% 
    group_by(k, l) %>% 
    summarize(accuracy = mean(prediction == oracle)) 

Das gibt:

Source: local data frame [8 x 3] 
Groups: k [?] 

     k  l accuracy 
    <int> <int>  <dbl> 
1  2  0 0.5396825 
2  2  1 0.5277778 
3  3  0 0.5317460 
4  3  1 0.5317460 
5  4  0 0.5277778 
6  4  1 0.5357143 
7  5  0 0.4841270 
8  5  1 0.4841270 
Verwandte Themen