Support Vector Machine (SVM)
Una macchina a vettori di supporto (SVM) separa le classi con l’iperpiano dal margine più ampio e usa kernel per i confini curvi. Scopri come funziona, come regolarla e il codice.
Una macchina a vettori di supporto (SVM) è un algoritmo di apprendimento supervisionato che classifica i dati individuando l'iperpiano che separa due classi con il margine più ampio possibile, ovvero la distanza tra il confine e i punti di addestramento più vicini di ciascuna classe. Questi punti più vicini, i vettori di supporto, sono gli unici esempi di addestramento che determinano il confine. Le funzioni kernel permettono alle SVM di apprendere confini curvi, mentre le varianti gestiscono la regressione e il rilevamento degli outlier. Vladimir Vapnik e i suoi colleghi svilupparono il metodo presso AT&T Bell Labs: la versione con kernel nel 1992 e la formulazione a margine morbido usata oggi, pubblicata da Cortes e Vapnik nel 1995. Prima del deep learning, le SVM erano tra i classificatori più accurati per testo, immagini e dati biologici e restano efficaci con dataset di piccole e medie dimensioni e molte feature.
Come funzionano le SVM#
Una SVM lineare predice la classe in base al segno di w·x + b, quindi il suo confine decisionale è l'iperpiano w·x + b = 0 e, con i pesi scalati in modo che i punti più vicini soddisfino |w·x + b| = 1, il margine ha larghezza 2/‖w‖. L'addestramento massimizza il margine minimizzando ‖w‖² e imponendo che ogni punto di addestramento ricada sul lato corretto. Le classi reali si sovrappongono, quindi la SVM a margine morbido permette ai punti di oltrepassare il margine, con un costo determinato dal parametro C di regolarizzazione. La sua funzione hinge non applica penalità ai punti classificati correttamente oltre il margine e assegna agli altri una penalità che cresce linearmente con la violazione. Un valore C basso tollera più violazioni e produce un margine più ampio e regolare; un valore C alto aderisce maggiormente ai dati di addestramento, con un rischio maggiore di overfitting. Nel modello addestrato, solo i punti sul margine o sul suo lato errato hanno un peso diverso da zero: sono i vettori di supporto, e spostare qualsiasi altro punto senza oltrepassare il margine lascia invariato il confine.
Il trucco del kernel#
Quando nessun iperpiano separa le classi, una mappatura dei dati in uno spazio con più dimensioni può renderle separabili: due anelli concentrici in 2D diventano separabili da un piano piatto quando una terza feature, x₁² + x₂², misura la distanza di ogni punto dal centro. Nella sua formulazione duale, l'addestramento e la predizione delle SVM utilizzano i dati solo attraverso i prodotti scalari tra coppie di punti, quindi una funzione kernel k(x, x′) può restituire direttamente il prodotto scalare nello spazio mappato, senza calcolare mai le coordinate mappate. Questo è il trucco del kernel. I kernel più comuni sono lineare, polinomiale e a funzione di base radiale (RBF), exp(−γ‖x − x′‖²), dove γ determina la portata dell'influenza di ciascun vettore di supporto. Questo esempio adatta SVC di scikit-learn con un kernel lineare e uno RBF su due anelli concentrici:
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# Two concentric rings: no straight line separates the classes
X, y = make_circles(n_samples=500, factor=0.4, noise=0.1, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
for kernel in ("linear", "rbf"):
clf = SVC(kernel=kernel, C=1.0)
clf.fit(X_train, y_train)
print(f"{kernel}: test accuracy {clf.score(X_test, y_test):.2f}, support vectors {clf.n_support_.sum()}")Il kernel lineare ottiene 0.43 sui punti esclusi dall'addestramento, peggio di una previsione casuale, e mantiene 360 dei 375 punti di addestramento come vettori di supporto. Il kernel RBF separa perfettamente gli anelli (1.00) con soli 42 vettori di supporto.
Scelta del kernel e degli iperparametri#
Le distanze e i prodotti scalari dipendono dalla scala delle feature, quindi gli input delle SVM vengono prima standardizzati. La guida pratica degli autori di LIBSVM, la libreria alla base di SVC di scikit-learn, consiglia di scalare le feature, iniziare con il kernel RBF e scegliere C e γ tramite ricerca a griglia con convalida incrociata. Quando le feature sono molte più dei campioni, come nel caso del testo, un kernel lineare offre prestazioni simili e si addestra molto più rapidamente. Il tempo di addestramento delle SVM con kernel cresce almeno quadraticamente con il numero di campioni, quindi oltre alcune decine di migliaia di campioni le SVM lineari o le feature kernel approssimate sostituiscono il modello con kernel esatto.
Le SVM nella computer vision#
La computer vision classica abbinava feature progettate manualmente a SVM lineari. Il rilevatore di pedoni di Dalal e Triggs del 2005 classificava gli istogrammi dei gradienti orientati (HOG) con una SVM lineare, mentre il rilevatore di oggetti R-CNN del 2014 classificava le feature CNN di ogni regione candidata con una SVM lineare per classe, finché nel 2015 Fast R-CNN non le sostituì con un livello softmax addestrato insieme alla rete. I rilevatori moderni apprendono insieme le feature e il classificatore; le SVM restano utili come classificatori rapidi su feature fisse. Una SVM lineare addestrata sui vettori restituiti da YOLO26 da model.embed(), un embedding per immagine, è una sonda lineare che aggiunge una nuova categoria di immagini senza riaddestrare la rete.
Applicazioni#
- Classificazione del testo: i vettori basati sul conteggio delle parole hanno decine di migliaia di dimensioni sparse, in cui le SVM lineari separano con precisione argomenti, spam e sentiment: un vantaggio dimostrato da Thorsten Joachims per la categorizzazione del testo nel 1998.
- Bioinformatica: gli studi di espressione genica classificano i tumori a partire da migliaia di geni misurati e solo decine o centinaia di pazienti, un contesto in cui il margine limita l'overfitting; inoltre, i kernel per stringhe confrontano direttamente le sequenze proteiche.
- Rilevamento delle anomalie: una SVM a una classe apprende un confine attorno ai soli dati normali e segnala i punti esterni, caratteristica adatta al rilevamento delle frodi e al monitoraggio dei macchinari, dove i guasti sono troppo rari per essere etichettati.
- Regressione: la regressione a vettori di supporto adatta una funzione all'interno di un tubo di larghezza ε, ignora gli errori inferiori a ε e mantiene come vettori di supporto solo i punti sul tubo o al suo esterno.
SVM e algoritmi correlati#
- K vicini più prossimi (KNN): conserva l'intero set di addestramento e confronta ogni nuovo punto con i suoi vicini al momento della predizione, mentre una SVM conserva solo i propri vettori di supporto.
- Alberi decisionali e foreste casuali: suddividono i dati in base a una feature alla volta, non richiedono la scalatura delle feature e gestiscono colonne numeriche e categoriche miste, mentre le SVM richiedono input numerici scalati.
- Reti neurali: apprendono la mappatura delle feature dai dati invece di fissarla con un kernel, riuscendo così a scalare fino a milioni di immagini, un volume con cui le SVM con kernel diventano troppo lente.
- Regressione logistica: apprende anch'essa un confine lineare, ma minimizza la perdita logaritmica su tutti i punti di addestramento e restituisce probabilità. Una SVM restituisce distanze con segno dal confine, mentre SVC di scikit-learn produce probabilità solo con
probability=True, che applica la scalatura di Platt tramite una convalida incrociata interna a 5 fold.










