Esercizio - Importanza delle feature di un albero sul dataset wine
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 5
Testo (laboratorio LAB5). Dataset wine: 178 vini, 13 misure chimiche, 3 classi (cultivar). Con una divisione stratificata (training : ; test ) addestrare un albero di decisione (Gini, profondità massima 4) e:
- calcolare l'importanza delle feature con la riduzione di impurità ponderata e normalizzata;
- spiegare come si estende a una foresta e che informazione dà;
- valutare l'accuracy per profondità 1, 2, 3.
Teoria usata: 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 → (Gini, profondità); Metodi ensemble - bagging, random forest e boostingUn albero da solo ha varianza alta; un ensemble combina molti modelli deboli. Bagging: ogni albero è addestrato su un campione bootstrap (n estrazioni con rimpiazzo, circa il 63% di campioni distinti) e si vota o si fa la media: riduce la varianza, perché la media di $T$ stimatori con varianza $\sigma^2$ e correlazione $\rho$ ha varianza $\rho\sigma^2+(1-\rho)\sigma^2/T$. Random forest = bagging + a ogni split solo $\sqrt p$ feature casuali (alberi meno correlati); l'importanza di una feature è la somma delle riduzioni di Gini pesate sui nodi in cui è usata. Boosting: alberi in sequenza, ciascuno corregge gli errori dei precedenti, e si riduce il bias. Gradient boosting: $F\leftarrow F+\eta h$ con $h$ albero sui residui (gradiente negativo della perdita), $\eta$ piccolo; AdaBoost: stump e pesi sui campioni sbagliati; XGBoost: similarity score $\frac{(\sum r)^2}{N+\lambda}$, gain, potatura con $\gamma$, output $\frac{\sum r}{N+\lambda}$. Programma di Telecomunicazioni: Random Forests; boosting come approfondimento.Metodi ensemble - bagging, random forest e boosting → (importanza delle feature, foreste); come uso interpretativo vedi 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) →.
Formula
Per ogni nodo interno che divide in sinistra e destra: L'importanza grezza di una feature è sui nodi che la usano; poi si divide per la somma di tutte le importanze (normalizzazione a ).
1. Calcolo
L'albero di profondità 4 ha come primi nodi:
| nodo | feature e soglia | campioni | Gini del nodo | Gini ponderato dei figli | contributo |
|---|---|---|---|---|---|
| radice | proline | ||||
| figlio | color_intensity | ||||
| nipote | flavanoids | ||||
| altri | flavanoids, magnesium, malic_acid, alcohol | restanti |
Sommando i contributi di tutti i nodi per ciascuna feature (per flavanoids ci sono tre nodi: ; per malic_acid due: ) si ottengono le importanze grezze: proline ; color_intensity ; flavanoids ; malic_acid ; magnesium ; alcohol ; le altre sette feature valgono . La somma è . Normalizzate (ogni valore diviso per ):
| feature | importanza |
|---|---|
| proline | |
| color_intensity | |
| flavanoids | |
| malic_acid | |
| magnesium | |
| alcohol | |
| tutte le altre |
(Gli stessi valori della tabella del notebook.) Tre feature (proline, intensità del colore e flavonoidi) spiegano l' della riduzione di impurità; sette feature non sono mai usate dall'albero.
2. Foreste e significato
In una foresta casuale si calcola l'importanza di ogni albero e se ne fa la media, poi si normalizza a somma ; con le foreste i valori sono più stabili perché non dipendono da un singolo albero (che può cambiare molto con piccoli cambiamenti dei dati). È un approccio globale di spiegabilità: dice quali variabili contano per l'intero modello, non perché una singola previsione sia stata presa (quella è un'analisi locale). Usi: scartare feature quasi inutili (efficienza), capire il fenomeno, indirizzare la raccolta dati. Cautela: misura quanto una feature serve al modello, non è una relazione causale, e favorisce le feature con molti valori distinti; due feature correlate si dividono l'importanza.
3. Profondità
Accuracy sul test: profondità 1: ; 2: ; 3: ; 4: (36 casi su 37 giusti). Con un solo split (proline) si separano male tre classi; con tre livelli l'accuracy è già al .
Codice
importances = np.zeros(13); N = tree.nodes[0].n_samples
for node in tree.nodes.values():
if node.feature is not None: # nodo interno
importances[node.feature] += node.n_samples / N * (node.impurity - node.split_impurity)
importances /= importances.sum()
# con scikit-learn: DecisionTreeClassifier(max_depth=4).fit(X, y).feature_importances_
# foresta: RandomForestClassifier(...).fit(X, y).feature_importances_