Tutorial Completo Scikit-learn (sklearn) per Principianti: Guida al Machine Learning in Python

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Tutorial Completo Scikit-learn

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

  1. Caricamento dei dati
  2. Esplorazione e pulizia
  3. Preprocessing (standardizzazione, encoding, ecc.)
  4. Divisione in training/test set
  5. Creazione del modello
  6. Addestramento (fit)
  7. Predizione (predict)
  8. Valutazione
  9. 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.

Forse potrebbe interessarti anche:  Data Lakehouse: Cos'è, Come Funziona e Perché Unisce il Meglio di Data Lake e Warehouse

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.

Forse potrebbe interessarti anche:  Conteggio Parole e TF-IDF in Python: Guida Completa all’Analisi Statistica dei Testi e Information Retrieval

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 modello
  • predict() = genera previsioni
  • transform() = trasforma dati (per preprocessing)
  • fit_transform() = addestra e trasforma
  • score() = restituisce una misura di performance

 

Machine learning con python
Machine Learning con PYTHON & Scikit-Learn, Tensorflow 2, Keras, PyTorch e Fastai: Guida completa alla creazione di algoritmi, reti neurali e modelli di Machine Learning e Deep Learning -67% 9,69 €

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:

  1. Carica il dataset Iris.
  2. Dividi il dataset in training (80%) e test (20%).
  3. Standardizza le feature.
  4. Applica un modello KNN con n_neighbors=3.
  5. 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:

  1. Carica il dataset load_diabetes.
  2. Dividi il dataset.
  3. Applica la regressione lineare.
  4. 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.

Forse potrebbe interessarti anche:  Curva di Phillips: cos'è, formula, esempi Python e limiti del modello

🔧 Istruzioni:

  1. Crea una pipeline con StandardScaler e SVC(kernel='linear').
  2. 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:

  1. Usa cross_val_score con cv=5.
  2. 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:

  1. Crea un dizionario di parametri: {'n_neighbors': [3, 5, 7]}.
  2. Applica GridSearchCV con cv=3.
  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:

  1. 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

Pubblicità