La foresta casuale è troppo adatta


15

Sto cercando di usare la regressione casuale della foresta in scikits-learn. Il problema è che sto ricevendo un errore di test molto elevato:

train MSE, 4.64, test MSE: 252.25.

Ecco come appaiono i miei dati: (blu: dati reali, verde: previsto):

La regressione della foresta è stata pulita

Sto usando il 90% per l'allenamento e il 10% per il test. Questo è il codice che sto usando dopo aver provato diverse combinazioni di parametri:

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

Quali sono le possibili strategie per migliorare il mio adattamento? C'è qualcos'altro che posso fare per estrarre il modello sottostante? Mi sembra incredibile che dopo così tante ripetizioni dello stesso modello il modello si comporti così male con i nuovi dati. Ho qualche speranza di provare ad adattare questi dati?


Stai allenando questa funzione periodica con l'asse x come input e l'asse y come etichetta per x <= 245, e quindi testando per x> 245? O sto interpretando male la tua trama?
rrenaud,

tipo di, in realtà l'asse x è l'indice di osservazione, in totale ci sono 300 osservazioni, quindi da 245 in poi, cioè i dati di test non utilizzati per l'addestramento del modello, il vettore della caratteristica di input è costituito da numeri interi, ha forma (300,2) e assomiglia molto a una funzione lineare dell'indice di osservazione, quindi non ho aggiunto informazioni a riguardo per non complicare eccessivamente la domanda.
elyase,

1
Potresti voler rimuovere prima il ciclo (parte stagionale) dai tuoi dati (e la tendenza).
R. Prost

Hai esaminato l'analisi delle serie storiche? Non mi è chiaro cosa c'è sul tuo asse x ma mi sembra periodico. Controlla qui e fammi sapere se questo aiuta: otexts.org/fpp/7/5
Bram Van Camp

Risposte:


21

Penso che tu stia usando uno strumento sbagliato; se tutta la tua X è equivalente all'indice, stai fondamentalmente con qualche funzione campionata e stai cercando di estrapolarla. L'apprendimento automatico si basa sull'interpolazione della storia, quindi non sorprende che in questo caso ottenga risultati spettacolari.f:RR

Ciò di cui hai bisogno è un'analisi delle serie temporali (ovvero estrazione della tendenza, analisi dello spettro e autoregressing o HMMing il resto) o fisica (cioè pensare se esiste un ODE che può produrre tale output e cercare di adattare i suoi parametri tramite quantità conservate).


l'apprendimento automatico non è l'estrazione di modelli generalizzabili dai dati? Una volta che uno ha un certo insieme di quali interpola bene i dati, possiamo scegliere quelli con migliori proprietà di estrapolazione / generalizzazione usando ad esempio la validazione incrociata. C'è qualcosa di sbagliato nella mia comprensione?
elyase,

L'estrapolazione è diversa dalla generalizzazione: immagina di essere il soggetto di un esperimento seguente: vedi uno schermo e hai un pulsante rosso e verde. Innanzitutto, lo schermo mostra un video della stanza in cui sei stato premuto da un'altra persona sul pulsante verde per il gatto, il leone e la tigre mostrato su uno schermo e poi rosso per il lupo e il cane e in questo modo ha raccolto 5 deliziosi biscotti.

1
Ora, lo schermo mostra un gatto selvatico; esegui un'interpolazione corretta e generalizzabile della cronologia, premi il pulsante verde e ricevi una scossa elettrica invece di un cookie. Perché è successo? Perché la soluzione è un ciclo (gggrrr) e le immagini degli animali sono solo un inganno. Hai fatto lo stesso con la tua foresta, attirandolo in una stupida riproduzione del tuo set di allenamento nascondendo le informazioni reali.

Un buon esempio ma non vederlo come fai tu. Nel tuo esempio abbiamo i seguenti dati: una destinazione ( go r) e 2 caratteristiche ( index(temporale) e animal). Da questi dati ho potuto adattarsi a più modelli che possono dare più o meno peso alla caratteristica 1 o 2 (o uguale a entrambi). La convalida incrociata (presupponendo dati sufficienti) dovrebbe arrivare a un modello con caratteristica 2 (animale) di minore importanza. Vedo che il mio modello sta sovradimensionando i dati, ma penso ancora che dovrei essere in grado di estrarre un modello che segue questo modello (perché il comportamento non è cambiato) con uno spazio modello abbastanza grande.
elyase,

1
No; anche se si chiedono ulteriori dati, lo sperimentatore può ancora estendere l'inganno animale e offuscare ulteriormente il modello per renderlo non ovvio. Vale a dire, l'estrapolazione semplicemente non può essere fatta con l'apprendimento perché per definizione richiede informazioni che non sono presenti nella formazione - in questo modo è necessario applicare alcune ipotesi o raccogliere dati aggiuntivi in ​​modo che il problema diventi interpolazione.

9

Il problema più grande è che gli alberi di regressione (e gli algoritmi basati su di essi come foreste casuali) prevedono funzioni costanti a tratti, fornendo un valore costante per gli input che cadono sotto ogni foglia. Ciò significa che quando estrapolano al di fuori del loro dominio di addestramento, prevedono semplicemente lo stesso valore che avrebbero per il punto più vicino in cui avevano i dati di addestramento. @mbq ha ragione nel dire che esistono strumenti specializzati per l'apprendimento di serie temporali che probabilmente sarebbero migliori delle tecniche generali di apprendimento automatico. Tuttavia, le foreste casuali sono particolarmente dannose per questo esempio e probabilmente altre tecniche ML generali avrebbero prestazioni molto migliori di quelle che si vedono. Le SVM con kernel non lineari sono un'opzione che viene in mente. Poiché la tua funzione ha una struttura periodica, ciò suggerisce anche di lavorare sul dominio della frequenza,


AFAIK SVM ha lo stesso problema di foresta casuale. Non prevedono bene al di fuori dello spazio in cui sono stati addestrati. Probabilmente la rete neurale sarebbe una soluzione migliore
Donbeo,

Se i dati si trovano su una curva e il kernel è del tipo giusto per adattarsi a quella curva, un SVM sarà in grado di estrapolare lungo quella curva. se i dati hanno una tendenza lineare, un SVM lineare si adatterà alla linea estrapolando lungo quella linea. Kernel più complessi possono adattarsi ed estrapolare comportamenti più complessi. Dipende dall'avere il giusto tipo di kernel. Ciò non rende gli SVM lo strumento giusto per l'estrapolazione e la previsione TS, ma li rende migliori delle foreste casuali.
Daniel Mahler,

3

Questo è un esempio da manuale per l'over-fitting dei dati, il modello funziona molto bene su dati addestrati ma collassa su tutti i nuovi dati di test. Questa è una delle strategie per affrontare questo: effettuare una convalida incrociata di dieci volte dei dati di allenamento per ottimizzare i parametri.

Passaggio 1. Creare una funzione di minimizzazione MSE utilizzando l'ottimizzazione NM. Un esempio potrebbe essere visto qui: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

Passaggio 2. All'interno di questa funzione di minimizzazione, l'obiettivo è ridurre il MSE. Per fare ciò, creare una suddivisione di dieci volte dei dati in cui un nuovo modello viene appreso su 9 pieghe e testato sulla decima piega. Questo processo viene ripetuto dieci volte, per ottenere il MSE su ogni piega. L'MSE aggregato viene restituito come risultato dell'obiettivo.

Passaggio 3. L'Fmin in Python farà le iterazioni per te. Controlla quali iper parametri sono necessari per essere ottimizzati (n_estimators, max_features ecc.) E passali al fmin.

Il risultato saranno i migliori iperparametri che ridurranno la possibilità di sovra-adattamento.


Sì, sembra essere troppo adatto (cosa che normalmente non accade nella regressione casuale della foresta, quindi la domanda). Ora ho osservato che la modifica dei parametri ha scarso effetto con i registratori RF. Ora la validazione incrociata richiede un modello sottostante abbastanza flessibile da essere ottimizzato. Che tipo di modelli / algoritmo ML consigliate per questo tipo di dati.
elyase,

3

Alcuni suggerimenti:

  1. Ottimizza i tuoi parametri utilizzando un approccio a finestra mobile (il tuo modello deve essere ottimizzato per prevedere i valori successivi nelle serie temporali, non per prevedere i valori tra quelli forniti)
  2. Prova altri modelli (anche quelli più semplici, con la giusta selezione delle funzionalità e le strategie di ingegneria delle funzionalità, potrebbero rivelarsi più adatti al tuo problema)
  3. Cerca di apprendere trasformazioni ottimali della variabile target (ottimizza anche questa, c'è una tendenza lineare / esponenziale negativa, potresti essere in grado di stimarla)
  4. Analisi spettrale forse
  5. Sembra che i massimi / minimi siano equidistanti. Scopri dove vengono assegnate le tue funzioni (nessun input da parte dell'operatore, fai in modo che un algoritmo lo rilevi per rimuovere la distorsione) e aggiungilo come funzionalità. Ingegnerizza anche una funzione nearest maximum. Non so, potrebbe funzionare, o forse no, puoi solo sapere se lo provi :)

Ma, come affermato da Daniel nella sua risposta, la foresta casuale non funzionerà per questo tipo di problemi in base alla progettazione poiché non è in grado di prevedere valori al di fuori dell'intervallo osservato nel campione del treno. L'ottimizzazione dei parametri ecc. Non porta da nessuna parte.
Tim

1
Suggerimento n. 2 @Tim. E le foreste casuali non funzioneranno in modo ingenuo su questi dati, ma l'estrazione intelligente delle funzionalità potrebbe farlo funzionare.
Firebug


0

Dopo aver letto il post sopra, voglio dare un'altra risposta diversa.

Per i modelli basati su alberi, come la foresta casuale, non possono estrapolare il valore oltre il set di addestramento. Quindi, non penso che sia un problema eccessivo, ma una strategia di modellazione sbagliata.

Quindi, cosa possiamo fare per la previsione delle serie storiche con il modello ad albero?

Il modo possibile è combinarlo con la regressione lineare: in primo luogo, detrarre le serie temporali (o la tendenza della modellazione con la regressione lineare), quindi modellare il residuo con alberi (i residui sono limitati, quindi i modelli di alberi possono gestirlo).

Inoltre, esiste un modello ad albero combinato con la regressione lineare che può estrapolare, chiamato cubista, esegue una regressione lineare sulla foglia.


0

Se vuoi semplicemente prevedere entro i limiti del grafico, allora semplicemente randomizzare le osservazioni prima di dividere il set di dati dovrebbe risolvere il problema. Diventa quindi un problema di interpolazione da quello di estrapolazione come mostrato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.