Salta al contenuto
Note per Studenti Esercizio - Isolation forest da zero e anomalie sul dataset delle abitazioni

Esercizio - Isolation forest da zero e anomalie sul dataset delle abitazioni

Esame

Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.

In questa pagina 3

Testo (laboratorio LAB6 e 3° appello 2025).

  1. Implementare da zero un isolation tree (split casuali, feature e soglia, profondità massima 88, profondità corretta d+c(n)d+c(n)) e una isolation forest (sottocampioni di 256256 punti, 100100 alberi, anomaly score 2−E[h]/c(n)2^{-E[h]/c(n)}, soglia dalla contaminazione).
  2. Sul dataset California Housing con le due variabili MedInc e AveRooms (20 640 punti): trovare i 10 e i 100 punti più anomali; iniettare 66 anomalie sintetiche e verificare che vengano trovate.
  3. (Appello) Con le sole colonne Longitude e Latitude del dataset delle abitazioni modificato (20 649 punti), identificare l'1%1\% di punti più anomali; commentare dove cadono.

Teoria usata: Anomaly detectionUn'anomalia (outlier) è un'osservazione che si discosta tanto dalle altre da far pensare che sia generata da un meccanismo diverso. Rilevarle serve come pulizia dei dati (solo se sono errori o rumore, non per migliorare artificialmente le metriche), come obiettivo finale (frodi, guasti, cybersicurezza) e per il monitoraggio di un modello in produzione. Metodi semplici: box plot (oltre $1{,}5,\mathrm{IQR}$), carte di controllo univariate ($\mu\pm3\sigma$) e la statistica multivariata di Hotelling $T^2=(x-\bar x)^TS^{-1}(x-\bar x)$ con soglia $\chi^2_{p,1-\alpha}$, valida per dati gaussiani e unimodali. Metodi non supervisionati multivariati danno un anomaly score: l'isolation forest isola ogni punto con split casuali (le anomalie hanno cammini corti) e calcola $s(x,n)=2^{-E(h(x))/c(n)}$, con soglia scelta dalla contaminazione. Senza etichette si valuta con esperti, eventi noti o anomalie sintetiche. Approfondimento: non nel programma di Telecomunicazioni.Anomaly detection → (isolation forest, c(n)c(n), contaminazione, valutazione con anomalie sintetiche); 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 → per la struttura ad albero; gli alberi di isolamento sono la parte non supervisionata di 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 →. Ripasso delle stesse idee: Esercizio - Albero di isolamento passo per passo (laboratorio di ripasso).

1. Implementazione

Normalizzazione c(n)c(n). c(n)=2H(n−1)−2(n−1)nc(n)=2H(n-1)-\frac{2(n-1)}n, con H(m)≈ln⁡m+0,5772H(m)\approx\ln m+0{,}5772; c(1)=0c(1)=0, c(2)=1c(2)=1. Per n=256n=256: c=10,25c=10{,}25.

Albero. Si parte da un sottocampione XX (256 punti):

  • foglia se il nodo ha ≤1\le1 punto, o la profondità è 88, o tutti i punti sono uguali; la profondità della foglia è d+c(nnodo)d+c(n_{\text{nodo}}) (correzione per i nodi interrotti con più punti);
  • altrimenti si sceglie a caso una feature ff e una soglia t∼U(min⁡Xf,max⁡Xf)t\sim U(\min X_f,\max X_f), e si divide in Xf≤tX_f\le t e Xf>tX_f>t.
python
class IsolationTree:
    def _build(self, X, depth, node_id):
        n = len(X)
        if n <= 1 or depth >= self.max_depth or all(len(np.unique(X[:, f])) == 1 for f in range(X.shape[1])):
            self.nodes[node_id] = Node(None, None, depth + c(n)); return    # foglia con profondità corretta
        f = np.random.randint(X.shape[1]); t = np.random.uniform(X[:, f].min(), X[:, f].max())
        self.nodes[node_id] = Node(f, t, depth)
        left = X[:, f] <= t
        self._build(X[left], depth + 1, 2 * node_id + 1); self._build(X[~left], depth + 1, 2 * node_id + 2)

Foresta. Per ognuno dei 100 alberi: sottocampione di 256256 punti senza rimpiazzo, albero. Score di xx: profondità media su tutti gli alberi E[h(x)]E[h(x)] e s=2−E[h]/c(256)s=2^{-E[h]/c(256)}. Soglia: percentile 100(1−contaminazione)100(1-\text{contaminazione}) degli score di training.

2. California Housing: MedInc e AveRooms

Con contaminazione 0,10{,}1: mediana degli score 0,420{,}42, soglia 0,520{,}52, massimo 0,810{,}81. I punti più anomali sono casi estremi:

rango MedInc AveRooms score
1 15,015{,}0 22,222{,}2 0,8140{,}814
2 10,310{,}3 24,624{,}6 0,8000{,}800
3 1,191{,}19 52,752{,}7 0,7980{,}798
4 0,920{,}92 37,037{,}0 0,7970{,}797
5 1,621{,}62 62,462{,}4 0,7920{,}792

(reddito altissimo con molte stanze, o reddito bassissimo con un numero enorme di stanze per abitazione: dati rari e quasi certamente atipici). Un punto «normale» ha score intorno a 0,40{,}4 perché è isolato solo dopo ≈13\approx13 split (profondità corretta), un outlier dopo 33-55.

Iniezione di 6 anomalie. Con media (μ1,μ2)=(3,87; 5,43)(\mu_1,\mu_2)=(3{,}87;\ 5{,}43) e deviazione standard (1,90; 2,47)(1{,}90;\ 2{,}47) si aggiungono 66 punti a (+7σ1,+3σ2)(+7\sigma_1,+3\sigma_2), (+3σ1,+10σ2)(+3\sigma_1,+10\sigma_2), (+6σ1,+5σ2)(+6\sigma_1,+5\sigma_2), (+4σ1,+12σ2)(+4\sigma_1,+12\sigma_2), (+3σ1,+8σ2)(+3\sigma_1,+8\sigma_2), (+4σ1,+3σ2)(+4\sigma_1,+3\sigma_2). Dopo il riaddestramento i ranghi dei sei punti iniettati nella classifica degli score sono 8, 9, 3, 2, 11, 728,\ 9,\ 3,\ 2,\ 11,\ 72 (su 20 64620\,646), con score 0,783; 0,782; 0,796; 0,807; 0,778; 0,7560{,}783;\ 0{,}782;\ 0{,}796;\ 0{,}807;\ 0{,}778;\ 0{,}756: cinque su sei sono nei primi 11 e superano quasi tutti i punti naturali del dataset. L'ultimo, (+4σ,+3σ)(+4\sigma,+3\sigma), è il meno estremo (a soli 44 e 33 deviazioni standard dalla media) e si confonde con le code naturali (rango 72, score 0,7560{,}756 comunque alto). Questa è la valutazione per iniezione sintetica (si veda Anomaly detectionUn'anomalia (outlier) è un'osservazione che si discosta tanto dalle altre da far pensare che sia generata da un meccanismo diverso. Rilevarle serve come pulizia dei dati (solo se sono errori o rumore, non per migliorare artificialmente le metriche), come obiettivo finale (frodi, guasti, cybersicurezza) e per il monitoraggio di un modello in produzione. Metodi semplici: box plot (oltre $1{,}5,\mathrm{IQR}$), carte di controllo univariate ($\mu\pm3\sigma$) e la statistica multivariata di Hotelling $T^2=(x-\bar x)^TS^{-1}(x-\bar x)$ con soglia $\chi^2_{p,1-\alpha}$, valida per dati gaussiani e unimodali. Metodi non supervisionati multivariati danno un anomaly score: l'isolation forest isola ogni punto con split casuali (le anomalie hanno cammini corti) e calcola $s(x,n)=2^{-E(h(x))/c(n)}$, con soglia scelta dalla contaminazione. Senza etichette si valuta con esperti, eventi noti o anomalie sintetiche. Approfondimento: non nel programma di Telecomunicazioni.Anomaly detection →): senza etichette si controlla almeno che gli outlier noti siano trovati. I punti naturali più anomali (per esempio quello con MedInc =15=15) restano comunque nelle prime posizioni (rango 1, 4, 5, ... nella classifica con le iniezioni).

Limite («bias»). Con gli split paralleli agli assi, nelle zone vuote tra i gruppi gli score possono restare bassi; per un esempio con due gruppi gaussiani ruotati il grafico degli score mostra zone scure (score basso, «normali») anche lontane dai cluster. Un nuovo punto lì non verrebbe segnalato.

3. Appello: solo latitudine e longitudine

Con contaminazione 0,010{,}01 (soglia: 99-esimo percentile degli score), 300300 alberi e sottocampioni di 10001000 punti si segnalano 207207 punti su 20 64920\,649 (1%1\%): score soglia 0,660{,}66, mediana 0,440{,}44. Dove cadono? Il 70%70\% degli anomali ha latitudine >39,5>39{,}5 (in tutto il dataset solo il 2,9%2{,}9\% dei distretti è lì, il nord scarsamente popolato della California), il 56%56\% ha longitudine <−123<-123 (costa nord-occidentale) e il 24%24\% longitudine >−117>-117 (deserto e zone orientali), mentre le zone dense (Los Angeles: score 0,390{,}39; San Francisco: 0,430{,}43) hanno score bassi. Il metodo individua quindi le zone poco popolate: sono «anomali» i distretti isolati, non per forza errori. Una domanda del tema: ci sono punti che a occhio sembrano anomali ma che il modello non segnala? Può succedere nelle zone vuote interne: per esempio il punto (−120,5; 35)(-120{,}5;\,35), in una zona poco popolare dell'interno, ha score 0,550{,}55, sotto la soglia 0,660{,}66. Le zone lontane dagli altri cluster ma che gli split casuali (paralleli agli assi) non riescono a isolare presto ottengono score moderati: è il limite del metodo già visto per il «bias» dell'isolation forest.

Variante meno casuale (domanda del tema). Per esempio non riusare una feature già usata nel ramo. Non ci si aspetta che migliori: con soli due feature dopo due split non ci sono più feature e l'albero si ferma, riducendo la capacità di isolare; la casualità è un punto di forza dell'algoritmo (medie su alberi diversi).

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata