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):
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?
Respuestas:
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:R→R
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).
fuente
g
or
) y 2 características (index
(temporal) yanimal
). 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.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,
fuente
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.
fuente
Algunas sugerencias:
nearest maximum
. No sé, podría funcionar, o tal vez no, solo puedes saber si lo pruebas :)fuente
fuente
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.
fuente
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.
fuente