El bosque aleatorio está sobreajustado


15

Estoy tratando de usar Regresión forestal aleatoria en scikits-learn. El problema es que recibo un error de prueba muy alto:

train MSE, 4.64, test MSE: 252.25.

Así es como se ven mis datos: (azul: datos reales, verde: predicho):

Regresión forestal limpiada

Estoy usando 90% para entrenamiento y 10% para prueba. Este es el código que estoy usando después de probar varias combinaciones de parámetros:

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

¿Cuáles son las posibles estrategias para mejorar mi ajuste? ¿Hay algo más que pueda hacer para extraer el modelo subyacente? Me parece increíble que después de tantas repeticiones del mismo patrón, el modelo se comporte tan mal con los nuevos datos. ¿Tengo alguna esperanza de intentar ajustar estos datos?


¿Estás entrenando esta función periódica con el eje x como entrada y el eje y como etiqueta para x <= 245, y luego pruebas para x> 245? ¿O estoy malinterpretando tu trama?
rrenaud

tipo de, en realidad, el eje x es el índice de observación, en total hay 300 observaciones, por lo que a partir de 245 en adelante, es decir, los datos de prueba no se utilizan para entrenar el modelo, el vector de características de entrada consta de enteros, tiene forma (300,2) y se parece mucho a una función lineal del índice de observación, por lo que no agregué información al respecto para no complicar demasiado la pregunta.
elyase

1
Es posible que desee eliminar primero el ciclo (parte estacional) de sus datos (y la tendencia).
R. Prost

¿Has mirado en el análisis de series de tiempo? No me queda claro qué hay en tu eje x, pero me parece periódico. Marque aquí y avíseme si esto ayuda: otexts.org/fpp/7/5
Bram Van Camp

Respuestas:


21

Creo que estás usando una herramienta incorrecta; Si toda su X es equivalente al índice, básicamente tiene alguna función muestreada e intenta extrapolarla. El aprendizaje automático tiene que ver con la interpolación de la historia, por lo que no es sorprendente que obtenga una falla espectacular en este caso.f:RR

Lo que necesita es un análisis de series de tiempo (es decir, extracción de tendencias, análisis de espectro y autoregresión o HMMing el resto) o física (es decir, pensar si hay una EDO que pueda producir dicha salida e intentar ajustar sus parámetros a través de cantidades conservadas).


¿No es el aprendizaje automático sobre la extracción de modelos generalizables de los datos? Una vez que se tiene un cierto conjunto de los cuales se interpolan bien los datos, podemos elegir los que tengan mejores propiedades de extrapolación / generalización utilizando, por ejemplo, la validación cruzada. ¿Hay algo mal en mi entendimiento?
elyase

La extrapolación es diferente de la generalización: imagine que es sujeto de un siguiente experimento: ve una pantalla y tiene un botón rojo y verde. Primero, la pantalla muestra un video de la habitación en la que se encuentra donde otra persona presionó el botón verde para el gato, el león y el tigre que se muestra en una pantalla y luego el rojo para el lobo y el perro y de esta manera recolectó 5 deliciosas galletas.

1
Ahora, la pantalla muestra un lince; realiza una interpolación adecuada y generalizable del historial, presiona el botón verde y recibe una descarga eléctrica en lugar de una cookie. ¿Por qué ha sucedido esto? Porque la solución es un ciclo (gggrrr) y las imágenes de animales son solo un engaño. Ha hecho lo mismo con su bosque: lo atrajo a una reproducción tonta de su conjunto de entrenamiento mientras ocultaba la información real.

Buen ejemplo, pero no lo veo como tú. En su ejemplo, tenemos los siguientes datos: un objetivo ( go r) y 2 características ( index(temporal) y animal). A partir de estos datos, podría ajustar varios modelos que pueden dar más o menos peso a la función 1 o 2 (o igual a ambos). La validación cruzada (suponiendo que haya suficientes datos) debería llegar a un modelo con la característica 2 (animal) que tiene menos importancia. Puedo ver que mi modelo está sobreajustando los datos, pero sigo pensando que debería poder extraer un modelo que siga este patrón (porque el comportamiento no ha cambiado) con un espacio de modelo lo suficientemente grande.
elyase

1
No; incluso si solicita más datos, el experimentalista puede extender el engaño animal y ofuscar aún más el patrón para que no sea obvio. Es decir, la extrapolación simplemente no se puede hacer con el aprendizaje porque, por definición, requiere información que no está presente en la capacitación; de esta manera, debe aplicar algunas suposiciones o recopilar datos adicionales para que el problema se convierta en interpolación.

9

El mayor problema es que los árboles de regresión (y los algoritmos basados ​​en ellos como bosques aleatorios) predicen funciones constantes por partes, dando un valor constante para las entradas que caen debajo de cada hoja. Esto significa que cuando extrapolan fuera de su dominio de entrenamiento, solo predicen el mismo valor que lo harían para el punto más cercano en el que tenían datos de entrenamiento. @mbq tiene razón en que existen herramientas especializadas para aprender series temporales que probablemente serían mejores que las técnicas generales de aprendizaje automático. Sin embargo, los bosques aleatorios son particularmente malos para este ejemplo, y hay otras técnicas generales de LD que probablemente funcionarían mucho mejor de lo que está viendo. Las SVM con núcleos no lineales son una opción que viene a la mente. Como su función tiene una estructura periódica, esto también sugiere trabajar el dominio de frecuencia,


AFAIK SVM tiene el mismo problema de bosque aleatorio. No predicen bien fuera del espacio donde han sido entrenados. Probablemente la red neuronal sería una mejor solución
Donbeo

Si los datos se encuentran en una curva y el núcleo es del tipo adecuado para ajustarse a esa curva, entonces un SVM podrá extrapolar a lo largo de esa curva. Si los datos tienen una tendencia lineal, entonces un SVM lineal se ajustará a la línea y se extrapolará a lo largo de esa línea. Un kernel más complejo puede adaptarse y extrapolar comportamientos más complejos. Depende de tener el tipo correcto de núcleo. Eso no hace que los SVM sean la herramienta adecuada para la extrapolación y la predicción de TS, pero los hace mejores que los bosques aleatorios.
Daniel Mahler

3

Este es un ejemplo de libro de texto para el ajuste excesivo de datos, el modelo funciona muy bien en datos entrenados, pero colapsa en cualquier nuevo dato de prueba. Esta es una de las estrategias para abordar esto: hacer una validación cruzada diez veces mayor de los datos de entrenamiento para optimizar los parámetros.

Paso 1. Cree una función de minimización de MSE utilizando la optimización NM. Un ejemplo se puede ver aquí: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

Paso 2. Dentro de esta función de minimización, el objetivo es reducir el MSE. Para hacer esto, cree una división de diez veces de los datos donde se aprende un nuevo modelo en 9 pliegues y se prueba en el décimo pliegue. Este proceso se repite diez veces, para obtener el MSE en cada pliegue. El MSE agregado se devuelve como resultado del objetivo.

Paso 3. El fmin en python hará las iteraciones por ti. Compruebe qué hiperparámetros son necesarios para ajustar (n_estimators, max_features, etc.) y páselos al fmin.

El resultado serán los mejores hiperparámetros que reducirán la posibilidad de un ajuste excesivo.


Sí, parece estar sobreajustando (que la Regresión forestal aleatoria normalmente no, de ahí la pregunta). Ahora he observado que cambiar los parámetros tiene poco efecto con los Regresores de RF. Ahora la validación cruzada requiere un modelo subyacente lo suficientemente flexible como para ser optimizado. ¿Qué tipo de algoritmo / modelos de ML recomienda para este tipo de datos?
elyase

3

Algunas sugerencias:

  1. Ajuste sus parámetros utilizando un enfoque de ventana móvil (su modelo debe estar optimizado para predecir el siguientes valores en la serie de tiempo, no para predecir valores entre los suministrados)
  2. Pruebe otros modelos (incluso los más simples, con la selección correcta de características y las estrategias de ingeniería de características, podrían ser más adecuados para su problema)
  3. Trate de aprender transformaciones óptimas de la variable objetivo (sintonice esto también, hay una tendencia lineal / exponencial negativa, es posible que pueda estimarla)
  4. Análisis espectral quizás
  5. Los máximos / mínimos están igualmente espaciados, parece. Aprenda dónde se les dan sus características (sin entrada del operador, haga que un algoritmo lo descubra para eliminar el sesgo) y agregue esto como una característica. También diseñe una característica nearest maximum. No sé, podría funcionar, o tal vez no, solo puedes saber si lo pruebas :)

Pero, como dijo Daniel en su respuesta, el bosque aleatorio no funcionará para este tipo de problemas por diseño, ya que no puede predecir valores fuera del rango observado en la muestra del tren. Los parámetros de ajuste, etc., no llevarían a ninguna parte.
Tim

1
Sugerencia # 2 @Tim. Y Random Forests no funcionará ingenuamente en estos datos, pero la extracción inteligente de características podría hacer que funcione.
Firebug


0

Después de leer la publicación anterior, quiero dar otra respuesta diferente.

Para los modelos basados ​​en árboles, como el bosque aleatorio, no pueden extrapolar el valor más allá del conjunto de entrenamiento. Entonces, no creo que sea un problema excesivo, sino una estrategia de modelado incorrecta.

Entonces, ¿qué podemos hacer para la predicción de series de tiempo con el modelo de árbol?

La forma posible es combinarlo con regresión lineal: primero, detrend la serie de tiempo (o tendencia de modelado con regresión lineal), luego modelando el residuo con árboles (los residuos están delimitados, para que los modelos de árboles puedan manejarlo).

Además, hay un modelo de árbol combinado con regresión lineal que se puede extrapolar, llamado cubista, hace una regresión lineal en la hoja.


0

Si simplemente desea predecir dentro de los límites del gráfico, simplemente aleatorizar las observaciones antes de dividir el conjunto de datos debería resolver el problema. Luego se convierte en un problema de interpolación de la extrapolación como se muestra.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.