R caret y NAs

26

Prefiero preocuparme por su capacidad de ajuste de parámetros y su interfaz uniforme, pero he observado que siempre requiere conjuntos de datos completos (es decir, sin NA), incluso si el modelo "desnudo" aplicado permite NA. Eso es muy molesto, ya que uno debe aplicar métodos de imputación laboriosos, que no son necesarios en primer lugar. ¿Cómo se puede evadir la imputación y seguir utilizando las ventajas de los cuidados?

Fredrik
fuente
3
Siempre tienes que hacer algo con valores perdidos. Debo decir que realmente no entiendo tu pregunta: ¿estás buscando un enfoque único para todos ...? Si no quiere imponer NA, entonces ¿qué quiere hacer con ellos? ¿Borrar?
Tim
1
Quiero dejar NAs y dejar que el modelo se encargue de NAs. Si lo hago con una función C5.0 en C50, por ejemplo, podría hacer frente a los NA en sí, pero en este caso no puedo usar caret, porque la función de tren de caret no permite NA en los conjuntos de datos incluso cuando quiero usar el C5. Función 0 de C50 mencionada anteriormente.
Fredrik
3
Pero lo que hace el "modelo" es que ignora (elimina) estos datos y le deja con una muestra más pequeña; estima (imput) esos valores; o predice la categoría "NA" (por ejemplo, en algunos modelos basados ​​en árboles). ¿Qué más te gustaría que hiciera tu "modelo"? Algún software hace esas cosas por usted automáticamente, pero imagine que su cafetera le dio el café "predeterminado" ... Algunos softwares hacen el "café predeterminado" de NA, pero no es lo mejor que puede obtener.
Tim
3
¿Estás seguro de que caret no permite NA? Intenté introducir NA con el ejemplo predeterminado en la página de ayuda del tren y con el método C5.0 train funcionó bien. Falló con el bosque al azar.
mpiktas

Respuestas:

32

Para la función train en caret, puede pasar el parámetro na.action = na.pass y no preprocesar (no especifique preProcess, déjelo como su valor predeterminado NULL). Esto pasará los valores de NA sin modificar directamente a la función de predicción (esto hará que las funciones de predicción que no admiten valores faltantes fallen, para aquellos que necesitaría especificar preProcess para imputar los valores faltantes antes de llamar a la función de predicción). Por ejemplo:

train(formula,
      dataset,
      method = "C5.0",
      na.action = na.pass)

En este caso, C5.0 manejará los valores faltantes por sí mismo.

Stan Hatko
fuente
1
Esta es una discusión interesante. ¿Cuál sería el peligro de agregar NA como otro nivel a un predictor categórico? Si las NA no pueden ser modeladas o imputadas, es decir, la presencia de una ausencia es realmente informativa, ¿parecería que simplemente hacer de NA un nivel adicional tiene sentido?
Seanosapien
Si se usa la especificación x, y al traintener la na.action = na.passopción establecida, se producirá el siguiente error:Something is wrong; all the RMSE metric values are missing
user29609
3

¿Has intentado recodificar las NA? Algo> 3 desviaciones estándar fuera de sus datos (por ejemplo, -12345) debería alentar a C5.0 a predecirlas por separado, como sucede con las NA.

psiconomia
fuente
2

Creo que su solución sería imputar los valores mientras usa la función predict () .

Ver ?predict.trainpara más detalles.

Puede usar na.omitpara permitir que caret impute valores. Por ejemplo:

    ## S3 method for class 'train':
    predict((object, newdata = NULL, type = "raw", na.action = na.omit, ...)

de http://www.inside-r.org/packages/cran/caret/docs/predict.train

Otra solución sería imputar mientras se preprocesan los datos:

    ## S3 method for class 'default':
    preProcess(x, 
       method = "knnImpute",   # or *bagImpute* / *medianImpute*
       pcaComp = 10,
       na.remove = TRUE,
       k = 5,
       knnSummary = mean,
       outcome = NULL,
       fudge = .2,
       numUnique = 3,
       verbose = TRUE,
       )

de http://www.inside-r.org/node/86978

Kristijan
fuente