Salta al contenuto
Note per Studenti Python per il machine learning - NumPy, pandas e Matplotlib

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 con git clone.

Linguaggio

  • Tipi e variabili: assegnazione senza dichiarare il tipo (x = 10 int, y = 3.14 float, z = "hello" str, w = True bool); type(x); divisione / (reale), // (intera), % resto, ** potenza; str * 3 ripete; i tipi diversi non si sommano (10 + "a" è un errore: convertire con str(x)).
  • Condizioni: if / elif / else, con and, 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) e while cond:.
  • Funzioni con def e return. I tipi immutabili (int, float, str, bool) sono passati per copia: una funzione che fa number = number + 10 non cambia la variabile del chiamante; per cambiarla bisogna restituire il valore e assegnarlo (x = add_ten(x)); una funzione senza return restituisce None.
  • 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 00; lista[-1] è l'ultimo elemento; set(lista) dà gli elementi unici.

NumPy

python
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=0 opera lungo le righe (collassa le righe, un risultato per colonna), axis=1 lungo le colonne. Senza axis la media è su tutti gli elementi.
  • Forma (shape): un vettore (n,)(n,) non è uguale a una colonna (n,1)(n,1): sottrarre un array (n,)(n,) da uno (n,1)(n,1) dà per broadcasting una matrice n×nn\times n senza errore. Controllare sempre le forme (.reshape(-1, 1)).
  • Statistiche: np.var divide per nn (popolazione), ddof=1 per n−1n-1; np.cov e np.corrcoef vogliono per default le variabili sulle righe: con le osservazioni sulle righe serve rowvar=False. np.percentile(..., method="higher") per i quartili; curtosi, asimmetria e moda non sono in NumPy.

pandas

python
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 n−1n-1 (var, std), quelle di NumPy nn: per nn 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 x=np.linspace(−3,3,1000)x=\texttt{np.linspace}(-3,3,1000) si disegnano x2x^2 e sin⁡x\sin x 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

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 ⇒\Rightarrow la funzione deve fare return; classi = attributi + metodi; list/tuple/set/dict (indici da 00, [-1] ultimo).

NumPy. axis=0 una statistica per colonna, axis=1 per riga; @ prodotto matriciale; np.hstack per la colonna di uni; forma (n,)≠(n,1)(n,)\ne(n,1) (broadcasting insidioso); np.var divide per nn, ddof=1 per n−1n-1; 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 n−1n-1.

Grafici. Matplotlib (plot, scatter, hist, boxplot); seaborn (scatterplot, heatmap, pairplot, boxplot, violinplot).

Trappole: rowvar, assi, forme, statistiche sul dataset intero.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata