Machine Learning Academy · Oppitunti

Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit

Sovella RBF- ja polynomikernelia epälineaarisesti eroteltavaan aineistoon ja ymmärrä, että kernelit projisoivat datan implisiittisesti suurempiulotteiseen avaruuteen.

Oppitunti 3/413 vaihetta

Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Ongelma: epälineaarinen data

Monet tosielämän luokitteluongelmat eivät ole lineaarisesti eroteltavissa — mikään suora viiva (tai hypertaso) ei pysty erottamaan luokkia oikein. Esimerkiksi samankeskisiksi renkaiksi järjestynyttä dataa ei voi erottaa lineaarisella rajalla. Yksi lähestymistapa on luoda manuaalisesti uusia piirteitä (esimerkiksi x² ja x×y), joiden avulla luokat ovat lineaarisesti eroteltavissa laajennetussa avaruudessa. Kernelitemppu tekee tämän automaattisesti ja implisiittisesti laskematta koskaan korkeaulotteisen avaruuden koordinaatteja.

Piirrekartat: datan siirtäminen korkeampiin ulottuvuuksiin

Piirrekartta φ(x) muuntaa syötevektorin korkeampiulotteiseksi esitykseksi. Esimerkiksi φ([x₁, x₂]) = [x₁², √2·x₁x₂, x₂²] kuvaa 2D-datan 3D-avaruuteen. Tämän muunnoksen jälkeen 2D-avaruudessa päällekkäiset luokat voivat olla lineaarisesti eroteltavissa 3D-avaruudessa. SVM etsii muunnetusta avaruudesta suurimarginaalisen hypertason. Alkuperäisen 2D-avaruuden vastaava päätösraja on käyrä, mikä antaa SVM:lle epälineaarisen luokittelukyvyn.

Kernelitemppu: eksplisiittisten piirrekarttojen välttäminen

φ(x):n eksplisiittinen laskeminen on kallista tai jopa mahdotonta (jotkin piirrekartat tuottavat ääretönulotteisia vektoreita). Keskeinen oivallus on, että SVM:n duaalimuotoilu tarvitsee vain pistetuloja φ(xᵢ)·φ(xⱼ), ei yksittäisiä piirrevektoreita. Kernelifunktio K(xᵢ, xⱼ) laskee tämän pistetulon suoraan alkuperäisistä syötteistä muodostamatta koskaan φ(xᵢ):tä. Tämä on kernelitemppu: kallis korkeaulotteinen pistetulo lasketaan edullisesti syöteavaruudessa.

Polynomikernel

Polynomikernel määritellään muodossa K(xᵢ, xⱼ) = (γ · xᵢ·xⱼ + r)^d, jossa d on polynomin aste, γ skaalauskerroin ja r coef0-parametri. Toisen asteen polynomikernel luo implisiittisesti kaikki parittaiset vuorovaikutukset (x₁x₂) ja neliötermit (x₁²). Korkeammat asteet luovat monimutkaisempia rajoja, mutta lisäävät ylisovittamisen riskiä. scikit-learnissä käytetään komentoa SVC(kernel='poly', degree=3).

from sklearn.svm import SVC
from sklearn.datasets import make_moons
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

X, y = make_moons(n_samples=300, noise=0.15, random_state=42)
for degree in [2, 3, 5]:
    model = make_pipeline(StandardScaler(), SVC(kernel='poly', degree=degree, C=5))
    score = cross_val_score(model, X, y, cv=5).mean()
    print(f'Polynomial degree={degree}: CV accuracy={score:.4f}')

RBF-kernel: oletusarvoinen työjuhta

Radial Basis Function (RBF) -kernel, josta käytetään myös nimitystä gaussinen kernel, määritellään muodossa K(xᵢ, xⱼ) = exp(-γ · ||xᵢ - xⱼ||²). Se mittaa samankaltaisuutta etäisyyden perusteella: lähellä olevilla pisteillä kernelin arvo on lähellä arvoa 1 ja kaukana olevilla lähellä arvoa 0. RBF-kernel vastaa ääretönulotteista piirrekarttaa, mikä antaa SVM:lle rajattoman ilmaisukyvyn. Se on scikit-learnin SVC-luokan oletuskernel ja toimii hyvin useimmilla aineistoilla, kun C ja γ säädetään asianmukaisesti.

from sklearn.svm import SVC
from sklearn.datasets import make_moons
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

X, y = make_moons(n_samples=300, noise=0.15, random_state=42)
model = make_pipeline(StandardScaler(), SVC(kernel='rbf', C=1.0, gamma='scale'))
scores = cross_val_score(model, X, y, cv=5)
print('RBF SVM CV accuracy:', round(scores.mean(), 4))

Gamma-parametri RBF-kernelissä

gamma-parametri määrittää, kuinka kauas yksittäisen harjoitusesimerkin vaikutus ulottuu. Pieni gamma saa kunkin pisteen vaikutuksen ulottumaan kauas — päätösraja on tasainen ja malli alisovittuu (suuri harha). Suuri gamma saa vaikutuksen heikkenemään jyrkästi — raja kiertyy tiukasti yksittäisten harjoituspisteiden ympärille (suuri varianssi, ylisovittuminen). scikit-learnin oletukset ovat gamma='scale' (käyttää arvoa 1/(n_features × X.var())) tai gamma='auto' (käyttää arvoa 1/n_features). Säätäkää C ja gamma aina yhdessä.

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

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

Sigmoidikernel

Sigmoidikernel on K(xᵢ, xⱼ) = tanh(γ · xᵢ·xⱼ + r), ja se muistuttaa kaksikerroksisen neuroverkon aktivointifunktiota. Se ei ole kaikilla parametriarvoilla kelvollinen (positiivisesti semidefiniitti) kernel, joten SVM:n optimointi ei välttämättä konvergoidu globaaliin minimiin. Sigmoidikernel on käytännössä harvoin paras valinta — RBF päihittää sen lähes aina — mutta siitä voi olla hyötyä, jos neuroverkkovastaavuuden tulkittavuutta arvostetaan.

Kernelin valinta käytännössä

Käytännön ohje kernelin valintaan: käyttäkää lineaarista kerneliä, kun piirteitä on paljon (teksti, genomiikka) tai data on jo valmiiksi korkeampiulotteista — ulottuvuuksien lisääminen kerneleillä on tarpeetonta; käyttäkää RBF:ää oletuksena matalan tai keskisuuren ulottuvuuden taulukkomuotoiselle datalle — se on joustavin ja usein paras vaihtoehto; käyttäkää polynomikerneliä, kun on selkeä syy olettaa polynomisten piirrevuo­rovaikutusten olevan merkityksellisiä; välttäkää sigmoidikerneliä, ellei tarkoituksena ole kokeilla. Verratkaa kerneleitä aina ristiinvalidoinnilla juuri omalla aineistollanne.

Kernel-SVM:n kompleksisuus ja skaalautuvuus

Kernel-SVM:ien suurin heikkous on skaalautuvuus. Koulutus edellyttää kvadraattisen ohjelmointiongelman ratkaisemista, ja laskenta-aika kasvaa harjoitusesimerkkien määrän suhteen muodossa O(n²)–O(n³). 100 000 esimerkin aineistolla RBF-SVM:n koulutus voi kestää tunteja tai muisti voi loppua. Ratkaisuja ovat: (1) käyttäkää lineaarisille kerneleille LinearSVC-luokkaa, joka skaalautuu miljooniin esimerkkeihin; (2) käyttäkää approksimatiivisia kernelimenetelmiä, kuten Nystroem tai RBFSampler, jotka luovat eksplisiittisiä matalaulotteisia piirrekarttoja; (3) vaihtakaa gradienttitehostukseen tai neuroverkkoihin todella suurilla aineistoilla.

Kernelien vertailu samalla aineistolla

Oikea tapa valita kernel on verrata kaikkia vaihtoehtoja ristiinvalidoinnilla omalla aineistollanne. Eri aineistot suosivat eri kerneleitä. Lineaarisesti eroteltava ongelma ei hyödy RBF:stä. Monimutkaisen paikallisen rakenteen ongelma saattaa tarvita suuren gamman RBF:n. Aloittakaa aina lineaarisesta kernelistä vertailutasona ja kokeilkaa sen jälkeen RBF:ää ruudukkohauilla, joissa haetaan C:n ja gamman arvoja. Jos kumpikaan ei päihitä toista merkittävästi, valitkaa lineaarinen kerneli sen tulkittavuuden ja nopeuden vuoksi.

from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

X, y = load_digits(return_X_y=True)
for kernel in ['linear', 'poly', 'rbf']:
    model = make_pipeline(StandardScaler(), SVC(kernel=kernel, C=10))
    score = cross_val_score(model, X, y, cv=3).mean()
    print(f'Kernel={kernel:8s}: CV accuracy={score:.4f}')

Mercerin lause ja kelvolliset kernelit

Kaikkia funktioita ei voi käyttää kernelinä. Kelvollisen kernelin on täytettävä Mercerin ehto: sen on oltava symmetrinen (K(x,y) = K(y,x)) ja tuotettava positiivisesti semidefiniitti Gram-matriisi mille tahansa syötejoukolle. Tämä takaa, että kerneli vastaa kelvollista pistetuloa jossakin piirreu­lot­tuvuudessa, jolloin SVM:n optimointiongelma on konveksi (sillä on yksi globaali minimi). DNA-sekvensseille, graafeille tai tekstille voidaan määrittää mukautettuja kerneleitä ja välittää ne parametrilla SVC(kernel='precomputed'), kunhan ne täyttävät Mercerin lauseen ehdot.

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte tässä oppitunnissa käsitellyn kernelitempun.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että kernelfunktiot laskevat pistetulot implisiittisesti korkeampiulotteisissa piirret­iloissa, RBF-kernel on monipuolisin oletusvalinta, ja gamma säätelee vaikutussädettä ja kernel-SVM:t eivät skaalaudu suurille aineistoille, joten lineaarisia kerneleitä tai approksimatiivisia menetelmiä kannattaa harkita ensin. Seuraavaksi tutustumme C:n ja gamman samanaikaiseen säätämiseen ruudukkohauilla.

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 ”Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit” ilmainen?

Kyllä – oppitunnin ”Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit” 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 ”Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit”?

Sovella RBF- ja polynomikernelia epälineaarisesti eroteltavaan aineistoon ja ymmärrä, että kernelit projisoivat datan implisiittisesti suurempiulotteiseen avaruuteen. 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 3/4.

Kuinka kauan ”Kernelitemppu: RBF-, polynomi- ja sigmoidikernelit”-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