Machine Learning Academy · Oppitunti

Pehmeän marginaalin SVM ja C-parametri

Havainnoi, miten C:n kasvattaminen kaventaa marginaalia ja rankaisee vääristä luokituksista, kun taas pieni C sallii enemmän rikkomuksia leveämmän ja vankemman marginaalin saavuttamiseksi.

Oppitunti 2/413 vaihetta

Pehmeän marginaalin SVM ja C-parametri on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.

Kovan marginaalin ongelma

Kovan marginaalin SVM edellyttää, että jokainen opetusesimerkki luokitellaan oikein vähintään 1:n marginaalilla, joten virheille ei jää tilaa. Käytännössä todelliset aineistot ovat lähes aina epätäydellisesti lineaarisesti erotettavia. Kohina, väärin merkityt esimerkit ja luokkien todellinen päällekkäisyys tarkoittavat, että kovaa marginaalia on joko mahdotonta saavuttaa tai raja vääntyy kaikkien rikkomusten välttämiseksi niin paljon, että se ylisovittaa opetusdatan. Tarvitsemme perustellun tavan sallia joitakin virheitä ja samalla maksimoida marginaali.

Väljyysmuuttujat: rikkomusten salliminen

Pehmeän marginaalin SVM ottaa käyttöön väljyysmuuttujat ξᵢ ≥ 0 (xi, lausutaan ”ksi”), yhden kutakin opetusesimerkkiä kohden. Ne mittaavat, kuinka paljon piste rikkoo marginaalia. Jos ξᵢ = 0, piste on luokiteltu oikein ja sijaitsee marginaalin ulkopuolella. Jos 0 < ξᵢ < 1, piste sijaitsee marginaalin sisällä mutta on luokiteltu oikein. Jos ξᵢ > 1, piste on luokiteltu väärin. Uusi tavoitefunktio minimoi suureen ||w||²/2 + C × Σξᵢ, jolloin marginaalin leveys ja rikkomusten kokonaismäärä ovat tasapainossa.

C-parametri: rikkomusten rangaistus

C on regularisointirangaistus: se määrittää, kuinka voimakkaasti SVM rankaisee kustakin marginaalirikkomuksesta. Suuri C asettaa suuren rangaistuksen ja pakottaa mallin luokittelemaan mahdollisimman harvat pisteet väärin marginaalin kaventumisen kustannuksella. Tämä johtaa pieneen harhaan ja suureen varianssiin (ylisovittamisen riski). Pieni C hyväksyy enemmän rikkomuksia leveämmän ja tasaisemman marginaalin saavuttamiseksi. Tämä johtaa suurempaan harhaan ja pienempään varianssiin (malli kestää paremmin kohinaa). Oikea C-arvo on löydettävä ristiinvalidoinnilla.

C:n vaikutuksen visualisointi

Kun C on hyvin pieni (esimerkiksi 0,001), SVM tuottaa leveän marginaalin ja luokittelee monet opetuspisteet väärin. Raja on tasainen ja yleistyy hyvin, mutta malli alisovittuu, jos data on selkeästi erotettavaa. Kun C on hyvin suuri (esimerkiksi 1000), raja taipuu luokittelemaan lähes jokaisen opetuspisteen oikein, jolloin marginaali kapenee ja malli saattaa ylisovittua. Optimaalinen C sijaitsee näiden ääripäiden välissä. Tämä kompromissi vastaa kaikissa regularisoiduissa malleissa esiintyvää harha–varianssi-kompromissia.

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import numpy as np

X, y = load_breast_cancer(return_X_y=True)
for C in [0.001, 0.01, 0.1, 1, 10, 100]:
    model = make_pipeline(StandardScaler(), SVC(kernel='linear', C=C))
    score = cross_val_score(model, X, y, cv=5).mean()
    print(f'C={C:6}: CV accuracy={score:.4f}')

Tukivektorien määrä suhteessa C:hen

Kun C pienenee (regularisointi lisääntyy ja marginaali levenee), yhä useampi opetusesimerkki rikkoo marginaalia ja muuttuu tukivektoriksi. Kun C kasvaa (regularisointi vähenee ja marginaali kapenee), harvempi esimerkki sijaitsee marginaalilla tai sen sisällä, joten tukivektoreita tarvitaan vähemmän. Voitte tarkastella tätä tutkimalla arvoa svm.n_support_. Malli, jolla on paljon tukivektoreita, käyttää useampia opetusesimerkkejä rajansa määrittämiseen. Se on yleensä vakaampi, mutta myös monimutkaisempi.

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np

X, y = load_breast_cancer(return_X_y=True)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
for C in [0.01, 0.1, 1, 10, 100]:
    svm = SVC(kernel='linear', C=C).fit(X_scaled, y)
    print(f'C={C:5}: support vectors = {svm.n_support_}, total = {sum(svm.n_support_)}')

Hinge-häviö: SVM:n häviöfunktio

Pehmeän marginaalin SVM minimoi kunkin opetusesimerkin kohdalla hinge-häviön max(0, 1 - y × (w·x + b)) sekä L2-regularisointitermin ||w||²/(2C). Hinge-häviö on nolla, kun piste on luokiteltu oikein ja sijaitsee marginaalin ulkopuolella (pisteellä ei ole häviötä). Kun piste siirtyy kohti rajaa tai sen yli, häviö kasvaa lineaarisesti. Tämän ansiosta SVM:t ovat vähemmän herkkiä poikkeaville havainnoille kuin neliövirhehäviö, joka rankaisisi kaukana väärin olevia ennusteita toisen asteen funktion mukaisesti.

import numpy as np
# Hinge loss for a single example: y in {-1, +1}, score = decision function value
def hinge_loss(y, score):
    return max(0, 1 - y * score)

# Correctly classified, far beyond margin
print('Correct, margin=2:', hinge_loss(1, 3))    # 0
# Inside margin, still correct
print('Inside margin:', hinge_loss(1, 0.5))       # 0.5
# Misclassified
print('Misclassified:', hinge_loss(1, -1))        # 2

LinearSVC suurille aineistoille

scikit-learn tarjoaa LinearSVC-luokan nopeammaksi vaihtoehdoksi luokalle SVC(kernel='linear') suurilla aineistoilla. Se käyttää LIBLINEAR-optimoijaa (primaarista tai duaalia koordinaattilaskeutumista) LIBSVM:n kvadraattisen ohjelmoinnin ratkaisijan sijaan. Kymmenientuhansien esimerkkien aineistoilla LinearSVC voi olla 10–100 kertaa nopeampi ja tuottaa lähes identtiset tulokset. Se ei tue predict_proba()-metodia natiivisti, mutta voitte käyttää Plattin skaalausta luokan CalibratedClassifierCV kautta.

from sklearn.svm import LinearSVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

X, y = load_breast_cancer(return_X_y=True)
model = make_pipeline(StandardScaler(), LinearSVC(C=1.0, max_iter=5000))
scores = cross_val_score(model, X, y, cv=5)
print('LinearSVC CV:', scores.mean().round(4), '+/-', scores.std().round(4))

C:n valinta: ruudukkohakustrategia

Optimaalinen C-arvo voi vaihdella useita kertaluokkia, joten etsikää sitä aina logaritmisella asteikolla: [0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000]. Tasavälinen asteikko ohittaa pienten arvojen tärkeän vaihteluvälin. Käyttäkää GridSearchCV-luokkaa ja viisiosaista ristiinvalidointia kunkin C-arvon arviointiin. SVM:n tapauksessa haku on yksiulotteinen (tai kaksiulotteinen, jos RBF-ytimelle otetaan mukaan gamma), joten se on laskennallisesti mahdollinen myös hienojakoisella ruudukolla.

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.datasets import load_breast_cancer
import numpy as np

X, y = load_breast_cancer(return_X_y=True)
model = make_pipeline(StandardScaler(), SVC(kernel='linear'))
param_grid = {'svc__C': np.logspace(-3, 3, 7)}
grid = GridSearchCV(model, param_grid, cv=5)
grid.fit(X, y)
print('Best C:', grid.best_params_['svc__C'])
print('Best CV score:', round(grid.best_score_, 4))

Pehmeä marginaali epälineaarisilla kerneleillä

Pehmeän marginaalin käsite koskee samalla tavalla epälineaarisia kerneleitä (RBF, polynomi). Kun käytätte RBF-ydintä, C ohjaa edelleen marginaalirikkomusten sietoa, mutta nyt raja voi olla kaareva pinta alkuperäisessä syöteavaruudessa. Pieni C ja RBF-ydin tuottavat hyvin tasaisen, lähes ympyränmuotoisen rajan. Suuri C ja pieni gamma tuottavat erittäin monimutkaisen rajan, joka kiertyy tiukasti jokaisen opetusaineiston ryppään ympärille. Kumpikin ääripää ylisovittuu omalla tavallaan.

Pehmeän marginaalin yhteenveto ja intuitio

Ajatelkaa pehmeän marginaalin SVM:ää säätimenä, jolla tehdään kompromissi. Kun kasvatatte C:tä, mallista tulee aggressiivinen: se rankaisee jokaisesta rikkomuksesta ja puristaa marginaalia sopiakseen opetusdataan. Kun pienennätte C:tä, mallista tulee sallivampi: se hyväksyy rikkomuksia, leventää marginaalia ja painottaa yleistymiskykyä. Oikea C on arvo, joka löytää juuri aineistonne tarvitseman tasapainon. Tämä ei koske vain SVM:iä: regularisointia käytetään myös ridge-regressiossa (alpha), logistisessa regressiossa (C) ja neuroverkoissa (painojen vaimennus), joissa tehdään aina kompromissi harhan ja varianssin välillä.

SVM:n ja logistisen regression vertailu

Sekä logistinen regressio että pehmeän marginaalin SVM löytävät lineaarisia päätösrajoja, mutta ne optimoivat eri häviöfunktioita. Logistinen regressio minimoi log-häviön, joka rankaisee jatkuvasti kaikista vääristä luokituksista. SVM minimoi hinge-häviön, joka on nolla marginaalin ulkopuolella oikein luokitelluille pisteille ja kasvaa lineaarisesti rikkomusten kohdalla. Käytännössä SVM:t ovat usein logistista regressiota parempia matalaulotteisilla aineistoilla, joilla on selkeät marginaalit, kun taas logistista regressiota suositaan, kun tarvitaan hyvin kalibroituja todennäköisyysarvioita tai kun aineisto on suuri (miljoonia esimerkkejä) ja malli on nopeampi opettaa.

from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

X, y = load_breast_cancer(return_X_y=True)
for name, model in [('SVM', SVC(kernel='linear', C=1.0)), ('LogReg', LogisticRegression(max_iter=1000))]:
    pipe = make_pipeline(StandardScaler(), model)
    score = cross_val_score(pipe, X, y, cv=5).mean()
    print(f'{name}: CV accuracy={score:.4f}')

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte tämän oppitunnin pehmeän marginaalin SVM:n ja C-parametrin.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että pehmeän marginaalin SVM sallii marginaalin hallitut rikkomukset slack-muuttujien avulla, C on regularisointiparametri, joka tasapainottaa marginaalin leveyttä ja harjoitusvirheitä ja C:tä tulee aina hakea logaritmisella asteikolla ristiinvalidoinnin avulla. Seuraavaksi tutustumme kernelitemppuun, joka laajentaa SVM:t epälineaarisille rajapinnoille.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Pehmeän marginaalin SVM ja C-parametri” ilmainen?

Kyllä – oppitunnin ”Pehmeän marginaalin SVM ja C-parametri” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Pehmeän marginaalin SVM ja C-parametri”?

Havainnoi, miten C:n kasvattaminen kaventaa marginaalia ja rankaisee vääristä luokituksista, kun taas pieni C sallii enemmän rikkomuksia leveämmän ja vankemman marginaalin saavuttamiseksi. Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Pehmeän marginaalin SVM ja C-parametri”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?

Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Maksimimarginaaliluokitin: tukivektorit ja hypertaso
  2. Pehmeän marginaalin SVM ja C-parametri
  3. Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit
  4. C:n ja gamman säätäminen Grid Searchilla
← Takaisin: Machine Learning Academy