03 · Nadzorowane · 4 min czytania · Interaktywne · aktualizacja
Jak działa maszyna wektorów nośnych (SVM) i co oznaczają parametry C i gamma?
W skrócie
SVM szuka granicy, która oddziela klasy z jak największym marginesem. Decydują o niej tylko punkty przy granicy, a jądra pozwalają kreślić granice krzywe.
Co to jest
Maszyna wektorów nośnych (support vector machine, SVM) to klasyfikator, który spośród wszystkich granic oddzielających dwie klasy wybiera tę o największym marginesie — największej odległości od najbliższych punktów obu klas. Punkty leżące na skraju marginesu lub wewnątrz niego to wektory nośne: tylko one wyznaczają granicę, reszta danych mogłaby zniknąć bez żadnej zmiany modelu. Współczesną postać SVM opisali Boser, Guyon i Vapnik (1992) oraz Cortes i Vapnik (1995).
Intuicja: między dwiema grupami punktów na płaszczyźnie można poprowadzić wiele prostych, które je rozdzielają. SVM wybiera tę, wokół której da się poprowadzić najszerszą „ulicę” bez punktów w środku. Granica biegnie środkiem ulicy, a wektory nośne to punkty stojące na krawężnikach.
Dzięki sztuczce jądrowej SVM nie ogranicza się do prostych: z jądrem wielomianowym lub gaussowskim (RBF) kreśli granice dowolnie zakrzywione, nadal rozwiązując ten sam problem maksymalnego marginesu.
Mechanizm — dlaczego tak działa
Granica liniowa to zbiór punktów, gdzie w·x + b = 0. Szerokość marginesu wynosi 2 / ‖w‖, więc maksymalizacja marginesu to minimalizacja ‖w‖² przy warunku, że każdy punkt leży po właściwej stronie w odległości co najmniej marginesu. To problem optymalizacji wypukłej: ma jedno rozwiązanie, bez lokalnych minimów, w przeciwieństwie do sieci neuronowych.
Dlaczego szeroki margines miałby pomagać? Granica blisko punktów treningowych jest wrażliwa — mała zmiana danych lub szum pomiarowy przerzuca przykłady na drugą stronę. Szeroki margines oznacza zapas bezpieczeństwa. Teoria uczenia statystycznego Vapnika wiąże szerokość marginesu z ograniczeniem błędu uogólniania, które nie zależy wprost od liczby wymiarów.
W prawdziwych danych klasy rzadko dają się idealnie rozdzielić. Wersja z miękkim marginesem dopuszcza punkty wewnątrz marginesu lub po złej stronie, płacąc za każde naruszenie karę proporcjonalną do jego wielkości (strata zawiasowa, hinge loss). Parametr C ustala cenę naruszeń: duże C — model za wszelką cenę klasyfikuje trening poprawnie, margines jest wąski, ryzyko przeuczenia rośnie; małe C — szeroki margines, więcej tolerowanych błędów, więcej wektorów nośnych, gładsza granica. C działa więc jak odwrotność siły regularyzacji.
Z jądrem RBF, K(x, z) = exp(−γ‖x − z‖²), pojawia się drugi parametr: γ określa zasięg wpływu pojedynczego punktu. Małe γ — każdy punkt wpływa na szeroką okolicę, granica jest gładka, model zbliża się do liniowego. Duże γ — wpływ sięga tylko najbliższego otoczenia, granica owija się wokół pojedynczych punktów, a model zapamiętuje dane. C i γ trzeba stroić razem.
Ograniczenia: SVM liczy odległości, więc jest bardzo wrażliwa na skalę cech. Trening z jądrem rośnie z liczbą przykładów mniej więcej kwadratowo lub szybciej, co przy setkach tysięcy wierszy staje się kłopotem. Model nie zwraca prawdopodobieństw wprost — trzeba je doszacować kalibracją. Wiele klas obsługuje się, ucząc wiele klasyfikatorów binarnych (scikit-learn: każda para klas osobno).
Na przykładzie
Zbiór Wine: 178 win z trzech odmian winorośli (59, 71 i 48), 13 cech z analizy chemicznej; trening na 133, test na 45 (podział warstwowy, random_state=0). Cechy mają skrajnie różne skale: prolina od 278 do 1680, odcień od 0,48 do 1,71. SVM z jądrem RBF bez skalowania trafia na teście w 60,0% przypadków — odległości są zdominowane przez prolinę. Po standaryzacji: 100%. W 5-krotnej walidacji krzyżowej na całym zbiorze: 65,7% bez skalowania, 98,3% ze skalowaniem. Liniowa SVM jest tu mniej wrażliwa (97,8% w obu wersjach) i opiera się na 22 wektorach nośnych ze 133 przykładów.
Parametry w akcji (cechy standaryzowane): liniowa SVM z C = 0,01 używa 88 wektorów nośnych i na treningu ma 97,7%, z C = 1 — tylko 22 i 100% na treningu. Jądro RBF z C = 1 i γ = 1 ma 100% na treningu, ale 62,2% na teście, a wektorami nośnymi są wszystkie 133 przykłady: każdy punkt stał się osobną wysepką. Przy γ = 10 trafność spada do 40%, czyli do udziału najliczniejszej klasy. Przeszukanie siatki z walidacją krzyżową na danych treningowych wybiera C = 10 i γ = 0,001 (97,0% w walidacji, 100% na teście).
Dane: Wine (wina z Piemontu)
W praktyce
SVC(kernel="rbf", C=1.0, gamma="scale"), zawsze w potokumake_pipeline(StandardScaler(), SVC()).- C i γ strój razem przez
GridSearchCVw skali logarytmicznej, np. C od 0,1 do 1000, γ od 0,0001 do 1. - Dla dużych zbiorów lub tekstu:
LinearSVCalboSGDClassifier(loss="hinge")— skalują się liniowo z liczbą przykładów. - Prawdopodobieństwa:
SVC(probability=True)(wewnętrzna kalibracja Platta, wolniejsza) alboCalibratedClassifierCV. - Regresja:
SVRz parametrem ε określającym szerokość „rury”, w której błędy nie są karane.
Najczęstsze pytania
- Co oznacza parametr C w SVM?
- C to kara za punkty naruszające margines. Duże C wymusza poprawną klasyfikację prawie wszystkich punktów treningowych kosztem wąskiego marginesu i ryzyka przeuczenia. Małe C pozwala na więcej błędów w zamian za szeroki margines i gładszą granicę.
- Czy SVM jest jeszcze używana?
- Tak, choć rzadziej niż kiedyś. Dobrze sprawdza się przy małych i średnich zbiorach z wieloma cechami, np. w bioinformatyce i klasyfikacji tekstu, oraz jako mocny punkt odniesienia. Przy dużych danych tabelarycznych zwykle wygrywa wzmacnianie gradientowe, a przy obrazach i tekście — sieci neuronowe.
- Czym SVM różni się od regresji logistycznej?
- Obie mogą dawać liniową granicę, ale minimalizują inne straty. Regresja logistyczna bierze pod uwagę wszystkie punkty i zwraca prawdopodobieństwa. SVM ze stratą zawiasową ignoruje punkty daleko od granicy — liczą się tylko wektory nośne — i zwraca odległość od granicy zamiast prawdopodobieństwa.
Źródła
- Cortes C., Vapnik V. „Support-Vector Networks”, Machine Learning 20(3), 1995.
- Boser B. E., Guyon I. M., Vapnik V. N. „A Training Algorithm for Optimal Margin Classifiers”, COLT 1992.
- Hastie T., Tibshirani R., Friedman J. „The Elements of Statistical Learning”, 2nd ed., 2009, rozdz. 12.
- James G., Witten D., Hastie T., Tibshirani R. „An Introduction to Statistical Learning”, 2nd ed., 2021, rozdz. 9.
- Dokumentacja scikit-learn, „Support Vector Machines”: https://scikit-learn.org/stable/modules/svm.html