¿Cómo predecir las series de tiempo en scikit-learn?

Scikit-learn utiliza un enfoque muy conveniente basado en los métodos de fit y predict . Tengo datos de series de tiempo en el formato adecuado para fit y predict .

Por ejemplo tengo las siguientes Xs :

 [[1.0, 2.3, 4.5], [6.7, 2.7, 1.2], ..., [3.2, 4.7, 1.1]] 

y las correspondientes ys :

 [[1.0], [2.3], ..., [7.7]] 

Estos datos tienen el siguiente significado. Los valores almacenados en ys forman una serie de tiempo. Los valores en Xs son los “factores” dependientes del tiempo correspondientes que se sabe que tienen alguna influencia sobre los valores en ys (por ejemplo: temperatura, humedad y presión atmosférica).

Ahora, por supuesto, puedo usar fit(Xs,ys) . Pero luego obtengo un modelo en el que los valores futuros en ys dependen solo de factores y no dependen de los valores Y anteriores (al menos directamente) y esto es una limitación del modelo. Me gustaría tener un modelo en el que Y_n dependa también de Y_{n-1} y Y_{n-2} y así sucesivamente. Por ejemplo, podría querer usar un promedio móvil exponencial como modelo. ¿Cuál es la forma más elegante de hacerlo en scikit-learn?

ADICIONAL

Como se ha mencionado en los comentarios, puedo extender Xs añadiendo ys . Pero de esta manera tiene algunas limitaciones. Por ejemplo, si agrego los últimos 5 valores de y como 5 nuevas columnas a X , la información sobre el ordenamiento temporal de ys se pierde. Por ejemplo, no hay ninguna indicación en X que los valores en la quinta columna sigan a los valores en la cuarta columna y así sucesivamente. Como modelo, me gustaría tener un ajuste lineal de los últimos cinco años y usar la función lineal encontrada para hacer una predicción. Pero si tengo 5 valores en 5 columnas no es tan trivial.

AÑADIDO 2

Para que mi problema sea aún más claro, me gustaría dar un ejemplo concreto. Me gustaría tener un modelo “lineal” en el que y_n = c + k1*x1 + k2*x2 + k3*x3 + k4*EMOV_n , donde EMOV_n es solo una media móvil exponencial. ¿Cómo puedo implementar este modelo simple en scikit-learn?

Esto podría ser lo que está buscando, con respecto a la media móvil ponderada exponencialmente:

 import pandas, numpy ewma = pandas.stats.moments.ewma EMOV_n = ewma( ys, com=2 ) 

Aquí, com es un parámetro que puedes leer aquí . Luego puedes combinar EMOV_n a Xs , usando algo como:

 Xs = numpy.vstack((Xs,EMOV_n)) 

Y luego puedes mirar varios modelos lineales, aquí , y hacer algo como:

 from sklearn import linear_model clf = linear_model.LinearRegression() clf.fit ( Xs, ys ) print clf.coef_ 

¡La mejor de las suertes!

Según Wikipedia, EWMA funciona bien con datos estacionarios, pero no funciona como se esperaba en presencia de tendencias o estacionalidad. En esos casos, debe utilizar un método EWMA de segundo o tercer orden, respectivamente. Decidí ver la función de pandas ewma para ver cómo manejaba las tendencias, y esto es lo que se me ocurrió:

 import pandas, numpy as np ewma = pandas.stats.moments.ewma # make a hat function, and add noise x = np.linspace(0,1,100) x = np.hstack((x,x[::-1])) x += np.random.normal( loc=0, scale=0.1, size=200 ) plot( x, alpha=0.4, label='Raw' ) # take EWMA in both directions with a smaller span term fwd = ewma( x, span=15 ) # take EWMA in fwd direction bwd = ewma( x[::-1], span=15 ) # take EWMA in bwd direction c = np.vstack(( fwd, bwd[::-1] )) # lump fwd and bwd together c = np.mean( c, axis=0 ) # average # regular EWMA, with bias against trend plot( ewma( x, span=20 ), 'b', label='EWMA, span=20' ) # "corrected" (?) EWMA plot( c, 'r', label='Reversed-Recombined' ) legend(loc=8) savefig( 'ewma_correction.png', fmt='png', dpi=100 ) 

introduzca la descripción de la imagen aquí

Como puede ver, el EWMA rompe la tendencia cuesta arriba y cuesta abajo. Podemos corregir esto (sin tener que implementar un esquema de segundo orden por nosotros mismos) tomando el EWMA en ambas direcciones y luego promediando. Espero que tus datos estén fijos!