Python per il machine learning - NumPy, pandas e Matplotlib
In questa pagina 6
Gli strumenti del corso (Lezione 3 · Laboratorio Python, Colab e JupyterLab, Lezione 6 · Laboratorio di statistica, visualizzazioni e PCA): Python con le librerie NumPy, pandas, Matplotlib, seaborn e scikit-learn. Non si insegna la programmazione, ma si fissano le abitudini che servono nei laboratori e all'esame; i calcoli statistici corrispondenti sono in 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 → e 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 →. Esercizio: Esercizio - Statistica descrittiva, quartili e standardizzazione di un dataset.
Ambiente
- Notebook (
.ipynb) contro script (.py): il notebook alterna celle di codice e di testo, si esegue una cella alla volta e mostra subito i risultati (adatto a studio, esperimenti, analisi dati); lo script contiene solo codice, si esegue tutto insieme (programmi completi). - Google Colab: ambiente di esecuzione per notebook nel cloud: niente da installare, gratuito, buona potenza di calcolo. Si accede con l'account Google; i notebook si possono caricare o aprire da GitHub; i file si gestiscono dal pannello laterale (caricamento, salvataggio, download) e si può montare Google Drive.
- Percorsi con
pathlib.Path("ML_resources", "titanic.csv"); se i file non ci sono, nel laboratorio si clona il repository congit clone.
Linguaggio
- Tipi e variabili: assegnazione senza dichiarare il tipo (
x = 10int,y = 3.14float,z = "hello"str,w = Truebool);type(x); divisione/(reale),//(intera),%resto,**potenza;str * 3ripete; i tipi diversi non si sommano (10 + "a"è un errore: convertire constr(x)). - Condizioni:
if / elif / else, conand,or,not. L'indentazione è sintassi: niente graffe, i due punti, niente punto e virgola. - Cicli:
for i in range(1, 6)(1, 2, 3, 4, 5: l'estremo finale è escluso) ewhile cond:. - Funzioni con
defereturn. I tipi immutabili (int, float, str, bool) sono passati per copia: una funzione che fanumber = number + 10non cambia la variabile del chiamante; per cambiarla bisogna restituire il valore e assegnarlo (x = add_ten(x)); una funzione senzareturnrestituisceNone. - Classi: raggruppano attributi (variabili) e metodi (funzioni) in modo riusabile; ogni cliente creato dalla classe è un oggetto. Nei laboratori si usano per modelli (
fit,predict), nodi di alberi, criteri di impurità.
| Struttura | Ordinata | Modificabile | Duplicati | Indicizzata |
|---|---|---|---|---|
list [1, 2.5, "a"] |
sì | sì | sì | sì |
tuple (1, 2) |
sì | no | sì | sì |
set {1, 2} |
no | sì | no | no |
dict {"a": 1} |
no | sì | chiavi uniche | per chiave |
Gli indici partono da ; lista[-1] è l'ultimo elemento; set(lista) dà gli elementi unici.
NumPy
import numpy as np
x = np.linspace(-3, 3, 1000) # 1000 punti equispaziati
X = np.hstack([np.ones((n, 1)), X]) # aggiunge la colonna di uni a sinistra
beta = np.linalg.inv(X.T @ X) @ X.T @ y # @ = prodotto tra matrici
np.mean(A, axis=0) # axis=0: una media per colonna; axis=1: per riga
A[A[:, 0] > 3] # maschera booleana: righe con prima colonna > 3
np.cumsum(v); np.argmax(v >= 5) # somma cumulata; indice del primo valore >= 5
np.argsort(v)[::-1] # indici in ordine decrescente- Assi:
axis=0opera lungo le righe (collassa le righe, un risultato per colonna),axis=1lungo le colonne. Senzaaxisla media è su tutti gli elementi. - Forma (
shape): un vettore non è uguale a una colonna : sottrarre un array da uno dà per broadcasting una matrice senza errore. Controllare sempre le forme (.reshape(-1, 1)). - Statistiche:
np.vardivide per (popolazione),ddof=1per ;np.covenp.corrcoefvogliono per default le variabili sulle righe: con le osservazioni sulle righe serverowvar=False.np.percentile(..., method="higher")per i quartili; curtosi, asimmetria e moda non sono in NumPy.
pandas
import pandas as pd
df = pd.read_csv("ML_resources/titanic.csv")
df.head(); df.shape; df.columns # prime righe, (righe, colonne), nomi
df["Sex"].value_counts() # conteggi per categoria
df["Age"].mean(); df["Age"].max()
df[df["Age"] > 30]["Sex"].value_counts() # filtro e conteggio
X = df.drop(columns=["target"]).to_numpy(); y = df["target"].to_numpy()pandas è come un foglio di calcolo: filtra righe, aggrega statistiche, legge e scrive CSV. Le statistiche di pandas usano (var, std), quelle di NumPy : per grande la differenza è trascurabile. Sul dataset Iris (150 righe, 5 colonne: 4 numeriche e la specie categorica) mean, var, std, skew, kurt, quantile(0.25) si calcolano sulle sole colonne numeriche, la moda sulla colonna categorica; corr() dà la matrice di correlazione di Pearson.
Grafici
- Matplotlib (
plt.plot,plt.scatter,plt.hist,plt.boxplot,plt.legend,plt.show): su si disegnano e con legenda. - seaborn, costruita sopra Matplotlib, con interfaccia di più alto livello soprattutto per i DataFrame:
sns.scatterplot(data=df, x=..., y=..., hue=...),sns.heatmap(corr, annot=True, cmap="coolwarm"),sns.pairplot(df),sns.boxplot,sns.violinplot,sns.barplot. - Per tabelle grandi si campiona (
df.sample(1000)) prima del pair plot.
Trappole tipiche
- Dimenticare
rowvar=False, o l'asse giusto inmean/std. - Mescolare e nelle funzioni di costo e nei gradienti.
- Calcolare standardizzazione e statistiche sul dataset intero invece che sul solo training.
- Modificare un
DataFramefiltrato e non accorgersi che si lavora su una copia. - Fidarsi di numeri letti da un file con una colonna categorica: va codificata prima (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).
Versione ripasso
Ambiente. Notebook (celle, risultati subito) contro script. Colab: notebook nel cloud, gratis, Drive montabile, apertura da GitHub.
Linguaggio. / reale, // intera, % resto, ** potenza; indentazione = sintassi; range(1,6) esclude 6; tipi immutabili passati per copia la funzione deve fare return; classi = attributi + metodi; list/tuple/set/dict (indici da , [-1] ultimo).
NumPy. axis=0 una statistica per colonna, axis=1 per riga; @ prodotto matriciale; np.hstack per la colonna di uni; forma (broadcasting insidioso); np.var divide per , ddof=1 per ; np.cov/np.corrcoef con rowvar=False.
pandas. read_csv, head, shape, value_counts, filtri booleani, mean/var/std/skew/kurt/quantile/corr; var e std con .
Grafici. Matplotlib (plot, scatter, hist, boxplot); seaborn (scatterplot, heatmap, pairplot, boxplot, violinplot).
Trappole: rowvar, assi, forme, statistiche sul dataset intero.