Machine Learning Academy · Lezione

Errore out-of-bag: validazione gratuita nella foresta

Abiliterà oob_score, comprenderà che ogni albero vede solo circa il 63% dei dati e utilizzerà i campioni OOB come insieme di validazione non distorto.

Lezione 3 di 413 passaggi

Errore out-of-bag: validazione gratuita nella foresta è una lezione Machine Learning Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Machine Learning Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Machine Learning Academy include 4 lezioni in totale.

Che cos'è l'errore out-of-bag?

Quando una Random Forest addestra ogni albero su un campione bootstrap, circa il 37% degli esempi di addestramento non viene incluso in quel campione. Questi esempi out-of-bag (OOB) sono invisibili all'albero durante l'addestramento, quindi la previsione dell'albero su di essi è una previsione onesta effettuata su dati tenuti da parte. Aggregando le previsioni OOB di tutti gli alberi che hanno escluso un determinato esempio, otteniamo una stima quasi non distorta dell'errore di generalizzazione del modello: è completamente gratuita e non richiede una suddivisione separata per la validazione.

Come viene calcolata la previsione OOB

Per ogni esempio di addestramento x_i, scikit-learn individua tutti gli alberi che non hanno visto x_i nel proprio campione bootstrap. Solo questi alberi votano per la previsione di x_i. La previsione OOB finale per x_i è il voto della maggioranza (classificazione) o la media (regressione) di tali alberi. Il processo viene eseguito per ogni esempio di addestramento, fornendo una previsione OOB per l'intero training set. Il confronto tra queste previsioni e le etichette reali produce l'errore OOB.

Abilitare il punteggio OOB in scikit-learn

Impostate oob_score=True quando create un RandomForestClassifier o un RandomForestRegressor. Dopo aver chiamato .fit(), l'attributo oob_score_ contiene l'accuratezza OOB (oppure R² per la regressione). Per ottenere previsioni OOB dettagliate per ogni campione, accedete a oob_decision_function_ (probabilità delle classi) o a oob_prediction_ (regressione). Il punteggio OOB è essenzialmente una stima della convalida incrociata leave-one-forest-out, calcolata gratuitamente come sottoprodotto dell'addestramento.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = load_breast_cancer(return_X_y=True)
rf = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=42)
rf.fit(X, y)

print('OOB score:', round(rf.oob_score_, 4))
cv_score = cross_val_score(rf, X, y, cv=5).mean()
print('5-fold CV score:', round(cv_score, 4))

Errore OOB e convalida incrociata

L'errore OOB approssima da vicino l'accuratezza della convalida incrociata (in genere con una differenza compresa tra l'1% e il 2%), ma viene calcolato con costo di addestramento aggiuntivo nullo. La convalida incrociata addestra il modello più volte (5 o 10 volte per una convalida a 5 o 10 fold), mentre il punteggio OOB utilizza un'unica esecuzione di addestramento. Il compromesso è il seguente: l'OOB richiede un numero sufficiente di alberi (in genere almeno 100) affinché ogni punto di addestramento sia out-of-bag in diversi alberi. Con foreste molto piccole, alcuni punti possono essere out-of-bag in un numero insufficiente di alberi e la stima OOB diventa rumorosa.

Il punteggio OOB in funzione di n_estimators

All'aumentare di n_estimators, il punteggio OOB si stabilizza. Con pochissimi alberi, alcuni esempi di addestramento possono risultare fuori dal sacchetto in appena 1-2 alberi, rendendo rumorose le predizioni per singolo esempio. Man mano che la foresta cresce, ogni esempio viene mediato su un numero maggiore di alberi OOB e la stima converge. Tracciare il punteggio OOB in funzione di n_estimators è un modo rapido per individuare il punto dei rendimenti decrescenti, ovvero il punto oltre il quale aggiungere altri alberi non migliora più significativamente il punteggio.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
for n in [10, 50, 100, 200, 500]:
    rf = RandomForestClassifier(n_estimators=n, oob_score=True, random_state=42)
    rf.fit(X, y)
    print(f'n_estimators={n:4d}: OOB={rf.oob_score_:.4f}')

OOB per le foreste di regressione

Per RandomForestRegressor, l'attivazione di oob_score=True restituisce per impostazione predefinita il punteggio R² sulle predizioni OOB. È inoltre possibile accedere a oob_prediction_, ovvero ai valori effettivamente predetti per ogni punto di addestramento dai relativi alberi OOB, e calcolare qualsiasi metrica preferita, come MAE o RMSE. Questa possibilità è utile quando R² non è la metrica adatta al problema, ad esempio quando interessa la scala assoluta degli errori.

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_absolute_error
import numpy as np

X, y = fetch_california_housing(return_X_y=True)
rfr = RandomForestRegressor(n_estimators=100, oob_score=True, random_state=42)
rfr.fit(X, y)

print('OOB R²:', round(rfr.oob_score_, 4))
oob_mae = mean_absolute_error(y, rfr.oob_prediction_)
print('OOB MAE:', round(oob_mae, 4))

Usare l'OOB per la regolazione degli iperparametri

Poiché il calcolo del punteggio OOB non comporta costi aggiuntivi, è possibile usarlo per esplorare rapidamente le configurazioni degli iperparametri senza riservare una partizione di validazione. È sufficiente iterare sui valori candidati, addestrare il modello una volta per ogni configurazione e confrontare oob_score_. Questo è particolarmente utile per una selezione rapida delle caratteristiche (rimuovere alcune caratteristiche e osservare la variazione dell'OOB) o per impostare max_features e min_samples_leaf. Tenga presente che, in contesti ad altissima dimensionalità, la stima OOB può essere leggermente ottimistica.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
results = []
for msl in [1, 3, 5, 10, 20]:
    rf = RandomForestClassifier(n_estimators=200, min_samples_leaf=msl, oob_score=True, random_state=42)
    rf.fit(X, y)
    results.append((msl, round(rf.oob_score_, 4)))

best = max(results, key=lambda x: x[1])
for msl, score in results:
    print(f'min_samples_leaf={msl:3d}: OOB={score}')
print('Best:', best)

Funzione decisionale OOB per le stime di probabilità

Dopo l'addestramento con oob_score=True, l'attributo oob_decision_function_ memorizza una matrice di forma (n_samples, n_classes) contenente le probabilità delle classi ricavate dalle predizioni OOB. Queste probabilità possono essere usate per tracciare curve di calibrazione, curve ROC o curve precision-recall direttamente sul set di addestramento, senza utilizzare il set di test. Questo è molto utile per diagnosticare il comportamento del modello nelle prime fasi dello sviluppo.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import roc_auc_score

X, y = load_breast_cancer(return_X_y=True)
rf = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=42)
rf.fit(X, y)

oob_probs = rf.oob_decision_function_[:, 1]  # prob of positive class
auc = roc_auc_score(y, oob_probs)
print('OOB AUC-ROC:', round(auc, 4))

Garantire una copertura OOB sufficiente

Un esempio di addestramento è coperto da un albero OOB se il campione bootstrap di quell'albero lo ha escluso. Per la legge dei grandi numeri, con un numero sufficiente di alberi ogni esempio avrà molti alberi OOB. Tuttavia, con dataset molto piccoli e pochi alberi, alcuni esempi potrebbero risultare OOB in appena 1-2 alberi, producendo predizioni individuali rumorose. Una regola pratica è usare almeno 100 alberi per ottenere stime OOB affidabili. È possibile verificare la copertura controllando che tutte le voci di oob_decision_function_ siano diverse da zero.

L'errore OOB nel flusso di lavoro ML completo

In un tipico flusso di lavoro con una Random Forest: (1) si esegue l'addestramento su tutti i dati etichettati disponibili con oob_score=True, (2) si usa il punteggio OOB per regolare gli iperparametri tramite iterazioni rapide, (3) una volta soddisfatti del risultato, si esegue nuovamente l'addestramento con gli iperparametri finali, continuando a usare l'OOB per ottenere un punteggio imparziale, e (4) si effettuano le predizioni sul vero set di test messo da parte una sola volta. Questo flusso consente di massimizzare l'uso dei dati di addestramento: non è mai necessario riservare una partizione di validazione, pur ottenendo durante lo sviluppo una stima affidabile delle prestazioni.

Considerazioni su memoria e velocità

L'attivazione del punteggio OOB richiede a scikit-learn di memorizzare ulteriori dati di supporto durante l'addestramento, aumentando leggermente l'uso della memoria. Per dataset molto grandi (milioni di righe) con molti alberi, questo sovraccarico può diventare significativo. In questi casi, usi invece un piccolo set messo da parte o una singola partizione di validazione. Tenga inoltre presente che le predizioni OOB sono disponibili solo per gli esempi di addestramento: per i nuovi esempi di test non ancora osservati è comunque necessario usare il modello nel modo consueto tramite .predict().

Verifica rapida

Verifichi la Sua comprensione dei concetti relativi all'errore Out-of-Bag trattati in questa lezione.

Riepilogo della lezione

In questa lezione ha imparato che: gli esempi OOB sono circa il 37% dei dati di addestramento esclusi da ciascun campione bootstrap, l'aggregazione delle predizioni OOB fornisce gratuitamente una stima imparziale dell'errore di generalizzazione e oob_score_ può essere usato per regolare rapidamente gli iperparametri senza una partizione di validazione separata. Nella prossima lezione esamineremo gli ensemble a voto, che combinano diversi tipi di modello.

Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Errore out-of-bag: validazione gratuita nella foresta» è gratuita?

Sì — il testo completo di «Errore out-of-bag: validazione gratuita nella foresta» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Machine Learning Academy, passa a CoddyKit PRO. Il corso Machine Learning Academy include 4 lezioni in totale.

Cosa imparerò in «Errore out-of-bag: validazione gratuita nella foresta»?

Abiliterà oob_score, comprenderà che ogni albero vede solo circa il 63% dei dati e utilizzerà i campioni OOB come insieme di validazione non distorto. Eserciti Machine Learning Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Machine Learning Academy?

Non è richiesta alcuna esperienza precedente. Machine Learning Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Errore out-of-bag: validazione gratuita nella foresta»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Machine Learning Academy?

Sì. Ogni lezione Machine Learning Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Bootstrap aggregation (bagging) spiegato
  2. Selezione casuale delle feature: il trucco del random forest
  3. Errore out-of-bag: validazione gratuita nella foresta
  4. Ensemble a votazione: hard vote e soft vote
← Torna a Machine Learning Academy