2 votos

¿Por qué mis predicciones de la red neuronal son "correctas", pero se alejan del valor real? No se utilizan los valores retardados del pasado

Por favor, tened paciencia con toda la pregunta, sólo quiero dejar muy claro lo que he hecho hasta ahora y por qué estoy tan perplejo.

Estoy trabajando con una red neuronal con el paquete Keras en R, intentando predecir el precio de Bitcoin por hora, con 24 horas de antelación. Aquí está el código de mi modelo:

batch_size = 2              

model <- keras_model_sequential()
model%>%
  layer_dense(units=13, 
             batch_input_shape = c(batch_size, 1, 13), use_bias = TRUE) %>%
  layer_dense(units=17, batch_input_shape = c(batch_size, 1, 13)) %>%
  layer_dense(units=1)
model %>% compile(
  loss = 'mean_squared_error',
  optimizer = optimizer_adam(lr= 0.000025, decay = 0.0000015),  
  metrics = c('mean_squared_error')
)
summary(model)

Epochs <- 25
for (i in 1:Epochs){
  print(i)
  model %>% fit(x_train, y_train, epochs=1, batch_size=batch_size, verbose=1, shuffle=TRUE)
  #model %>% reset_states()
}

Puedes notar que estoy trabajando en un problema de series de tiempo, pero no usando LSTM. Esto se debe a que ninguna de mis entradas son valores de series temporales. Todas son variables exógenas. También notarás que he comentado la línea "model %>% reset_states()". No estoy seguro de si eso es lo correcto, pero por lo que he leído, esa línea es para los modelos LSTM y como ya no estoy usando uno, la he comentado.

De nuevo, como no tengo entradas de series temporales, también he puesto "shuffle=" en TRUE. Por lo tanto, a continuación se muestran las predicciones en azul frente al valor real en rojo: First Pic

Se puede ver que las predicciones están muy a menudo (pero no siempre) por detrás del valor real. Además, este retraso no es constante. Permítanme subrayar de nuevo que todas las variables son exógenas. No hay ninguna entrada de precio pasado que el modelo pueda utilizar para generar estas predicciones tardías. Y no olvide que puse shuffle= TRUE, lo que me confunde aún más en cuanto a cómo el modelo podría estar dando tales resultados si no hay manera (que yo sepa) de que pueda "ver" los valores pasados con el fin de replicarlos. Aquí está el gráfico del ajuste de los datos de entrenamiento: Training Data fit

Es más difícil de decir, pero el retraso también existe en los datos de entrenamiento. También diré que si cambio la antelación con la que intento predecir, el retraso aparente de la predicción también cambia. Si intento predecir con 0 horas de antelación (por lo que estoy "prediciendo" el precio actual dadas las condiciones actuales), no hay retraso en la predicción.

He comprobado que las tablas/columnas están bien configuradas para que el modelo se entrene en condiciones "actuales" prediciendo el precio a 24 horas vista. También he jugado con la arquitectura de la red y el tamaño del lote. Lo único que parece afectar a este retraso es la distancia a la que estoy intentando predecir, es decir, cuántas filas he desplazado en mi columna de Precio de Bitcoin para que las filas de precios "futuros" coincidan con las filas de predicción pasadas.

Otra cosa rara que he notado es que con este modelo no LSTM, tiene un error bastante alto al entrenar (MSE=0.07) que alcanza después de sólo 5-9 Epochs y luego no baja más. No creo que esto sea relevante porque el modelo LSTM que utilicé antes alcanzaba MSE=0.005 y todavía tenía el mismo problema de retraso pero pensé en mencionarlo.

Cualquier consejo, sugerencia o enlace sería enormemente apreciado. No puedo por la vida de mí averiguar lo que está pasando.

0 votos

¿Puedo preguntarle, dado que intenta predecir datos de series temporales por adelantado, cuál es el MSE que espera poder reproducir? ¿Ha comparado este MSE con un modelo sencillo como: ¿"predecir el precio a 24 horas al precio actual"?

0 votos

@Attack68 Realmente no tengo un MSE objetivo, y no lo he comparado con un modelo como el que describes porque he descubierto que esos modelos simples tienen un MSE engañosamente bajo (~0.03) (cuando todas las variables se normalizan a media=0, sd=1), pero son terribles para la predicción porque simplemente replican valores pasados.

3voto

Dave Sherohman Puntos 25122

Algunos consejos:

  1. No prediga el precio directamente, establezca que su variable objetivo es la rentabilidad (relativa). como has mencionado tu modelo se entrena muy rápido (sólo 5-9 épocas) y luego el error no se reduce. Sospecho que tu red neuronal sólo predice el último precio + algo de ruido. (también se puede ver en sus gráficos como la predicción sólo se retrasa el valor real)

  2. Pruebe primero sus características en un modelo más sencillo, como la regresión lineal (o logística, si trata de predecir la dirección de los precios). Compare los resultados con la red neuronal.

  3. ejecutar la validación cruzada (dividir las series temporales en trozos que no se solapen, con algún espacio entre ellos para asegurarse de no filtrar información del futuro)

  4. Los modelos complejos, como las redes neuronales con muchas capas ocultas, dependen en gran medida de la calidad de las características de entrada.

  5. Poner shuffle en falso. Es es en un modelo de predicción de series temporales, el barajado no hace más que filtrar información futura, lo que hace que el modelo sea demasiado optimista (es decir, en la configuración en vivo la predicción de su modelo será mucho peor que la probada en el pasado)

0 votos

1. Pero, ¿cómo predice mi red neuronal el último precio+ruido si NINGUNA de mis entradas contiene el precio? Todas son exógenas. 3. Eso es lo que he hecho. El primer gráfico es mi predicción fuera de muestra, mientras que el segundo gráfico es mi ajuste a los datos de entrenamiento. 4. ¿Lo hago eliminando variables una a una y viendo cómo se ve afectado el modelo?

0 votos

5. El cambio del orden aleatorio no parece cambiar los resultados de forma significativa, lo cual no es sorprendente, ya que no tengo series temporales ni datos retardados.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X