Salta al contenuto
Note per Studenti Metodi ensemble - bagging, random forest e boosting

Metodi ensemble - bagging, random forest e boosting

In questa pagina 9

L'albero di decisioneUn albero di decisione partiziona i dati con una sequenza di regole su una sola variabile alla volta (nodi interni = regole, foglie = predizioni: classe più frequente, oppure media del target in regressione). Si costruisce in modo ricorsivo scegliendo a ogni nodo la divisione che rende i figli più «puri»: con l'entropia $H=-\sum p_i\log_2p_i$ e il guadagno d'informazione $IG=H(S)-\sum\frac{|S_v|}{|S|}H(S_v)$ (ID3), oppure con l'indice di Gini $1-\sum p_i^2$ e soglie $x\le t$ su variabili numeriche (CART); in regressione con MSE o riduzione di varianza. Un albero pienamente sviluppato fa overfitting (varianza alta): si limita con la profondità massima (pre-potatura) o con la potatura a costo-complessità $R_\alpha(T)=R(T)+\alpha|T|$ (post-potatura). Pro: interpretabile, niente normalizzazione, predizione immediata; contro: varianza alta, da cui le foreste. Programma di Telecomunicazioni: Decision Trees e Random Forests.Alberi di decisione → è interpretabile e veloce ma è un classificatore ad alta varianza. I metodi ensemble combinano molti modelli semplici (weak learner, di solito alberi) in uno più robusto (Lezione 16 · Alberi di decisione e random forest, Lezione 17 · Metodi ensemble basati su alberi). Tutti cercano di superare l'overfitting degli alberi singoli (1) costruendo più alberi, (2) imponendo vincoli su dati, feature, struttura o apprendimento, (3) combinandone le uscite. Gli esercizi sono Esercizio - ID3 con potatura e foresta casuale sul dataset Titanic, Esercizio - Gradient boosting per la regressione sul dataset housing, Esercizio - Importanza delle feature di un albero sul dataset wine e Esercizio - Curva ROC e AUC di una foresta casuale e di un albero (Lezione 18 · Laboratorio sui metodi ad albero).

Perché mediare riduce la varianza

Siano f^1,…,f^T\hat f_1,\dots,\hat f_T stimatori (per esempio le previsioni di TT alberi) con la stessa varianza σ2\sigma^2 e correlazione ρ\rho tra due qualunque di essi. La media fˉ=1T∑tf^t\bar f=\frac1T\sum_t\hat f_t ha varianza Var⁡(fˉ)=1T2(∑tVar⁡(f^t)+∑s≠tCov⁡(f^s,f^t))=1T2(Tσ2+T(T−1)ρσ2)=ρσ2+1−ρTσ2.\operatorname{Var}(\bar f)=\frac1{T^2}\Big(\sum_t\operatorname{Var}(\hat f_t)+\sum_{s\ne t}\operatorname{Cov}(\hat f_s,\hat f_t)\Big)=\frac1{T^2}\big(T\sigma^2+T(T-1)\rho\sigma^2\big)=\rho\sigma^2+\frac{1-\rho}T\sigma^2. (Si è usata la varianza di una somma di variabili correlate, Varianza e momentiI momenti E[X^k] e i momenti centrati E[(X − μ)^k] descrivono la forma di una legge; la varianza Var(X) = E[(X − μ)²] = E[X²] − E[X]² misura quanto X si disperde attorno alla media, vale Var(aX + b) = a² Var(X) e Var(X) = 0 solo se X è costante.Varianza e momenti → e Covarianza e coefficiente di correlazioneCov(X, Y) = E[(X − E X)(Y − E Y)] = E[XY] − E[X]E[Y] misura quanto X e Y variano insieme; è bilineare, Cov(X, X) = Var(X), Var(X + Y) = Var X + Var Y + 2Cov(X, Y); ρ = Cov / (σ_X σ_Y) sta in [−1, 1] e vale ±1 solo per legami lineari. Indipendenti ⇒ non correlate, ma non viceversa (tranne per i vettori gaussiani).Covarianza e coefficiente di correlazione →: ci sono TT varianze e T(T−1)T(T-1) coppie ordinate, ciascuna con covarianza ρσ2\rho\sigma^2.) Con σ2=1\sigma^2=1: per ρ=0\rho=0 (alberi indipendenti) la varianza è 1/T1/T, cioè 0,10{,}1 con T=10T=10 e 0,010{,}01 con T=100T=100; per ρ=0,5\rho=0{,}5 vale 0,550{,}55 con T=10T=10 e 0,5050{,}505 con T=100T=100; per ρ=1\rho=1 (alberi uguali) resta 11.

Quindi mediare riduce la varianza, ma solo se gli alberi sono poco correlati: la parte ρσ2\rho\sigma^2 non scompare aumentando TT. Tutto il bagging serve a rendere gli alberi diversi.

Bagging

Definizione (bagging, bootstrap aggregating). Per costruire una foresta di TT alberi: per ciascun albero si estrae dal training di nn campioni un campione bootstrap, cioè nn campioni con rimpiazzo (ogni estratto è rimesso nell'urna prima della successiva); si addestra un albero su ciascun campione; per classificare si fa il voto di maggioranza (la moda), per la regressione la media.

Con il rimpiazzo alcuni campioni compaiono più volte e altri mai. La probabilità che un dato campione non sia mai estratto in nn estrazioni è (1−1n)n(1-\frac1n)^n, che tende a e−1=0,368e^{-1}=0{,}368 (Esponenziale e logaritmoLa funzione esponenziale a^x (base positiva diversa da 1) e la sua inversa, il logaritmo in base a, con grafici e proprietà.Esponenziale e logaritmo →; per n=10n=10 vale 0,3490{,}349, per n=100n=100 0,3660{,}366): ogni albero vede circa il 63%63\% dei campioni distinti, e il restante 37%37\% (out-of-bag) può servire come validazione. Esempio: con n=5n=5 un campione bootstrap possibile è {1,1,3,4,4}\{1,1,3,4,4\} (i campioni 2 e 5 sono fuori).

Il bagging riduce la varianza senza aumentare il bias: la previsione di un solo albero è molto sensibile al rumore del suo training, la media di molti alberi non lo è, finché non sono correlati; il bootstrap «decorrela» gli alberi mostrando a ciascuno un training diverso.

Esempio di voto. Con T=4T=4 alberi che predicono [2,2,1,2][2,2,1,2] per un campione: classe 22 con 33 voti su 44, «confidenza» 0,750{,}75 (la frazione di voti per la classe vincente). Nel laboratorio (dataset wine, T=4T=4 alberi di profondità 2) l'accuracy sul test è 0,9190{,}919 e gli errori hanno confidenza 0,750{,}75 o 0,50{,}5.

Random forest

Definizione (random forest). Bagging in più: a ogni split di ogni albero, invece di valutare tutte le feature se ne estrae a caso un sottoinsieme (tipicamente p\sqrt p, con pp feature) e si sceglie lo split migliore solo tra queste (feature bagging).

Perché. Se una o poche feature sono predittori molto forti, compaiono nella radice di quasi tutti gli alberi e li rendono correlati (cioè ρ\rho alto): la riduzione di varianza svanisce. Il feature bagging obbliga ad esplorare altre feature e abbassa ρ\rho.

Caratteristiche. Iperparametro principale: il numero di alberi TT (ne basta «abbastanza»; più alberi non causano overfitting ma costano di più). Pro: multiclasse, nessuna normalizzazione dei dati, parte costosa fatta offline, classificazione quasi immediata, accuratezza molto alta. Contro: calcolo oneroso (ma parallelizzabile), minore interpretabilità (non del tutto: vedi l'importanza delle feature). Si usa anche per la regressione (media).

Esempio (laboratorio, wine, feature bagging, T=10T=10). Accuracy sul test 0,9730{,}973 con profondità 2 e 4 e 1,01{,}0 con profondità 10; un solo albero di profondità 2-3 dava 0,9460{,}946-0,9730{,}973.

Importanza delle feature

Definizione (importanza di una feature). La misura di quanto una feature è utile alle previsioni, basata su quanto riduce l'impurità quando è usata per dividere. È un approccio «globale» di intelligenza artificiale spiegabile (Explainable AI (XAI)approfondimento: non nel programma di Telecomunicazioni. L'interpretabilità è l'arte di produrre descrizioni di un modello abbastanza semplici da essere capite da un umano; la spiegabilità aggiunge la completezza (permettere di anticipare la previsione). I metodi si classificano in intrinseci o post-hoc, agnostici o specifici del modello, globali o locali. Modelli intrinsecamente interpretabili: regressione lineare (pesi $\beta_j$, intervalli di confidenza, LASSO per la sparsità), regressione logistica ($\log\frac y{1-y}=\beta_0+\sum\beta_jx_j$), alberi. Importanza nelle foreste: MDI $=\sum_{\text{nodi}}\frac{n_p}{n_{TOT}}\Delta Gini$ (con feature selection bias). Metodi agnostici: permutation importance (aumento dell'errore dopo aver mescolato una feature), PDP $\hat f_S(x_S)=\frac1n\sum_if(x_S,x_C^{(i)})$ (media delle curve ICE), LIME (modello semplice locale pesato sui punti perturbati), SHAP (valori di Shapley: media dei contributi marginali su tutti gli ordini, somma $=f(x)-f(\text{base})$). Per le reti profonde: mappe di salienza, Grad-CAM, occlusione. Valutazione: livello applicativo, umano, funzionale. Lab: cardiopatia AHD con logistica, LASSO, random forest, ICE, PDP, SHAP.Explainable AI (XAI) →): dà informazioni sull'intero modello.

Con la Gini, per ogni albero: (1) a ogni nodo interno pp la riduzione di impurità è ΔGini⁡=Gini⁡(genitore)−(nsxnpGini⁡(sx)+ndxnpGini⁡(dx))\Delta\operatorname{Gini}=\operatorname{Gini}(\text{genitore})-\big(\frac{n_{sx}}{n_p}\operatorname{Gini}(\text{sx})+\frac{n_{dx}}{n_p}\operatorname{Gini}(\text{dx})\big), pesata per npN\frac{n_p}{N} (NN campioni totali); (2) l'importanza di una feature è la somma di queste riduzioni sui nodi che la usano; (3) nella foresta si media sugli alberi; (4) (opzionale) si normalizza a somma 11.

Esempio (iris, albero di profondità 3). Nodi: radice (150 campioni) con la larghezza del petalo: 150150⋅0,3333=0,3333\frac{150}{150}\cdot0{,}3333=0{,}3333; nodo «larghezza >0,8>0{,}8» (100 campioni, di nuovo larghezza): 100150⋅0,3897=0,2598\frac{100}{150}\cdot0{,}3897=0{,}2598; due nodi con la lunghezza del petalo: 54150⋅0,0824=0,0297\frac{54}{150}\cdot0{,}0824=0{,}0297 e 46150⋅0,0135=0,0042\frac{46}{150}\cdot0{,}0135=0{,}0042. Importanza grezza: larghezza 0,3333+0,2598=0,59310{,}3333+0{,}2598=0{,}5931, lunghezza 0,0297+0,0042=0,03390{,}0297+0{,}0042=0{,}0339; normalizzando (divisione per la somma 0,62700{,}6270): 0,9460{,}946 e 0,0540{,}054 (coincide con feature_importances_ di scikit-learn). Sul dataset wine le feature più importanti sono proline, intensità del colore e flavonoidi.

Come usarla. Per eliminare le feature quasi irrilevanti, capire il fenomeno, guidare la raccolta dati.

Boosting: l'idea

Definizione (boosting). Si costruisce un modello forte (strong learner) combinando in sequenza molti modelli deboli (alberi con pochi split); ciascun nuovo modello cerca di correggere gli errori dei precedenti. La combinazione è una somma pesata.

Il bagging addestra gli alberi in parallelo e riduce la varianza; il boosting li addestra in sequenza e riduce il bias, ma è sensibile al rumore.

Metodo Idea di base Combinazione Caratteristiche
Bagging alberi su sottoinsiemi casuali dei dati media / voto riduce la varianza, parallelizzabile
Random forest bagging + feature casuali media / voto ottima base di partenza
Boosting modelli in sequenza che correggono gli errori somma pesata riduce il bias, sensibile al rumore
AdaBoost ripesa i campioni mal classificati somma pesata semplice, usa stump
Gradient boosting adatta i gradienti della perdita somma pesata perdite flessibili; può andare in overfitting senza regolazione
XGBoost gradient boosting regolarizzato, con potatura e ottimizzazioni somma pesata veloce, regolarizzato, gestisce i valori mancanti
LightGBM basato su istogrammi, crescita per foglia somma pesata molto veloce, poca memoria
CatBoost gestisce nativamente le feature categoriche somma pesata evita l'overfitting
Stacking modelli diversi + un meta-modello meta-modello molto flessibile, rischio di overfitting senza cross-validation

Gradient boosting (regressione)

Si ripete: (1) si parte da una predizione costante (la media dei target); (2) si calcolano i residui ri=yi−F(xi)r_i=y_i-F(x_i); (3) si addestra un albero di regressione che predice i residui, con un vincolo sul numero massimo di foglie (da 8 a 32 in pratica; 4 nell'esempio); (4) si aggiorna F←F+η hF\leftarrow F+\eta\,h, con il tasso di apprendimento η\eta piccolo (per esempio 0,10{,}1); (5) si ripete finché i residui sono piccoli o si raggiunge il numero massimo di alberi. Nella foglia con più residui si mette la media dei residui.

Formula (gradient boosting). F0=yˉF_0=\bar y,  ri=yi−Fm(xi)\ r_i=y_i-F_{m}(x_i),  Fm+1(x)=Fm(x)+η hm(x)\ F_{m+1}(x)=F_m(x)+\eta\,h_m(x). Predizione finale: FM(x)=F0+η∑mhm(x)F_M(x)=F_0+\eta\sum_mh_m(x).

Perché si chiama «gradient». Per la perdita quadratica ℓ=12(y−F)2\ell=\tfrac12(y-F)^2 il gradiente rispetto alla predizione è ∂ℓ/∂F=−(y−F)\partial\ell/\partial F=-(y-F), quindi il residuo è il gradiente negativo della perdita (Differenziabilità e gradientef è differenziabile in x0 se f(x) = f(x0) + ∇f(x0)·(x − x0) + o(‖x − x0‖): vicino a x0 il grafico si confonde con il piano tangente z = f(x0) + ∇f(x0)·(x − x0). Differenziabile ⇒ continua, derivabile e D_v f = ∇f·v; derivate parziali continue ⇒ differenziabile. Il gradiente indica la direzione di massima crescita (pendenza ‖∇f‖) ed è ortogonale alle curve di livello.Differenziabilità e gradiente →): ogni nuovo albero fa un passo di discesa del gradiente nello spazio delle funzioni (LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →). Per la classificazione con log-verosimiglianza si adattano gli pseudo-residui y−py-p (p=σ(F)p=\sigma(F), la probabilità prevista) e la probabilità finale è p=σ(FM(x))p=\sigma(F_M(x)) (Regressione logistica e softmaxLa regressione lineare non è adatta alla classificazione (valori fuori da [0,1], retta tirata dai punti lontani). La regressione logistica passa il predittore lineare dalla sigmoide $\sigma(z)=1/(1+e^{-z})$ e interpreta $\hat y=\sigma(x^T\beta)$ come $P(y=1\mid x)$: si predice la classe 1 se $\hat y\ge0{,}5$, cioè $x^T\beta\ge0$ (bordo lineare). L'errore quadratico dà una funzione non convessa; si usa la log-verosimiglianza negativa $-\sum[y\log\hat y+(1-y)\log(1-\hat y)]$, convessa, con gradiente $X^T(\hat y-y)$ e nessuna formula chiusa (discesa del gradiente). Per più classi: one-vs-one ($C(C-1)/2$ classificatori, voto), one-vs-all ($C$ classificatori, massima probabilità), o la softmax $p_c=e^{z_c}/\sum_ke^{z_k}$ con cross-entropia. Si può regolarizzare (ridge, LASSO, Elastic Net) e la cross-validation si fa stratificata. Approfondimento: non nel programma di Telecomunicazioni.Regressione logistica e softmax →).

Esempio (dalle slide). Pesi osservati y=[88,76,56,73,77,57]y=[88,76,56,73,77,57] (altezza, colore preferito, genere come feature). Predizione iniziale: la media 71,271{,}2 (esattamente 71,1771{,}17). Residui: [16,8; 4,8; −15,2; 1,8; 5,8; −14,2][16{,}8;\ 4{,}8;\ -15{,}2;\ 1{,}8;\ 5{,}8;\ -14{,}2]. Primo albero con 4 foglie: {−14,2,−15,2}→−14,7\{-14{,}2,-15{,}2\}\to-14{,}7 (media), {4,8}→4,8\{4{,}8\}\to4{,}8, {1,8,5,8}→3,8\{1{,}8,5{,}8\}\to3{,}8, {16,8}→16,8\{16{,}8\}\to16{,}8. Con η=0,1\eta=0{,}1 la prima osservazione passa da 71,271{,}2 a 71,2+0,1⋅16,8=72,8871{,}2+0{,}1\cdot16{,}8=72{,}88 e il nuovo residuo è 88−72,88=15,1288-72{,}88=15{,}12 (prima 16,816{,}8: ha fatto un «piccolo passo» nella direzione giusta). Residui dopo il primo albero: [15,1; 4,3; −13,7; 1,4; 5,4; −12,7][15{,}1;\ 4{,}3;\ -13{,}7;\ 1{,}4;\ 5{,}4;\ -12{,}7]. Secondo albero: foglie −13,2-13{,}2, 4,34{,}3, 3,43{,}4, 15,115{,}1; residui dopo il secondo: [13,6; 3,9; −12,4; 1,1; 5,1; −11,4][13{,}6;\ 3{,}9;\ -12{,}4;\ 1{,}1;\ 5{,}1;\ -11{,}4]. Ad ogni albero i residui si riducono (l'errore quadratico medio sul training passa da 129129 a circa 105105 e 8585).

Perché piccoli passi. Con η=0,1\eta=0{,}1 si perde accuratezza sul training (si usa solo una piccola parte di ciascun albero) nella speranza di una migliore generalizzazione (meno overfitting e meno varianza): l'evidenza empirica mostra che «molti piccoli passi nella direzione giusta» danno previsioni migliori sul test. Gli iperparametri tipici: numero di alberi, tasso di apprendimento, profondità o numero di foglie.

Nel laboratorio (wine). GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3): accuracy sul test 1,01{,}0; implementazione da zero per la regressione con alberi a criterio MSE e foglie con media.

AdaBoost

AdaBoost (adaptive boosting) è molto simile ma con due differenze: (1) usa solo stump, alberi con una sola decisione (2 foglie); (2) i modelli hanno pesi diversi nella somma finale (nel gradient boosting tutti gli alberi sono scalati dallo stesso fattore). I campioni mal classificati ricevono più peso nello stump successivo. Le formule standard (non nelle slide), per classi ±1\pm1 e pesi wiw_i che sommano a 11: εt=∑i erratiwi,αt=12ln⁡1−εtεt,wi←wi e∓αtZt (× e+αt se errato, × e−αt se corretto),H(x)=sign⁡(∑tαtht(x)),\varepsilon_t=\sum_{i\,\text{errati}}w_i,\qquad\alpha_t=\frac12\ln\frac{1-\varepsilon_t}{\varepsilon_t},\qquad w_i\leftarrow\frac{w_i\,e^{\mp\alpha_t}}{Z_t}\ (\text{× }e^{+\alpha_t}\text{ se errato, × }e^{-\alpha_t}\text{ se corretto}),\qquad H(x)=\operatorname{sign}\Big(\sum_t\alpha_th_t(x)\Big), con ZtZ_t che normalizza i pesi.

Esempio. 5 campioni con pesi 0,20{,}2 e uno stump che ne sbaglia uno: ε=0,2\varepsilon=0{,}2, α=12ln⁡0,80,2=12ln⁡4=0,693\alpha=\tfrac12\ln\frac{0{,}8}{0{,}2}=\tfrac12\ln4=0{,}693. Il campione errato passa a 0,2 e0,693=0,40{,}2\,e^{0{,}693}=0{,}4, gli altri a 0,2 e−0,693=0,10{,}2\,e^{-0{,}693}=0{,}1 (somma 0,80{,}8): dopo la normalizzazione l'errato pesa 0,50{,}5 e ciascuno degli altri 0,1250{,}125. Il prossimo stump è addestrato in modo che l'errore precedente conti metà del totale.

XGBoost

XGBoost è un approccio di stato dell'arte, pieno di trucchi implementativi; qui si vede la parte concettuale. Sfrutta: (1) il boosting (alberi in sequenza); (2) un modo nuovo di costruire gli alberi, sempre basato sui residui; (3) la regolarizzazione.

Punteggio di similarità e guadagno. Si parte da una predizione iniziale (per esempio 0,50{,}5) e si calcolano i residui. Un nodo con residui simili (stesso segno e grandezza) è «buono». Per misurarlo:

Formula (similarity score, gain, output). Con λ\lambda parametro di regolarizzazione: Similarity=(∑residui)2Nresidui+λ,Gain=Simsx+Simdx−Simgenitore,Output=∑residuiNresidui+λ.\text{Similarity}=\frac{\big(\sum\text{residui}\big)^2}{N_{\text{residui}}+\lambda},\qquad \text{Gain}=\text{Sim}_{\text{sx}}+\text{Sim}_{\text{dx}}-\text{Sim}_{\text{genitore}},\qquad \text{Output}=\frac{\sum\text{residui}}{N_{\text{residui}}+\lambda}. Attenzione: nell'output la somma non è al quadrato.

Si provano tutte le soglie e si sceglie quella con gain massimo.

Esempio (dalle slide). Dosaggi [10,20,25,35][10,20,25,35] mg, efficacia [−10,7,8,−7][-10,7,8,-7], predizione iniziale 0,50{,}5: residui [−10,5; 6,5; 7,5; −7,5][-10{,}5;\ 6{,}5;\ 7{,}5;\ -7{,}5], con λ=0\lambda=0. Radice: somma =−4=-4, similarità (−4)24=4\frac{(-4)^2}{4}=4. Soglia «dosaggio <15<15»: sinistra {−10,5}\{-10{,}5\}: 110,251=110,25\frac{110{,}25}{1}=110{,}25; destra {6,5; 7,5; −7,5}\{6{,}5;\ 7{,}5;\ -7{,}5\} (somma 6,56{,}5): 42,253=14,08\frac{42{,}25}{3}=14{,}08; gain =110,25+14,08−4=120,33=110{,}25+14{,}08-4=\mathbf{120{,}33}. Soglia «<22,5<22{,}5»: sinistra {−10,5; 6,5}\{-10{,}5;\ 6{,}5\} (somma −4-4): 162=8\frac{16}{2}=8; destra {7,5; −7,5}\{7{,}5;\ -7{,}5\} (somma 0): 00; gain =8+0−4=4=8+0-4=4. Soglia «<30<30»: sinistra (somma 3,53{,}5): 12,253=4,08\frac{12{,}25}{3}=4{,}08; destra {−7,5}\{-7{,}5\}: 56,2556{,}25; gain =4,08+56,25−4=56,33=4{,}08+56{,}25-4=56{,}33. Si sceglie «dosaggio <15<15». Il ramo destro {6,5;7,5;−7,5}\{6{,}5;7{,}5;-7{,}5\} si divide ancora con «<30<30»: sinistra {6,5;7,5}\{6{,}5;7{,}5\} (somma 14): 1962=98\frac{196}2=98; destra {−7,5}\{-7{,}5\}: 56,2556{,}25; gain =98+56,25−14,08=140,17=98+56{,}25-14{,}08=140{,}17 (profondità massima 2 nell'esempio; in pratica 6).

Potatura con γ\gamma. Una volta costruito l'albero si pota dal basso verso l'alto: si sceglie una soglia γ\gamma (iperparametro di XGBoost) e si toglie un ramo se Gain−γ<0\text{Gain}-\gamma<0. Con γ=130\gamma=130: il nodo con gain 140,17140{,}17 ha 140,17−130=10,17>0140{,}17-130=10{,}17>0, quindi resta; la radice ha gain 120,33<130120{,}33<130, ma non si può potare perché il ramo sotto non è stato potato. Con γ=150\gamma=150: 140,17−150<0140{,}17-150<0 (si pota) e poi 120,33−150<0120{,}33-150<0 (si pota anche la radice): l'albero scompare. Un valore alto di γ\gamma previene l'overfitting.

Regolarizzazione λ\lambda. Con λ>0\lambda>0 le similarità sono più piccole, e la riduzione è tanto maggiore quanto meno residui ha il nodo (λ=1\lambda=1: radice 164+1=3,2\frac{16}{4+1}=3{,}2; sinistra 110,252=55,12\frac{110{,}25}{2}=55{,}12; destra 42,254=10,56\frac{42{,}25}{4}=10{,}56; gain =55,12+10,56−3,2=62,48=55{,}12+10{,}56-3{,}2=62{,}48). Questo rende più facile potare e riduce la sensibilità a singole osservazioni.

Predizione. In inferenza ogni foglia restituisce Output=∑rN+λ\text{Output}=\frac{\sum r}{N+\lambda} (non è la similarità): per la foglia con residui 6,5; 7,5; −7,56{,}5;\ 7{,}5;\ -7{,}5 ed λ=1\lambda=1: 6,53+1=1,625\frac{6{,}5}{3+1}=1{,}625; con λ=0\lambda=0 è la media: {6,5;7,5}→7\{6{,}5;7{,}5\}\to7, {−10,5}→−10,5\{-10{,}5\}\to-10{,}5, {−7,5}→−7,5\{-7{,}5\}\to-7{,}5. La nuova predizione è vecchia+ε⋅Output\text{vecchia}+\varepsilon\cdot\text{Output}, con ε\varepsilon (eta) il tasso di apprendimento (default 0,30{,}3 in XGBoost): per il dosaggio 1010: 0,5+0,3⋅(−10,5)=−2,650{,}5+0{,}3\cdot(-10{,}5)=-2{,}65 (residuo −10−(−2,65)=−7,35-10-(-2{,}65)=-7{,}35, minore di prima); per i dosaggi 20,2520,25: 0,5+0,3⋅7=2,60{,}5+0{,}3\cdot7=2{,}6; per 3535: 0,5+0,3⋅(−7,5)=−1,750{,}5+0{,}3\cdot(-7{,}5)=-1{,}75. Si continua ad aggiungere alberi finché i residui sono molto piccoli o si raggiunge il massimo.

Altre caratteristiche citate: penalità L1L_1 e L2L_2 (regolarizzazione come nella ridgeUna buona prestazione sul training non basta: serve stimare quella su dati nuovi. La cross-validation (K-fold: $k$ parti, ciascuna a turno come test, errore medio; Monte Carlo: $k$ divisioni casuali con quota di test $q$; leave-one-out se $k=n$) evita di dipendere da una sola divisione casuale. L'errore atteso si scompone in $\text{bias}^2+\text{varianza}+\sigma^2$: i modelli semplici fanno underfitting (bias alto), quelli complessi overfitting (varianza alta). La regolarizzazione aggiunge alla perdita una penalità: la ridge regression minimizza $|y-X\beta|^2+\lambda\sum_{j\ge1}\beta_j^2$ e ha soluzione $\beta=(X^TX+\lambda\tilde I)^{-1}X^Ty$ (l'intercetta non si penalizza, le feature si standardizzano): riduce i coefficienti, rende l'inversa stabile con feature collineari, e $\lambda$ è un iperparametro scelto con la validazione (cross-validation annidata per non contaminare il test).Overfitting, ridge regression e cross-validation → e nel LASSOIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →), algoritmo basato su istogrammi per cercare gli split più velocemente, potatura in profondità, passo adattivo, campionamento di colonne e righe. LightGBM è più veloce con crescita per foglia, CatBoost tratta nativamente le variabili categoriche.

Codice

python
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from xgboost import XGBClassifier

rf  = RandomForestClassifier(n_estimators=200, max_features="sqrt", random_state=0).fit(X_train, y_train)
gb  = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=0).fit(X_train, y_train)
xgb = XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=0).fit(X_train, y_train)
print(rf.feature_importances_)            # importanza globale delle feature (Gini)
python
# bagging da zero: campione bootstrap e voto di maggioranza
def bootstrap_sample(X, y):
    idx = np.random.choice(len(X), size=len(X), replace=True)   # con rimpiazzo
    return X[idx], y[idx]

Errori tipici

  • Pensare che aggiungere alberi a una random forest faccia overfitting: la varianza si stabilizza.
  • Dimenticare il feature bagging: senza di esso gli alberi sono molto correlati.
  • Usare η\eta troppo grande nel boosting: si impara troppo in fretta e si va in overfitting.
  • Confondere similarity score (numeratore al quadrato, per scegliere gli split) e output della foglia (numeratore non al quadrato).
  • Confrontare bagging e boosting come se riducessero la stessa cosa: il primo riduce la varianza, il secondo il bias.
  • Interpretare l'importanza delle feature (basata sulla Gini) come causalità: misura solo quanto servono al modello, ed è distorta per feature con molti valori.

Versione ripasso

Teorema (media di stimatori correlati). TT stimatori con varianza σ2\sigma^2 e correlazione ρ\rho: Var⁡(fˉ)=ρσ2+1−ρTσ2\operatorname{Var}(\bar f)=\rho\sigma^2+\frac{1-\rho}{T}\sigma^2. Mediare riduce la varianza solo se gli alberi sono poco correlati.

Esempio. σ2=1\sigma^2=1, T=10T=10: ρ=0→0,1\rho=0\to0{,}1; ρ=0,5→0,55\rho=0{,}5\to0{,}55; ρ=1→1\rho=1\to1.

Bagging. Campione bootstrap: nn estrazioni con rimpiazzo (≈63%\approx63\% campioni distinti, (1−1n)n→e−1(1-\frac1n)^n\to e^{-1} fuori); voto di maggioranza (media in regressione); riduce la varianza senza aumentare il bias; confidenza = frazione di voti.

Random forest = bagging + a ogni split solo p\sqrt p feature (alberi meno correlati). Iperparametro: numero di alberi. Pro: multiclasse, nessuna normalizzazione, accuratezza alta; contro: costo, interpretabilità.

Formula (importanza). Imp(f)=∑nodi che usano fnpNΔGini⁡\text{Imp}(f)=\sum_{\text{nodi che usano }f}\frac{n_p}{N}\Delta\operatorname{Gini}, con ΔGini⁡=Gini⁡(gen.)−(nsxnpGini⁡(sx)+ndxnpGini⁡(dx))\Delta\operatorname{Gini}=\operatorname{Gini}(\text{gen.})-\big(\frac{n_{sx}}{n_p}\operatorname{Gini}(sx)+\frac{n_{dx}}{n_p}\operatorname{Gini}(dx)\big); media sugli alberi, poi normalizzazione.

Esempio. Iris profondità 3: larghezza 0,3333+0,25980{,}3333+0{,}2598, lunghezza 0,0297+0,00420{,}0297+0{,}0042; normalizzate 0,9460{,}946 e 0,0540{,}054.

Boosting. Alberi in sequenza, ciascuno corregge gli errori dei precedenti; somma pesata; riduce il bias, sensibile al rumore.

Formula (gradient boosting). F0=yˉF_0=\bar y; residuo r=y−Fr=y-F (= gradiente negativo di 12(y−F)2\frac12(y-F)^2); Fm+1=Fm+η hmF_{m+1}=F_m+\eta\,h_m con hmh_m albero (foglie limitate) sui residui; foglia = media dei residui; η\eta piccolo (0,10{,}1).

Esempio. y=[88,76,56,73,77,57]y=[88,76,56,73,77,57], media 71,271{,}2, residui [16,8;4,8;−15,2;1,8;5,8;−14,2][16{,}8;4{,}8;-15{,}2;1{,}8;5{,}8;-14{,}2]; dopo un albero con η=0,1\eta=0{,}1: [15,1;4,3;−13,7;1,4;5,4;−12,7][15{,}1;4{,}3;-13{,}7;1{,}4;5{,}4;-12{,}7].

AdaBoost. Stump (2 foglie); pesi diversi per i modelli; α=12ln⁡1−εε\alpha=\frac12\ln\frac{1-\varepsilon}{\varepsilon}; i campioni sbagliati si ripesano (esempio: ε=0,2⇒α=0,693\varepsilon=0{,}2\Rightarrow\alpha=0{,}693, l'errato passa da 0,20{,}2 a 0,50{,}5 dopo la normalizzazione).

Formula (XGBoost). Sim=(∑r)2N+λ\text{Sim}=\frac{(\sum r)^2}{N+\lambda}; Gain=Simsx+Simdx−Simgen\text{Gain}=\text{Sim}_{sx}+\text{Sim}_{dx}-\text{Sim}_{\text{gen}}; potatura se Gain−γ<0\text{Gain}-\gamma<0 (dal basso, non si pota la radice se il ramo resta); Output=∑rN+λ\text{Output}=\frac{\sum r}{N+\lambda} (numeratore non al quadrato); nuova predizione =vecchia+ε⋅Output=\text{vecchia}+\varepsilon\cdot\text{Output}, ε=0,3\varepsilon=0{,}3.

Esempio. Residui [−10,5;6,5;7,5;−7,5][-10{,}5;6{,}5;7{,}5;-7{,}5], λ=0\lambda=0: radice 44; soglia <15<15: 110,25+14,08−4=120,33110{,}25+14{,}08-4=120{,}33; <22,5<22{,}5: 44; <30<30: 56,3356{,}33. Con λ=1\lambda=1: radice 3,23{,}2, gain 62,4862{,}48.

Tabella. LightGBM (istogrammi, crescita per foglia), CatBoost (categoriche), stacking (meta-modello).

Errori tipici: credere che più alberi in una RF causino overfitting; senza feature bagging gli alberi sono correlati; η\eta troppo grande; confondere similarity e output; bagging riduce la varianza, boosting il bias.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata