Nachiketa Hebbar

Follow

Sep 18, 2020 – 8 min read

La predicción de series temporales es una de las técnicas más demandadas de la ciencia de datos, ya sea en el comercio de acciones, la predicción de las ventas de las empresas o la predicción del tiempo. Es claramente una habilidad muy útil para tener y voy a equipar con sólo que al final de este artículo.

En este tutorial, vamos a construir un modelo ARIMA(no se preocupe si usted no sabe exactamente cómo funciona todavía) para predecir los valores futuros de la temperatura de una ciudad en particular utilizando python. El enlace de GitHub para el código y el conjunto de datos se puede encontrar al final de este blog. También he adjuntado mi vídeo de YouTube al final, por si te interesa una explicación en vídeo. Así que sin perder tiempo vamos a empezar.

El primer paso en cualquier serie de tiempo es leer sus datos y ver cómo se ve. El siguiente fragmento de código demuestra cómo hacerlo.

El código es bastante sencillo. Leemos los datos usando pd.read_csv y escribiendo parse_date=True, nos aseguramos de que pandas entiende que está tratando con valores de fecha y no con valores de cadena.

A continuación eliminamos cualquier valor que falte e imprimimos la forma de los datos. df.head() imprime las 5 primeras filas del conjunto de datos. Esta es la salida que deberías ver para esto:

Planifica tus datos

Lo siguiente es trazar tus datos. Esto te da una idea de si los datos son estacionarios o no. Para aquellos que no saben lo que significa la estacionariedad, permítanme darles una idea. Aunque he hecho varios videos sobre este tema, todo se reduce a esto:

Cualquier serie de datos de tiempo que tiene que ser modelada necesita ser estacionaria. Estacionario significa que sus propiedades estadísticas son más o menos constantes con el tiempo. Tiene sentido, ¿verdad? ¿Cómo se supone que se pueden hacer predicciones si las propiedades estadísticas varían con el tiempo? Estas son las siguientes propiedades que tendrá cualquier modelo de estacionariedad:

  1. Media constante
  2. Varianza constante(Puede haber variaciones, pero las variaciones no deben ser irregulares)
  3. No hay estacionalidad(No hay patrones que se repitan en el conjunto de datos)

Así que el primer paso es comprobar la estacionariedad. Si tu conjunto de datos no es estacionario, tendrás que convertirlo en una serie estacionaria. Ahora, antes de que empieces a preocuparte por todo esto, ¡relájate! Tenemos una prueba fácil y fija para comprobar la estacionariedad llamada ADF (prueba de Dickey Fuller aumentada). Pero antes de mostrar eso, vamos a trazar los datos primero.

Como sólo estoy interesado en predecir la temperatura media, esa es la única columna que voy a trazar.

df.plot(figsize=(12,5))

Comprobando la estacionariedad

De entrada, podemos ver que parece tener una media constante en torno a los 45 años. Y las fluctuaciones también parecen ser más o menos las mismas. Sin embargo, para estar seguros de si los datos son estacionarios o no, ejecutamos una prueba estadística fija utilizando el siguiente código:

Obtendrás la salida de la siguiente manera:

No tienes que preocuparte de toda la estadística compleja. Para interpretar los resultados de la prueba, sólo tienes que mirar el valor p. Y se utiliza el siguiente método sencillo:

Si p< 0,05 ; Los datos son estacionarios

Si p>0,05; Los datos no son estacionarios

No es una regla rígida, pero un dato estacionario debería tener un valor p pequeño. Un valor p más grande podría indicar la presencia de ciertas tendencias (media variable) o estacionalidad también.

Por último, decida su modelo ARIMA

Ahora bien, aunque he hecho varios vídeos en YouTube sobre este tema, si no entiende del todo lo que es un modelo ARIMA, permítame presentarle un resumen sencillo:

ARIMA se compone de 3 términos(Auto-Regresión + Integrado+Promedio Móvil)

  1. Auto-Regresión:

Esto significa básicamente que usted está utilizando los valores anteriores de la serie de tiempo con el fin de predecir el futuro. La cantidad de valores pasados que utiliza, determina el orden del modelo AR. Así es como se ve un modelo AR(1):

Y(t)=Alguna_Constante*Y(t-1)+Otra_Constante +Error(t)

Bastante sencillo, ¿verdad?

2. Integrado:

Así que, ¿recuerda nuestra charla sobre la estacionariedad, y cómo es extremadamente importante? Pues bien, si tu conjunto de datos no es estacionario, lo más frecuente es que tengas que realizar algún tipo de operación de diferencia para hacerlo estacionario. Si estás diferenciando con el valor anterior, su orden es 1 y así sucesivamente. Aquí tienes un ejemplo:

Perdona mi mal dibujo. Pero como puedes la serie Y(t) no era estacionaria, por una tendencia creciente que daba lugar a una media variable. Simplemente la restamos de los valores anteriores y ¡voilá! Se convierte en estacionaria. Dependiendo de tus datos, puede que tengas que repetir la diferenciación para conseguir una diferenciación de segundo orden , de tercer orden y así sucesivamente..

3. Media móvil:

Esto significa básicamente que estás utilizando los errores anteriores para hacer la predicción futura. También tiene sentido, ¿no? Al ver lo equivocado que estabas en tu predicción, lo tienes en cuenta para hacer una mejor predicción. Y al igual que en un modelo AR, el número de errores anteriores (también llamado número de rezagos) que se utiliza, determina el orden del modelo.

Así es como la ecuación de orden MA(1) parece:
Y(t)= Media + Some_Constant*Error(t-1) +Error(t)

Así que nuestro trabajo principal es decidir el orden de las partes AR, I, MA que son donadas por(p,d,q) respectivamente.

Y antes de que empieces a preocuparte, déjame decirte que todo se hará automáticamente. ¡La biblioteca pmdarima viene a nuestro rescate! Hace el trabajo de averiguar el orden de la ARIMA por sí mismo. Así es como el fragmento de código parece:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Asegúrese de instalar la biblioteca pmdarima primero usando pip install pmdarima)

El código es bastante auto explicativo. Simplemente suministramos nuestros datos a la función auto_arima. La función básicamente utiliza algo llamado como la puntuación AIC para juzgar qué tan bueno es un modelo de orden particular. Simplemente trata de minimizar la puntuación AIC, y así es como se ve la salida:

Rendimiento del modelo para diferentes combinaciones de órdenes

Podemos ver que el mejor modelo ARIMA parece ser del orden (1,0,5) con la mínima puntuación AIC=8294.785. Con este conocimiento podemos finalmente proceder a entrenar y ajustar el modelo para empezar a hacer predicciones.

Dividir el conjunto de datos

Antes de entrenar el modelo, tenemos que dividir el conjunto de datos en una sección de entrenamiento y otra de prueba. Hacemos esto porque primero entrenamos el modelo en los datos y mantenemos la sección de pruebas oculta para el modelo. Una vez que el modelo está listo, le pedimos que haga predicciones sobre los datos de prueba y vemos su rendimiento.

El siguiente fragmento de código ilustra cómo hacerlo:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Así que, como probablemente puedes decir, reservamos los últimos 30 días de los datos como la sección de prueba. Puedes ver las formas de los datos reales y las secciones de prueba y entrenamiento en la salida.

Forma de la sección de entrenamiento y prueba

Finalmente, ¡llegamos a lo más jugoso!

Sorprendentemente, la creación del modelo ARIMA es en realidad uno de los pasos más fáciles una vez que se han realizado todos los pasos previos. Es tan sencillo como se muestra en el siguiente fragmento de código:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Como puede ver, simplemente llamamos a la función ARIMA, le suministramos nuestro conjunto de datos y mencionamos el orden del modelo ARIMA que queremos. También podrá ver el resumen del modelo en su salida.

Resumen del modelo

Aquí podrá ver un montón de información sobre su modelo. También podrá ver los coeficientes de cada término AR y MA. Estos no son más que el valor de las variables que vio en la ecuación del modelo AR/MA anterior y que fueron etiquetadas como ‘Some_Constant’. Generalmente, una mayor magnitud de esta variable significa que tiene un mayor impacto en la salida.

Compruebe qué tan bueno es su modelo

Aquí es donde entran nuestros datos de prueba. Primero hacemos la predicción de la temperatura en los datos de prueba. A continuación, trazamos para ver cómo nuestras predicciones en comparación con los datos reales.

Para hacer realmente las predicciones, tenemos que utilizar la función model.predict y decirle el índice de inicio y final en el que queremos hacer las predicciones.

Como queremos empezar a hacer predicciones donde los datos de entrenamiento termina, eso es lo que he escrito en la variable de inicio. Queremos dejar de hacer predicciones cuando el conjunto de datos termine, lo que explica la variable end. Si quieres hacer predicciones en el futuro también, sólo tienes que cambiar eso en la variable start y end a los índices que quieras. El gráfico de salida debería ser así:

Valores de prueba frente a gráfico de predicciones

Como puedes ver las predicciones hacen un buen trabajo al coincidir con la tendencia real, aunque hay un cierto retraso aceptable.

Comprueba tu métrica de precisión

Para determinar realmente lo bueno o malo que es tu modelo encontramos el error cuadrático medio del mismo. El siguiente fragmento de código muestra que:

Primero comprobamos el valor medio del conjunto de datos que resulta ser 45. Y el error cuadrático medio para este modelo en particular debería ser de alrededor de 2,3. También hay que tener en cuenta que la media del error cuadrático debe ser menor que el valor medio del conjunto de datos. En este caso podemos ver que el error medio va a ser aproximadamente 2,3/45 *100=5,1% del valor real.

¡Así que con esto su modelo ARIMA está listo para funcionar! ¡En futuros blogs voy a hablar de diferentes modelos y cómo se puede aumentar la precisión del modelo aún más.

Si usted está interesado en la explicación de vídeo de la misma, la cabeza a mi canal de YouTube para más contenido! Puedes encontrar el enlace de GitHub para el código y el conjunto de datos aquí: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

¡No dudes en conectar conmigo en LinkedIn también!