Prestazioni negative di regressione della rete neurale
Ho un problema con le prestazioni di un regressore perceptron multistrato (rete neurale) e non riesco a capire perché.
Compito: sto cercando di migliorare una previsione di serie temporali. Ho previsioni di un parametro fisico degli ultimi 4 anni insieme ai valori quasi veri. Alleno l'NN con le previsioni per -7 giorni fino a +1 giorni intorno al giorno che mi interessa come caratteristiche, al fine di ottenere una migliore previsione per quel giorno.
Problema: l'output di NN è peggiore della funzionalità per il giorno a cui sono interessato, sia per i dati di allenamento che per i test. Sia in termini di RMSE che di MAE. Mi aspettavo che l'output fosse almeno allo stesso livello della funzione che ho inserito in NN.
Metodo: Python con sklearn. Uso una ricerca sulla griglia con convalida incrociata per ottenere un buon iperparametro. Provo diverse configurazioni di livelli nascosti, funzioni di attivazione, velocità di apprendimento e punti di forza della penalità di regolarizzazione. Ho diviso i dati nel 66% per la formazione e i dati rimanenti per i test.
Sono davvero grato per i suggerimenti su come capire qual è il mio problema qui.
EDIT: Sto usando sklearn.neural_network.MLPRegressor che fornisce "identità", "logistica", "tanh" e "relu" come funzioni di attivazione e le ho testate tutte nella ricerca della griglia.
NON ho ridimensionato la matrice delle caratteristiche perché tutte le caratteristiche sono nella stessa unità dell'output desiderato e vanno da circa -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)
Dati : i dati di previsione che utilizzo hanno la seguente struttura: per ogni giorno degli ultimi ~ 4 anni sono state fatte previsioni per i prossimi 90 giorni. Ho un file di testo con dati da -90d a + 90d per ogni giorno. Cerco di addestrare l'NN a stimare una previsione migliore per i prossimi 10 giorni. Per questo prendo da -7 a +1 giorni intorno al giorno di previsione corrente (1-10 giorni dopo l'inizio della previsione attualmente utilizzato) come caratteristiche. Ciò significa che la predizione del giorno che mi interessa è inclusa come caratteristica.
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
Risposte
È possibile che il modello originale svolga già un ottimo lavoro, non è possibile migliorarlo. Ad esempio, la vera relazione tra le variabili di input originali e l'obiettivo potrebbe essere lineare, quindi una rete neurale non aggiunge nulla.
Come test, aumenterei hidden_layer_sizes e imposterò early_stopping = False e anche solo facendo una ricerca sulla griglia (senza CV): RMSE Training dovrebbe essere migliore di RMSE Feature. Molto probabilmente il test RMSE sarà peggiore, ma almeno avrai la prova che non ci sono altre circostanze impreviste (ad es. Un bug nel codice).
Ha senso utilizzare le previsioni di un modello di base come input. Soprattutto se quel modello di base originale è in qualche modo vincolato e ti aspetti che il tuo nuovo modello superi quello originale perché nel nuovo modello non hai quel vincolo. Ad esempio, il modello originale potrebbe essere lineare (ARIMA o ARIMAX), mentre il tuo non è lineare: una rete neurale.
Anche se la vera relazione tra input e target non è lineare, non hai troppa stanza dei giochi qui per una rete neurale (ricorda che vogliamo superare un modello base). Da quanto ho capito hai solo ~ 4 * 365 osservazioni. Puoi facilmente sovrallenarti con molti neuroni, ma con solo pochi neuroni l'allenamento può bloccarsi nei minimi locali.