---
title: "Support Vector Machines – forelesning 1"
subtitle: "Fra skillelinje til støttevektorklassifikator"
author: "Øystein Myrland"
lang: nb
format:
html:
theme: cosmo
toc: true
toc-depth: 3
number-sections: true
code-fold: show
code-tools: true
embed-resources: true
fig-width: 7
fig-height: 5
execute:
warning: false
message: false
echo: true
---
## Om forelesningen {.unnumbered}
**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.
<!--
Lærernotat (vises ikke i HTML):
Gjengi med: quarto render svm_forelesning_1.qmd --to html
Uten kodekjøring: quarto render svm_forelesning_1.qmd --to html -M execute.eval:false
Bokfigurer: legg bildefiler i figurer/ og fjern kommentartegnene rundt bildelinjen ved hver figurplass.
-->
::: {.callout-note title="Fra 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?
:::
::: {.callout-note title="To 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*?
:::
# 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.
# 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.
# 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.
<!--
Figurplass 1 – hyperplan: bokfiguren med linje, normalvektor og punkter på hver side.
Spørsmål til salen: pek ut fortegnet til f(x) for et par av punktene.
{#fig-hyperplan width=78%}
-->
{#fig-9-1 width=85%}
::: {.callout-tip title="Stopp 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?
:::
::: {.callout-note collapse="true" title="Svar: Stopp og tenk"}
**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.
:::
# 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.
<!--
Figurplass 2 – flere mulige skillelinjer og maksimal margin.
Diskusjon: hvorfor velger ikke 100 % treff på trening én entydig modell?
{#fig-maksimal-margin width=85%}
-->
{#fig-9-2 width=85%}
::: {.callout-warning title="Hvorfor 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.
:::
# 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.
<!--
Figurplass 3 – myk margin: bokfiguren med støttevektorer, marginbrudd og feilklassifikasjoner.
Oppgave: la studentene sortere markerte punkter etter tabellen over.
{#fig-myk-margin width=85%}
-->
{#fig-9-3 width=85%}
# 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 |
# 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.
```{r}
#| label: simuler-laan
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)
```
::: {.callout-tip title="Stopp 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.
:::
::: {.callout-note collapse="true" title="Svar: Stopp og tenk: skalering"}
**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.
```{r}
#| label: fig-lineaer-svc
#| fig-cap: "Samme treningsdata, ulik kostnad ved marginbrudd. Heltrukken linje er beslutningsgrensen, stiplede linjer er marginene, ringer markerer støttevektorer."
#| fig-width: 10
#| fig-height: 5
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))
```
```{r}
#| label: tab-lav-hoy
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))
)
```
**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?
::: {.callout-note collapse="true" title="Svar: Diskuter"}
**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.
:::
# 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.
```{r}
#| label: tune-cost
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
cv_lin$best.parameters
```
```{r}
#| label: test-cost
pred_lin <- predict(cv_lin$best.model, newdata = test_laan)
table(faktisk = test_laan$y, predikert = pred_lin)
mean(pred_lin == test_laan$y)
```
**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?
::: {.callout-note collapse="true" title="Svar: Diskuter"}
**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.
:::
::: {.callout-important title="En 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.
:::
# Vurder påstanden
::: {.callout-caution title="En 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.
::: {.callout-note collapse="true" title="Svar: Hva er galt?"}
**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.»
:::
# 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 {.unnumbered}
- *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.