Support Vector Machine (SVM), po polsku maszyna wektorów nośnych, to jeden z najpotężniejszych klasycznych algorytmów uczenia maszynowego. SVM znajduje optymalną hiperpłaszczyznę rozdzielającą dane na klasy — taką, która maksymalizuje margines między klasami. Przez ponad dekadę (lata 2000-2012) SVM był dominującym algorytmem klasyfikacji, zanim głębokie sieci neuronowe przejęły pałeczkę.
Intuicja SVM
Wyobraź sobie punkty dwóch klas na płaszczyźnie — niebieskie i czerwone. Istnieje nieskończenie wiele prostych, które je rozdzielą. Która jest najlepsza?
SVM wybiera prostą (w ogólności: hiperpłaszczyznę), która maksymalizuje margines — odległość od najbliższych punktów obu klas. Intuicja: im większy margines, tym bardziej „pewna" jest klasyfikacja i tym lepiej model generalizuje na nowe dane.
Wektory nośne
Wektory nośne (support vectors) to punkty danych najbliższe hiperpłaszczyźnie rozdzielającej. To one „podpierają" (support) granicę decyzyjną — gdyby je usunąć, granica by się zmieniła. Wszystkie inne punkty (dalsze od granicy) nie wpływają na położenie hiperpłaszczyzny. Dlatego SVM jest odporny na outlier-y odległe od granicy.
Matematyka SVM
Liniowy SVM
Dla danych treningowych (xᵢ, yᵢ), gdzie yᵢ ∈ {-1, +1}:
Hiperpłaszczyzna: w · x + b = 0
Margines: 2 / ||w||
Problem optymalizacji:
min (1/2) ||w||²
pod warunkiem: yᵢ(w · xᵢ + b) ≥ 1 dla wszystkich i
To problem optymalizacji wypukłej z ograniczeniami — rozwiązywany przez multiplikatory Lagrange'a i programowanie kwadratowe.
Soft Margin SVM
Realne dane rzadko są idealnie liniowo separowalne. Soft margin SVM (C-SVM) wprowadza zmienne slack ξᵢ pozwalające na naruszenia marginesu:
min (1/2) ||w||² + C · Σ ξᵢ
pod warunkiem: yᵢ(w · xᵢ + b) ≥ 1 - ξᵢ, ξᵢ ≥ 0
Hiperparametr C kontroluje kompromis:
- Duże C → mniej naruszeń (hard margin), ryzyko overfittingu
- Małe C → więcej naruszeń, szerszy margines, lepsza generalizacja
Formulacja dualna
Problem SVM rozwiązuje się zwykle w formulacji dualnej (dual formulation), która operuje na mnożnikach Lagrange'a αᵢ zamiast bezpośrednio na w:
max Σ αᵢ - (1/2) Σᵢ Σⱼ αᵢ αⱼ yᵢ yⱼ (xᵢ · xⱼ)
Kluczowa obserwacja: formulacja dualna zależy od iloczynów skalarnych xᵢ · xⱼ, nie od samych wektorów. To otwiera drogę do kernel trick.
Kernel Trick — nieliniowy SVM
Wiele problemów nie jest liniowo separowalnych. Kernel trick rozwiązuje to bez jawnego transformowania danych do wyższego wymiaru.
Idea
- Mapuj dane do przestrzeni o wyższym wymiarze φ(x), gdzie stają się liniowo separowalne
- W wyższym wymiarze zastosuj liniowy SVM
- Kernel trick: zamiast obliczać φ(xᵢ) · φ(xⱼ) (kosztowne), oblicz K(xᵢ, xⱼ) — funkcję jądra dającą ten sam wynik bez jawnej transformacji
Popularne kernele
Liniowy: K(x, x') = x · x' Brak transformacji. Szybki, dobry dla danych wysokowymiarowych (tekst, genomika).
Wielomianowy: K(x, x') = (γ · x · x' + r)^d Parametr d kontroluje stopień wielomianu. Granice decyzyjne w kształcie krzywych wielomianowych.
RBF (Radial Basis Function / Gaussian): K(x, x') = exp(-γ ||x - x'||²) Najpopularniejszy kernel. Mapuje do nieskończenie wymiarowej przestrzeni. Parametr γ kontroluje „zasięg" wpływu każdego punktu — mały γ = gładka granica, duży γ = złożona granica.
Sigmoid: K(x, x') = tanh(γ · x · x' + r) Podobny do sieci neuronowej z jedną warstwą ukrytą.
Dobór kernela
- Dane liniowo separowalne → kernel liniowy
- Dane nieliniowe, mało cech → RBF (domyślny wybór)
- Dane wysokowymiarowe (tekst: tysiące cech) → kernel liniowy (szybszy, często wystarczający)
Hiperparametry SVM
C (regularization parameter)
Kontroluje kompromis margines vs błędy. Dobierany przez walidację krzyżową.
γ (gamma) — dla RBF
Kontroluje zasięg wpływu punktu. Mały γ → gładka granica (underfitting). Duży γ → złożona granica (overfitting). Domyślnie: 1 / (n_features × variance).
Grid Search
Typowo C i γ dobierane przez grid search z walidacją krzyżową:
- C ∈ {0,01; 0,1; 1; 10; 100; 1000}
- γ ∈ {0,0001; 0,001; 0,01; 0,1; 1}
SVM do regresji (SVR)
Support Vector Regression (SVR) adaptuje ideę SVM do regresji. Zamiast maksymalizować margines między klasami, SVR dopasowuje rurę ε-insensitive — toleruje błędy mniejsze niż ε bez kary:
min (1/2) ||w||² + C · Σ (ξᵢ + ξᵢ*)
Punkty wewnątrz rury nie generują straty — tylko punkty poza rurą.
SVM wieloklasowy
Oryginalny SVM jest binarny (dwie klasy). Strategie wieloklasowe:
- One-vs-One (OvO): k(k-1)/2 klasyfikatorów, głosowanie. Domyślne w scikit-learn
- One-vs-Rest (OvR): k klasyfikatorów (klasa vs reszta)
Zalety i wady SVM
Zalety
- Skuteczny w wysokich wymiarach — działa dobrze gdy n_features > n_samples
- Odporny na overfitting — margines zapewnia dobrą generalizację
- Elastyczny — kernel trick obsługuje nieliniowe granice
- Mocne gwarancje teoretyczne — teoria VC, PAC learning
- Nie wymaga dużych danych — działa dobrze na małych-średnich zbiorach
Wady
- Skalowanie — O(n²) do O(n³) złożoność treningowa. Nie nadaje się do milionów próbek
- Wybór kernela i hiperparametrów — wymaga eksperymentowania
- Brak prawdopodobieństw — domyślnie daje etykietę, nie prawdopodobieństwo (Platt scaling dodaje tę zdolność)
- Wrażliwy na skalę cech — wymaga standaryzacji danych
- Trudna interpretowalność — kernel RBF tworzy złożone granice
SVM vs inne algorytmy
| Cecha | SVM | Random Forest | Sieci neuronowe |
|---|---|---|---|
| Dane | Małe-średnie | Średnie-duże | Duże |
| Cechy | Dowolne (z kernelem) | Structured | Dowolne |
| Interpretacja | Trudna (kernel RBF) | Łatwa (feature importance) | Trudna |
| Hiperparametry | Mało (C, γ) | Mało | Dużo |
| Trening | Wolny na dużych danych | Szybki | Wolny |
| Generalizacja | Doskonała (margines) | Bardzo dobra | Zależy od danych |
SVM w praktyce (scikit-learn)
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
# Standaryzacja jest kluczowa dla SVM
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
# Grid search po C i gamma
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': ['scale', 0.01, 0.1]}
svm = GridSearchCV(SVC(kernel='rbf'), param_grid, cv=5)
svm.fit(X_train_scaled, y_train)
Zastosowania SVM
- Klasyfikacja tekstu — kategoryzacja dokumentów, spam detection (SVM z kernelem liniowym na TF-IDF)
- Bioinformatyka — klasyfikacja genów, predykcja struktury białek
- Rozpoznawanie pisma — jeden z pierwszych skutecznych algorytmów OCR
- Diagnostyka medyczna — klasyfikacja obrazów medycznych na małych zbiorach
- Wykrywanie anomalii — One-Class SVM do detekcji outlierów
Podsumowanie
SVM to elegancki algorytm łączący solidne podstawy teoretyczne z praktyczną skutecznością. Maksymalizacja marginesu, kernel trick i odporność na overfitting czynią go doskonałym wyborem dla małych-średnich zbiorów danych i wysokowymiarowych przestrzeni cech. Choć głębokie uczenie zdominowało wiele zastosowań, SVM pozostaje wartościowym narzędziem w arsenale uczenia maszynowego.