Esercizio - Analisi esplorativa e preprocessing di un dataset sbilanciato (Adult)
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 7
Testo (1° appello 2025, parte 1). Dataset Adult (reddito), versione modificata: persone, target income-over-50k (vero se il reddito supera $), feature che riguardano capitale, titoli di studio, lavoro, stato civile e dati personali, più alcune feature aggiunte per l'esercizio (eye-diameter, favourite-color, quantum-decoherence). Rispondere ai TODO: aspetto del dataset che influenza divisione e metrica; significato dei valori unici; valori mancanti; correlazioni; distribuzioni; variabili categoriche; preprocessing per addestrare una regressione logistica nell'ordine corretto, con motivazioni.
Teoria usata: Statistica per il machine learningI dati di un problema ML si organizzano nella matrice di progetto $X$ ($n$ osservazioni, $p$ variabili). La statistica serve a capirli, ripulirli e prepararli: i momenti (media $\mu$, varianza $\sigma^2$, asimmetria, curtosi), i quartili con lo scarto interquartile $\mathrm{IQR}=Q_3-Q_1$ (all'esame senza interpolazione), la moda per i dati categorici. Con queste quantità si imputano i dati mancanti (media o mediana), si eliminano le variabili costanti e si standardizza con lo z-score $z=(x-\mu)/\sigma$, usando sempre media e deviazione standard del solo training set.Statistica per il machine learning → (valori mancanti, standardizzazione); Correlazione e visualizzazione dei datiLa correlazione di Pearson $r=\sum(X_i-\bar X)(Y_i-\bar Y)/\big(\sqrt{\sum(X_i-\bar X)^2}\sqrt{\sum(Y_i-\bar Y)^2}\big)\in[-1,1]$ misura la relazione lineare tra due variabili (covarianza divisa per le deviazioni standard); correlazione non implica causalità. Serve a capire quali variabili contano per il target e a eliminare quelle quasi duplicate (|r| molto alto). Gli indicatori di sintesi non bastano (quartetto di Anscombe, Datasaurus): vanno affiancati ai grafici: istogramma, KDE, box plot, violin plot, heatmap di correlazione, scatter plot e matrice di scatter plot.Correlazione e visualizzazione dei dati → (correlazione, box plot, violin plot, pair plot); Metriche di classificazioneIn classificazione binaria ogni previsione è vero positivo (TP), vero negativo (TN), falso positivo (FP, errore di tipo I) o falso negativo (FN, errore di tipo II). Da queste quattro quantità: accuracy $=\frac{TP+TN}{TP+TN+FP+FN}$, specificità $=\frac{TN}{TN+FP}$, precision $=\frac{TP}{TP+FP}$, recall $=\frac{TP}{TP+FN}$, e la loro media armonica $F_1=\frac{2PR}{P+R}$. Con dati sbilanciati l'accuracy inganna (un modello che predice sempre la classe maggioritaria ha 99%): si usano precision, recall, F1, ROC-AUC, la cross-validation stratificata e il riequilibrio con undersampling o oversampling (non SMOTE). Cambiando la soglia sulla probabilità si ottiene la curva ROC (TPR contro FPR) e l'area AUC. Approfondimento: non nel programma di Telecomunicazioni.Metriche di classificazione → (sbilanciamento, stratificazione); 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 → e 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 → (one-hot).
TODO 1: che cosa influenza divisione e metrica?
Il target è sbilanciato: solo il delle persone ha reddito sopra \3$ negativi per ogni positivo). Conseguenze:
- divisione: stratificata (training e test con la stessa proporzione), e per la valutazione cross-validation stratificata;
- metrica: l'accuracy è ingannevole (predire sempre «no» dà ); meglio precision, recall, , ROC-AUC;
- addestramento: alcuni algoritmi (regressione logistica, SVM, reti neurali) ottimizzano la classe maggioritaria e generalizzano male sulla minoritaria; si può riequilibrare con undersampling o oversampling (Metriche di classificazioneIn classificazione binaria ogni previsione è vero positivo (TP), vero negativo (TN), falso positivo (FP, errore di tipo I) o falso negativo (FN, errore di tipo II). Da queste quattro quantità: accuracy $=\frac{TP+TN}{TP+TN+FP+FN}$, specificità $=\frac{TN}{TN+FP}$, precision $=\frac{TP}{TP+FP}$, recall $=\frac{TP}{TP+FN}$, e la loro media armonica $F_1=\frac{2PR}{P+R}$. Con dati sbilanciati l'accuracy inganna (un modello che predice sempre la classe maggioritaria ha 99%): si usano precision, recall, F1, ROC-AUC, la cross-validation stratificata e il riequilibrio con undersampling o oversampling (non SMOTE). Cambiando la soglia sulla probabilità si ottiene la curva ROC (TPR contro FPR) e l'area AUC. Approfondimento: non nel programma di Telecomunicazioni.Metriche di classificazione →).
TODO 2: valori unici e tipi
Il numero di valori unici distingue feature categoriche da continue, insieme al significato e al tipo. Nel dataset: education valori, marital-status , race , sex , favourite-color categoriche. age valori, capital-gain , hours-per-week numeriche (anche se hanno meno valori distinti di righe). eye-diameter ha valori distinti su righe: continua pura. Nella soluzione si usa una soglia (più di valori unici continua), da accompagnare con il significato semantico.
TODO 3: valori mancanti
quantum-decoherence ha valori mancanti su (): va eliminata, quasi non contiene dati. workclass (, ), occupation () e native-country () hanno poche mancanze, tutte categoriche: si possono eliminare le righe (si perde circa il ) oppure sostituire i mancanti con la moda o con una nuova categoria «sconosciuto»: quest'ultima non cancella dati e rende l'assenza stessa un'informazione.
TODO 4-5: correlazioni e distribuzioni
Si calcola la correlazione di Pearson di ogni feature numerica con il target (mappato a ) e tra le feature. Risultati: age , hours-per-week , capital-gain (le più alte), capital-loss , eye-diameter (trascurabile). eye-diameter ha correlazione nulla con il target e non è correlata con nessun'altra variabile: si può rimuovere. Non ci sono correlazioni forti tra feature, quindi nessuna è ridondante.
Istogrammi e describe(): eye-diameter ha distribuzione normale; capital-gain e capital-loss sono zero per il e il dei casi con pochi valori molto grandi (media e deviazione standard gonfiate dagli outlier, i percentili ne mostrano la natura); hours-per-week ha un picco molto alto a .
TODO 6-9: variabili categoriche
- Conteggi e violin plot: alcune feature categoriche sono sbilanciate (
sex: circa il doppio di uomini;race:Whitepredomina). Questo può causare problemi di equità (Fairness nel machine learningapprofondimento: non nel programma di Telecomunicazioni. Un sistema di ML è fair se le sue decisioni non producono esiti ingiusti rispetto agli attributi sensibili $A$ (razza, genere, età, religione...). Il bias nasce dai dati storici (problema dell'inerzia) e non esiste una definizione unica di equità (problema della definizione). Togliere $A$ dagli ingressi (fairness through unawareness, $\hat Y=f(X)$ con $A\notin X$) spesso non basta per le variabili proxy (es. CAP correlato alla razza, $\rho=-0{,}80$) e costa accuratezza. Metriche: Demographic Parity $DP=P(\hat Y=1|A=a)-P(\hat Y=1|A=d)$ (stesso tasso di esiti positivi nei gruppi) ed Equality of Opportunity $EO=P(\hat Y=1|A=a,Y=1)-P(\hat Y=1|A=d,Y=1)$ (stesso tasso di veri positivi). Interventi: soglie diverse per gruppo, vincoli di fairness nella loss, pre-processing dei dati; ogni intervento ha un compromesso con l'accuratezza. Casi: COMPAS (falsi positivi 44,9% contro 23,5%), riconoscimento facciale, RCA auto, consegne Amazon; GDPR e AI Act richiedono garanzie di non discriminazione.Fairness nel machine learning →): nel dataset il degli uomini ma solo il delle donne ha reddito alto. favourite-color: la proporzione di target positivi è la stessa per ogni colore (, , , ): la feature non è utile per predire il target e si elimina.- Box plot di feature numeriche per categoria: mostrano relazioni tra numeriche e categoriche (per esempio
agevaria con lo stato civile). - Rapporto per categoria (heatmap): non si può calcolare una correlazione numerica tra categorica e target binario; il rapporto per categoria è uno strumento qualitativo per individuare le categorie legate al target.
TODO 10-11: preprocessing e preparazione per la regressione logistica
Ordine corretto delle operazioni:
- Eliminare le feature inutili:
eye-diameter(non correlata),favourite-color(proporzione costante),quantum-decoherence(quasi vuota). - Valori mancanti nelle altre (poche, categoriche): eliminare le righe oppure categoria «sconosciuto».
- Codificare le categoriche con one-hot (
pd.get_dummies(..., drop_first=True)): la regressione logistica richiede numeri e un'etichetta numerica darebbe un ordine inesistente. - Dividere in training e test con campionamento stratificato (il target è sbilanciato).
- Standardizzare solo le feature numeriche (non le colonne one-hot) con media e deviazione standard del training, applicate poi anche al test: se si usassero i dati di test si avrebbe fuga di informazione.
Si noti che la divisione deve avvenire prima della standardizzazione (ma dopo la pulizia che non usa informazioni del target); un errore frequente è standardizzare tutto il dataset e poi dividere.
Codice (struttura)
df = df.drop(columns=["eye-diameter", "favourite-color", "quantum-decoherence"])
df = df.dropna() # oppure fillna("unknown") per le categoriche
df = pd.get_dummies(df, columns=categorical_cols, drop_first=True)
X_tr, X_te, y_tr, y_te = stratified_train_test_split(X, y, train_prop=0.8)
mu, sd = X_tr[:, num_idx].mean(0), X_tr[:, num_idx].std(0) # solo training
X_tr[:, num_idx] = (X_tr[:, num_idx] - mu) / sd; X_te[:, num_idx] = (X_te[:, num_idx] - mu) / sd