Che siate principianti assoluti o abbiate già qualche conoscenza di Python, qui troverete tutto il necessario per iniziare a lovorare con Scikit-learn (sklearn), la libreria Python più popolare e potente per il Machine Learning.. Impareremo insieme i concetti chiave della classificazione, regressione, clustering e preprocessing dei dati, il tutto supportato da codice chiaro ed esercizi pratici con soluzioni guidate. Preparatevi a trasformare la vostra curiosità in competenze concrete e a padroneggiare gli strumenti che stanno rivoluzionando ogni settore, dall’analisi finanziaria alla medicina!
🎯 Obiettivi
- Capire cos’è Scikit-learn e perché è importante.
- Imparare a usare i principali strumenti per classificazione, regressione, clustering e preprocessing.
- Esercitarsi con codice chiaro e spiegazioni passo passo.
Cos’è Scikit-learn?
- A cosa serve: Scikit-learn è una libreria Python open-source che fornisce un set completo di algoritmi e utility per compiti di machine learning supervisionato e non supervisionato. È progettata per essere coerente, efficiente e facile da usare, fungendo da ponte tra la ricerca accademica e le applicazioni industriali.
- Casi di utilizzo:
- Classificazione: Prevedere la categoria di un’istanza (es. spam/non-spam, diagnosi medica, riconoscimento di immagini).
- Regressione: Prevedere un valore numerico continuo (es. prezzo delle case, previsioni di borsa, stima della temperatura).
- Clustering: Raggruppare dati simili senza etichette predefinite (es. segmentazione clienti, analisi di testo, rilevamento di anomalie).
- Riduzione della dimensionalità: Ridurre il numero di feature mantenendo le informazioni rilevanti (es. PCA per visualizzazione o pre-elaborazione per altri algoritmi).
- Selezione delle feature: Identificare le feature più importanti per migliorare le prestazioni del modello e la sua interpretabilità.
- Validazione dei modelli: Stimare le prestazioni del modello su dati invisibili (es. cross-validation, split train/test).
Installazione
pip install scikit-learn
Puoi anche installarla tramite Anaconda:
conda install scikit-learn
Dataset disponibili
Scikit-learn fornisce dataset incorporati per imparare:
from sklearn.datasets import load_iris
iris = load_iris()
print(iris.keys())
Altri dataset comuni:
load_digits()load_boston()(deprecato)load_diabetes()fetch_20newsgroups()
Questi dataset incorporati sono cruciali per l’apprendimento e la prototipazione rapida. Sono piccoli, puliti e non richiedono download esterni, permettendo agli utenti di concentrarsi sull’algoritmo piuttosto che sulla preparazione dei dati. iris è un classico per la classificazione, diabetes per la regressione.
Casi di utilizzo: Testare nuovi algoritmi, imparare l’API di Scikit-learn, dimostrare concetti di machine learning, debugging.
Struttura generale di un progetto con sklearn
- Caricamento dei dati
- Esplorazione e pulizia
- Preprocessing (standardizzazione, encoding, ecc.)
- Divisione in training/test set
- Creazione del modello
- Addestramento (fit)
- Predizione (predict)
- Valutazione
- Ottimizzazione
1️⃣ Esempio base: Classificazione con l’Iris dataset
Questo primo esempio dimostra il workflow fondamentale di Scikit-learn: caricare dati, dividerli, definire un modello, addestrarlo, fare previsioni e valutarlo. KNeighborsClassifier è scelto per la sua semplicità e interpretabilità, rendendolo ideale per i principianti. accuracy_score è una metrica di base per la classificazione.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 1. Caricamento dati
iris = load_iris()
X = iris.data
y = iris.target
# 2. Divisione training/test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. Modello
model = KNeighborsClassifier(n_neighbors=3)
# 4. Addestramento
model.fit(X_train, y_train)
# 5. Predizione
y_pred = model.predict(X_test)
# 6. Valutazione
print("Accuratezza:", accuracy_score(y_test, y_pred))
Accuratezza: 1.0
2️⃣ Preprocessing dei dati
A cosa serve: I dati grezzi raramente sono adatti per gli algoritmi di machine learning.
Standardizzazione (StandardScaler): Trasforma i dati in modo che abbiano media 0 e deviazione standard 1. Questo è fondamentale per molti algoritmi (es. SVM, K-Means, Regressione Lineare regolarizzata) che sono sensibili alla scala delle feature. Evita che feature con range di valori più grandi dominino il calcolo delle distanze o i pesi del modello.
Encoding di categorie (OneHotEncoder): Converte feature categoriali non numeriche (es. “rosso”, “blu”) in un formato numerico che può essere compreso dagli algoritmi. OneHotEncoder crea una nuova colonna binaria per ogni categoria unica, evitando di imporre un ordine numerico arbitrario tra le categorie.
Casi di utilizzo:
StandardScaler: Quando si usano modelli basati sulla distanza (KNN, SVM), sulla discesa del gradiente, o quando le feature hanno scale molto diverse.
OneHotEncoder: Quando si hanno feature categoriali nominali (senza un ordine intrinseco), come colori, tipi di veicoli, città.
Esempio di Standardizzazione
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
Encoding di categorie
from sklearn.preprocessing import OneHotEncoder
import numpy as np
encoder = OneHotEncoder()
X_encoded = encoder.fit_transform(np.array(["rosso", "blu", "rosso"]).reshape(-1, 1)).toarray()
3️⃣ Classificatori comuni
Una panoramica degli algoritmi di classificazione più usati.
Ogni algoritmo ha punti di forza e debolezza, e la scelta dipende dal tipo di dati, dalla complessità del problema e dalle risorse disponibili.
Casi di utilizzo:
K-Nearest Neighbors: Semplice, non parametrico, utile per problemi dove la similarità locale è importante.
Decision Tree/Random Forest: Utili per dati eterogenei, facili da interpretare (almeno il Decision Tree), robusti a feature non scalate.
SVM: Efficace in spazi ad alta dimensione, buono per problemi di classificazione complessi con margini chiari.
Logistic Regression: Base per problemi di classificazione binaria, interpretabile, buona linea di partenza.
| Algoritmo | Classe sklearn |
|---|---|
| K-Nearest Neighbors | KNeighborsClassifier |
| Decision Tree | DecisionTreeClassifier |
| Random Forest | RandomForestClassifier |
| SVM | SVC |
| Logistic Regression | LogisticRegression |
Esempio con SVM:
SVM (SVC): Potente per dati di alta dimensione e set di dati piccoli o medi. kernel='linear' indica una separazione lineare dei dati.
from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf.fit(X_train, y_train)
4️⃣ Regressione
La regressione lineare è il punto di partenza per prevedere valori continui. LinearRegression modella la relazione tra le feature e il target come una funzione lineare. mean_squared_error (RMSE) è una metrica comune che penalizza maggiormente errori grandi.
Casi di utilizzo: Previsione di prezzi, previsioni meteorologiche, stima di dosi, analisi di tendenze.
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("RMSE:", mean_squared_error(y_test, y_pred, squared=False))
5️⃣ Clustering con KMeans
KMeans è un algoritmo di clustering basato sulla distanza, che raggruppa i dati in k cluster. È un algoritmo non supervisionato, il che significa che non richiede etichette predefinite.
Casi di utilizzo: Segmentazione clienti, compressione di immagini, rilevamento di anomalie, analisi genetica.
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
print(kmeans.labels_) # etichette assegnate
6️⃣ Valutazione dei modelli
A cosa serve:
Capire quanto bene un modello si comporta su dati invisibili è cruciale.
Classificazione:
confusion_matrix: Mostra il numero di veri positivi, veri negativi, falsi positivi e falsi negativi. Fondamentale per capire gli errori specifici del modello.
classification_report: Fornisce precisione, richiamo e F1-score per ogni classe, oltre all’accuratezza complessiva. Queste metriche sono più informative dell’accuratezza semplice, specialmente su dataset sbilanciati.
Regressione:
mean_absolute_error (MAE): La media degli errori assoluti, facile da interpretare perché è nella stessa unità del target.
r2_score (R-squared): Indica la proporzione della varianza nella variabile dipendente che è prevedibile dalle variabili indipendenti. Un R2 più vicino a 1 indica una migliore adattamento del modello.
Casi di utilizzo: Ogni fase di sviluppo di un modello per monitorarne le prestazioni, comparare diversi modelli, identificare aree di miglioramento.
Esempi:
Classificazione
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
Regressione
from sklearn.metrics import mean_absolute_error, r2_score
print("MAE:", mean_absolute_error(y_test, y_pred))
print("R2:", r2_score(y_test, y_pred))
7️⃣ Cross-validation
A cosa serve: La cross-validation (cross_val_score) è una tecnica robusta per stimare le prestazioni di un modello in modo più affidabile rispetto a un singolo split train/test. Dividendo il dataset in più fold e addestrando il modello su diverse combinazioni, si riduce la varianza della stima della performance e si ottiene una misura più generalizzabile.
Casi di utilizzo: Qualsiasi progetto in cui è fondamentale ottenere una stima affidabile della performance del modello, specialmente su dataset di dimensioni moderate.
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)
print("Accuratezza media:", scores.mean())
8️⃣ Grid Search (tuning degli iperparametri)
Gli iperparametri non vengono appresi dal modello durante l’addestramento, ma devono essere impostati prima. GridSearchCV automatizza la ricerca esaustiva del miglior set di iperparametri provando tutte le combinazioni possibili in una griglia definita. Questo è fondamentale per massimizzare le prestazioni del modello.
Casi di utilizzo: Ottimizzazione delle prestazioni di quasi tutti gli algoritmi di machine learning, quando si hanno risorse computazionali sufficienti per esplorare lo spazio dei parametri.
from sklearn.model_selection import GridSearchCV
param_grid = {'n_neighbors': [3, 5, 7]}
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=3)
grid.fit(X_train, y_train)
print("Miglior parametro:", grid.best_params_)
9️⃣ Pipeline (automazione di preprocessing + modello)
Le Pipeline sono uno strumento potente per concatenare più trasformazioni e un estimatore finale in un unico oggetto. Questo garantisce che le operazioni di preprocessing (come la standardizzazione) vengano applicate correttamente a tutti i dati (training e test, ed eventuali nuovi dati), prevenendo il data leakage e semplificando il codice.
Casi di utilizzo: Quasi tutti i workflow di machine learning, dalla prototipazione alla produzione, per migliorare la robustezza, la riproducibilità e la leggibilità del codice.
from sklearn.pipeline import Pipeline
pipe = Pipeline([
('scaler', StandardScaler()),
('clf', KNeighborsClassifier())
])
pipe.fit(X_train, y_train)
🔁 Riepilogo concetti chiave
fit()= addestra il modellopredict()= genera previsionitransform()= trasforma dati (per preprocessing)fit_transform()= addestra e trasformascore()= restituisce una misura di performance

Esercizi Pratici con Soluzioni Guidate per Scikit-learn
Ecco una serie di esercizi pratici con soluzioni guidate per imparare Scikit-learn da zero. Gli esercizi sono pensati in ordine crescente di difficoltà e coprono classificazione, regressione, preprocessing, e valutazione dei modelli.
✅ Esercizio 1: Classificazione con KNN
🎯 Obiettivo:
Classificare i fiori del dataset Iris usando K-Nearest Neighbors.
🔧 Istruzioni:
- Carica il dataset Iris.
- Dividi il dataset in training (80%) e test (20%).
- Standardizza le feature.
- Applica un modello KNN con
n_neighbors=3. - Valuta l’accuratezza.
✅ Soluzione guidata:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 1. Caricamento
iris = load_iris()
X, y = iris.data, iris.target
# 2. Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 3. Standardizzazione
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 4. Modello
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train_scaled, y_train)
# 5. Valutazione
y_pred = knn.predict(X_test_scaled)
print("Accuratezza:", accuracy_score(y_test, y_pred))
Accuratezza: 0.9666666666666667
✅ Esercizio 2: Regressione Lineare con dataset Diabetes
🎯 Obiettivo:
Prevedere una misura clinica (target) usando la regressione lineare.
🔧 Istruzioni:
- Carica il dataset
load_diabetes. - Dividi il dataset.
- Applica la regressione lineare.
- Valuta l’errore quadratico medio (RMSE).
✅ Soluzione guidata:
import numpy as np # Import numpy for square root function
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 1. Dataset
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
# 2. Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. Modello
model = LinearRegression()
model.fit(X_train, y_train)
# 4. Valutazione
y_pred = model.predict(X_test)
# Calculate Mean Squared Error
mse = mean_squared_error(y_test, y_pred)
# Calculate Root Mean Squared Error by taking the square root of MSE
rmse = np.sqrt(mse)
print("RMSE:", rmse)
RMSE: 53.85344583676593
✅ Esercizio 3: Preprocessing + Classificazione con Pipeline
🎯 Obiettivo:
Usare Pipeline per combinare scaling e SVM su Iris dataset.
🔧 Istruzioni:
- Crea una pipeline con
StandardScalereSVC(kernel='linear'). - Addestra e valuta il modello.
✅ Soluzione guidata:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 1. Caricamento del dataset Iris
iris = load_iris()
X, y = iris.data, iris.target # 150 campioni, 4 feature, 3 classi
# 2. Suddivisione in training e test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. Creazione della pipeline
pipe = Pipeline([
('scaler', StandardScaler()),
('svc', SVC(kernel='linear'))
])
# 4. Addestramento
pipe.fit(X_train, y_train)
# 5. Predizione
y_pred = pipe.predict(X_test)
# 6. Valutazione
print("Accuratezza:", accuracy_score(y_test, y_pred))
Accuratezza: 0.9666666666666667
✅ Esercizio 4: Cross-validation
🎯 Obiettivo:
Usare cross-validation per stimare l’accuratezza di un modello SVM.
🔧 Istruzioni:
- Usa
cross_val_scoreconcv=5. - Stampa media e deviazione standard dell’accuratezza.
✅ Soluzione guidata:
from sklearn.model_selection import cross_val_score
# (Si assumono X, y e la 'pipe' dagli esercizi precedenti)
scores = cross_val_score(pipe, X, y, cv=5)
print("Accuratezza media:", scores.mean())
print("Deviazione standard:", scores.std())
Accuratezza media: 0.9666666666666668
Deviazione standard: 0.029814239699997188
✅ Esercizio 5: Grid Search
🎯 Obiettivo:
Ottimizzare n_neighbors in un classificatore KNN usando GridSearchCV.
🔧 Istruzioni:
- Crea un dizionario di parametri:
{'n_neighbors': [3, 5, 7]}. - Applica
GridSearchCVconcv=3. - Stampa il miglior parametro.
✅ Soluzione guidata:
from sklearn.model_selection import GridSearchCV
# (Si assumono X_train_scaled e y_train dall'Esercizio 1)
param_grid = {'n_neighbors': [3, 5, 7]}
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=3)
grid.fit(X_train_scaled, y_train)
print("Miglior parametro:", grid.best_params_)
print("Accuratezza:", grid.best_score_)
Miglior parametro: {'n_neighbors': 7}
Accuratezza: 0.3583333333333334
✅ Esercizio 6: Confusion Matrix e Classification Report
🎯 Obiettivo:
Usare confusion_matrix e classification_report per analizzare una predizione.
🔧 Istruzioni:
- Dopo aver predetto le etichette, stampa entrambe le metriche.
✅ Soluzione guidata:
from sklearn.metrics import confusion_matrix, classification_report
# (Si assumono iris, y_test e y_pred dall'Esercizio 1 o 3)
print("Matrice di confusione:")
print(confusion_matrix(y_test, y_pred))
print("\nReport di classificazione:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
Matrice di confusione:
[[10 0 0]
[ 0 8 1]
[ 0 0 11]]
Report di classificazione:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 0.89 0.94 9
virginica 0.92 1.00 0.96 11
accuracy 0.97 30
macro avg 0.97 0.96 0.97 30
weighted avg 0.97 0.97 0.97 30





