Neural Network regression negative performance
I have a problem with the performance of a multi layer perceptron regressor (neural network) and I cannot figure out why.
Task: I am trying to improve a time series prediction. I have predictions of a physical parameter of the last 4 years along with the quasi true values. I train the NN with the predictions for -7 days until +1 days around the day I am interested in as features, in order to obtain a better prediction for that day.
Problem: The output of the NN is worse than the feature for the day I am interested in, both for the training and the testing data. Both in terms of RMSE and MAE. I expected the output to be at least on the same level as the feature I input to the NN.
Método: Python con sklearn. Utilizo una búsqueda de cuadrícula con validación cruzada para obtener un buen hiperparámetro. Pruebo diferentes configuraciones de capas ocultas, funciones de activación, tasa de aprendizaje y fortalezas de penalización de regularización. Dividí los datos en 66% para entrenamiento y los datos restantes para pruebas.
Estoy muy agradecido por los consejos sobre cómo averiguar cuál es mi problema aquí.
EDITAR: Estoy usando sklearn.neural_network.MLPRegressor que proporciona 'identidad', 'logística', 'tanh' y 'relu' como funciones de activación y las he probado todas en la búsqueda de cuadrícula.
NO escale la matriz de características porque todas las características están en la misma unidad que la salida deseada y van desde aproximadamente -1 a +1.
EDIT2:
tuned_parameters = [{'hidden_layer_sizes': [int(2/3*number_features),
(int(2/3*number_features), int(4/9*number_features)),
(int(2/3*number_features), int(4/9*number_features), int(8/27*number_features))],
'alpha': 10.0 ** -np.arange(1, 4),
'activation': ["identity", "relu", "logistic", "tanh"],
'learning_rate': ['adaptive', "invscaling"],
'solver': ['lbfgs'],
'early_stopping': [True],
'max_iter': [600]}]
regr = GridSearchCV(MLPRegressor(), tuned_parameters, n_jobs=3, verbose=2)
regr.fit(feature_training_matrix, combined_training_target_vector)
Datos : Los datos de predicción que utilizo tienen la siguiente estructura: para todos los días de los últimos ~ 4 años se hicieron predicciones para los próximos 90 días. Tengo un archivo de texto con datos de -90d a + 90d para todos los días. Intento entrenar a la NN para estimar una mejor predicción para los próximos 10 días. Para esto, tomo de -7 hasta +1 días alrededor del día de predicción actual (1-10 días después de que el que se usa actualmente comienza a predecir) como características. Esto significa que la predicación del día que me interesa está incluida como característica.
feature example: [0.16272058, 0.13296574, 0.14213905, 0.25064893, 0.23302285,
0.21019931, 0.20733988, 0.1466959 , 0.17029025, 0.15876942]
corresponding target: 0.174652
Respuestas
Es muy posible que el modelo original ya haga un muy buen trabajo, no es posible mejorarlo. Por ejemplo, la verdadera relación entre las variables de entrada originales y el objetivo puede ser lineal, por lo que una red neuronal no agrega nada.
Como prueba, aumentaría hidden_layer_sizes y establecería early_stopping = False e incluso solo haría una búsqueda en la cuadrícula (sin CV): RMSE Training debería ser mejor que RMSE Feature. Lo más probable es que las pruebas de RMSE sean peores, pero al menos tendrá evidencia de que no hay otras circunstancias inesperadas (por ejemplo, un error en el código).
Tiene sentido usar predicciones de un modelo base como entradas. Especialmente si ese modelo base original está restringido de alguna manera, y espera que su nuevo modelo supere al original porque en el nuevo modelo no tiene esa restricción. Por ejemplo, el modelo original podría ser lineal (ARIMA o ARIMAX), mientras que el suyo no es lineal: una red neuronal.
Incluso si la verdadera relación entre las entradas y el objetivo no es lineal, aquí no tiene demasiado espacio de juego para una red neuronal (recuerde que queremos superar a un modelo base). Según tengo entendido, solo tiene ~ 4 * 365 observaciones. Puede sobreentrenar fácilmente con muchas neuronas, pero con solo unas pocas neuronas, el entrenamiento puede quedarse atascado en mínimos locales.