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:
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:
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.