values sklearn scikit onehotencoder one learn labelencoder hot guide example estimator categorical_features categorical python machine-learning time-series scikit-learn

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



scikit learn en python (2)

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 here . Entonces puedes combinar EMOV_n a Xs , usando algo como:

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

Y luego puede ver varios modelos lineales here 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!

Scikit-learn utiliza un enfoque muy conveniente basado en métodos de fit y predict . Tengo datos de series temporales 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 el ys correspondiente:

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

Estos datos tienen el siguiente significado. Los valores almacenados en ys forman una serie temporal. Los valores en Xs son los correspondientes "factores" dependientes del tiempo que se sabe que tienen cierta 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 previos (al menos directamente) y esto es una limitación del modelo. Me gustaría tener un modelo en el que Y_n también dependa 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 agregando 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 orden de tiempo de ys se pierde. Por ejemplo, no hay ninguna indicación en X que los valores en la 5ª columna sigan el valor en la 4ª columna y así sucesivamente. Como modelo, me gustaría tener un ajuste lineal de los últimos cinco y usar la función lineal encontrada para hacer una predicción. Pero si tengo 5 valores en 5 columnas, no es tan trivial.

AGREGADO 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?


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 usar un método EWMA de segundo o tercer orden, respectivamente. Decidí ver la función ewma los pandas 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 )

Como puede ver, el EWMA bucks la tendencia cuesta arriba y cuesta abajo. Podemos corregir esto (sin tener que implementar un esquema de segundo orden nosotros mismos) tomando el EWMA en ambas direcciones y luego promediando. ¡Espero que tu información esté estacionaria!