Salta al contenuto
Note per Studenti Esercizio - Analisi esplorativa e preprocessing di un dataset sbilanciato (Adult)

Esercizio - Analisi esplorativa e preprocessing di un dataset sbilanciato (Adult)

Esame

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: 48 84248\,842 persone, target income-over-50k (vero se il reddito supera 50 00050\,000 $), 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 23,9%23{,}9\% delle persone ha reddito sopra 50 00050\,000 \(circa(circa3$ negativi per ogni positivo). Conseguenze:

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 1616 valori, marital-status 77, race 55, sex 22, favourite-color 44 →\to categoriche. age 7474 valori, capital-gain 123123, hours-per-week 9696 →\to numeriche (anche se hanno meno valori distinti di righe). eye-diameter ha 48 84248\,842 valori distinti su 48 84248\,842 righe: continua pura. Nella soluzione si usa una soglia (più di 4242 valori unici ⇒\Rightarrow continua), da accompagnare con il significato semantico.

TODO 3: valori mancanti

quantum-decoherence ha 43 83743\,837 valori mancanti su 48 84248\,842 (89,8%89{,}8\%): va eliminata, quasi non contiene dati. workclass (27992799, 5,7%5{,}7\%), occupation (28092809) e native-country (857857) hanno poche mancanze, tutte categoriche: si possono eliminare le righe (si perde circa il 6%6\%) 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 0/10/1) e tra le feature. Risultati: age 0,230{,}23, hours-per-week 0,230{,}23, capital-gain 0,220{,}22 (le più alte), capital-loss 0,150{,}15, eye-diameter −0,006-0{,}006 (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 91,7%91{,}7\% e il 95,3%95{,}3\% 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 4040.

TODO 6-9: variabili categoriche

TODO 10-11: preprocessing e preparazione per la regressione logistica

Ordine corretto delle operazioni:

  1. Eliminare le feature inutili: eye-diameter (non correlata), favourite-color (proporzione costante), quantum-decoherence (quasi vuota).
  2. Valori mancanti nelle altre (poche, categoriche): eliminare le righe oppure categoria «sconosciuto».
  3. 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.
  4. Dividere in training e test con campionamento stratificato (il target è sbilanciato).
  5. 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)

python
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

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata