CLASSE QUARTA • MACHINE LEARNING

Intro al Machine Learning

Dai dati alle previsioni: il tuo primo modello intelligente

Benvenuto nel mondo dell'AI! In questo modulo passerai dall'analisi dati alla creazione di modelli predittivi. Imparerai i concetti fondamentali del Machine Learning.

🧠 Cos'è il Machine Learning?

Il Machine Learning è un ramo dell'Intelligenza Artificiale che permette ai computer di "imparare" dai dati senza essere esplicitamente programmati.

📊 Apprendimento Supervisionato

Il modello impara da dati etichettati (input → output noto).

Esempi: Classificazione, Regressione

🔍 Apprendimento Non Supervisionato

Il modello trova pattern in dati non etichettati.

Esempi: Clustering, Riduzione dimensionalità

🎮 Apprendimento per Rinforzo

Il modello impara tramite ricompense/punizioni.

Esempi: Giochi, Robotica, Trading

1
Dati di Input
2
Training Modello
3
Predizioni

💡 Perché Machine Learning?

Problemi tradizionali: Regole fisse, complesse da mantenere

ML: Modelli che si adattano ai dati, migliorano con l'esperienza

Esempio reale: Riconoscimento spam (ML) vs regole manuali (tradizionale)

🔧 Scikit-learn: La Libreria ML per Python

Scikit-learn è la libreria ML più utilizzata in Python. Ecco la sua struttura:

🚫 COPIA BLOCCATA
import numpy as np import pandas as pd import sklearn print("🤖 SCKIT-LEARN INTRO") print("=" * 60) print(f"Versione Scikit-learn: {sklearn.__version__}") print(f"Versione NumPy: {np.__version__}") print(f"Versione Pandas: {pd.__version__}") print("\n" + "="*60) # MODULI PRINCIPALI DI SCIKIT-LEARN print("\n📦 MODULI PRINCIPALI:") modules_info = { 'sklearn.datasets': 'Dataset pre-caricati per pratica', 'sklearn.model_selection': 'Split dati, cross-validation', 'sklearn.preprocessing': 'Scaler, encoding, normalizzazione', 'sklearn.linear_model': 'Regressione lineare, logistica', 'sklearn.tree': 'Alberi decisionali, Random Forest', 'sklearn.metrics': 'Metriche di valutazione', 'sklearn.cluster': 'Algoritmi di clustering', 'sklearn.neighbors': 'K-Nearest Neighbors', 'sklearn.svm': 'Support Vector Machines', 'sklearn.neural_network': 'Reti neurali semplici' } for module, desc in modules_info.items(): print(f" • {module}: {desc}") # FLUSSO DI LAVORO TIPICO print("\n🔄 FLUSSO DI LAVORO ML:") print("1. Carica e esplora i dati") print("2. Preprocessing e cleaning") print("3. Split in train/test") print("4. Scelta e training modello") print("5. Valutazione performance") print("6. Ottimizzazione (se necessario)") print("7. Deployment (uso su nuovi dati)") # INSTALLAZIONE (per Google Colab è già installato) print("\n🚀 INSTALLAZIONE:") print("# Su Google Colab: già installato!") print("# Installazione locale:") print(" pip install scikit-learn") print(" pip install scikit-learn pandas numpy matplotlib seaborn")

🎯 Algoritmi ML Comuni in Scikit-learn

Algoritmo Tipo Quando usarlo Classe Scikit-learn
Linear Regression Regressione Predizione valori continui LinearRegression
Logistic Regression Classificazione Problemi binari (si/no) LogisticRegression
Decision Tree Class/Reg Interpretabilità, regole if-then DecisionTreeClassifier
Random Forest Class/Reg Performance robuste, meno overfitting RandomForestClassifier
K-Means Clustering Raggruppamento dati simili KMeans
K-Nearest Neighbors Class/Reg Dati con pattern locali KNeighborsClassifier

🌸 Iris Dataset: Il "Hello World" del ML

L'Iris Dataset è il dataset più famoso per imparare il Machine Learning.

🌸
Sepal Length
🌼
Sepal Width
🌺
Petal Length
💮
Petal Width
🚫 COPIA BLOCCATA
# COMPLETE IRIS DATASET ANALYSIS import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score, classification_report, confusion_matrix print("🌸 IRIS DATASET - ANALISI COMPLETA") print("=" * 70) # 1. CARICAMENTO DATI iris = load_iris() print("\n1. 📥 CARICAMENTO DATI") print(f"Tipo dataset: {type(iris)}") print(f"Contenuto: {list(iris.keys())}") # Converti in DataFrame per analisi più facile df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names) df_iris['target'] = iris.target df_iris['species'] = df_iris['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'}) print(f"\n📊 DIMENSIONI DATASET: {df_iris.shape}") print(f"📋 COLONNE: {list(df_iris.columns)}") # 2. ESPLORAZIONE DATI print("\n\n2. 🔍 ESPLORAZIONE DATI (EDA)") print("\nPRIME 10 RIGHE:") print(df_iris.head(10)) print("\n📈 STATISTICHE DESCRITTIVE:") print(df_iris.describe()) print("\n🎯 DISTRIBUZIONE TARGET:") print(df_iris['species'].value_counts()) print("\n🔍 INFO DATASET:") print(df_iris.info()) print("\n❓ VALORI MANCANTI:") print(df_iris.isnull().sum()) # 3. VISUALIZZAZIONE DATI print("\n\n3. 📊 VISUALIZZAZIONE DATI") print("\n📈 Nota: Su Google Colab, scommenta le righe di matplotlib per vedere i grafici") """ # Pairplot per vedere tutte le relazioni plt.figure(figsize=(12, 8)) sns.pairplot(df_iris, hue='species', palette='husl', markers=['o', 's', 'D']) plt.suptitle('Iris Dataset - Pairplot', y=1.02) plt.show() # Boxplot per vedere distribuzioni plt.figure(figsize=(12, 6)) for i, feature in enumerate(iris.feature_names): plt.subplot(2, 2, i+1) sns.boxplot(x='species', y=feature, data=df_iris, palette='husl') plt.title(f'{feature} per Specie') plt.tight_layout() plt.show() # Matrice di correlazione plt.figure(figsize=(8, 6)) corr_matrix = df_iris[iris.feature_names].corr() sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0) plt.title('Matrice di Correlazione - Caratteristiche Iris') plt.show() """ # 4. PREPROCESSING print("\n\n4. 🛠️ PREPROCESSING DATI") # Separazione features (X) e target (y) X = df_iris[iris.feature_names] y = df_iris['target'] print(f"Shape X (features): {X.shape}") print(f"Shape y (target): {y.shape}") # Standardizzazione (molto importante per molti algoritmi ML) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) print("\n✅ Features standardizzate (media=0, dev std=1)") # Split in training e test set X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, # 20% per test, 80% per training random_state=42, # Per riproducibilità stratify=y # Mantiene distribuzione target ) print(f"\n🎯 SPLIT DATI:") print(f"Training set: {X_train.shape[0]} campioni ({X_train.shape[0]/len(X)*100:.1f}%)") print(f"Test set: {X_test.shape[0]} campioni ({X_test.shape[0]/len(X)*100:.1f}%)") print(f"Distribuzione target training: {np.bincount(y_train)}") print(f"Distribuzione target test: {np.bincount(y_test)}") # 5. TRAINING MODELLI print("\n\n5. 🤖 TRAINING MODELLI ML") # Modello 1: Logistic Regression print("\n📈 1. LOGISTIC REGRESSION:") log_reg = LogisticRegression(random_state=42, max_iter=1000) log_reg.fit(X_train, y_train) y_pred_log = log_reg.predict(X_test) accuracy_log = accuracy_score(y_test, y_pred_log) print(f" Accuracy: {accuracy_log:.3f}") # Modello 2: Decision Tree print("\n🌳 2. DECISION TREE CLASSIFIER:") dt_clf = DecisionTreeClassifier(random_state=42, max_depth=3) dt_clf.fit(X_train, y_train) y_pred_dt = dt_clf.predict(X_test) accuracy_dt = accuracy_score(y_test, y_pred_dt) print(f" Accuracy: {accuracy_dt:.3f}") # 6. VALUTAZIONE MODELLI print("\n\n6. 📊 VALUTAZIONE PERFORMANCE") print("\n🎯 ACCURACY COMPARISON:") print(f"Logistic Regression: {accuracy_log:.3f} ({accuracy_log*100:.1f}%)") print(f"Decision Tree: {accuracy_dt:.3f} ({accuracy_dt*100:.1f}%)") print("\n📋 CLASSIFICATION REPORT - Logistic Regression:") print(classification_report(y_test, y_pred_log, target_names=iris.target_names)) print("\n📋 CLASSIFICATION REPORT - Decision Tree:") print(classification_report(y_test, y_pred_dt, target_names=iris.target_names)) # Matrice di confusione print("\n🎯 MATRICE DI CONFUSIONE - Logistic Regression:") cm_log = confusion_matrix(y_test, y_pred_log) print(cm_log) print("\n🎯 MATRICE DI CONFUSIONE - Decision Tree:") cm_dt = confusion_matrix(y_test, y_pred_dt) print(cm_dt) # Visualizzazione matrice di confusione """ plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) sns.heatmap(cm_log, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names) plt.title('Confusion Matrix - Logistic Regression') plt.ylabel('True Label') plt.xlabel('Predicted Label') plt.subplot(1, 2, 2) sns.heatmap(cm_dt, annot=True, fmt='d', cmap='Greens', xticklabels=iris.target_names, yticklabels=iris.target_names) plt.title('Confusion Matrix - Decision Tree') plt.ylabel('True Label') plt.xlabel('Predicted Label') plt.tight_layout() plt.show() """ # 7. PREDIZIONI SU NUOVI DATI print("\n\n7. 🔮 PREDIZIONI SU NUOVI DATI") # Crea dati fittizi per test (simuliamo nuovi fiori) nuovi_fiori = np.array([ [5.1, 3.5, 1.4, 0.2], # Probabilmente setosa [6.0, 2.9, 4.5, 1.5], # Probabilmente versicolor [7.2, 3.2, 6.0, 2.5] # Probabilmente virginica ]) # Standardizza come abbiamo fatto per i dati di training nuovi_fiori_scaled = scaler.transform(nuovi_fiori) # Predizioni con entrambi i modelli pred_log = log_reg.predict(nuovi_fiori_scaled) pred_dt = dt_clf.predict(nuovi_fiori_scaled) print("\n🌺 PREDIZIONI NUOVI FIORI:") print("Features (sepal length, sepal width, petal length, petal width):") for i, fiore in enumerate(nuovi_fiori): specie_log = iris.target_names[pred_log[i]] specie_dt = iris.target_names[pred_dt[i]] print(f"\nFiore {i+1}: {fiore}") print(f" Logistic Regression: {specie_log}") print(f" Decision Tree: {specie_dt}") # 8. FEATURE IMPORTANCE print("\n\n8. 🎯 FEATURE IMPORTANCE") # Logistic Regression coefficients print("\n📈 COEFFICIENTI Logistic Regression:") coeff_df = pd.DataFrame({ 'feature': iris.feature_names, 'coefficient': log_reg.coef_[0] # Prendiamo la prima classe come riferimento }) print(coeff_df.sort_values('coefficient', ascending=False)) # Decision Tree feature importance print("\n🌳 FEATURE IMPORTANCE Decision Tree:") importance_df = pd.DataFrame({ 'feature': iris.feature_names, 'importance': dt_clf.feature_importances_ }) print(importance_df.sort_values('importance', ascending=False)) # Visualizzazione feature importance """ plt.figure(figsize=(10, 4)) plt.subplot(1, 2, 1) sns.barplot(x='coefficient', y='feature', data=coeff_df.sort_values('coefficient')) plt.title('Coefficienti Logistic Regression') plt.xlabel('Coefficiente') plt.ylabel('Feature') plt.subplot(1, 2, 2) sns.barplot(x='importance', y='feature', data=importance_df.sort_values('importance')) plt.title('Feature Importance Decision Tree') plt.xlabel('Importanza') plt.ylabel('Feature') plt.tight_layout() plt.show() """ # 9. CONCLUSIONI E INSIGHTS print("\n\n9. 🎓 CONCLUSIONI E INSIGHTS") print("\n✅ COSA ABBIAMO IMPARATO:") print("1. Caricamento ed esplorazione dataset ML") print("2. Preprocessing: standardizzazione, train/test split") print("3. Training due modelli diversi") print("4. Valutazione con metriche multiple") print("5. Predizioni su nuovi dati") print("6. Analisi feature importance") print("\n📊 PERFORMANCE FINALI:") metric_display = { 'Modello': ['Logistic Regression', 'Decision Tree'], 'Accuracy': [accuracy_log, accuracy_dt], 'Campioni Training': [len(X_train), len(X_train)], 'Campioni Test': [len(X_test), len(X_test)] } metrics_df = pd.DataFrame(metric_display) print(metrics_df.to_string(index=False)) print("\n🎯 MIGLIOR MODELLO PER IRIS:") best_model = 'Logistic Regression' if accuracy_log > accuracy_dt else 'Decision Tree' best_accuracy = max(accuracy_log, accuracy_dt) print(f"{best_model} con accuracy del {best_accuracy*100:.1f}%") print("\n🌺 FEATURE PIÙ IMPORTANTI:") most_important = importance_df.loc[importance_df['importance'].idxmax(), 'feature'] print(f"'{most_important}' è la feature più importante per la classificazione") print("\n🚀 PROSSIMI PASSI:") print("1. Provare altri algoritmi (KNN, Random Forest, SVM)") print("2. Ottimizzare iperparametri con GridSearchCV") print("3. Cross-validation per valutazione più robusta") print("4. Applicare su dataset più complessi") print("\n🎉 COMPLIMENTI! HAI COMPLETATO IL TUO PRIMO PROGETTO ML!")
150
Campioni Totali
4
Features
3
Classi
95%+
Accuracy Tipica

💡 Perché Iris Dataset è perfetto per imparare?

  1. Dimensionalità gestibile: 4 features, 150 campioni
  2. Nessun valore mancante: Dati puliti
  3. Classi ben separate: Setosa è linearmente separabile
  4. Interpretabilità: Features misurabili fisicamente
  5. Benchmark: Comparabile con risultati pubblicati

🎯 Train/Test Split e Valutazione Modelli

Come misurare se il tuo modello funziona davvero?

🚫 COPIA BLOCCATA
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score, KFold from sklearn.linear_model import LogisticRegression from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report, roc_auc_score, roc_curve) import matplotlib.pyplot as plt print("🎯 METRICHE DI VALUTAZIONE ML") print("=" * 70) # Creiamo dati sintetici per dimostrazione np.random.seed(42) n_samples = 1000 # Features: età, reddito, spese_mensili X = np.random.randn(n_samples, 3) * 10 + 50 # Media 50, dev std 10 # Target: approvato mutuo (1) o rifiutato (0) # Logica: se reddito > spese*2 e età tra 25-60, approvato y = ((X[:, 1] > X[:, 2] * 2) & (X[:, 0] > 25) & (X[:, 0] < 60)).astype(int) # Aggiungiamo rumore y = y ^ (np.random.random(n_samples) > 0.9) # 10% di rumore df_mutui = pd.DataFrame(X, columns=['età', 'reddito', 'spese']) df_mutui['mutuo_approvato'] = y print("\n📊 DATASET MUTUI (prime 10 righe):") print(df_mutui.head(10)) print(f"\nDistribuzione target: {df_mutui['mutuo_approvato'].value_counts().to_dict()}") # 1. TRAIN/TEST SPLIT BASE print("\n\n1. 🔀 TRAIN/TEST SPLIT BASE") print("-" * 40) X = df_mutui[['età', 'reddito', 'spese']] y = df_mutui['mutuo_approvato'] # Split 70/30 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, # 30% test random_state=42, stratify=y # Mantiene proporzioni target ) print(f"Training set: {X_train.shape} ({len(X_train)/len(X)*100:.0f}%)") print(f"Test set: {X_test.shape} ({len(X_test)/len(X)*100:.0f}%)") print(f"Distribuzione training: {pd.Series(y_train).value_counts().to_dict()}") print(f"Distribuzione test: {pd.Series(y_test).value_counts().to_dict()}") # 2. TRAINING MODELLO print("\n\n2. 🤖 TRAINING LOGISTIC REGRESSION") print("-" * 40) model = LogisticRegression(random_state=42, max_iter=1000) model.fit(X_train, y_train) # Predizioni y_pred = model.predict(X_test) y_pred_proba = model.predict_proba(X_test)[:, 1] # Probabilità classe positiva print("✅ Modello addestrato!") print(f"Coefficienti: {model.coef_[0]}") print(f"Intercetta: {model.intercept_[0]:.4f}") # 3. METRICHE BASE DI CLASSIFICAZIONE print("\n\n3. 📊 METRICHE DI VALUTAZIONE") print("-" * 40) # Calcola tutte le metriche accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) print(f"🎯 Accuracy: {accuracy:.3f} ({accuracy*100:.1f}%)") print(f"🎯 Precision: {precision:.3f}") print(f"🎯 Recall (Sensitivity): {recall:.3f}") print(f"🎯 F1-Score: {f1:.3f}") # Matrice di confusione cm = confusion_matrix(y_test, y_pred) print("\n📋 MATRICE DI CONFUSIONE:") print(f" Predetto NO Predetto SI") print(f"Reale NO (TN): {cm[0,0]:8} (FP): {cm[0,1]:8}") print(f"Reale SI (FN): {cm[1,0]:8} (TP): {cm[1,1]:8}") # Classification report completo print("\n📄 CLASSIFICATION REPORT:") print(classification_report(y_test, y_pred, target_names=['Rifiutato', 'Approvato'])) # 4. ROC-AUC (per problemi binari) print("\n\n4. 📈 ROC-AUC CURVE") print("-" * 40) # Calcola AUC auc_score = roc_auc_score(y_test, y_pred_proba) print(f"🎯 AUC Score: {auc_score:.3f}") # Calcola curve ROC fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba) print("\n📊 SU GOOGLE COLAB, SCOMMENTA PER VEDERE IL GRAFICO:") """ plt.figure(figsize=(10, 6)) plt.plot(fpr, tpr, color='blue', lw=2, label=f'ROC curve (AUC = {auc_score:.3f})') plt.plot([0, 1], [0, 1], color='gray', lw=1, linestyle='--', label='Random Classifier') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate (Recall)') plt.title('ROC Curve - Mutuo Approval') plt.legend(loc="lower right") plt.grid(True, alpha=0.3) plt.show() """ # 5. CROSS-VALIDATION print("\n\n5. 🔄 CROSS-VALIDATION") print("-" * 40) # 5-fold cross-validation cv_scores = cross_val_score( LogisticRegression(max_iter=1000), X, y, cv=5, # 5 folds scoring='accuracy', # Metrica da valutare n_jobs=-1 # Usa tutti i core CPU ) print("🎯 CROSS-VALIDATION SCORES (5-fold):") for i, score in enumerate(cv_scores, 1): print(f" Fold {i}: {score:.3f}") print(f"\n📊 Media CV Accuracy: {cv_scores.mean():.3f} (+/- {cv_scores.std()*2:.3f})") print(f"📈 Accuracy su test set: {accuracy:.3f}") # K-Fold esplicito print("\n🎯 K-FOLD CROSS-VALIDATION DETTAGLIATO:") kf = KFold(n_splits=5, shuffle=True, random_state=42) fold_accuracies = [] for fold, (train_idx, val_idx) in enumerate(kf.split(X), 1): X_train_fold, X_val_fold = X.iloc[train_idx], X.iloc[val_idx] y_train_fold, y_val_fold = y.iloc[train_idx], y.iloc[val_idx] fold_model = LogisticRegression(max_iter=1000, random_state=42) fold_model.fit(X_train_fold, y_train_fold) y_pred_fold = fold_model.predict(X_val_fold) fold_accuracy = accuracy_score(y_val_fold, y_pred_fold) fold_accuracies.append(fold_accuracy) print(f" Fold {fold}: Accuracy = {fold_accuracy:.3f} " f"(Train size: {len(X_train_fold)}, Val size: {len(X_val_fold)})") print(f"\n📊 Media K-Fold Accuracy: {np.mean(fold_accuracies):.3f}") # 6. STRATIFIED K-FOLD (per dataset sbilanciati) print("\n\n6. ⚖️ STRATIFIED K-FOLD (per classi sbilanciate)") print("-" * 40) from sklearn.model_selection import StratifiedKFold skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) stratified_scores = [] for train_idx, val_idx in skf.split(X, y): X_train_fold, X_val_fold = X.iloc[train_idx], X.iloc[val_idx] y_train_fold, y_val_fold = y.iloc[train_idx], y.iloc[val_idx] # Verifica distribuzione print(f" Train distribuzione: {pd.Series(y_train_fold).value_counts().to_dict()}") print(f" Val distribuzione: {pd.Series(y_val_fold).value_counts().to_dict()}") fold_model = LogisticRegression(max_iter=1000, random_state=42) fold_model.fit(X_train_fold, y_train_fold) y_pred_fold = fold_model.predict(X_val_fold) fold_accuracy = accuracy_score(y_val_fold, y_pred_fold) stratified_scores.append(fold_accuracy) break # Mostra solo primo fold per brevità # 7. LEARNING CURVE (semplificata) print("\n\n7. 📚 LEARNING CURVE - Effetto dimensione training set") print("-" * 40) train_sizes = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] train_scores = [] test_scores = [] for size in train_sizes: X_train_frac, _, y_train_frac, _ = train_test_split( X, y, train_size=size, random_state=42, stratify=y ) temp_model = LogisticRegression(max_iter=1000, random_state=42) temp_model.fit(X_train_frac, y_train_frac) # Score su training train_score = temp_model.score(X_train_frac, y_train_frac) # Score su test (holdout) test_score = temp_model.score(X_test, y_test) train_scores.append(train_score) test_scores.append(test_score) print(f" Train size {size*100:.0f}%: Train Acc={train_score:.3f}, Test Acc={test_score:.3f}") print("\n📊 SU GOOGLE COLAB, SCOMMENTA PER VEDERE LEARNING CURVE:") """ plt.figure(figsize=(10, 6)) plt.plot([s*100 for s in train_sizes], train_scores, 'o-', color='blue', label='Training Accuracy') plt.plot([s*100 for s in train_sizes], test_scores, 's-', color='green', label='Test Accuracy') plt.xlabel('Training Set Size (%)') plt.ylabel('Accuracy') plt.title('Learning Curve - Logistic Regression') plt.legend(loc='best') plt.grid(True, alpha=0.3) plt.show() """ # 8. CONCLUSIONI E BEST PRACTICES print("\n\n8. 🎓 BEST PRACTICES PER VALUTAZIONE ML") print("-" * 40) print("\n✅ COSA FARE:") print("1. Usa sempre train/test split (minimo 70/30)") print("2. Stratifica se le classi sono sbilanciate") print("3. Usa cross-validation per stime robuste") print("4. Guarda multiple metriche, non solo accuracy") print("5. Confronta con baseline (modello semplice)") print("\n❌ COSA EVITARE:") print("1. Mai testare su dati usati per training") print("2. Non guardare solo all'accuracy") print("3. Non ignorare overfitting/underfitting") print("4. Non dimenticare di standardizzare features") print("\n🎯 METRICA GIUSTA PER IL PROBLEMA GIUSTO:") print("• Accuracy: Classi bilanciate") print("• Precision: Costo falsi positivi alto (es: spam detection)") print("• Recall: Costo falsi negativi alto (es: diagnosi medica)") print("• F1-Score: Balance tra precision e recall") print("• AUC-ROC: Confronto modelli overall") print("\n📊 PERFORMANCE SUMMARY:") summary_df = pd.DataFrame({ 'Metric': ['Accuracy', 'Precision', 'Recall', 'F1-Score', 'AUC'], 'Value': [accuracy, precision, recall, f1, auc_score], 'Interpretation': [ f"{accuracy*100:.1f}% delle predizioni corrette", f"{precision*100:.1f}% degli approvati erano veri approvati", f"{recall*100:.1f}% dei veri approvati sono stati identificati", f"Media armonica tra precision e recall", f"{auc_score*100:.1f}% di capacità discriminativa" ] }) print(summary_df.to_string(index=False)) print("\n🎉 VALUTAZIONE COMPLETATA! ORA SAI COME MISURARE I MODELLI ML!")

📚 Perché il Train/Test Split è Cruciale?

Training Set: Dati su cui il modello impara (≈70-80%)

Test Set: Dati mai visti dal modello per valutazione reale (≈20-30%)

Overfitting: Modello memorizza i dati invece di imparare pattern

Underfitting: Modello troppo semplice per catturare pattern

💪 Esercizi Pratici ML

Esercizio 1: Digit Recognition MEDIO

Usa il dataset MNIST (scikit-learn) per riconoscere cifre scritte a mano.

Obiettivi:

  1. Carica MNIST con load_digits()
  2. Visualizza alcune cifre con matplotlib
  3. Prova almeno 3 algoritmi diversi (KNN, SVM, Random Forest)
  4. Calcola confusion matrix per ogni modello
  5. Identifica quali cifre sono più confuse tra loro

Esercizio 2: Titanic Survival Prediction MEDIO

Dataset classico: predici chi sopravvive al Titanic.

Steps:

  1. Carica dati Titanic da Seaborn: sns.load_dataset('titanic')
  2. Pulizia dati: gestisci missing values, encoding variabili categoriche
  3. Feature engineering: crea nuove features (famiglia_size, titolo, etc.)
  4. Addestra modello Logistic Regression
  5. Calcola precision/recall per classe "sopravvissuto"

Esercizio 3: Wine Classification FACILE

Classifica vini in base alle loro caratteristiche chimiche.

🚫 COPIA BLOCCATA
from sklearn.datasets import load_wine # Carica dataset wine = load_wine() # Questo dataset ha 13 features chimiche e 3 classi di vino

Analisi richiesta:

  1. EDA completa: correlazioni, distribuzioni
  2. PCA per visualizzazione in 2D
  3. Classificazione con Decision Tree e Random Forest
  4. Feature importance analysis
  5. Cross-validation con 10 folds

🚀 Preparati per la Regressione Lineare!

📈 Regressione vs Classificazione

Classificazione: Output discreti (categorie)

Regressione: Output continui (numeri)

🎯 Prossimo: Regressione Lineare

Nel Modulo 4 imparerai:

  • Teoria regressione lineare
  • Implementazione con scikit-learn
  • Analisi residui e R²
  • Caso pratico reale

📚 Concetti Chiave da Ricordare:

  1. Supervised Learning: Dati con etichette
  2. Train/Test Split: Mai testare su dati di training
  3. Overfitting: Modello troppo complesso per i dati
  4. Accuracy non è tutto: Guarda precision, recall, F1
  5. Cross-validation: Stima più robusta delle performance
Vai alla Regressione Lineare →