2012-05-08 12 views
5

Estoy usando la biblioteca caret en R para la generación de modelos. Quiero generar un modelo earth (también conocido como MARS) y quiero especificar el parámetro degree para esta generación de modelos. De acuerdo con el documentation (página 11), el método earth admite este parámetro.caret :: train: especificar modelos-generación-parámetros

me sale el siguiente mensaje de error cuando se especifica el parámetro:

¿Cómo puedo evitar este error cuando se especifica el parámetro 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 

Respuesta

7

descubrí cómo hacerlo, Joran me llevó a la dirección correcta:

Crear una nueva función que genera la red de formación. Esta función debe aceptar los dos parámetros len y data. Para recuperar la grilla de entrenamiento original, puede llamar al createGrid método provisto por el paquete caret. A continuación, puede modificar la cuadrícula según sus necesidades.Por ejemplo, para neave el parámetro nprune sin cambios y añadir degree de 1 a 5 utiliza el código siguiente:

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

luego invoque esta manera:

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

Gracias @theomega. Esto es muy útil. ¿Sabes cuál es la conexión entre 'len' en' createGrid' y 'tuneLength' (argumento en' train')? Además, ¿por qué 'createGrid' necesita recibir los datos de ciertos modelos? ('? createGrid' no dice mucho sobre esto) –

+0

Haga una nueva pregunta y estaré encantado de ayudarle – theomega

+0

Gracias theomega: Aquí está mi pregunta: http://stackoverflow.com/questions/14839730/caret- errors-with-creategrid-for-rf-randomforest. Todavía me falta una respuesta que aclare la conexión entre 'tuneLength' y el parámetro len en' createGrid', p. Ej. pueden ser usados ​​juntos? ¿Cuál es su relación? –

9

siempre he encontrado las funciones de intercalación a la vez útil y algo enloquecedor. Esto es lo que está pasando.

Está intentando pasar un argumento al earth a través del argumento ... al train. La documentación para train contiene esta descripción para ese argumento:

argumentos que se pasan a la clasificación o regresión de rutina (como randomForest). Se producirán errores si los valores para los parámetros de ajuste son pasados ​​aquí.

Parámetro de ajuste, ¿eh? Bueno, si se desplaza hacia abajo y examina la lista oficial de parámetros de ajuste para cada tipo de modelo, verá que para earth, son degree y nprune.

lo tanto, el problema aquí es que train está diseñado para automatizar algunas rejilla buscar a lo largo de los parámetros de ajuste, y el argumento ... se va a utilizar para pasar más argumentos a la función de ajuste modelo excepto para aquellos parámetros de ajuste.

Si desea establecer los parámetros de ajuste que tendrá que utilizar otros argumentos, así:

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

Nota cómo las columnas se nombran con períodos principales. Además, es frustrante que dado que el valor predeterminado en earth para nprune es NULL, no estoy seguro de que pueda pasar solo los valores predeterminados de esta manera. (Por lo general, el establecimiento de las cosas a NULL en tramas de datos simplemente eliminarlos.)

+1

Gracias por la solución. El problema es: ¿cómo puedo mantener el 'nprune' a su valor predeterminado? Lo busqué en la fuente y descubrí que el valor predeterminado se ubica en la función privada (no ejecutable) 'marsSeq', por lo que no es un valor fijo. Como dijiste, no puedes dejarlo fuera. – theomega

+0

Consulte mi respuesta a continuación que proporciona una solución a mi (y su) pregunta. – theomega