CMD + K

Introduksjon til maskinlæringUbalanserte datasettBegreper & formler12
6 min lesing

Ubalanserte datasett

Håndter sjeldne klasser med egnede metrikker, resampling, klassevekter og beslutningsterskler som reflekterer kostnaden ved feil.

Læringsmål
  • 01Forklare hvorfor accuracy kan være misvisende ved sterk klasseubalanse
  • 02Sammenligne oversampling, undersampling, klassevekt og terskeljustering uten datalekkasje
  • 03Beregne og tolke vektet tap, balanserte klassevekter og en kostnadsbasert terskel
  • 04Velge metrikk og valideringsopplegg ut fra feilkonsekvens og realistisk klassefordeling

Når 97,5 prosent riktig er et dårlig resultat

Et logistikkselskap vil varsle om transportskader som rammer 25 av 1000 forsendelser. En modell som alltid svarer «uskadet», får 97,5 prosent accuracy. Likevel finner den ingen pakker som bør kontrolleres før utlevering. Dette er kjernen i klasseubalanse: klassefordelingen er så skjev at et samlet gjennomsnitt kan skjule modellens viktigste feil.

Den sjeldne klassen kalles ofte minoritetsklasse. Positiv betyr her «tilstanden vi leter etter», ikke «god». Før modellvalg bør vi regne ut ƒpositiv klasseandel i trenings-, validerings- og testdata. Dersom andelen varierer uventet, kan splitten være uheldig eller dataene komme fra ulike perioder. En stratifisert split forsøker å bevare klasseandelene, men den gjør ikke problemet balansert og reparerer ikke et lite eller skjevt datagrunnlag.

Figuren viser et mer realistisk eksempel enn «alltid negativ». Modellen finner 18 av 25 hendelser, men produserer også 24 falske alarmer. Accuracy er høy fordi 951 sanne negative dominerer telleren. Recall for positiv klasse er , mens precision er . Tallene svarer på forskjellige spørsmål og kan ikke erstattes av én universell metrikk.

FIGUR · confusionmatrix
FIGSjeldne transportskader ved terskel 0,5

Start derfor med konsekvensene: Hva koster et oversett tilfelle? Hva koster en falsk alarm? Hvor mange saker kan mennesker følge opp? Først da kan vi velge metrikk og terskel. Ved sikkerhetskontroll kan recall være kritisk, mens en knapp kontrollressurs også krever akseptabel precision. I svindeldeteksjon kan beløp og kundebelastning gjøre to feil av samme type svært ulike.

Evaluer på en realistisk fordeling

Testsettet skal etterligne situasjonen modellen møter etter lansering. Hvis den virkelige positive andelen er 2,5 prosent, bør vi normalt ikke balansere testsettet til 50–50. Et kunstig balansert testsett kan være nyttig for en avgrenset diagnostisk analyse, men precision og forventet arbeidsmengde vil da ikke beskrive produksjonen direkte. Klasseandelen påvirker hvor stor del av de positive varslene som faktisk er riktige.

En confusion matrix bør alltid leses med riktig positiv klasse. Precision bruker i nevneren og vurderer kvaliteten på varslene. Recall bruker og vurderer dekningen av faktiske positive. Specificity vurderer faktiske negative. Ved sterk ubalanse er precision–recall-kurven ofte mer informativ enn ROC-kurven fordi den viser kvaliteten på positive funn direkte. ROC kan se imponerende ut selv når et lite false-positive-rate gir mange falske positive i en enorm negativ klasse.

0101recallprecisionpositiv andelhøy terskellavere terskelLavere terskel gir vanligvis høyere recall, men kan redusere precision.
FIGPrecision–recall når terskelen flyttes

En kurve oppstår når terskelen flyttes, ikke når modellen trenes mange ganger. Hvert punkt viser et mulig kompromiss. Arealet under kurven kan oppsummere rangering, men skjuler fortsatt hvilket punkt som er praktisk brukbart. Velg derfor terskel på valideringsdata etter en forhåndsbestemt kostnad eller kapasitetsgrense, og rapporter sluttresultatet én gang på urørt testdata.

Den første kodesnutten lager 950 negative og 50 positive observasjoner med en fast seed. Modellen er representert ved ferdige scorer. Når terskelen endres, er både data og scorer identiske; bare klassevedtaket endres.

kap5-terskelsok

Metrikker ved flere terskler

python
import numpy as np rng = np.random.default_rng(4172)y = np.r_[np.zeros(950, dtype=int), np.ones(50, dtype=int)]score = np.clip(0.12 + 0.50 * y + rng.normal(0, 0.20, y.size), 0, 1) for terskel in (0.30, 0.50, 0.70):    pred = (score >= terskel).astype(int)    tp = np.sum((pred == 1) & (y == 1))    fp = np.sum((pred == 1) & (y == 0))    fn = np.sum((pred == 0) & (y == 1))    precision = tp / (tp + fp) if tp + fp else 0.0    recall = tp / (tp + fn) if tp + fn else 0.0    print(f"tau={terskel:.2f}  precision={precision:.3f}  recall={recall:.3f}")

Syntetiske sannsynlighetsscorer gjør terskeleffekten synlig uten å endre modellen. Den faste seed-en gir samme tall ved hver kjøring.

Resampling endrer treningsutvalget

resampling endrer hvilke observasjoner modellen ser under trening eller hvor ofte de bidrar. Ved oversampling trekkes minoritetsobservasjoner flere ganger. Det kan hjelpe en algoritme som ellers nesten aldri får gradientbidrag fra den sjeldne klassen. Enkel tilfeldig oversampling lager imidlertid ikke ny informasjon. Mange kopier av samme grensetilfelle kan gi overtilpasning, og syntetiske varianter kan bli urealistiske hvis featuregeometrien ikke respekteres.

Ved undersampling fjernes noen majoritetsobservasjoner. Treningen blir raskere, og klassenes bidrag kan bli jevnere. Prisen er mulig tap av viktige variasjoner, særlig sjeldne negative mønstre nær beslutningsgrensen. Har vi svært mye data, kan flere ulike undersamplede utvalg og et ensemble utnytte mer av informasjonen enn ett hardt kutt.

Resampling skal skje *etter* at data er delt. Hvis vi oversampler før splitten, kan kopier av samme observasjon havne i både trening og validering. Da måler vi gjenkjenning av kopier, ikke generalisering. Ved kryssvalidering må resampling ligge inne i pipeline-steget som tilpasses separat i hver treningsfold. Valideringsfolden og testsettet skal ikke påvirke hvilke treningsobservasjoner som kopieres eller fjernes.

Fire svar på klasseubalanseTiltakNår?Endrer trening?Viktig kontrollABCDOversamplingEtter splitJaLekkasjeUndersamplingEtter splitJaInfotapKlassevektUnder treningJaKalibreringTerskelEtter treningNeiKostnadValg av tiltak avhenger av om problemet ligger i representasjon, tap eller beslutning.
FIGTiltak virker på ulike deler av arbeidsflyten

Klassevekter endrer tapet

En klassevekt lar feil på én klasse telle mer uten å kopiere rader. ƒvektet binary cross-entropy multipliserer hvert tapsbidrag med vekten til observasjonens klasse. En falsk negativ kan dermed gi større gradient enn en tilsvarende sikker falsk positiv. Dette er et treningsvalg: parameterne som læres, kan endres.

En vanlig start er ƒbalansert klassevekt, der en klasse får vekt omvendt proporsjonal med antallet. Har vi 900 negative og 100 positive i et toklasseproblem, blir vektene 1000/(2·900) og 1000/(2·100). Det gjør klassesummene like store i tapet, men betyr ikke at de virkelige feilutgiftene er like. Dersom virksomheten kjenner kostnadene, bør de inngå i valget og testes som hyperparametre på valideringsdata.

kap5-vektet-bce

Vektet binary cross-entropy fra bunnen

python
import numpy as np rng = np.random.default_rng(4172)y = np.array([0, 0, 0, 0, 0, 1, 1])p = np.clip(rng.uniform(0.10, 0.90, size=y.size), 1e-12, 1 - 1e-12)vekt = np.where(y == 1, 4.0, 1.0) tap = -(y * np.log(p) + (1 - y) * np.log(1 - p))vektet_tap = np.mean(vekt * tap) print("labels:       ", y)print("sannsynlighet:", np.round(p, 3))print("vektet bidrag:", np.round(vekt * tap, 3))print(f"vektet BCE = {vektet_tap:.4f}")

Eksemplet viser at klassevekt skalerer tapsbidraget fra positive observasjoner. Det lager ikke nye data og garanterer ikke bedre kalibrering.

Store vekter kan gi ustabil trening og dårligere sannsynlighetskalibrering. En modell kan rangere positive høyt, men de rå sannsynlighetene gjenspeiler ikke lenger faktisk forekomst. Kontroller derfor kalibrering på data med realistisk klassefordeling. Ikke tolk 0,8 som «80 prosent risiko» bare fordi scoren ligger mellom null og én.

Terskel og kostnad er en egen beslutning

terskeljustering skjer etter trening. Vi kan senke terskelen for å fange flere positive eller heve den for å redusere falske alarmer. Dette endrer vanligvis recall og precision i motsatte retninger, men endrer ikke modellens rangering. Tiltaket er derfor raskt og reversibelt, og det kan tilpasses kapasitet uten å bygge modellen på nytt.

I kostnadssensitiv læring uttrykker vi at feil har ulik verdi. Dersom sannsynlighetene er kalibrerte og kostnadene er konstante, gir ƒkostnadsbasert bayes-terskel et enkelt beslutningspunkt. Hvis en falsk negativ koster ni ganger så mye som en falsk positiv, blir terskelen . Det er ikke en regel om at alle sjeldne problemer skal bruke 0,1. Formelen bygger på antakelser om kalibrering, korrekte kostnader og ett binært valg.

I praksis kan kostnaden avhenge av observasjonen. Et svindelforsøk på 100 000 kroner er ikke likt et på 50 kroner. Da kan forventet kostnad per sak være bedre enn én global terskel. Kapasitetsgrenser kan også gjøre «undersøk de 100 høyeste scorene» mer relevant enn et fast tall.

En trygg arbeidsrekkefølge

Begynn med å kontrollere labels, klasseandeler og tidsutvikling. Del data før all tilpasning, og behold et realistisk testsett. Velg metrikker fra feilkonsekvensene. Tren først en enkel baseline uten tiltak. Prøv deretter resampling, klassevekt eller begge deler inne i valideringsløpet. Velg terskel separat, og mål både ytelse, kalibrering og antall varsler.

Unngå å sammenligne tiltak på ulike splitter. Et resultat kan skyldes tilfeldige eksempler, ikke metoden. Bruk faste seeds der eksperimentet skal reproduseres, men gjenta gjerne med flere seeds for å se variasjonen. Rapporter confusion matrix og relevante rater, ikke bare beste gjennomsnittsscore.

Sjekk også hvordan resultatet varierer mellom undergrupper og over tid. En samlet positiv andel på én prosent kan skjule at én region har fem prosent og en annen nesten null. Ett globalt tiltak kan da hjelpe den ene gruppen og skade den andre. Tidsdrift kan endre både forekomst og måleprosess, slik at en terskel valgt i fjor gir for mange eller for få varsler i dag. Dokumenter derfor hvilken periode og populasjon terskelen ble validert på, og avtal når den skal vurderes på nytt.

Usikkerhet hører med i rapporteringen. Hvis testsettet bare inneholder ti positive tilfeller, kan ett enkelt treff flytte recall med ti prosentpoeng. Et punktestimat med mange desimaler gir da falsk presisjon. Vis gjerne et konfidensintervall beregnet med en metode som passer utvalget, eller bruk bootstrap på testprediksjonene uten å trene modellen på nytt. Resultatet skal tolkes sammen med antallet positive, ikke løsrevet fra det.

På eksamen bør du kunne skille tre nivåer: resampling endrer treningsdataene, klassevekt endrer tapsfunksjonen, og terskeljustering endrer beslutningen. Alle kan flytte confusion matrix, men via ulike mekanismer. Det skillet gjør det mulig å oppdage datalekkasje, tolke metrikkene og foreslå et tiltak som passer problemet.

Mine notater

Skriv egne notater for dette kapittelet. De lagres automatisk og dukker opp i «Mine notater»-oversikten paa fag-siden.

Laster…