ML Atlas

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).

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: liniowy SVM na dwóch gatunkach irysów: przy C = 0,01 pas marginesu ma 3,9 cm i wszystkie 70 kwiatów treningowych to wektory nośne, przy C = 100 pas ma 0,15 cm i trzymają go 4 punkty, a trafność testowa prawie się nie zmienia (26–27 z 30).

Dane: Wine (wina z Piemontu)

W praktyce

  • SVC(kernel="rbf", C=1.0, gamma="scale"), zawsze w potoku make_pipeline(StandardScaler(), SVC()).
  • C i γ strój razem przez GridSearchCV w skali logarytmicznej, np. C od 0,1 do 1000, γ od 0,0001 do 1.
  • Dla dużych zbiorów lub tekstu: LinearSVC albo SGDClassifier(loss="hinge") — skalują się liniowo z liczbą przykładów.
  • Prawdopodobieństwa: SVC(probability=True) (wewnętrzna kalibracja Platta, wolniejsza) albo CalibratedClassifierCV.
  • Regresja: SVR z 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

Zobacz też