Tres métodos de predicción de series temporales: modelo estadístico, aprendizaje automático y red neuronal recurrente

guía

La predicción de series de tiempo es una clase de problemas clásicos, que ha sido ampliamente investigada y aplicada en la academia y la industria. Incluso se dice que todo en el mundo se puede abstraer en problemas de series temporales después de agregar la dimensión temporal, como los precios de las acciones, los cambios climáticos, etc. Las teorías relevantes sobre el pronóstico de series de tiempo también son muy extensas Además de varios modelos estadísticos clásicos, el aprendizaje automático actual y la red neuronal cíclica en el aprendizaje profundo también se pueden usar para modelar el pronóstico de series de tiempo. Hoy, este artículo presenta la aplicación simple de los tres métodos y los verifica en un conjunto de datos de series de tiempo real.

41ba44eb6818568c0aea8d12cdd412ad.png

Pronóstico de series de tiempo, su tarea principal es predecir su valor en el futuro con base en los datos históricos de un determinado indicador, por ejemplo, la curva en la figura anterior registra el número de pasajeros de vuelos mensuales en 12 años y 144 meses desde 1949 hasta 1960 (no se ha verificado la unidad específica), entonces el problema a resolver en el pronóstico de series de tiempo es: dados los datos históricos de los primeros 9 años, como 1949-1957, ¿puede el número de pasajeros en los dos años desde 1958 -1960 ser predicho.

Para resolver este problema, probablemente hay cuatro soluciones principales:

  • Modelos estadísticos, series AR más clásicas, que incluyen AR, MA, ARMA y ARIMA, etc. Además, el modelo Prophet lanzado por Facebook (hablando con precisión, ahora debería llamarse Meta) es en realidad un modelo estadístico en esencia, pero On la base de la tendencia tradicional y los componentes periódicos, la influencia de factores como vacaciones y puntos de inflexión de tiempo se consideran más en detalle, con el fin de traer reglas de tiempo más precisas;

  • Modelo de aprendizaje automático, en el aprendizaje automático supervisado, el problema de regresión resuelve principalmente el problema de predecir el posible valor de una etiqueta en función de una serie de características, por lo que cuando los datos históricos se utilizan como característica, es natural utilizar la serie temporal. problema de predicción Abstraído como un problema de regresión, desde esta perspectiva, todos los modelos de regresión pueden usarse para resolver el pronóstico de series de tiempo. Para la previsión de series temporales abstractas con aprendizaje automático, se recomienda consultar este documento "Estrategias de aprendizaje automático para la previsión de series temporales";

  • Modelo de aprendizaje profundo, los principales escenarios de aplicación de aprendizaje profundo son CV y ​​NLP, el último de los cuales se usa especialmente para resolver el problema del modelado de problemas de secuencia, y la serie temporal es, por supuesto, una forma especial de datos de secuencia, por lo que es natural para Uso de redes neuronales recurrentes para modelar pronósticos de series temporales;

  • Modelo de Markov oculto, el modelo de Markov es una abstracción clásica utilizada para describir la transición entre estados adyacentes, y el modelo de Markov oculto agrega estados ocultos para enriquecer la capacidad expresiva del modelo. Sin embargo, una de las principales suposiciones es que el estado futuro solo está relacionado con el estado actual, y no es propicio utilizar múltiples estados históricos para participar en la predicción. El más comúnmente utilizado puede ser el ejemplo de la previsión meteorológica.

Este documento considera principalmente los primeros tres métodos de modelado de pronóstico de series temporales y selecciona: 1) modelo Prophet, 2) modelo de regresión RandomForest, 3) tres esquemas LSTM para probar.

Primero, pruebe el conjunto de datos reales de los pasajeros del vuelo y compare la precisión de la predicción de los tres modelos seleccionados a su vez. El conjunto de datos tiene un total de 12 años de números de pasajeros por mes. Enero de 1958 se usa como interfaz de segmentación para dividir el conjunto de entrenamiento y el conjunto de prueba, es decir, los datos de los primeros 9 años se usan como conjunto de entrenamiento, y los datos de los últimos 3 años se utilizan como conjunto de prueba para verificar el efecto del modelo. El diagrama esquemático del conjunto de datos después de la segmentación es el siguiente:

df = pd.read_csv("AirPassengers.csv", parse_dates=["date"]).rename(columns={"date":"ds", "value":"y"})
X_train = df[df.ds<"19580101"]
X_test = df[df.ds>="19580101"]


plt.plot(X_train['ds'], X_train['y'])
plt.plot(X_test['ds'], X_test['y'])

814250cf0fb15a619f6c0dfc4acf8449.png

1. Predicción del modelo de profeta . Prophet es un modelo de predicción de series temporales altamente encapsulado que acepta un DataFrame como un conjunto de entrenamiento (se requieren columnas de campo ds e y), y también acepta un DataFrame al predecir, pero solo necesita tener una columna ds en este momento. Para obtener una introducción detallada, consulte su documentación oficial: https://facebook.github.io/prophet/. El código central de entrenamiento y predicción de modelos es el siguiente:

from prophet import Prophet
pro = Prophet()
pro.fit(X_train)
pred = pro.predict(X_test)


pro.plot(pred)

El diagrama esquemático del resultado del entrenamiento es el siguiente:

9ef951b63e2a3c9f30193a3d04731410.png

Por supuesto, este es el resultado dado por la función de visualización incorporada de Prophet, o dibujando manualmente la comparación entre la etiqueta real del conjunto de prueba y el resultado previsto:

4447ef206f0387df9ca2e7b49453c3ed.png

Es fácil ver que aunque la tendencia general de la serie tiene un buen resultado de ajuste, en realidad existe una brecha relativamente grande en los valores específicos.

2. Aquí se selecciona el modelo de aprendizaje automático , el modelo RandomForest que a menudo se usa como varias líneas base. Cuando se utiliza el aprendizaje automático para realizar la predicción de series temporales, generalmente es necesario extraer características y etiquetas a través de ventanas deslizantes, y luego es necesario deslizar e interceptar las características del conjunto de prueba para lograr la predicción de un solo paso al realizar la predicción. Consulte el documento "Máquina Estrategias de aprendizaje para el tiempo En la práctica de los pronósticos en serie, el problema se puede describir aproximadamente de la siguiente manera:

6b3cd2f6df33efb311d2fe129c96875c.png

En consecuencia, la longitud de la ventana de extracción de características se establece en 12, y la forma de construir el conjunto de entrenamiento y el conjunto de prueba es la siguiente:

data = df.copy()
n = 12
for i in range(1, n+1):
    data['ypre_'+str(i)] = data['y'].shift(i)
data = data[['ds']+['ypre_'+str(i) for i in range(n, 0, -1)]+['y']]


# 提取训练集和测试集
X_train = data[data['ds']<"19580101"].dropna()[['ypre_'+str(i) for i in range(n, 0, -1)]]
y_train = data[data['ds']<"19580101"].dropna()[['y']]
X_test = data[data['ds']>="19580101"].dropna()[['ypre_'+str(i) for i in range(n, 0, -1)]]
y_test = data[data['ds']>="19580101"].dropna()[['y']]


# 模型训练和预测
rf = RandomForestRegressor(n_estimators=10, max_depth=5)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)


# 结果对比绘图
y_test.assign(yhat=y_pred).plot()

9b87062d7a7b35e74cb5cf4d8b77474d.png

Se puede ver que el efecto de predicción es relativamente general, especialmente para los resultados de predicción de los últimos dos años, la brecha con el valor real sigue siendo relativamente grande. Es fácil explicar este fenómeno pensando en un modelo de aprendizaje automático: el modelo de bosque aleatorio en realidad está aprendiendo la ley entre las curvas de acuerdo con el conjunto de datos de entrenamiento. Dado que la serie temporal en su conjunto muestra una tendencia a aumentar con el tiempo, el punto más alto en los datos históricos no es suficiente para cubrir los valores más grandes en el futuro, por lo que todas las etiquetas que exceden los datos históricos en el conjunto de prueba en realidad no pueden encajar.

3. La red neuronal cíclica en el aprendizaje profundo , de hecho, el aprendizaje profundo generalmente requiere un gran conjunto de datos para aprovechar al máximo sus ventajas, y el conjunto de datos aquí es obviamente muy pequeño, por lo que solo se diseña uno de los modelos más simples: 1 capa LSTM+1 Capa Lineal. El modelo se construye de la siguiente manera:

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.rnn = nn.LSTM(input_size=1, hidden_size=10, batch_first=True)
        self.linear = nn.Linear(10, 1)
        
    def forward(self, x):
        x, _ = self.rnn(x)
        x = x[:, -1, :]
        x = self.linear(x)
        return x

La idea general de la construcción del conjunto de datos es la misma que la parte de aprendizaje automático mencionada anteriormente, y luego, de acuerdo con la alquimia de entrenamiento del modelo, algunos resultados son los siguientes:

# 数据集转化为3D
X_train_3d = torch.Tensor(X_train.values).reshape(*X_train.shape, 1)
y_train_2d = torch.Tensor(y_train.values).reshape(*y_train.shape, 1)
X_test_3d = torch.Tensor(X_test.values).reshape(*X_test.shape, 1)
y_test_2d = torch.Tensor(y_test.values).reshape(*y_test.shape, 1)


# 模型、优化器、评估准则
model = Model()
creterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters())


# 训练过程
for i in range(1000):
    out = model(X_train_3d)
    loss = creterion(out, y_train_2d)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    if (i+1)%100 == 0:
        y_pred = model(X_test_3d)
        loss_test = creterion(y_pred, y_test_2d)
        print(i, loss.item(), loss_test.item())


# 训练结果
99 65492.08984375 188633.796875
199 64814.4375 187436.4375
299 64462.09765625 186815.5
399 64142.70703125 186251.125
499 63835.5 185707.46875
599 63535.15234375 185175.1875
699 63239.39453125 184650.46875
799 62947.08203125 184131.21875
899 62657.484375 183616.203125
999 62370.171875 183104.671875

A través de las 1000 épocas anteriores, generalmente se puede inferir que el modelo no encajará bien, ¡así que ríndete con decisión!

Por supuesto, debe señalarse que los resultados de las pruebas anteriores solo pueden ilustrar el rendimiento de los tres esquemas en este conjunto de datos y no pueden representar el rendimiento de este tipo de modelo cuando se utiliza en problemas de predicción de series temporales. De hecho, el problema de predicción de series de tiempo en sí mismo es un escenario que requiere un análisis específico de problemas específicos, y no existe un buen modelo que sea universalmente aplicable, ¡como "No Free Lunch"!

Este artículo es solo una pequeña prueba de la serie de tweets de pronóstico de series temporales, y otras experiencias y resúmenes relacionados se actualizarán de vez en cuando en el futuro.

458f1d9784c2b30bb45d4832a81440f6.png

Lectura relacionada:

Supongo que te gusta

Origin blog.csdn.net/weixin_43841688/article/details/122053781
Recomendado
Clasificación