Al hacer un LSTM, ¿el índice de fecha y hora debe ser ascendente o descendente? Lo que quiero decir es si la cabeza del conjunto de datos debe ser 2014 y la cola 2020 o al revés. La razón por la que pregunto sobre esto es por el período de retrospectiva de LSTM, me temo que si no se clasifica correctamente, se verá en el marco de tiempo incorrecto.

Mi índice de tiempo actual al imprimir (df) se ve así:

2014-21-3 XYZ
2014-22-3 XYZ
2014-23-3 XYZ

¿Debería cambiarse a este orden para que el LSTM "funcione"?

2014-23-3 XYZ
2014-22-3 XYZ
2014-21-3 XYZ

Además, cuando estoy cargando en un conjunto de datos que tiene una variable de respuesta binaria que fluctúa entre las dos cadenas "Arriba" y "Abajo". Al hacer un modelo de Keras, generará probabilidades para el valor 1, sin embargo, ¿cómo sé qué cadena es 1 y cuál es el 0?

Además, si la respuesta es predic_classification, lo siento, eso no es lo que estoy buscando aquí (solo un aviso, ya que he visto preguntas similares con esa respuesta).

0
sword134 26 jun. 2020 a las 20:02

2 respuestas

El futuro / presente depende del pasado pero no al revés. La celda LSTM para hacer una predicción actual utilizará la memoria del pasado. Por esta razón, la fecha debe estar en orden creciente.

Parte 2:

Como tiene dos etiquetas posibles Up y Down, deberá colocar una capa lineal de tamaño 1 (o una red neuronal multicapa con su última capa de tamaño 1) sobre la salida de LSTM . Puede codificar Up como clase 1 y Down como clase 0. Cuando entrena el modelo, cada paso de tiempo dará como resultado una predicción única y, según su valor, puede interpretarlo como 1 ({ {X4}}) o 0 (Down)

Muestra:

import numpy as np

from keras.models import Sequential
from keras.layers import LSTM, Dense, TimeDistributed
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(8, input_shape = (10, 1), return_sequences = True))
model.add(TimeDistributed(Dense(1))) 
model.compile(loss='mean_squared_error', optimizer='adam')

# 4 samples each of 10 timesteps with 1 feature each
X = np.random.randn(4,10,1) 
# Each timestep has a label 1 for UP and 0 for down
y = np.random.randint(0,2, size=(4,10, 1))

model.fit(X, y, epochs=2)
print (model.predict(X).shape)

Salida:

Epoch 1/2
4/4 [==============================] - 0s 76ms/step - loss: 0.4758
Epoch 2/2
4/4 [==============================] - 0s 2ms/step - loss: 0.4704
(4, 10, 1)

Como puede ver, el tamaño de las predicciones es 4 X 10 X 1, es decir, para cada paso de tiempo para cada muestra, predice la probabilidad de que pertenezca a la clase 1. Si desea predecir la clase directamente, puede usar

model.predict_classes(X)
0
mujjiga 26 jun. 2020 a las 17:48

Debes usar orden creciente ...

2014-21-3 XYZ
2014-22-3 XYZ
2014-23-3 XYZ

EDITAR (cómo interpretar las probabilidades) :

Puedes codificar Up como clase 1 y Down como clase 0

Tiene dos opciones sobre cómo interpretar la salida de un problema de clasificación. depende de la salida de activación que elija

La función de activación sigmoidea se utiliza para generar probabilidades en problemas de clasificación binaria. en este caso, el modelo genera una serie de probabilidades con forma igual a la longitud de la muestra para predecir. podemos recuperar la clase predicha simplemente verificando el puntaje de probabilidad ... si está por encima de 0.5 (esta es una práctica común pero también puede cambiarla de acuerdo a sus necesidades) la muestra pertenece a la clase 1, de lo contrario pertenece a la clase 0.

preds = model.predict(X) # (n_samples, 1)
y_classes = ((pred > 0.5)+0).ravel() # (n_samples,)

En caso de sigmoide, su última capa de salida debe ser Densa (1, activación = 'sigmoide')

En el caso de softmax, la clase predicha se recupera utilizando argmax

preds = model.predict(X) # (n_samples, n_class)
y_classes = np.argmax(preds , axis=1)  # (n_samples,)

En caso de softmax, su última capa de salida debe ser Densa (n_classes, activación = 'softmax')

0
Marco Cerliani 26 jun. 2020 a las 17:28