Stödvektormaskiner (SVM)
Kunna förklara marginalmaximering och kärntricket.
Förkunskaper
Intuition
Många linjer kan separera två klasser. SVM väljer den som ligger längst från båda — den med störst marginal.
Bara de punkter som ligger precis på marginalens kant påverkar lösningen. De kallas stödvektorer, och resten av datan kan tas bort utan att modellen ändras. Det är ovanligt bland ML-metoder och gör SVM robust mot punkter långt från gränsen.
Mjuk marginal: verklig data är sällan perfekt separerbar. Parametern C styr avvägningen — litet C tillåter fler felklassificeringar för bredare marginal, stort C prioriterar att klassificera allt rätt (och riskerar överanpassning).
Formellt
Primalproblemet (mjuk marginal):
Marginalens bredd är , så att minimera är att maximera marginalen. Problemet är konvext — en global optimum, inga lokala fällor, deterministiskt resultat.
Dualformen innehåller datan bara genom skalärprodukter . Det öppnar för kärntricket: byt ut skalärprodukten mot en kärnfunktion som motsvarar en skalärprodukt i ett högre-dimensionellt rum — utan att någonsin beräkna koordinaterna där.
| Kärna | Effekt | |
|---|---|---|
| Linjär | rak gräns | |
| Polynom | polynomgräns | |
| RBF | oändligtdimensionellt rum, mycket flexibel |
När SVM är rätt val i dag: små till medelstora dataset (< ~50 000 exempel), höga dimensioner relativt antalet exempel (text med TF-IDF), och när determinism och teoretiska garantier värderas. När det inte är det: stora dataset (träningen skalar ungefär –), och när sannolikheter behövs (SVM ger avstånd, inte kalibrerade sannolikheter — Platt-skalning krävs).
Kod
import numpy as np
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV
# Skalning är OBLIGATORISK för SVM — avstånd är kärnan i metoden
pipe = make_pipeline(StandardScaler(), SVC(kernel="rbf"))
sok = GridSearchCV(pipe, {"svc__C": [0.1, 1, 10, 100],
"svc__gamma": ["scale", 0.01, 0.1, 1]},
cv=5, scoring="f1_macro", n_jobs=-1).fit(X_tr, y_tr)
print(sok.best_params_, round(sok.best_score_, 3))
modell = sok.best_estimator_
svc = modell[-1]
print("stödvektorer:", svc.n_support_, "av", len(X_tr))
# stödvektorer: [43 39] av 800 ← bara 10 % av datan definierar gränsen
C och gamma hör ihop: stort C och stort gamma ger nästan alltid överanpassning (gränsen slingrar sig runt varje punkt). Sök dem tillsammans i ett rutnät, aldrig var för sig.
Behärskning innebär
- Förklarar marginalmaximering och stödvektorer
- Beskriver kärntricket
- Vet när SVM är ett bra val
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- scikit-learn User Guide (BSD-3) — BSD-3-Clause
- Wikipedia — Support vector machine (CC BY-SA 4.0) — CC BY-SA 4.0