Support Vector Machines – forelesning 1

Fra skillelinje til støttevektorklassifikator

Forfatter

Øystein Myrland

Om forelesningen

Pensum: James, Witten, Hastie, Tibshirani og Taylor, An Introduction to Statistical Learning, 2. utgave, avsnitt 9.1–9.2 og første del av laben i 9.6.
Videoer: 9.1 «Optimal Separating Hyperplane» og 9.2 «Support Vector Classifier».
Kodeeksemplene bruker pakken e1071; kjør install.packages("e1071") én gang.

NoteFra videoene – dette skal du kunne fra før
  • Et hyperplan er en flat grense \(f(x)=0\), og \(\boldsymbol\beta\) er normalvektoren.
  • Maksimal margin-klassifikatoren velger den skillelinjen som har størst avstand til de nærmeste punktene.
  • Støttevektorklassifikatoren tillater brudd på marginen gjennom bruddvariablene \(\xi_i\) og et budsjett \(C\).

I dag bruker vi lite tid på å gjenta definisjonene.
Vi bruker tiden på å vurdere: hva skjer når vi endrer cost, hvilke punkter styrer løsningen, og hvordan velger vi modell på en ærlig måte?

NoteTo spørsmål å ha med gjennom begge forelesningene
  1. Hvorfor kan en modell med perfekt treff på treningsdata gi dårlige prediksjoner?
  2. Hva betyr det egentlig at en observasjon er en støttevektor?

1 Læringsmål

Etter forelesningen skal du kunne forklare hyperplan, margin og støttevektor.
Du skal kunne skille maksimal margin fra myk margin og tolke bruddvariabelen \(\xi_i\).
Du skal kunne forklare hvordan cost påvirker margin, antall støttevektorer og avveiningen mellom skjevhet og varians.
Og du skal kunne bruke treningsdata, kryssvalidering og et separat testsett på en ryddig måte.

2 Et økonomisk klassifikasjonsproblem

Anta at en bank vil klassifisere en lånesøknad som mislighold eller ikke mislighold ut fra inntekt og gjeldsgrad.
Her lærer vi en prediksjonsregel fra historiske observasjoner.
Høy prediksjonsnøyaktighet viser ikke at en endring i inntekt forårsaker en endring i mislighold.

La \(x=(x_1,\ldots,x_p)\) være prediktorene og \(y\in\{-1,+1\}\) klassene.
Med to prediktorer kan vi tegne observasjonene som punkter i et plan.
Målet er å trekke en beslutningsgrense som også fungerer for nye søknader.

3 Hyperplan: en flat beslutningsgrense

Definer skåren

\[ f(x)=\beta_0+\beta_1x_1+\cdots+\beta_px_p=\beta_0+\boldsymbol\beta^\mathsf{T}x. \]

Grensen \(f(x)=0\) er en linje når \(p=2\), et plan når \(p=3\), og et hyperplan ellers.
Prediksjonen er \(+1\) når \(f(x)>0\) og \(-1\) når \(f(x)<0\).
Koeffisientvektoren \(\boldsymbol\beta\) står vinkelrett på grensen.

Avstanden med fortegn fra et punkt \(x\) til grensen er

\[ d(x)=\frac{f(x)}{\lVert\boldsymbol\beta\rVert}, \qquad \lVert\boldsymbol\beta\rVert=\sqrt{\textstyle\sum_j\beta_j^2}. \]

Bare når \(\lVert\boldsymbol\beta\rVert=1\) er \(f(x)\) selv en geometrisk avstand.
I video 9.1 er \(\beta_1=0{,}8\) og \(\beta_2=0{,}6\), slik at \(\lVert\boldsymbol\beta\rVert=1\).
Skåren er ikke en sannsynlighet.

Figur 1: FIGURE 9.1. The hyperplane \(1+2 X_1+3 X_2=0\) is shown. The blue region is the set of points for which \(1+2 X_1+3 X_2>0\), and the purple region is the set of points for which \(1+2 X_1+3 X_2<0\).
TipsStopp og tenk

Hvis vi dobler både \(\beta_0\) og alle \(\beta_j\), endres da beslutningsgrensen?
Hva skjer med skåren \(f(x)\) og med den geometriske avstanden \(d(x)\)?
Hvorfor må vi derfor låse skalaen, for eksempel med \(\lVert\boldsymbol\beta\rVert=1\), før vi kan maksimere marginen?

Beslutningsgrensen endres ikke.
Grensen er punktene der \(f(x)=0\).
Siden \(2\beta_0+2\boldsymbol\beta^\mathsf{T}x=0\) nøyaktig når \(\beta_0+\boldsymbol\beta^\mathsf{T}x=0\), er det samme linje.
Fortegnet til \(f(x)\), og dermed klassifikasjonen, er også uendret.

Skåren dobles, men avstanden er den samme.
\(f(x)\) blir dobbelt så stor for alle punkter.
Den geometriske avstanden er uendret, fordi både teller og nevner dobles:

\[ d(x)=\frac{2f(x)}{2\lVert\boldsymbol\beta\rVert}=\frac{f(x)}{\lVert\boldsymbol\beta\rVert}. \]

Derfor må skalaen låses.
Uten en normering kan vi gjøre \(y_i f(x_i)\) så stor vi vil bare ved å gange alle koeffisientene med et stort tall.
Da kan \(M\) i kravet \(y_i f(x_i)\geq M\) vokse uten grense, uten at linjen flytter seg.
Med \(\lVert\boldsymbol\beta\rVert=1\) blir \(f(x)\) selve den geometriske avstanden, og \(M\) måler den faktiske marginen.
Formuleringen med cost løser det samme problemet på en annen måte: den låser marginkravet til \(y_i f(x_i)\geq 1\) og minimerer \(\lVert\boldsymbol\beta\rVert\) i stedet.

4 Når klassene kan skilles helt

En skillelinje klassifiserer alle treningsobservasjoner korrekt hvis

\[y_i f(x_i)>0\quad\text{for alle }i.\]

Det kan finnes uendelig mange slike linjer.
Maksimal margin-klassifikatoren velger den som gir størst minsteavstand fra grensen til treningspunktene.
Når \(\lVert\boldsymbol\beta\rVert=1\), kan vi skrive problemet slik:

\[ \max_{\beta_0,\boldsymbol\beta,M} M \quad\text{slik at}\quad y_i f(x_i)\geq M\ (i=1,\ldots,n),\quad \lVert\boldsymbol\beta\rVert=1. \]

De nærmeste punktene bestemmer grensen.
De kalles støttevektorer.
Punkter langt fra grensen kan flyttes uten at grensen endres, så lenge de ikke krysser marginen.

Figur 2: FIGURE 9.2. Left: There are two classes of observations, shown in blue and in purple, each of which has measurements on two variables. Three separating hyperplanes, out of many possible, are shown in black. Right: A separating hyperplane is shown in black. The blue and purple grid indicates the decision rule made by a classifier based on this separating hyperplane: a test observation that falls in the blue portion of the grid will be assigned to the blue class, and a test observation that falls into the purple portion of the grid will be assigned to the purple class.
AdvarselHvorfor trenger vi en mykere grense?

En enkelt uvanlig observasjon kan flytte maksimal margin-grensen mye; klassifikatoren har høy varians.
Når klassene overlapper, finnes det dessuten ingen linje som skiller alle punktene korrekt.
Det vanlige er overlapp når \(n\) er stor i forhold til \(p\); når \(p>n\), finnes det nesten alltid en skillelinje.

5 Myk margin: tillat noen brudd

En støttevektorklassifikator (support vector classifier, SVC) tillater at observasjoner havner innenfor marginen eller på feil side av beslutningsgrensen.
Formuleringen i kapittel 9 er

\[ \begin{aligned} \max_{\beta_0,\boldsymbol\beta,M,\boldsymbol\xi}\quad & M\\ \text{slik at}\quad & \lVert\boldsymbol\beta\rVert=1,\\ &y_i f(x_i)\geq M(1-\xi_i),\\ &\xi_i\geq0,\qquad\sum_{i=1}^n\xi_i\leq C_{\text{bok}}. \end{aligned} \]

\(\xi_i\) måler bruddet på marginen.
I en løsning med \(M>0\) gjelder:

Brudd Posisjon Klassifikasjon
\(\xi_i=0\) På eller utenfor marginen Korrekt
\(0<\xi_i<1\) Innenfor marginen, men på rett side av grensen Korrekt
\(\xi_i=1\) På beslutningsgrensen Ingen entydig klasse
\(\xi_i>1\) På feil side av beslutningsgrensen Feil

Siden \(\sum_i\xi_i\le C_{\text{bok}}\), kan høyst \(C_{\text{bok}}\) observasjoner havne på feil side av grensen.
Større \(C_{\text{bok}}\) gir altså flere tillatte brudd og en bredere margin.
Støttevektorene er punktene på marginen, innenfor den eller på feil side av grensen.

Dette gir en avveining mellom skjevhet og varians:

  • Stor \(C_{\text{bok}}\): bred margin, mange støttevektorer, lav varians og mulig høy skjevhet.
  • Liten \(C_{\text{bok}}\): smal margin, få støttevektorer, lav skjevhet og høy varians.
Figur 3: FIGURE 9.3. There are two classes of observations, shown in blue and in purple. The maximal margin hyperplane is shown as a solid line. The margin is the distance from the solid line to either of the dashed lines. The two blue points and the purple point that lie on the dashed lines are the support vectors, and the distance from those points to the hyperplane is indicated by arrows. The purple and blue grid indicates the decision rule made by a classifier based on this separating hyperplane.

6 Samme idé i R: cost har motsatt retning

Programvare bruker ofte den ekvivalente tapsformen

\[ \min_{\beta_0,\boldsymbol\beta,\boldsymbol\xi} \frac12\lVert\boldsymbol\beta\rVert^2 +C_{\mathrm{cost}}\sum_i\xi_i, \qquad y_i f(x_i)\geq1-\xi_i,\quad\xi_i\geq0. \]

Her er marginen lik \(1/\lVert\boldsymbol\beta\rVert\) på hver side av grensen, så å minimere \(\lVert\boldsymbol\beta\rVert\) er det samme som å gjøre marginen bred.
Høy cost gjør brudd dyre: smalere margin, færre støttevektorer og sterkere tilpasning til treningsdata.
Lav cost gjør brudd billige: bredere margin og flere støttevektorer.
\(C_{\text{bok}}\) og cost er ulike parameteriseringer; sammenhengen er kvalitativt motsatt, men tallverdiene kan ikke sammenlignes direkte.

Valg Liten verdi Stor verdi
Bokas \(C_{\text{bok}}\) Liten bruddramme, smal margin, høy varians Stor bruddramme, bred margin, høy skjevhet
e1071::svm(cost = ...) Billige brudd, bred margin, høy skjevhet Dyre brudd, smal margin, høy varians

7 Kode: en lineær SVC på lånedata

Vi simulerer 100 lånesøknader med inntekt (i 1000 kr) og gjeldsgrad.
Lav inntekt og høy gjeldsgrad øker risikoen for mislighold, men med mye støy, slik at klassene overlapper.
y må være en factor for at svm() skal gjøre klassifikasjon og ikke regresjon.

Kode
if (!requireNamespace("e1071", quietly = TRUE)) {
  stop("Installer pakken med install.packages('e1071') før du gjengir dokumentet.")
}
library(e1071)

set.seed(9)
n <- 100
inntekt    <- round(rnorm(n, mean = 550, sd = 150))          # 1000 kr
gjeldsgrad <- round(pmax(rnorm(n, mean = 2.5, sd = 1), 0.2), 2)
risiko <- -as.numeric(scale(inntekt)) + 0.9 * as.numeric(scale(gjeldsgrad)) +
  rnorm(n, sd = 0.8)
y <- factor(ifelse(risiko > 0.4, "Mislighold", "Ingen mislighold"))
dat_laan <- data.frame(inntekt, gjeldsgrad, y)

summary(dat_laan)
    inntekt        gjeldsgrad                   y     
 Min.   :157.0   Min.   :0.200   Ingen mislighold:57  
 1st Qu.:438.0   1st Qu.:1.645   Mislighold      :43  
 Median :524.5   Median :2.515                        
 Mean   :542.0   Mean   :2.372                        
 3rd Qu.:613.5   3rd Qu.:3.112                        
 Max.   :952.0   Max.   :4.310                        
TipsStopp og tenk: skalering

Inntekt har standardavvik rundt 150, gjeldsgrad rundt 1.
SVC bygger på avstander mellom punkter, og straffen \(\lVert\boldsymbol\beta\rVert^2\) behandler alle koeffisienter likt.
Hva skjer med grensen hvis vi måler inntekt i kroner i stedet for i tusen kroner og ikke skalerer?
Laben i boka bruker scale = FALSE; vi skalerer.

Inntekt får dominere, og gjeldsgrad blir nesten oversett.
Målt i kroner har inntekt standardavvik rundt 150 000, mens gjeldsgrad fortsatt har standardavvik rundt 1.
Én krones forskjell i inntekt teller da like mye i avstanden som én enhet forskjell i gjeldsgrad.
Avstandene mellom søknadene bestemmes nesten bare av inntekt.

Straffen virker skjevt.
For at inntekt skal få samme effekt på \(f(x)\) som før, trenger den en koeffisient som er 1000 ganger mindre.
En så liten koeffisient koster nesten ingenting i straffen \(\lVert\boldsymbol\beta\rVert^2\).
Koeffisienten på gjeldsgrad blir derimot relativt dyr.
Optimeringen velger derfor å bruke inntekt og krympe gjeldsgrad mot null.
Grensen blir omtrent en terskel på inntekt, altså nesten loddrett på inntektsaksen.

Resultatet avhenger av måleenheten.
I OLS endrer en ny måleenhet bare tallverdien på koeffisienten, mens tilpassede verdier og prediksjoner er de samme.
I SVC, og i ridge og lasso, endrer måleenheten selve løsningen.
Med radialkjerne blir problemet like stort, siden \(\lVert x-z\rVert^2\) også domineres av inntekt.

Hvorfor kan laben i boka bruke scale = FALSE?
Der er begge prediktorene simulert fra samme fordeling og har samme skala.
Med økonomiske data i ulike enheter bør vi standardisere, for eksempel med scale = TRUE.

For å kunne se marginen standardiserer vi begge prediktorene og tegner grensen \(f(x)=0\) og marginene \(f(x)=\pm1\) selv.
plot()-metoden i e1071 viser ikke marginene, og den bytter dessuten om aksene.
Støttevektorene er markert med en ring.

Kode
dat_std <- data.frame(inntekt    = as.numeric(scale(dat_laan$inntekt)),
                      gjeldsgrad = as.numeric(scale(dat_laan$gjeldsgrad)),
                      y          = dat_laan$y)

# Tegner punkter, beslutningsgrense f(x) = 0, marginer f(x) = ±1 og støttevektorer
tegn_svc <- function(mod, data, main = "") {
  beta  <- drop(t(mod$coefs) %*% mod$SV)   # beta = sum_i alpha_i * x_i (se forelesning 2)
  beta0 <- -mod$rho
  farge <- ifelse(data$y == "Mislighold", "#cc583b", "#276ca6")
  plot(data$inntekt, data$gjeldsgrad, col = farge, pch = 19, asp = 1,
       xlab = "Inntekt (standardisert)", ylab = "Gjeldsgrad (standardisert)",
       main = main)
  for (k in c(-1, 0, 1)) {
    abline(a = (k - beta0) / beta[2], b = -beta[1] / beta[2],
           lty = ifelse(k == 0, 1, 2), lwd = ifelse(k == 0, 2, 1))
  }
  points(data[mod$index, c("inntekt", "gjeldsgrad")], cex = 1.8)
  legend("bottomleft", legend = c("Mislighold", "Ingen mislighold"),
         col = c("#cc583b", "#276ca6"), pch = 19, bty = "n", cex = 0.8)
}

mod_lav <- svm(y ~ inntekt + gjeldsgrad, data = dat_std, kernel = "linear",
               cost = 0.05, scale = FALSE)
mod_hoy <- svm(y ~ inntekt + gjeldsgrad, data = dat_std, kernel = "linear",
               cost = 100, scale = FALSE)

par(mfrow = c(1, 2))
tegn_svc(mod_lav, dat_std, main = "Lav cost: 0,05")
tegn_svc(mod_hoy, dat_std, main = "Høy cost: 100")
par(mfrow = c(1, 1))
Figur 4: Samme treningsdata, ulik kostnad ved marginbrudd. Heltrukken linje er beslutningsgrensen, stiplede linjer er marginene, ringer markerer støttevektorer.
Kode
marginbredde <- function(mod) {
  beta <- drop(t(mod$coefs) %*% mod$SV)
  2 / sqrt(sum(beta^2))
}
data.frame(
  modell                = c("Lav cost", "Høy cost"),
  antall_stottevektorer = c(mod_lav$tot.nSV, mod_hoy$tot.nSV),
  marginbredde          = round(c(marginbredde(mod_lav), marginbredde(mod_hoy)), 2),
  treningsfeil          = c(mean(predict(mod_lav, dat_std) != dat_std$y),
                            mean(predict(mod_hoy, dat_std) != dat_std$y))
)
    modell antall_stottevektorer marginbredde treningsfeil
1 Lav cost                    69         2.18         0.22
2 Høy cost                    46         1.04         0.22

Diskuter:
Hvilken modell bruker flest støttevektorer, og hvorfor?
Hvilken modell vil endre seg mest hvis vi bytter ut ti av søknadene?
De to modellene har omtrent like mange treningsfeil.
Hvilken ville du stolt mest på for nye søknader, og hvorfor?

Modellen med lav cost har flest støttevektorer.
I vår kjøring har modellen med cost = 0,05 69 støttevektorer, mens modellen med cost = 100 har 46.
Når brudd er billige, lønner det seg å gjøre marginen bred, her omtrent dobbelt så bred.
Da havner flere punkter på marginen, innenfor den eller på feil side, og alle disse er støttevektorer.
Med høy cost er brudd dyre, marginen blir smal, og færre punkter ligger innenfor.

Modellen med høy cost endrer seg mest.
Grensen bestemmes bare av støttevektorene.
Når færre punkter bestemmer grensen, får hvert av dem større innflytelse.
Bytter vi ut noen av punktene nær den smale marginen, kan linjen vippe merkbart.
Med lav cost er grensen et kompromiss mellom mange punkter, og ti nye søknader flytter den lite.
Høy cost gir altså høy varians, mens lav cost gir lav varians og muligens høyere skjevhet.

Hvilken skal vi stole på?
Lik treningsfeil sier lite om hvordan modellene gjør det på nye data.
Alt annet likt taler lav varians for modellen med lav cost: den er mer stabil, og den bruker ikke ekstra fleksibilitet til å tilpasse seg støy.
Men for lav cost kan gi en skjev grense, og det ser vi ikke på treningsfeilen heller.
Det ærlige svaret er at vi ikke bør velge ut fra treningsdata.
Vi bør velge med kryssvalidering, slik vi gjør i neste avsnitt, der en verdi midt imellom (cost = 1) gir lavest CV-feil.

8 Hvordan velger vi cost?

Vi deler data i trening og test.
På treningsdelen sammenligner vi cost-verdier med femfolds kryssvalidering.
Vi bruker testsettet bare én gang, etter modellvalget.
Nå bruker vi de rå dataene og lar svm(scale = TRUE) gjøre skaleringen inne i hver fold.

Kode
set.seed(91)
id_train   <- sample(seq_len(nrow(dat_laan)), size = 0.7 * nrow(dat_laan))
train_laan <- dat_laan[id_train, ]
test_laan  <- dat_laan[-id_train, ]

set.seed(92)
cv_lin <- tune(
  svm, y ~ ., data = train_laan, kernel = "linear", scale = TRUE,
  ranges = list(cost = c(0.01, 0.1, 1, 10, 100)),
  tunecontrol = tune.control(cross = 5)
)

summary(cv_lin)$performances   # CV-feil og spredning over fold for hver cost
   cost     error dispersion
1 1e-02 0.4428571  0.1277753
2 1e-01 0.2428571  0.1083268
3 1e+00 0.2142857  0.1237179
4 1e+01 0.2285714  0.1173691
5 1e+02 0.2285714  0.1173691
Kode
cv_lin$best.parameters
  cost
3    1
Kode
pred_lin <- predict(cv_lin$best.model, newdata = test_laan)
table(faktisk = test_laan$y, predikert = pred_lin)
                  predikert
faktisk            Ingen mislighold Mislighold
  Ingen mislighold               17          2
  Mislighold                      3          8
Kode
mean(pred_lin == test_laan$y)
[1] 0.8333333

Diskuter:
Se på kolonnen dispersion.
Er forskjellene i CV-feil mellom de beste cost-verdiene store i forhold til usikkerheten?
Hva ville du valgt hvis to verdier var omtrent like gode?

Forskjellene er små i forhold til usikkerheten.
I vår kjøring har cost = 1 lavest CV-feil (0,214), mens cost = 10 og cost = 100 ligger på 0,229 og cost = 0,1 på 0,243.
Kolonnen dispersion er standardavviket i feilraten over de fem foldene, og den ligger rundt 0,11–0,12.
Standardfeilen til gjennomsnittet er omtrent \(0{,}12/\sqrt{5}\approx 0{,}05\).
Forskjellen mellom den beste og den nest beste er 0,015, langt mindre enn standardfeilen.
Treningsdelen har 70 observasjoner, så 0,015 tilsvarer omtrent én observasjon.
Bare cost = 0,01 (0,443) er tydelig dårligere enn de andre.

Den «beste» verdien er delvis tilfeldig.
Med et annet frø i set.seed() blir foldene annerledes, og en annen cost kan komme ut som best.
Det vi faktisk lærer, er at alle verdier fra 0,1 til 100 er omtrent like gode, og at 0,01 er for lav.

Velg den enkleste modellen som er omtrent like god.
En vanlig tommelfingerregel er én-standardfeil-regelen fra kapittel 6.
Den sier at vi skal velge den mest regulariserte modellen som har CV-feil innenfor én standardfeil fra den beste.
For SVC er den mest regulariserte modellen den med lavest cost, altså bredest margin, flest støttevektorer og lavest varians.
Her ligger cost = 0,1 innenfor grensen (\(0{,}243 < 0{,}214 + 0{,}05\)), så regelen ville valgt den.
Begrunnelsen er at når dataene ikke skiller mellom modellene, bør vi foretrekke den som er mest stabil.

ViktigEn arbeidsregel

Skaler innenfor treningsarbeidsflyten.
Ved kryssvalidering må hver valideringsfold holdes utenfor både tilpasning og beregning av skaleringsparametere.
svm(scale = TRUE) beregner gjennomsnitt og standardavvik på dataene modellen tilpasses, og bruker de samme tallene ved predict().
I figuren over standardiserte vi hele datasettet på forhånd; det er greit for illustrasjon, men ikke for modellvalg.

9 Vurder påstanden

ForsiktigEn KI-assistent skrev dette – hva er galt?

«Med cost = 100 får vi færre støttevektorer enn med cost = 0,05.
Modellen bygger dermed på færre observasjoner, er enklere og vil derfor være mer robust mot støy i nye data.»

Hvilke deler av påstanden stemmer?
Hvilken konklusjon følger ikke?
Bruk begrepene skjevhet, varians og margin i svaret.

Dette stemmer:
Med cost = 100 får vi færre støttevektorer, i vår kjøring 46 mot 69.
Det stemmer også at grensen bare bestemmes av støttevektorene.

Dette følger ikke:
Fra «færre støttevektorer» trekker påstanden to slutninger som går i feil retning: at modellen er enklere, og at den er mer robust.

Færre støttevektorer betyr ikke en enklere modell.
Her får vi færre støttevektorer fordi marginen er smal.
Høy cost gjør brudd dyre, og modellen tilpasser seg treningsdataene tettere.
Den er altså mer fleksibel, ikke mindre: lav skjevhet, men høy varians.
Påstanden blander trolig sammen med lasso, der færre ikke-null koeffisienter betyr færre variabler og en enklere modell.
I en SVM handler sparsomheten om observasjoner, og alle prediktorene brukes uansett.

Færre støttevektorer betyr ikke mer robusthet.
Når grensen hviler på få punkter, får hvert av dem stor innflytelse.
Flytter eller bytter vi ut noen av punktene nær den smale marginen, kan grensen vippe merkbart.
Det er nettopp høy varians.
Med lav cost er marginen bred, mange punkter deler på å bestemme grensen, og modellen blir mer stabil.
Prisen er mulig høyere skjevhet.

«Bygger på færre observasjoner» er også misvisende.
Alle observasjonene brukes i tilpasningen.
Det er dem som avgjør hvilke punkter som blir støttevektorer.

Riktig formulering:
«Med cost = 100 får vi smalere margin og færre støttevektorer.
Modellen tilpasser seg treningsdataene tettere og har lavere skjevhet, men høyere varians.
Om den er bedre på nye data, må avgjøres med kryssvalidering.»

10 Kort oppsummering og spørsmål

  1. Et hyperplan er en flat grense; marginen måler avstand fra grensen til treningspunktene.
  2. Maksimal margin forutsetter at klassene kan skilles og er følsom for enkeltpunkter; myk margin tillater brudd.
  3. Bare støttevektorene bestemmer grensen. Flere støttevektorer gir lavere varians.
  4. cost i R straffer brudd og virker motsatt av bokas \(C\). Velg verdien med kryssvalidering på treningsdata.
  5. Skaler prediktorene, og evaluer den valgte modellen på observasjoner den ikke har sett.

Til neste gang: Hva om gruppene ligger som en ring rundt et sentrum?
Kan en rett linje hjelpe, uansett cost?

Kilder og kobling til videoene

  • An Introduction to Statistical Learning, 2. utgave: §9.1 maksimal margin; §9.2 støttevektorklassifikator; §9.6.1 lab.
  • Video 9.1 «Optimal Separating Hyperplane»: hyperplan og maksimal margin.
  • Video 9.2 «Support Vector Classifier»: myk margin, bruddbudsjett og standardisering.
  • R-koden bygger på kapittel 9-laben med e1071, men med egne simulerte lånedata.