python - ¿Cómo usar el modelo de Keras para pronosticar fechas o eventos futuros?
python-3.x python-2.7 (1)
Bueno, necesita un modelo con
stateful=True
, por lo que puede alimentar una predicción tras otra para obtener la siguiente y mantener el modelo pensando que cada entrada no es una secuencia nueva, sino una secuela de la anterior.
Arreglando el código y entrenando
Veo en el código que hay un intento de hacer que su
y
sea un cambio
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 de
(number_of_sequences, number_of_steps,features)
.
Entonces, claramente está creando secuencias de solo 1 paso, lo que significa que su LSTM no está aprendiendo secuencias en absoluto. (No hay secuencia con un solo paso).
Suponiendo que sus datos son una única secuencia única con 1 característica, definitivamente debe tener la forma de
(1, len(x_train), 1)
.
Naturalmente,
y_train
también debería tener la misma forma.
Esto, a su vez, requerirá que sus capas LSTM sean
return_sequences=True
: la única forma de hacer que 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, entrena a su modelo hasta que obtenga un resultado satisfactorio.
Prediciendo el futuro
Para predecir el futuro, necesitará capas
stateful=True
LSTM.
Antes de nada, restablece los estados del modelo:
model.reset_states()
: necesario cada vez que ingresa una nueva secuencia en un modelo con estado.
Luego, primero predice todo el
X_train
(esto es necesario para que el modelo entienda en qué punto de la secuencia se encuentra, 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 características, una predicción de pasos futuros modificada y un método que es un poco diferente de esta respuesta, pero basado en el mismo principio.
Creé dos modelos (uno con
stateful=False
, para entrenar sin necesidad de restablecer estados cada vez, nunca olvide restablecer estados cuando está comenzando 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
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 veces la gente sugiere 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. Ahora tengo el modelo entrenado pero no obtengo lo que puedo hacer o qué código uso para usar el modelo y pronosticar los precios para los próximos 30 días o un minuto.
Por favor sugiérame la salida. Estoy atrapado en este problema desde hace una semana y no puedo hacer ningún intento exitoso.
Aquí está el enlace del repositorio donde se puede encontrar el código ejecutable completo, el modelo y el conjunto de datos .: Mi enlace del repositorio