2012-05-08 16 views
5

Sto utilizzando la libreria caret in R per la generazione del modello. Voglio generare un modello earth (aka MARS) e voglio specificare il parametro degree per questa generazione del modello. Secondo lo documentation (pagina 11) il metodo earth supporta questo parametro.caret :: treno: specifica i parametri di generazione del modello

ricevo il seguente messaggio di errore quando si specifica il parametro:

Come posso evitare questo errore quando si specifica il parametro degree?

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.UTF-8  LC_COLLATE=en_GB.UTF-8  
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] earth_3.2-3 plotrix_3.4 plotmo_1.3-1 leaps_2.9  caret_5.15-023 
[6] foreach_1.4.0 cluster_1.14.2 reshape_0.8.4 plyr_1.7.1  lattice_0.20-6 

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 compiler_2.15.0 grid_2.15.0  iterators_1.0.6 
[5] tools_2.15.0 

risposta

7

ho scoperto come farlo, Joran mi ha portato nella giusta direzione:

creare una nuova funzione che genera la griglia di formazione. Questa funzione deve accettare i due parametri len e data. Per recuperare la griglia di allenamento originale, è possibile chiamare il metodo createGrid fornito dal pacchetto caret. È quindi possibile modificare la griglia in base alle proprie esigenze.Ad esempio per il parametro neave nprune invariato e aggiungere degree da 1 a 5 uso il seguente codice:

createMARSGrid <- function(len, data) { 
     g = createGrid("earth", len, data) 
     g = expand.grid(.nprune=g$.nprune, .degree=seq(1,5)) 
     return(g) 
    } 

quindi richiamare in questo modo:

train(formula, data=data, method='earth', tuneGrid = createMARSGrid) 
+0

Grazie a @theomega. Questo è molto utile. Sai qual è la connessione tra 'len' in' createGrid' e 'tuneLength' (argomento di' train')? Inoltre, perché 'createGrid' ha bisogno di ricevere i dati per determinati modelli? ('? createGrid' non dice molto su questo) –

+0

Si prega di fare una nuova domanda e sarò felice di aiutarvi – theomega

+0

Grazie theomega: Ecco la mia domanda: http://stackoverflow.com/questions/14839730/caret- errori-con-creategrid-per-rf-foresta casuale. Mi manca ancora una risposta per chiarire la connessione tra 'tuneLength' e il parametro len in' createGrid', ad es. possono essere usati insieme? qual è la loro relazione? –

9

ho sempre trovato le funzioni in accento circonflesso sia utile e un po 'folli. Ecco cosa sta succedendo.

Si sta tentando di passare un argomento a earth tramite l'argomento ... a train. La documentazione per train contiene questa descrizione per tale argomento:

argomenti passati alla classificazione o di regressione di routine (come foresta casuale). Gli errori si verificheranno se i valori per i parametri di ottimizzazione sono passati a .

Parametro di regolazione, eh? Bene, se scorri verso il basso ed esamini l'elenco ufficiale dei parametri di tuning per ogni tipo di modello, vedrai che per earth, sono degree e nprune.

Così il problema qui è che train è stato progettato per automatizzare alcune griglia di ricerca lungo i parametri di ottimizzazione, e l'argomento ... deve essere utilizzato per il passaggio di ulteriori argomenti al modello funzione di raccordo eccezione per quei parametri di ottimizzazione.

Se si desidera impostare i parametri di regolazione che dovrete usare altri argomenti, in questo modo:

train(Volume~Girth+Height, data=trees, method='earth', 
     tuneGrid = data.frame(.degree = 1,.nprune = 5)) 

Si noti come le colonne sono chiamate con i periodi di punta. Inoltre, è frustrante che poiché il valore predefinito in earth per nprune è NULL, non sono sicuro che sia possibile passare solo i valori predefiniti in questo modo. (In generale, l'impostazione cose a NULL nel frame di dati semplicemente rimuoverli.)

+1

Grazie per la soluzione. Il problema è: come posso mantenere 'nprune' al suo valore predefinito? L'ho cercato nella fonte e ho scoperto che il valore predefinito è calcolato utilizzando la funzione privata (non richiamabile) 'marsSeq', quindi non è un valore fisso. Come hai detto, non puoi lasciarlo fuori. – theomega

+0

Vedere la mia risposta di seguito che fornisce una soluzione alla mia (e alla) domanda. – theomega

Problemi correlati