Stima degli errori out-of-bag per il boost?


9

In Random Forest, ogni albero viene cresciuto in parallelo su un unico esempio di boostrap dei dati. Poiché ci si aspetta che ogni campione di boostrap contenga circa il 63% di osservazioni uniche, questo lascia circa il 37% di osservazioni che possono essere utilizzate per testare l'albero.

Ora, sembra che nel potenziamento del gradiente stocastico, ci sia anche una simile a quella in RF:OOBerror

Se bag.fraction è impostato su un valore maggiore di 0 (si consiglia 0,5), gbm calcola una stima out-of-bag del miglioramento delle prestazioni predittive. Valuta la riduzione della devianza su quelle osservazioni non utilizzate nella selezione del prossimo albero di regressione.

Fonte: Ridgeway (2007) , sezione 3.3 (pagina 8).

Ho difficoltà a capire come funziona / è valido. Di 'che sto aggiungendo un albero nella sequenza. Sto crescendo questo albero su un sottocampione casuale del set di dati originale. Ho potuto testare questo singolo albero sulle osservazioni che non sono state utilizzate per coltivarlo. Concordato. MA , poiché Boosting è sequenziale, sto piuttosto usando l' intera sequenza di alberi costruita finora per fornire una previsione per quelle osservazioni lasciate fuori. E c'è un'alta probabilità che molti degli alberi precedenti abbiano già visto queste osservazioni. Quindi il modello non viene realmente testato ad ogni round su osservazioni invisibili come con RF, giusto?

Quindi, come mai questo viene chiamato stima dell'errore "out-of-bag"? Per me, non sembra essere "fuori" da nessuna borsa poiché le osservazioni sono già state viste?


1
Vedi la discussione qui github.com/scikit-learn/scikit-learn/pull/1806 . Non sei il solo a esprimere preoccupazioni sul modo in cui vengono calcolate le stime OOB.
mpiktas,

grazie per il link, ma sfortunatamente tutti i partecipanti al thread sembrano essere persi come me!
Antoine,

1
In realtà no. Vedi github.com/scikit-learn/scikit-learn/pull/2188 . In questo commit il punteggio OOB viene modificato in miglioramento OOB nel modo in cui lo fa gbm. Non so come funzioni esattamente questa idea, ma da ciò che ho raccolto, il campione di oob per l'albero corrente viene utilizzato per calcolare il miglioramento OOB. Non sono riuscito a trovare le formule matematiche, quindi è necessario scavare nel codice gbm per vedere con che precisione viene calcolato questo miglioramento.
mpiktas,

@Antoine Domanda davvero eccitante! è stata trovata una risposta definitiva?
Soren Havelund Welling,

1
No, sfortunatamente. Alcuni suggerimenti sono forniti dai collegamenti precedenti (nei commenti), da questa discussione e da questa altra discussione . Questo mi sta facendo diventare completamente matto. Un giorno qualcuno dovrebbe inviare un'e-mail al dottor Friedman / Hastie ... Grazie per l'attenzione.
Antoine,

Risposte:


2

Rispondere solo parzialmente (e aggiungere una nuova domanda alla domanda).

L'implementazione di gbm in R http://www.rdocumentation.org/packages/gbm/functions/gbm ha due parametri per regolare alcuni fuori-bagness.

a) train.fractiondefinirà una proporzione dei dati utilizzati per addestrare tutti gli alberi e quindi 1- train.fractionsaranno veri e propri dati OOB (out-of-bag).

b) bag.fractiondefinirà la proporzione dei dati di allenamento da utilizzare nella creazione del prossimo albero nel boost. Pertanto potrebbero esserci alcuni dati che non vengono mai utilizzati per la creazione di alcun albero e possono essere realmente utilizzati come dati OOB (ma è improbabile, vedere la domanda di seguito)

Il che mi porta alla domanda. L'analisi del 37% dei dati come OOB è vera solo per UN albero. Ma la possibilità che ci siano dati che non vengono utilizzati in QUALSIASI albero è molto più piccola - (deve essere nella OOB per tutti alberi - la mia comprensione è che ogni albero fa il suo bootstrap). Quindi in RandomForests dovrebbe essere molto improbabile che ci sia un OOB per testare la foresta. Eppure l'implementazione randomForest in R (basata sul codice originale di Breiman) parla molto di OOB (ad esempio i dati dei risultati e vedi http://www.rdocumentation.org/packages/randomForest/functions/randomForest ) n t r e e0.37ntreesntreeerr.rateconfusion

Non so come rispondere (e ti ringrazio (+1) per aver posto la domanda e avermi fatto capire che non capisco questo aspetto di randomForests). La possibile soluzione è che esiste un solo bootstrap - e tutti gli alberi sono costruiti da esso - ma per quanto ne so, non è così.


Per RF / Bagging, non vi è alcun problema: in qualsiasi fase del processo di creazione dell'ensemble, qualsiasi osservazione nel set di dati originale può essere alimentata a tutti gli alberi che sono stati addestrati su campioni di boostrap privi di questa osservazione. Circa un terzo (~ 37%) del numero totale di alberi soddisferà questa condizione. Inoltre, lasciando votare questi alberi e prendendo la classe più popolare, è possibile ottenere una previsione per l'osservazione. Il numero di volte in cui la previsione differisce dalla vera etichetta dell'osservazione è stata calcolata in media su tutte le classi, fornisce la stima dell'errore out-of-bag
Antoine

1
inoltre, sembra che ciò che dà l'abilità di stima dell'errore OOB in Boosting non provenga dal train.fractionparametro (che è solo una caratteristica della funzione gbm ma non è presente nell'algoritmo originale) ma dal fatto che solo un sottocampione del i dati vengono utilizzati per addestrare ciascun albero nella sequenza, tralasciando le osservazioni (che possono essere utilizzate per i test). Che risale alla mia domanda originale. In che modo queste osservazioni possono essere utilizzate per i test poiché sono state probabilmente viste molte volte da molti alberi precedenti nella sequenza?
Antoine,

ho dimenticato di dire che ogni albero in RF è effettivamente costruito dal suo unico e unico campione bootstrap dei dati originali
Antoine,

@utente2835597 grazie per le tue spiegazioni sulla RF. Quindi un errore OOB di una RF sta davvero valutando solo 1/3 degli alberi nella foresta (ciò non mi sembra molto utile). Bene, imparando qualcosa ogni giorno.
Jacques Wainer,

Ad ogni modo, il parametro train.fraction sembra essere la risposta alla tua domanda. L'implementazione di sklearn ha anche un parametro simile, il sottocampione (vedi scikit-learn.org/stable/modules/generated/…
Jacques Wainer,

-2

Credo che facciano una stima fuori borsa per ogni passaggio. Poiché vengono aggiunti i risultati di tutti i passaggi (con coefficienti), è possibile aggiungere anche gli errori OOB con gli stessi coefficienti.

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.