Aprendizaje automático: cómo usar las últimas 20 filas como entrada para X para cada valor Y

Tengo un código de aprendizaje de máquina muy simple aquí:

# load dataset dataframe = pandas.read_csv("USDJPY,5.csv", header=None) dataset = dataframe.values X = dataset[:,0:59] Y = dataset[:,59] #fit Dense Keras model model.fit(X, Y, validation_data=(x,y_test), epochs=150, batch_size=10) 

Mis valores de X son 59 características con la 60ª columna siendo mi valor de Y, una etiqueta de clasificación simple 1 o 0.

Teniendo en cuenta que estoy utilizando datos financieros, me gustaría revisar los últimos 20 valores de X para poder predecir el valor de Y.

Entonces, ¿cómo podría hacer que mi algoritmo use las últimas 20 filas como una entrada para X para cada valor Y?

Soy relativamente nuevo en el aprendizaje automático y pasé mucho tiempo buscando una solución a mi problema en línea, pero no pude encontrar nada tan simple como mi caso.

¿Algunas ideas?

Esto normalmente se hace con redes neuronales recurrentes (RNN), que retienen algo de memoria de la entrada anterior, cuando se recibe la siguiente entrada. Es una explicación muy breve de lo que sucede, pero hay muchas fonts en Internet para comprender mejor cómo funcionan.

Vamos a descomponerlo en un ejemplo simple. Digamos que tiene 5 muestras y 5 características de datos, y quiere dos escalonar los datos en 2 filas en lugar de 20. Aquí están sus datos (asumiendo que 1 stock y el valor de precio más antiguo es primero). Y podemos pensar en cada fila como un día de la semana.

 ar = np.random.randint(10,100,(5,5)) [[43, 79, 67, 20, 13], #<---Monday--- [80, 86, 78, 76, 71], #<---Tuesday--- [35, 23, 62, 31, 59], #<---Wednesday--- [67, 53, 92, 80, 15], #<---Thursday--- [60, 20, 10, 45, 47]] #<---Firday--- 

Para usar un LSTM en keras, sus datos deben ser 3-D, en comparación con la estructura 2-D actual que es ahora, y la notación para cada dimensión es (samples,timesteps,features) . Actualmente solo tiene (samples,features) por lo que necesitaría boost los datos.

 a2 = np.concatenate([ar[x:x+2,:] for x in range(ar.shape[0]-1)]) a2 = a2.reshape(4,2,5) [[[43, 79, 67, 20, 13], #See Monday First [80, 86, 78, 76, 71]], #See Tuesday second ---> Predict Value originally set for Tuesday [[80, 86, 78, 76, 71], #See Tuesday First [35, 23, 62, 31, 59]], #See Wednesday Second ---> Predict Value originally set for Wednesday [[35, 23, 62, 31, 59], #See Wednesday Value First [67, 53, 92, 80, 15]], #See Thursday Values Second ---> Predict value originally set for Thursday [[67, 53, 92, 80, 15], #And so on [60, 20, 10, 45, 47]]]) 

Observe cómo los datos son escalonados y tridimensionales. Ahora solo haz una red LSTM . Y sigue siendo 2-D ya que esta es una estructura de muchos a uno, sin embargo, debe recortar el primer valor.

 model = Sequential() model.add(LSTM(hidden_dims,input_shape=(a2.shape[1],a2.shape[2])) model.add(Dense(1)) 

Este es solo un breve ejemplo para que te muevas. Hay muchas configuraciones diferentes que funcionarán (incluso si no usas RNN), necesitas encontrar la correcta para tus datos.

Este parece ser un tipo de tarea de series de tiempo.
Comenzaría mirando las redes neuronales recurrentes keras

Si quieres seguir utilizando el modelado que tienes. (No lo recomendaría) Para series de tiempo, es posible que desee transformar su conjunto de datos a algún tipo de promedio ponderado de las últimas 20 observaciones (filas).
De esta manera, cada una de las observaciones de su nuevo conjunto de datos es la función de los 20 anteriores. De esta manera, esa información está presente para la clasificación.

Puedes usar algo como esto para cada columna si quieres la sum acumulada:

 import numpy as np def running_sum(x, N): cumsum = np.cumsum(np.insert(x, 0, 0)) return (cumsum[N:] - cumsum[:-N]) x=np.random.rand(200) print(running_sum(x,20)) 

Alternativamente, puede pivotar su conjunto de datos actual para que cada fila tenga los números reales: Agregue 19 x columnas de conteo de dimensiones. Poblar con datos de observaciones previas en esos. Si esto es posible o práctico, depende de la forma de su conjunto de datos.

Esta es una forma simple, no demasiado exhaustiva, de asegurarse de que cada observación tenga los datos que usted cree que harán una buena predicción. Tienes que ser consciente de estas cosas:

  1. El método de modelado es “correcto” con esta independencia de observación no absoluta.
  2. Cuando realiza la predicción para X [i], tiene toda la información de X [i-20] a X [i-1]

Estoy seguro de que hay otras consideraciones que hacen que esto no sea óptimo, y estoy sugiriendo usar RNN dedicado.

Soy consciente de que DJ ya señaló que esto es RNN, estoy publicando esto después de que esa respuesta fue aceptada por solicitud de OP.