Salta al contenuto
Note per Studenti Esercizio - Programma scikit-learn per una SVM con kernel RBF (esempio d'esame 1)

Esercizio - Programma scikit-learn per una SVM con kernel RBF (esempio d'esame 1)

Teoria: Apprendimento automatico nell'IA - supervisionato, SVM e valutazioneQuadro del machine learning nel corso di IA. Tre forme di apprendimento: supervisionato (coppie ingresso-uscita, classificazione se l'uscita è discreta e regressione se è un numero), non supervisionato (pattern senza feedback, per esempio clustering) e per rinforzo (ricompense). Un'ipotesi h approssima la funzione vera f e si valuta sul test set, non sul training set: un modello troppo semplice ha bias alto (underfitting), uno troppo complesso varianza alta (overfitting). Servono training, validation e test set; con pochi dati si usa la k-fold cross-validation. Alberi di decisione: si sceglie l'attributo con massimo guadagno d'informazione Gain = B(p/(p+n)) - somma (Nk/N) B(pk/Nk), si pota con il test del chi quadro (Delta > Delta*), si riduce la varianza con bagging e random forest. Perdita L1 e L2, regressione lineare e discesa del gradiente w <- w - alpha dL/dw. SVM: separatore a margine massimo, vettori di supporto, kernel trick con K(xj,xk). Pipeline scikit-learn del laboratorio 10: load_digits, train_test_split, SVC(C, kernel, gamma), fit, predict, classification_report, confusion_matrix, cross_val_score.Apprendimento automatico nell'IA - supervisionato, SVM e valutazione → (sezione 7, pipeline in scikit-learn), Support vector machines e metodi kernelUna SVM cerca l'iperpiano $w\cdot x+b=0$ che separa due classi con il margine più largo possibile: normalizzando $y_i(w\cdot x_i+b)\ge1$ il margine totale vale $2/|w|$, quindi si risolve $\min\frac12|w|^2$ (problema convesso, nessun minimo locale). Con classi sovrapposte si ammettono errori con le variabili di scarto $\xi_i$ e il parametro $C$ (soft margin, equivalente alla hinge loss più una penalità su $|w|^2$); $C$ piccolo = margine largo e più bias, $C$ grande = margine stretto e più varianza, si sceglie per cross-validation. La soluzione dipende solo dai vettori di supporto ($w=\sum\alpha_iy_ix_i$) e solo tramite prodotti scalari, per questo si può sostituire $x_i\cdot x_j$ con un kernel $K(x_i,x_j)=\langle\phi(x_i),\phi(x_j)\rangle$ (polinomiale, RBF) senza calcolare $\phi$: così si ottengono bordi non lineari. La SVR usa lo stesso schema con un tubo di tolleranza $\varepsilon$. Nell'esame le SVM sono solo nella parte teorica.Support vector machines e metodi kernel → e Metriche di classificazioneIn classificazione binaria ogni previsione è vero positivo (TP), vero negativo (TN), falso positivo (FP, errore di tipo I) o falso negativo (FN, errore di tipo II). Da queste quattro quantità: accuracy $=\frac{TP+TN}{TP+TN+FP+FN}$, specificità $=\frac{TN}{TN+FP}$, precision $=\frac{TP}{TP+FP}$, recall $=\frac{TP}{TP+FN}$, e la loro media armonica $F_1=\frac{2PR}{P+R}$. Con dati sbilanciati l'accuracy inganna (un modello che predice sempre la classe maggioritaria ha 99%): si usano precision, recall, F1, ROC-AUC, la cross-validation stratificata e il riequilibrio con undersampling o oversampling (non SMOTE). Cambiando la soglia sulla probabilità si ottiene la curva ROC (TPR contro FPR) e l'area AUC. Approfondimento: non nel programma di Telecomunicazioni.Metriche di classificazione →. Applicazione nel laboratorio: Esercizio - Ricerca del miglior C per una SVM lineare sul dataset digits (laboratorio 10). Domanda 9 del quiz da 9 CFU e domanda 6 di quello da 6 CFU: stesse sei righe, proposte in ordine diverso in ogni blank.

Testo. Allenare una SVM con kernel RBF a partire da un dataset X di cui sono note le label y. Ordinare le alternative (sei blank, ognuno con le stesse sei righe in ordine diverso) così da comporre il programma Python. Le sei righe sono:

python
import sklearn
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, shuffle=True)
svc = svm.SVC(kernel="rbf")
svc.fit(X_train, y_train)
predicted = svc.predict(X_test)
disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)

Soluzione

blank riga perché in questa posizione
1 import sklearn prima di usare qualsiasi nome della libreria
2 svc = svm.SVC(kernel="rbf") crea il classificatore (kernel RBF = gaussiano, C=1 e gamma="scale" di default)
3 X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, shuffle=True) separa il 75% per l'addestramento dal 25% per il test, prima di usare i dati
4 svc.fit(X_train, y_train) addestra: serve il classificatore e il training set
5 predicted = svc.predict(X_test) predice sul test set: serve il modello addestrato
6 disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted) confronta le etichette vere con le predette: servono y_test e predicted

Le dipendenze fissano questi vincoli: import per primo; fit dopo la creazione di svc e dopo lo split; predict dopo fit; la matrice di confusione per ultima. La creazione di svc e lo split non dipendono l'uno dall'altro, quindi anche lo scambio delle righe 2 e 3 dà un programma corretto; l'ordine sopra è quello del laboratorio (si definisce prima la SVM, poi si divide il dataset).

Perché gli altri ordini non funzionano

  • svc.predict prima di svc.fit: errore NotFittedError, il modello non è addestrato.
  • svc.fit prima di train_test_split: X_train e y_train non esistono ancora (NameError).
  • La matrice di confusione prima di predict: predicted non esiste.
  • shuffle=True mescola i dati prima della divisione: utile quando il dataset è ordinato per classe (con shuffle=False, come in iris, il test set può contenere una sola classe).

Nota: per far girare il programma servono anche from sklearn import svm, metrics e from sklearn.model_selection import train_test_split; nel quiz la riga import sklearn è semplificata.

Versione ripasso

Teoria: Apprendimento automatico nell'IA - supervisionato, SVM e valutazioneQuadro del machine learning nel corso di IA. Tre forme di apprendimento: supervisionato (coppie ingresso-uscita, classificazione se l'uscita è discreta e regressione se è un numero), non supervisionato (pattern senza feedback, per esempio clustering) e per rinforzo (ricompense). Un'ipotesi h approssima la funzione vera f e si valuta sul test set, non sul training set: un modello troppo semplice ha bias alto (underfitting), uno troppo complesso varianza alta (overfitting). Servono training, validation e test set; con pochi dati si usa la k-fold cross-validation. Alberi di decisione: si sceglie l'attributo con massimo guadagno d'informazione Gain = B(p/(p+n)) - somma (Nk/N) B(pk/Nk), si pota con il test del chi quadro (Delta > Delta*), si riduce la varianza con bagging e random forest. Perdita L1 e L2, regressione lineare e discesa del gradiente w <- w - alpha dL/dw. SVM: separatore a margine massimo, vettori di supporto, kernel trick con K(xj,xk). Pipeline scikit-learn del laboratorio 10: load_digits, train_test_split, SVC(C, kernel, gamma), fit, predict, classification_report, confusion_matrix, cross_val_score.Apprendimento automatico nell'IA - supervisionato, SVM e valutazione →, Support vector machines e metodi kernelUna SVM cerca l'iperpiano $w\cdot x+b=0$ che separa due classi con il margine più largo possibile: normalizzando $y_i(w\cdot x_i+b)\ge1$ il margine totale vale $2/|w|$, quindi si risolve $\min\frac12|w|^2$ (problema convesso, nessun minimo locale). Con classi sovrapposte si ammettono errori con le variabili di scarto $\xi_i$ e il parametro $C$ (soft margin, equivalente alla hinge loss più una penalità su $|w|^2$); $C$ piccolo = margine largo e più bias, $C$ grande = margine stretto e più varianza, si sceglie per cross-validation. La soluzione dipende solo dai vettori di supporto ($w=\sum\alpha_iy_ix_i$) e solo tramite prodotti scalari, per questo si può sostituire $x_i\cdot x_j$ con un kernel $K(x_i,x_j)=\langle\phi(x_i),\phi(x_j)\rangle$ (polinomiale, RBF) senza calcolare $\phi$: così si ottengono bordi non lineari. La SVR usa lo stesso schema con un tubo di tolleranza $\varepsilon$. Nell'esame le SVM sono solo nella parte teorica.Support vector machines e metodi kernel →.

Ordine: import sklearn / svc = svm.SVC(kernel="rbf") / train_test_split(X, y, test_size=0.25, shuffle=True) / svc.fit(X_train, y_train) / predicted = svc.predict(X_test) / ConfusionMatrixDisplay.from_predictions(y_test, predicted).

  • Vincoli: fit dopo svc e split; predict dopo fit; la matrice di confusione usa predicted. Creazione di svc e split sono indipendenti (ordine del laboratorio: prima la SVM).

Errori tipici: predict prima di fit (NotFittedError); fit prima dello split.

Teoria collegata