¿Cómo usar el modelo de Keras para pronosticar fechas o eventos futuros?

Aquí está mi código para entrenar el modelo completo y guardarlo:

num_units = 2 activation_function = 'sigmoid' optimizer = 'adam' loss_function = 'mean_squared_error' batch_size = 10 num_epochs = 100 # Initialize the RNN regressor = Sequential() # Adding the input layer and the LSTM layer regressor.add(LSTM(units = num_units, activation = activation_function, input_shape=(None, 1))) # Adding the output layer regressor.add(Dense(units = 1)) # Compiling the RNN regressor.compile(optimizer = optimizer, loss = loss_function) # Using the training set to train the model regressor.fit(x_train, y_train, batch_size = batch_size, epochs = num_epochs) regressor.save('model.h5') 

Después de eso, he visto que la mayoría de las personas nos sugieren el conjunto de datos de prueba para verificar la predicción, que también intenté y obtuve buenos resultados.

Pero el problema está en el uso del modelo que he creado. Quiero tener un pronóstico para los próximos 30 días o cada minuto que sea. Ahora tengo el modelo capacitado pero no obtengo lo que puedo hacer o qué código utilizo para usar el modelo y pronosticar los precios para los próximos 30 días o un minuto.

Por favor sugiéreme la salida. Estoy atascado en este problema desde hace una semana y no puedo hacer ningún bash exitoso.

Aquí está el enlace del repository donde se puede encontrar el código completo ejecutable, el modelo y el conjunto de datos. Mi enlace del repository

Bueno, necesitas un modelo con stateful=True , por lo que puedes hacer una predicción tras otra para obtener el siguiente y mantener el modelo pensando que cada entrada no es una secuencia nueva, sino una continuación de la anterior.

Arreglando el código y entrenando.

Veo en el código que hay un bash de hacer que tu y sea ​​un shifte x (una buena opción para predecir los próximos pasos). Pero también hay un gran problema en el preprocesamiento aquí:

 training_set = df_train.values training_set = min_max_scaler.fit_transform(training_set) x_train = training_set[0:len(training_set)-1] y_train = training_set[1:len(training_set)] x_train = np.reshape(x_train, (len(x_train), 1, 1)) 

Los datos para las capas LSTM deben tener la forma siguiente (number_of_sequences, number_of_steps,features) .

Entonces, claramente estás creando secuencias de 1 solo paso, lo que significa que tu LSTM no está aprendiendo secuencias en absoluto. (No hay secuencia con un solo paso).

Suponiendo que sus datos son una secuencia única y única con 1 característica, definitivamente debe tener la forma de (1, len(x_train), 1) .

Naturalmente, y_train también debe tener la misma forma.

Esto, a su vez, requerirá que sus capas LSTM sean return_sequences=True – La única manera de hacer que y tenga una longitud en pasos. Además, para tener una buena predicción, es posible que necesite un modelo más complejo (porque ahora será un verdadero aprendizaje).

Hecho esto, entrenas a tu modelo hasta obtener un resultado satisfactorio.


Prediciendo el futuro

Para predecir el futuro, necesitará capas con stateful=True LSTM.

Antes de nada, restablece los estados del modelo: model.reset_states() : es necesario cada vez que ingresa una nueva secuencia en un modelo con estado.

Luego, primero predice el X_train completo (esto es necesario para que el modelo comprenda en qué punto de la secuencia está, en palabras técnicas: para crear un estado).

 predictions = model.predict(`X_train`) #this creates states 

Y finalmente creas un bucle donde comienzas con el último paso de la predicción anterior:

 future = [] currentStep = predictions[:,-1:,:] #last step from the previous prediction for i in range(future_pred_count): currentStep = model.predict(currentStep) #get the next step future.append(currentStep) #store the future steps #after processing a sequence, reset the states for safety model.reset_states() 

Ejemplo

Este código hace esto con una secuencia de 2 funciones, una predicción de pasos futuros desplazada y un método que es un poco diferente de esta respuesta, pero que se basa en el mismo principio.

Creé dos modelos (uno con stateful=False , para el entrenamiento sin necesidad de restablecer los estados cada vez, nunca olvide restablecer los estados cuando inicie una nueva secuencia) y el otro con stateful=True , copiando los pesos del modelo entrenado, para prediciendo el futuro)

https://github.com/danmoller/TestRepo/blob/master/TestBookLSTM.ipynb