machine learning course python machine-learning scikit-learn missing-data scikits

python - learning - kaggle course



Faltan valores en scikits machine learning (7)

¿Es posible tener valores faltantes en scikit-learn? ¿Cómo deberían ser representados? No pude encontrar ninguna documentación sobre eso.


Cuando se encuentra con valores perdidos en las características de entrada, la primera orden del día no es cómo imputar la falta. La pregunta más importante es POR QUÉ DEBERÍAS. A menos que tenga una mente clara y definitiva sobre cuál es la ''verdadera'' realidad detrás de los datos, puede reducir el impulso de imputar. No se trata de técnica o paquete en primer lugar.

Históricamente recurrimos a métodos arbóreos como árboles de decisión, principalmente porque algunos de nosotros al menos consideramos que la imputación faltante para estimar la regresión, como la regresión lineal, la regresión logística o incluso NN, es suficientemente distorsionante como para tener métodos que no requieran que falte ''entre los columnas ''. La llamada falta de información. Lo cual debería ser un concepto familiar para quienes estén familiarizados, por ejemplo, con Bayesian.

Si realmente está modelando en big data, además de hablar de ello, existe la posibilidad de que se enfrente a una gran cantidad de columnas. En la práctica común de la extracción de características como el análisis de texto, puede decirse que la falta significa contar = 0. Eso está bien porque sabes la causa raíz. La realidad, especialmente cuando se enfrentan a fuentes de datos estructurados, es que usted no sabe o simplemente no tiene tiempo para conocer la causa raíz. Pero su motor obliga a conectar un valor, ya sea NAN u otros marcadores de posición que el motor pueda tolerar, y puedo argumentar que su modelo es tan bueno como usted imputa, lo cual no tiene sentido.

Una pregunta intrigante es: si dejamos que la desaparición sea juzgada por su contexto cercano dentro del proceso de división, primer sustituto de primer o segundo grado, ¿el bosque realmente hace que el juicio contextual sea discutible porque el contexto en sí es una selección aleatoria? Esto, sin embargo, es un problema "mejor". Al menos no duele mucho. Ciertamente debería hacer innecesaria la pérdida de preservación.

Como cuestión práctica, si tiene una gran cantidad de funciones de entrada, probablemente no pueda tener una ''buena'' estrategia para imputar después de todo. Desde la perspectiva pura de imputación, la mejor práctica es cualquier cosa menos univariado. Lo que está en el concurso de RF significa más o menos usar el RF para imputar antes de modelar con él.

Por lo tanto, a menos que alguien me diga (o a nosotros), "no podemos hacer eso", creo que deberíamos permitir que sigan perdiendo "células", evitando por completo el tema de qué "mejor" imputar.


Encuentro este problema En un caso práctico, encontré un paquete en R llamado missForest que puede manejar bien este problema, imputar el valor que falta y mejorar en gran medida mi predicción.

En lugar de simplemente reemplazar las NA con mediana o media, missForest reemplaza con una predicción de lo que cree que debería ser el valor perdido. Hace las predicciones usando un bosque aleatorio entrenado en los valores observados de una matriz de datos. Se puede ejecutar muy lento en un conjunto de datos grande que contiene una gran cantidad de valores perdidos. Entonces hay una compensación para este método.

Una opción similar en python es predictive_imputer


Me gustaría poder proporcionar un ejemplo simple, pero he descubierto que RandomForestRegressor no maneja los NaN con elegancia. El rendimiento empeora constantemente al agregar funciones con porcentajes crecientes de NaN. Las características que tienen "demasiados" NaN se ignoran por completo, incluso cuando los nan indican información muy útil.

Esto se debe a que el algoritmo nunca creará una división en la decisión "isnan" o "ismissing". El algoritmo ignorará una característica en un nivel particular del árbol si esa característica tiene un único NaN en ese subconjunto de muestras. Pero, en los niveles inferiores del árbol, cuando los tamaños de muestra son más pequeños, es más probable que un subconjunto de muestras no tenga un NaN en los valores de una característica en particular, y se puede producir una división en esa característica.

He intentado varias técnicas de imputación para tratar el problema (reemplazar con media / mediana, predecir valores perdidos usando un modelo diferente, etc.), pero los resultados fueron mixtos.

En cambio, esta es mi solución: reemplace NaN con un valor único, obviamente fuera de rango (como -1.0). Esto permite que el árbol se divida según los criterios "valor desconocido frente a valor conocido". Sin embargo, existe un extraño efecto secundario al usar dichos valores fuera de rango: los valores conocidos cercanos al valor fuera de rango podrían agruparse junto con el valor fuera de rango cuando el algoritmo intenta encontrar un buen lugar dividir. Por ejemplo, los 0 conocidos podrían agruparse con los -1 usados ​​para reemplazar los NaN. De modo que su modelo podría cambiar dependiendo de si su valor fuera de rango es menor que el mínimo o si es mayor que el máximo (podría agruparse con el valor mínimo o máximo, respectivamente). Esto puede ayudar o no a la generalización de la técnica, el resultado dependerá de qué tan similares en el comportamiento sean las muestras de valor mínimo o máximo a las muestras con valores de NaN.


Me he encontrado con un problema muy similar al ejecutar RandomForestRegressor en los datos. La presencia de los valores de NA arrojaba "nan" para las predicciones. Al desplazarse por varias discusiones, la Documentación de Breiman recomienda dos soluciones para datos continuos y categóricos, respectivamente.

  1. Calcule la Mediana de los datos de la columna (Característica) y utilícela (Datos Continuos)
  2. Determine la Categoría que ocurre con más frecuencia y use esto (Datos Categóricos)

Según Breiman, la naturaleza aleatoria del algoritmo y el número de árboles permitirán la corrección sin demasiado efecto sobre la precisión de la predicción. Creo que este sería el caso si la presencia de los valores de NA es escasa, una característica que contiene muchos valores de NA, creo que muy probablemente tendrá un efecto.


Reemplazar un valor perdido con una media / mediana / otra estadística puede no resolver el problema ya que el hecho de que el valor falta puede ser significativo. Por ejemplo, en una encuesta sobre las características físicas, un encuestado puede no poner su altura si se avergonzó de ser anormalmente alto o pequeño. Esto implicaría que los valores faltantes indican que el encuestado era inusualmente alto o pequeño, lo opuesto al valor mediano.

Lo que es necesario es un modelo que tenga una regla separada para valores perdidos, cualquier intento de adivinar el valor perdido probablemente reducirá el poder predictivo del modelo.


Orange es otra biblioteca de aprendizaje automático python que tiene instalaciones dedicadas a la imputación. No he tenido la oportunidad de usarlos, pero podría ser pronto, ya que los métodos simples de reemplazar nan con ceros, promedios o medianas tienen todos problemas importantes.


Los valores faltantes simplemente no son compatibles con scikit-learn. Ha habido discusiones en la lista de correo sobre esto antes, pero no hay intento de escribir código para manejarlos.

Hagas lo que hagas, no uses NaN para codificar valores perdidos, ya que muchos de los algoritmos se niegan a manejar muestras que contienen NaN.

La respuesta anterior está desactualizada; la última versión de scikit-learn tiene una clase Imputer que hace una imputación de valor perdida simple y por función. Puede alimentar las matrices que contienen NaN para reemplazarlas por la media, mediana o modo de la función correspondiente.