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

Metodi ensemble - bagging, random forest e boosting

In questa pagina 9
In questa pagina 4

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. 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.

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.

La derivazione, un passo alla volta.

  1. La media è un multiplo di una somma: fˉ=1TS\bar f=\frac1T S con S=∑tf^tS=\sum_t\hat f_t. Una costante aa esce dalla varianza al quadrato, Var⁡(aS)=a2Var⁡(S)\operatorname{Var}(aS)=a^2\operatorname{Var}(S) (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 →), quindi Var⁡(fˉ)=1T2Var⁡(S)\operatorname{Var}(\bar f)=\frac1{T^2}\operatorname{Var}(S): da qui il fattore 1T2\frac1{T^2}.
  2. La varianza di una somma di variabili non indipendenti è la somma di tutte le covarianze: Var⁡(S)=∑s∑tCov⁡(f^s,f^t)\operatorname{Var}(S)=\sum_{s}\sum_{t}\operatorname{Cov}(\hat f_s,\hat f_t), dove i termini con s=ts=t sono le varianze (Cov⁡(X,X)=Var⁡(X)\operatorname{Cov}(X,X)=\operatorname{Var}(X)) e gli altri le covarianze (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 →). Con TT variabili ci sono TT termini diagonali e T2−T=T(T−1)T^2-T=T(T-1) termini fuori diagonale.
  3. Il coefficiente di correlazione è ρ=Cov⁡(f^s,f^t)/(σ⋅σ)\rho=\operatorname{Cov}(\hat f_s,\hat f_t)/(\sigma\cdot\sigma), quindi ogni covarianza vale ρσ2\rho\sigma^2. Allora Var⁡(S)=Tσ2+T(T−1)ρσ2\operatorname{Var}(S)=T\sigma^2+T(T-1)\rho\sigma^2.
  4. Si divide per T2T^2 e si separa: Tσ2T2+T(T−1)ρσ2T2=σ2T+(T−1)ρσ2T=σ2T+ρσ2−ρσ2T=ρσ2+(1−ρ)σ2T.\dfrac{T\sigma^2}{T^2}+\dfrac{T(T-1)\rho\sigma^2}{T^2}=\dfrac{\sigma^2}T+\dfrac{(T-1)\rho\sigma^2}T=\dfrac{\sigma^2}T+\rho\sigma^2-\dfrac{\rho\sigma^2}T=\rho\sigma^2+\dfrac{(1-\rho)\sigma^2}T. Casi limite: se gli stimatori sono indipendenti (ρ=0\rho=0) i termini fuori diagonale sono nulli e resta σ2/T\sigma^2/T (varianza della media di TT variabili indipendenti, lo stesso risultato visto per il k-NN in Classificazione e k-nearest neighborsNella classificazione l'uscita $y$ è una categoria (con $C$ classi; $C=2$ è il caso binario). Il classificatore più semplice è il k-nearest neighbors: una nuova osservazione prende la classe più frequente (voto di maggioranza) tra i suoi $k$ vicini più prossimi nel training, con distanza euclidea $\sqrt{\sum(A_i-B_i)^2}$ o di Manhattan $\sum|A_i-B_i|$ (per la regressione si fa la media dei vicini). $k$ è un iperparametro: $k$ piccolo dà bordi frastagliati e overfitting, $k$ grande underfitting. È un metodo basato su istanze e «pigro» (nessun addestramento, costo alla predizione), sensibile a scala e feature irrilevanti e alla maledizione della dimensionalità; gli ingressi categorici si codificano con one-hot. Approfondimento: non nel programma di Telecomunicazioni.Classificazione e k-nearest neighbors →); se sono identici (ρ=1\rho=1) restano σ2\sigma^2 per qualunque TT, perché la media di TT copie dello stesso numero è quel numero. Una simulazione con numpy di T=10T=10 stimatori gaussiani con σ2=1\sigma^2=1 e ρ=0,5\rho=0{,}5 (400 000 prove) dà varianza della media 0,5480{,}548, contro il valore teorico 0,550{,}55.

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.

Grafico interattivo: Varianza della media di T alberi con σ² = 1 in funzione di T, per correlazione ρ = 0, 0,3 e 0,7: tende al pavimento ρσ² e non a zero, quindi più alberi aiutano solo finché la correlazione è bassa

Grafico interattivo: Varianza della media in funzione della correlazione ρ (σ² = 1): con T = 10 e T = 100 alberi la curva sale quasi linearmente con ρ; per T grandissimo è la retta ρσ², cioè solo la parte comune a tutti gli alberi

Perché serve anche abbassare ρ\rho, non solo aumentare TT (errore atteso contro numero di alberi). L'errore quadratico atteso di una previsione si scompone in bias2+varianza\text{bias}^2+\text{varianza} (più il rumore non eliminabile). La media di alberi ha lo stesso bias di un albero e la varianza ρσ2+1−ρTσ2\rho\sigma^2+\frac{1-\rho}T\sigma^2, quindi l'errore previsto in funzione di TT è bias2+ρσ2+1−ρTσ2\text{bias}^2+\rho\sigma^2+\frac{1-\rho}T\sigma^2: una curva che scende rapidamente per i primi alberi e si appiattisce su un valore finale. Con valori di esempio bias2=0,2\text{bias}^2=0{,}2, σ2=1\sigma^2=1, ρ=0,3\rho=0{,}3 (foresta casuale) oppure ρ=0,7\rho=0{,}7 (alberi simili, bagging senza feature bagging): errore con T=1T=1: 1,21{,}2 in entrambi i casi (un solo albero: 0,2+10{,}2+1); con T=10T=10: 0,2+0,3+0,07=0,570{,}2+0{,}3+0{,}07=0{,}57 contro 0,2+0,7+0,03=0,930{,}2+0{,}7+0{,}03=0{,}93; con T=∞T=\infty: 0,50{,}5 contro 0,90{,}9. Le curve sono un modello teorico, non un risultato di laboratorio; coincidono con quanto si osserva: l'errore di una foresta smette di calare dopo qualche decina di alberi e non risale (nessun overfitting da TT).

Grafico interattivo: Errore atteso della media di T alberi (modello teorico: bias² = 0,2; σ² = 1): la foresta casuale (ρ = 0,3) si assesta su 0,5, il bagging con alberi molto correlati (ρ = 0,7) su 0,9

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 calcolo, passo per passo.

  1. In una singola estrazione ogni campione ha probabilità 1n\frac1n di uscire (spazio uniforme: Spazi di probabilità discreti e uniformiIn uno spazio discreto la probabilità è determinata dalla densità discreta p(ω) = P({ω}), con somma 1, e P(A) è la somma di p(ω) sugli esiti di A; negli spazi uniformi (esiti equiprobabili) P(A) = |A| / |Ω|, casi favorevoli su casi possibili.Spazi di probabilità discreti e uniformi →), quindi probabilità 1−1n1-\frac1n di non uscire (Misura di probabilità e sue proprietàUna misura di probabilità è una funzione P: F → [0,1] con P(Ω) = 1 e σ-additiva; ne seguono P(Aᶜ) = 1 − P(A), P(∅) = 0, monotonia, P(A ∪ B) = P(A) + P(B) − P(A ∩ B) e la formula di inclusione-esclusione.Misura di probabilità e sue proprietà →, evento complementare).
  2. Le nn estrazioni sono indipendenti (si rimette il campione nell'urna), quindi la probabilità di non uscire mai è il prodotto delle nn probabilità uguali (Indipendenza di eventiA e B sono indipendenti se P(A ∩ B) = P(A) P(B), cioè se sapere che uno si è verificato non cambia la probabilità dell'altro; l'indipendenza passa ai complementari, non va confusa con l'incompatibilità, e per più eventi va richiesta su ogni sottofamiglia.Indipendenza di eventi →): (1−1n)n(1-\frac1n)^n.
  3. Il limite per n→∞n\to\infty è il limite notevole (1+xn)n→ex\big(1+\frac xn\big)^n\to e^x con x=−1x=-1 (Limiti notevoli di funzioniI limiti notevoli per le forme 0/0 (log(1+x)/x, (e^x − 1)/x, ((1+x)^α − 1)/x, sin x/x, (1 − cos x)/x², arctan x/x...) con le dimostrazioni, e la loro forma come asintoticità: log(1+f) ~ f, e^f − 1 ~ f, sin f ~ f, 1 − cos f ~ f²/2 quando f → 0.Limiti notevoli di funzioni →, Limiti di successioniUna successione ha limite l se, da un certo indice in poi, i suoi termini stanno vicini a l quanto si vuole; definizioni con epsilon, limiti infiniti e unicità.Limiti di successioni →). Si può vedere anche con i logaritmi: nln⁡(1−1n)≈n⋅(−1n)=−1n\ln(1-\frac1n)\approx n\cdot(-\frac1n)=-1, perché ln⁡(1+u)≈u\ln(1+u)\approx u per uu piccolo (Sviluppi di Mac-Laurin notevoliTabella degli sviluppi di Mac-Laurin da sapere a memoria (e^x, sin, cos, log(1+x), (1+x)^alpha, arctan, sinh, cosh, tan) e regole per combinarli: algebra degli o piccoli, prodotti, funzioni composte, quanti termini tenere.Sviluppi di Mac-Laurin notevoli →); quindi la potenza tende a e−1e^{-1}.
  4. Il complementare, la probabilità che un campione compaia almeno una volta, è 1−e−1=0,6321-e^{-1}=0{,}632, e il numero atteso di campioni distinti in un bootstrap è n(1−(1−1n)n)n(1-(1-\frac1n)^n), per esempio 6,516{,}51 su n=10n=10 (la linearità del valore atteso somma nn probabilità uguali: Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →).

Grafico interattivo: Probabilità che un campione non sia mai estratto in n estrazioni con rimpiazzo, (1 − 1/n)^n, e il suo limite 1/e = 0,368: già a n = 10 siamo vicini (0,349)

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.

Perché il voto di maggioranza aiuta (classificazione). Se TT alberi sono indipendenti e ciascuno indovina con probabilità p>12p>\tfrac12, il numero di alberi corretti è una variabile binomiale (Prove ripetute e modello binomialen prove indipendenti, ciascuna con probabilità di successo p: una sequenza con k successi ha probabilità p^k (1−p)^(n−k), e la probabilità di esattamente k successi è (n su k) p^k (1−p)^(n−k) (modello binomiale); il primo successo alla prova k ha probabilità (1−p)^(k−1) p.Prove ripetute e modello binomiale →) e la maggioranza è giusta quando i corretti sono almeno ⌊T/2⌋+1\lfloor T/2\rfloor+1. Con T=3T=3 e p=0,7p=0{,}7: P=(32)0,72 0,3+(33)0,73=3⋅0,49⋅0,3+0,343=0,441+0,343=0,784P=\binom32 0{,}7^2\,0{,}3+\binom33 0{,}7^3=3\cdot0{,}49\cdot0{,}3+0{,}343=0{,}441+0{,}343=0{,}784. Con T=5T=5 sale a 0,8370{,}837, con T=11T=11 a 0,9220{,}922, con T=101T=101 a 0,999990{,}99999: l'accuratezza della maggioranza supera quella del singolo albero (0,70{,}7). Il calcolo vale solo con alberi indipendenti, che nella pratica non sono (ρ>0\rho>0): per questo l'aumento è più lento, come nel grafico precedente, e si deve decorrelare.

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.

I due primi valori, calcolati. Radice: 5050 per classe, Gini⁡=1−3⋅(13)2=23=0,6667\operatorname{Gini}=1-3\cdot(\tfrac13)^2=\tfrac23=0{,}6667 (Alberi 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 →); la divisione isola le 5050 setosa (Gini 00) dalle altre 100100 (5050 versicolor e 5050 virginica, Gini 1−2⋅14=0,51-2\cdot\frac14=0{,}5), quindi ΔGini⁡=0,6667−(50150⋅0+100150⋅0,5)=0,6667−0,3333=0,3333\Delta\operatorname{Gini}=0{,}6667-\big(\tfrac{50}{150}\cdot0+\tfrac{100}{150}\cdot0{,}5\big)=0{,}6667-0{,}3333=0{,}3333, e il peso npN=150150=1\frac{n_p}{N}=\frac{150}{150}=1. Nodo con 100100 campioni: figli di 5454 (4949 versicolor e 55 virginica, Gini 1−(4954)2−(554)2=0,16801-(\tfrac{49}{54})^2-(\tfrac5{54})^2=0{,}1680) e di 4646 (Gini 0,04250{,}0425): ΔGini⁡=0,5−(0,54⋅0,1680+0,46⋅0,0425)=0,5−0,1103=0,3897\Delta\operatorname{Gini}=0{,}5-\big(0{,}54\cdot0{,}1680+0{,}46\cdot0{,}0425\big)=0{,}5-0{,}1103=0{,}3897, con peso 100150\frac{100}{150}, da cui 0,25980{,}2598. Il peso npN\frac{n_p}{N} conta quanta parte del training attraversa il nodo: una grande riduzione in un nodo con pochi campioni vale poco.

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}\ (\times\,e^{+\alpha_t}\text{ se errato, }\times\,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.

Da dove viene αt\alpha_t (passaggi). AdaBoost minimizza la perdita esponenziale ∑iwie−αyih(xi)\sum_iw_ie^{-\alpha y_ih(x_i)}, dove yih(xi)=+1y_ih(x_i)=+1 se lo stump è corretto sul campione ii e −1-1 se è errato. Raggruppando i campioni corretti (peso totale 1−ε1-\varepsilon) e quelli errati (peso totale ε\varepsilon): Z(α)=(1−ε)e−α+εeαZ(\alpha)=(1-\varepsilon)e^{-\alpha}+\varepsilon e^{\alpha}. Si deriva rispetto ad α\alpha (Regole di derivazioneDerivate delle funzioni elementari e delle loro inverse (arcsin, arctan, settcosh...) e regole di calcolo: linearità, prodotto (Leibniz), quoziente, funzione composta (regola della catena), funzione inversa, f(x)^g(x).Regole di derivazione →; (eα)′=eα(e^{\alpha})'=e^{\alpha}): Z′(α)=−(1−ε)e−α+εeα=0Z'(\alpha)=-(1-\varepsilon)e^{-\alpha}+\varepsilon e^{\alpha}=0, quindi e2α=1−εεe^{2\alpha}=\frac{1-\varepsilon}{\varepsilon} e, prendendo il logaritmo (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 →), α=12ln⁡1−εε\alpha=\frac12\ln\frac{1-\varepsilon}{\varepsilon}. La derivata seconda Z′′=(1−ε)e−α+εeα>0Z''=(1-\varepsilon)e^{-\alpha}+\varepsilon e^{\alpha}>0 garantisce che sia un minimo (Massimi e minimi relativi e teorema di Fermatx0 è punto di minimo (massimo) relativo se f(x0) ≤ f(x) (≥) per gli x del dominio vicini a x0. I candidati sono gli estremi del dominio, i punti dove f non è derivabile e i punti interni con f'(x0) = 0 (punti critici o stazionari). Teorema di Fermat: in un punto interno di minimo o massimo relativo dove f è derivabile, f'(x0) = 0. È solo una condizione necessaria: x³ in 0.Massimi e minimi relativi e teorema di Fermat →). Il valore minimo è Z=2ε(1−ε)Z=2\sqrt{\varepsilon(1-\varepsilon)}, che è anche la costante di normalizzazione dei pesi. Se ε=12\varepsilon=\tfrac12 (stump che indovina a caso) si ha α=0\alpha=0: voto nullo; se ε→0\varepsilon\to0, α→∞\alpha\to\infty.

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.

Da dove vengono le formule (passaggi, perdita quadratica). In una foglia con NN residui rir_i si cerca l'output oo che minimizza L(o)=∑i(ri−o)2+λo2L(o)=\sum_i(r_i-o)^2+\lambda o^2 (l'ultimo termine è la regolarizzazione che penalizza output grandi, come nella ridge: Overfitting, ridge regression e cross-validationUna 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 →).

  1. Derivata: L′(o)=−2∑i(ri−o)+2λo=−2∑iri+2No+2λoL'(o)=-2\sum_i(r_i-o)+2\lambda o=-2\sum_ir_i+2No+2\lambda o.
  2. Si pone L′(o)=0L'(o)=0 (Massimi e minimi relativi e teorema di Fermatx0 è punto di minimo (massimo) relativo se f(x0) ≤ f(x) (≥) per gli x del dominio vicini a x0. I candidati sono gli estremi del dominio, i punti dove f non è derivabile e i punti interni con f'(x0) = 0 (punti critici o stazionari). Teorema di Fermat: in un punto interno di minimo o massimo relativo dove f è derivabile, f'(x0) = 0. È solo una condizione necessaria: x³ in 0.Massimi e minimi relativi e teorema di Fermat →): (N+λ)o=∑iri(N+\lambda)o=\sum_ir_i, cioè o∗=∑riN+λo^*=\dfrac{\sum r_i}{N+\lambda}. Con λ=0\lambda=0 è la media dei residui, come nel gradient boosting; con λ>0\lambda>0 la media è «ristretta» verso 00. L′′=2(N+λ)>0L''=2(N+\lambda)>0: è un minimo.
  3. Si sostituisce o∗o^* in LL e si confronta con L(0)=∑ri2L(0)=\sum r_i^2 (nessuna correzione): la riduzione di perdita è L(0)−L(o∗)=∑ri2−[∑ri2−2o∗∑ri+(N+λ)o∗2]=2o∗∑ri−(N+λ)o∗2L(0)-L(o^*)=\sum r_i^2-\Big[\sum r_i^2-2o^*\sum r_i+(N+\lambda)o^{*2}\Big]=2o^*\sum r_i-(N+\lambda)o^{*2}. Poiché (N+λ)o∗=∑ri(N+\lambda)o^*=\sum r_i, i due termini valgono 2(∑r)2N+λ2\frac{(\sum r)^2}{N+\lambda} e (∑r)2N+λ\frac{(\sum r)^2}{N+\lambda}, e la differenza è (∑ri)2N+λ\dfrac{(\sum r_i)^2}{N+\lambda}: ecco la similarità, cioè la riduzione di perdita ottenuta da una foglia. Il gain è la riduzione ottenuta dividendo il nodo in due foglie (somma delle due similarità) meno quella che si avrebbe senza dividere (similarità del genitore); è positivo quando i due figli «spiegano» più residuo del genitore.

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

Un albero singolo ha varianza alta (Alberi 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 →). Un ensemble combina molti modelli semplici (weak learner, di solito alberi) per ridurre l'overfitting.

Perché mediare riduce la varianza

Formula (varianza della media di TT stimatori). Con varianza σ2\sigma^2 e correlazione ρ\rho tra ciascuna coppia: Var⁡(fˉ)=ρσ2+1−ρTσ2.\operatorname{Var}(\bar f)=\rho\sigma^2+\frac{1-\rho}{T}\sigma^2.

Derivazione: la varianza di S=∑tf^tS=\sum_t\hat f_t è la somma di TT varianze e T(T−1)T(T-1) covarianze ρσ2\rho\sigma^2 (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 →); Var⁡(fˉ)=Var⁡(S)/T2\operatorname{Var}(\bar f)=\operatorname{Var}(S)/T^2 (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 →).

Esempio. Con σ2=1\sigma^2=1 e T=10T=10: ρ=0⇒0,1\rho=0\Rightarrow0{,}1; ρ=0,5⇒0,55\rho=0{,}5\Rightarrow0{,}55; ρ=1⇒1\rho=1\Rightarrow1. Il termine ρσ2\rho\sigma^2 non sparisce aumentando TT: mediare serve solo se gli alberi sono poco correlati.

Errore atteso =bias2+ρσ2+1−ρTσ2=\text{bias}^2+\rho\sigma^2+\frac{1-\rho}{T}\sigma^2. Con bias2=0,2\text{bias}^2=0{,}2 e σ2=1\sigma^2=1: per ρ=0,3\rho=0{,}3 (foresta) l'errore scende a 0,50{,}5; per ρ=0,7\rho=0{,}7 (alberi simili) a 0,90{,}9. Modello teorico.

Bagging

Definizione (bagging, bootstrap aggregating). Per ogni albero si estrae dal training di nn campioni un campione bootstrap: nn estrazioni con rimpiazzo. Si addestra un albero per campione; si classifica per voto di maggioranza, si regredisce con la media.

Esempio. Con n=5n=5 un bootstrap possibile è {1,1,3,4,4}\{1,1,3,4,4\}: i campioni 2 e 5 restano fuori.

Formula (campioni distinti). Un campione non è mai estratto con probabilità (1−1n)n→e−1=0,368\left(1-\frac1n\right)^n\to e^{-1}=0{,}368. Per n=10n=10 vale 0,3490{,}349. Ogni albero vede circa il 63%63\% dei campioni distinti; il 37%37\% fuori (out-of-bag) può servire come validazione.

Passaggi: ogni estrazione lascia fuori il campione con probabilità 1−1n1-\frac1n; le nn estrazioni sono indipendenti, quindi il prodotto (Indipendenza di eventiA e B sono indipendenti se P(A ∩ B) = P(A) P(B), cioè se sapere che uno si è verificato non cambia la probabilità dell'altro; l'indipendenza passa ai complementari, non va confusa con l'incompatibilità, e per più eventi va richiesta su ogni sottofamiglia.Indipendenza di eventi →); il limite è e−1e^{-1} (Limiti notevoli di funzioniI limiti notevoli per le forme 0/0 (log(1+x)/x, (e^x − 1)/x, ((1+x)^α − 1)/x, sin x/x, (1 − cos x)/x², arctan x/x...) con le dimostrazioni, e la loro forma come asintoticità: log(1+f) ~ f, e^f − 1 ~ f, sin f ~ f, 1 − cos f ~ f²/2 quando f → 0.Limiti notevoli di funzioni →).

Il bagging riduce la varianza senza aumentare il bias: il bootstrap decorrela gli alberi mostrando a ciascuno un training diverso.

Esempio di voto. Con T=3T=3 alberi di accuratezza p=0,7p=0{,}7 indipendenti: P=(32)0,72 0,3+0,73=0,784P=\binom32 0{,}7^2\,0{,}3+0{,}7^3=0{,}784. Con T=5T=5 si ha 0,8370{,}837, con T=11T=11 si ha 0,9220{,}922 (Prove ripetute e modello binomialen prove indipendenti, ciascuna con probabilità di successo p: una sequenza con k successi ha probabilità p^k (1−p)^(n−k), e la probabilità di esattamente k successi è (n su k) p^k (1−p)^(n−k) (modello binomiale); il primo successo alla prova k ha probabilità (1−p)^(k−1) p.Prove ripetute e modello binomiale →). Il calcolo vale solo con alberi indipendenti, che nella pratica non sono.

Random forest

Definizione (random forest). Bagging più feature bagging: a ogni split si estrae a caso un sottoinsieme di p\sqrt p feature (con pp feature totali) e si sceglie lo split migliore solo tra quelle.

Senza il feature bagging, una feature molto forte finisce nella radice di quasi tutti gli alberi e li rende correlati (ρ\rho alto). Iperparametro principale: il numero di alberi TT, che non causa overfitting ma costa di più.

Formula (importanza di una feature). Per ogni nodo pp si calcola ΔGini⁡=Gini⁡(genitore)−(nsxnpGini⁡(sx)+ndxnpGini⁡(dx))\Delta\operatorname{Gini}=\operatorname{Gini}(\text{genitore})-\Big(\frac{n_{sx}}{n_p}\operatorname{Gini}(sx)+\frac{n_{dx}}{n_p}\operatorname{Gini}(dx)\Big), pesata per npN\frac{n_p}{N}. L'importanza è la somma sui nodi che usano la feature, poi media sugli alberi e normalizzazione.

Esempio (iris, profondità 3). Radice: Gini⁡=23\operatorname{Gini}=\tfrac23; la divisione isola le 5050 setosa e il resto ha Gini 0,50{,}5: Δ=0,6667−100150⋅0,5=0,3333\Delta=0{,}6667-\tfrac{100}{150}\cdot0{,}5=0{,}3333. Nodo da 100100 campioni: Δ=0,3897\Delta=0{,}3897, con peso 100150\tfrac{100}{150}, cioè 0,25980{,}2598. Larghezza del petalo: 0,3333+0,2598=0,59310{,}3333+0{,}2598=0{,}5931; lunghezza: 0,03390{,}0339. Normalizzando: 0,9460{,}946 e 0,0540{,}054, come feature_importances_ di scikit-learn.

Un'importanza alta dice che la feature serve al modello, non che causa il fenomeno (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) →).

Boosting

Definizione (boosting). Modelli deboli in sequenza: ciascuno corregge gli errori dei precedenti. La previsione è una somma pesata. Il bagging riduce la varianza; il boosting riduce il bias ed è sensibile al rumore.

Gradient boosting (regressione)

Formula (gradient boosting). F0=yˉF_0=\bar y; residui ri=yi−Fm(xi)r_i=y_i-F_m(x_i); Fm+1=Fm+η hmF_{m+1}=F_m+\eta\,h_m, con hmh_m albero di regressione sui residui (poche foglie) e η\eta piccolo (per esempio 0,10{,}1). Nella foglia si mette la media dei residui.

Il residuo è il gradiente negativo della perdita quadratica 12(y−F)2\tfrac12(y-F)^2 (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 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 si adattano gli pseudo-residui y−py-p, con p=σ(F)p=\sigma(F) (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. y=[88,76,56,73,77,57]y=[88,76,56,73,77,57]: F0=71,2F_0=71{,}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]. Con η=0,1\eta=0{,}1 la prima osservazione va a 71,2+0,1⋅16,8=72,8871{,}2+0{,}1\cdot16{,}8=72{,}88. Dopo il primo albero i residui sono [15,1; 4,3; −13,7; 1,4; 5,4; −12,7][15{,}1;\ 4{,}3;\ -13{,}7;\ 1{,}4;\ 5{,}4;\ -12{,}7].

Piccoli passi, cioè η\eta piccolo, aumentano l'errore sul training ma migliorano la generalizzazione. Iperparametri: numero di alberi, η\eta, profondità.

AdaBoost

Usa stump (alberi con due foglie) e pesi diversi per i modelli. Per classi ±1\pm1: εt=∑i erratiwi,αt=12ln⁡1−εtεt,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 H(x)=\operatorname{sign}\Big(\sum_t\alpha_t h_t(x)\Big). I pesi dei campioni sbagliati crescono, poi si normalizzano.

Passaggi per α\alpha: si minimizza Z(α)=(1−ε)e−α+εeαZ(\alpha)=(1-\varepsilon)e^{-\alpha}+\varepsilon e^{\alpha} derivando (Regole di derivazioneDerivate delle funzioni elementari e delle loro inverse (arcsin, arctan, settcosh...) e regole di calcolo: linearità, prodotto (Leibniz), quoziente, funzione composta (regola della catena), funzione inversa, f(x)^g(x).Regole di derivazione →); Z′=0Z'=0 dà e2α=1−εεe^{2\alpha}=\frac{1-\varepsilon}{\varepsilon} (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 →). Se ε=12\varepsilon=\tfrac12 allora α=0\alpha=0.

Esempio. 55 campioni di peso 0,20{,}2, uno sbagliato: ε=0,2\varepsilon=0{,}2, α=12ln⁡4=0,693\alpha=\tfrac12\ln4=0{,}693. Dopo la normalizzazione il campione errato pesa 0,50{,}5 e gli altri 0,1250{,}125.

XGBoost

Formula (similarity, gain, output). Con λ\lambda di regolarizzazione e rir_i residui: Sim=(∑ri)2N+λ,Gain=Simsx+Simdx−Simgenitore,Output=∑riN+λ.\text{Sim}=\frac{\big(\sum r_i\big)^2}{N+\lambda},\qquad \text{Gain}=\text{Sim}_{sx}+\text{Sim}_{dx}-\text{Sim}_{\text{genitore}},\qquad \text{Output}=\frac{\sum r_i}{N+\lambda}. Nell'output la somma non è al quadrato. Si sceglie la soglia con gain massimo.

Passaggi: l'output oo minimizza ∑i(ri−o)2+λo2\sum_i(r_i-o)^2+\lambda o^2; la derivata si annulla per o∗=∑riN+λo^*=\frac{\sum r_i}{N+\lambda} (Massimi e minimi relativi e teorema di Fermatx0 è punto di minimo (massimo) relativo se f(x0) ≤ f(x) (≥) per gli x del dominio vicini a x0. I candidati sono gli estremi del dominio, i punti dove f non è derivabile e i punti interni con f'(x0) = 0 (punti critici o stazionari). Teorema di Fermat: in un punto interno di minimo o massimo relativo dove f è derivabile, f'(x0) = 0. È solo una condizione necessaria: x³ in 0.Massimi e minimi relativi e teorema di Fermat →). Sostituendo, la riduzione di perdita è (∑ri)2N+λ\frac{(\sum r_i)^2}{N+\lambda}, cioè la similarità.

Esempio. Dosaggi [10,20,25,35][10,20,25,35], residui [−10,5; 6,5; 7,5; −7,5][-10{,}5;\ 6{,}5;\ 7{,}5;\ -7{,}5], λ=0\lambda=0. Radice: somma −4-4, Sim =164=4=\frac{16}{4}=4. Soglia «dosaggio <15<15»: sinistra {−10,5}\{-10{,}5\} con Sim 110,25110{,}25; destra {6,5;7,5;−7,5}\{6{,}5;7{,}5;-7{,}5\} con somma 6,56{,}5, Sim 42,253=14,08\frac{42{,}25}{3}=14{,}08; gain =110,25+14,08−4=120,33=110{,}25+14{,}08-4=120{,}33. Soglia «<22,5<22{,}5» dà gain 44; soglia «<30<30» dà 56,3356{,}33. Si sceglie <15<15.

Potatura con γ\gamma. Dal basso verso l'alto si toglie un ramo se Gain−γ<0\text{Gain}-\gamma<0. Esempio. Con γ=130\gamma=130 il ramo con gain 140,17140{,}17 resta, ma la radice con gain 120,33120{,}33 si pota solo se anche il ramo sotto è potato.

Regolarizzazione. Con λ=1\lambda=1 la radice vale 3,23{,}2 e il gain diventa 62,4862{,}48. Con λ>0\lambda>0 le foglie con pochi residui contano meno.

Predizione. La nuova predizione è vecchia + ε⋅Output+\,\varepsilon\cdot\text{Output}, con tasso ε=0,3\varepsilon=0{,}3 (default di XGBoost). Esempio. Per il dosaggio 1010 con λ=0\lambda=0: 0,5+0,3⋅(−10,5)=−2,650{,}5+0{,}3\cdot(-10{,}5)=-2{,}65.

Altre varianti: LightGBM (istogrammi, crescita per foglia), CatBoost (feature categoriche), stacking (un meta-modello sopra modelli diversi).

Errori tipici:

  • pensare che più alberi in una random forest causino overfitting: la varianza si stabilizza;
  • dimenticare il feature bagging: gli alberi diventano correlati;
  • usare un η\eta troppo grande nel boosting;
  • confondere la similarità (numeratore al quadrato) con l'output della foglia (numeratore non al quadrato);
  • scambiare il ruolo dei due metodi: il bagging riduce la varianza, il boosting il bias;
  • leggere l'importanza delle feature come causalità: è distorta per le feature con molti valori.

Esercizi su questo argomento

Teoria collegata