Luokittelu, ristientropia ja miten et huijaa itseäsi
Rakenna logistinen luokitin luvun 2 häviöstä ja luvun 3 laskeutumisesta — ja näe, miksi 98 % accuracy voi olla arvoton.
Tällä sivulla
Malli, joka vastaa tämä osa on kunnossa jokaisesta hihnalta tulevasta osasta, on oikeassa 98,15 % ajasta. Se on myös hyödytön: testijoukon 74 viallisesta osasta se ei löydä yhtäkään.
Molemmat lauseet kuvaavat samaa mallia. Niiden välinen matka on tämä luku.
Ensimmäinen puolikas rakentaa luokittimen. Se tarvitsee lähes mitään uutta: luku 2 antoi reseptin, jolla oletus datan syntytavasta muutetaan häviöfunktioksi, ja luku 3 antoi koneiston, jolla kävellään alamäkeen millä tahansa häviöllä, jonka resepti antaa. Sovella molempia kyllä/ei-kysymykseen, ja logistinen regressio putoaa ulos — sekä yksi uusi ajatus, logit, josta laskutetaan uudelleen luvussa 17.
Toinen puolikas on vaikeampi. Tästä eteenpäin kurssilla kaikki arvioidaan jollakin mitatulla luvulla, ja jos et erota todellista parannusta mittausartefaktista, jokainen seuraava luku on koristelua. Siis: sekaannusmatriisi, precision ja recall, kolme jakoa, leakage ja kysymys, johon lähes kukaan ei vastaa rehellisesti — montako testiesimerkkiä oikeasti tarvitsen?
Tässä aritmetiikka kulkee 20 000 rivin yli, joten se on kauttaaltaan vektoroitu — NumPy on tehnyt työn luvusta 2 asti, eikä tästä eteenpäin ole enää mainitsemisen arvoista huomauttaa siitä.
Hihna, harvinaisemmalla kysymyksellä
Linkki osioon: Hihna, harvinaisemmalla kysymykselläSama tehdas kuin luvussa 1, vaikeampi kysymys. Sen sijaan, että kysyttäisiin hyväksy vai hylkää, kysymys on onko tämä osa viallinen — ja viat ovat harvinaisia, mikä tekee tämän luvun mittauspuolesta vaikean ja mallinnuspuolesta petollisen helpon.
import numpy as np
rng = np.random.default_rng(4)
N = 20_000
width = rng.normal(22.0, 0.9, N) # millimetres
weight = rng.normal(57.0, 3.0, N) # grams
z_true = -5.90 + 1.90 * (width - 22.0) + 0.42 * (weight - 57.0)
y = (rng.random(N) < 1 / (1 + np.exp(-z_true))).astype(float)
perm = rng.permutation(N)
train, val, test = perm[:12_000], perm[12_000:16_000], perm[16_000:]N = 20000 defects = 337 base rate = 0.0169
defects per split = 203 60 74Kolme jakoa, ei kahta. Syy ansaitsee oman osionsa ja saa sellaisen alempana; toistaiseksi opeta ensimmäisellä, säädä toisella äläkä katso kolmanteen.
Piirteet standardoidaan — keskiarvo vähennetään ja jaetaan keskihajonnalla — käyttäen vain opetusjoukon tilastoja, siitä syystä jonka luku 1 näytti perceptronin konvergenssirajalla: keskittämätön data tekee geometriasta vihamielisen. Miltä riveiltä tuon keskiarvon saa laskea, muuttuu myöhemmin tässä luvussa eläväksi kysymykseksi.
Tuomiosta todennäköisyydeksi
Linkki osioon: Tuomiosta todennäköisyydeksiPerceptron palautti etumerkin. Etumerkki ei erota tapausta hylkää tapauksesta hylkää, mutta juuri ja juuri, ja juuri sitä eroa tehdas tarvitsee päättääkseen, mitkä osat ihmisen pitäisi tarkastaa uudelleen ensin.
Seuraa siis luvun 2 reseptiä kirjaimellisesti. Kirjoita ylös väitteesi siitä, miten label syntyy, ota likelihood, ota logaritmi, vaihda etumerkki, ja sinulla on häviö. Kyllä/ei-tulokselle väite on Bernoulli-jakauma: on todennäköisyys , että osa on viallinen, ja
mikä on vain tiivis tapa kirjoittaa " jos , ja jos ". Ota siitä logaritmi ja vaihda etumerkki, ja yhden esimerkin häviö on
Tämä on binäärinen ristientropia. Sitä ei valittu siksi, että se olisi kätevä; se on ainoa mahdollinen kolikonheiton jakauman negatiivinen log-likelihood. Mitään muuta ei ollut tarjolla.
Vielä puuttuu, mistä tulee. Malli laskee painotetun summan , joka on reaaliluku ja kulkee koko lukusuoran yli, kun taas todennäköisyyden täytyy elää välillä . Funktio, joka liikkuu niiden välillä, on logistinen sigmoid:
logit -4.0 -> p = 0.0180 loss when y=1 and p=0.9 : 0.1054
logit -1.0 -> p = 0.2689 loss when y=1 and p=0.5 : 0.6931
logit 0.0 -> p = 0.5000 loss when y=1 and p=0.01 : 4.6052
logit 4.0 -> p = 0.9820Lue oikeanpuoleinen sarake hinnastona. Oikeassa oleminen 90 % varmuudella maksaa 0,105. Kieltäytyminen sitoutumasta maksaa 0,693 — eli , olankohautuksen hinta. Varmasti väärässä oleminen maksaa 4,6, neljäkymmentäneljä kertaa enemmän, ja hinta nousee rajatta, kun malli tulee yhä varmemmaksi virheestään. Ristientropia ei vain laske virheitä: se veloittaa ylimielisyydestä.
Gradientti on ennuste miinus totuus
Linkki osioon: Gradientti on ennuste miinus totuusLuku 3 sanoi: jotta voit opettaa mitä tahansa, hanki häviön derivaatta kunkin parametrin suhteen. Tee se yhdelle esimerkille. Kun ja :
Näytä lisätiedot
Kaksi riviä, jotka saavat sotkun kumoutumaan. Sigmoidilla on poikkeuksellisen miellyttävä derivaatta, . Ja häviö derivoituu muotoon
Kerro nämä kaksi ketjusäännöllä, ja ilmestyy kerran ylös ja kerran alas. Se kumoutuu täsmälleen, ja jäljelle jää . Tuo kumoutuminen ei ole sattumaa — niin tapahtuu aina, kun häviö on jakauman negatiivinen log-likelihood ja ulostulofunktio on se, jota kyseinen jakauma luontevasti käyttää. Tällä parilla on nimi — yleistetty lineaarinen malli — ja siisti gradientti on sen sormenjälki.1
Päivitys on siis ennuste miinus totuus, kertaa syöte. Ei muuta. Tässä on koko trainer, joka on luvun 3 descent yhdellä muutetulla rivillä:
def sigmoid(z):
return np.where(z >= 0, 1.0 / (1.0 + np.exp(-z)),
np.exp(np.minimum(z, 0)) / (1.0 + np.exp(np.minimum(z, 0))))
def fit_logistic(X, y, lr=0.5, epochs=4000):
w, b = np.zeros(X.shape[1]), 0.0
for _ in range(epochs):
p = sigmoid(X @ w + b)
g = p - y
w -= lr * (X.T @ g) / len(y)
b -= lr * g.sum() / len(y)
return w, bnp.where kohdassa sigmoid ei ole kosmeettinen. Laskeminen suoraan ylivuotaa suurilla negatiivisilla -arvoilla; haara valitsee sen algebrallisesti identtisen muodon, joka pitää eksponentin negatiivisena. Tämä on luvun 2 liukulukulaatikko perimässä ensimmäistä velkaansa, ja se perii isomman kahden osion päästä.
Miksei neliövirhe, ja miksi vastaus liittyy gradienttiin
Linkki osioon: Miksei neliövirhe, ja miksi vastaus liittyy gradienttiinTavanomainen selitys ristientropian suosimiselle neliövirheen sijaan on yllä oleva likelihood-argumentti: neliövirhe on se, mitä saat olettamalla Gaussista kohinaa, labelit eivät ole Gaussisia, joten älä tee niin. Se on oikein eikä vakuuta ketään, koska voit kirjoittaa sigmoidin päälle, ja se kyllä oppii.
Perille menevä argumentti koskee gradienttia. Laita neliövirhe sigmoidin päälle, ja ketjusääntö antaa
Tuo ylimääräinen on se, joka aiemmin kumoutui. Nyt se ei kumoudu, ja se menee nollaan aina, kun malli on varma — myös silloin, kun malli on varmasti väärässä. Arvioi molemmat muutamalla pisteellä esimerkille, jonka todellinen label on 1:
| piste | ristientropia | neliövirhe | suhde | |
|---|---|---|---|---|
| 0.000335 | 1,491 | |||
| 0.017986 | 28.3 | |||
| 0.119203 | 4.8 | |||
| 0.500000 | 2.0 | |||
| 0.880797 | 4.8 |
Kohdassa malli on niin väärässä kuin mahdollista, ja neliövirhe vastaa gradientilla, joka on 1 491 kertaa pienempi kuin ristientropian. Mitä pahempi virhe, sitä vähemmän malli oppii siitä. Ristientropian gradientti puolestaan saturoituu arvoon : maksimaalisen väärä tuottaa maksimaalisen suuren signaalin, eikä suurempaa.
Aja kilpailu. Kaksituhatta tasapainotettua pistettä, identtiset aloituspainot valittuina olemaan varmasti väärässä (), identtinen oppimisnopeus, vain häviö eroaa. Molemmat ajot pisteytetään ristientropialla, jotta sarakkeet ovat vertailukelpoisia.
| epoch | ristientropiahäviö | accuracy | neliövirhehäviö | accuracy |
|---|---|---|---|---|
| 1 | 5.4865 | 0.2300 | 5.9499 | 0.2290 |
| 10 | 1.5525 | 0.2460 | 5.9042 | 0.2290 |
| 50 | 0.4642 | 0.7780 | 5.6913 | 0.2320 |
| 100 | 0.4639 | 0.7770 | 5.3955 | 0.2410 |
| 200 | 0.4639 | 0.7770 | 4.6311 | 0.2745 |
| 500 | 0.4639 | 0.7770 | 0.5291 | 0.7660 |
| 1,000 | 0.4639 | 0.7770 | 0.4640 | 0.7765 |
Ristientropia on valmis epochilla 50. Neliövirhe on vielä 24 % accuracyssa epochilla 100 — eikä ollut liikkunut 23 %:sta epochilla 10 — arvaamista huonompi, koska se aloitti varmasti väärässä ja sen pelastava gradientti oli kerrottu luvulla 0,0007. Se pääsee pakoon noin epochilla 500 ja päätyy samaan paikkaan. Rehellinen yhteenveto on siis, että neliövirhe sigmoidin päällä ei ole väärin; se on hidas juuri siellä, missä nopeudella on eniten väliä. Kahden parametrin mallissa menetät 450 epochia. Sadan kerroksen verkossa, jossa jokin yksikkö jossakin on aina varmasti väärässä, menetät koko opetuksen.
Entropia, ristientropia ja KL yhdellä sivulla
Linkki osioon: Entropia, ristientropia ja KL yhdellä sivullaKolme suuretta, joita tarvitaan kunnolla luvussa 8 perplexityyn ja luvussa 11 rangaistukseen, joka pitää fine-tuned policy lähellä referenssiään. Ne ovat helpompia kuin maineensa.2
Entropia on bittien keskimääräinen määrä, joka sinun täytyy käyttää jakaumasta tehdyn arvonnan viestimiseen, jos käytät sille parasta mahdollista koodia:
Ristientropia on se, mitä käytät, kun käytät jakaumalle rakennettua koodia dataan, joka oikeasti tulee jakaumasta :
KL-divergenssi on ylijäämä — hukka bitteinä, jonka aiheuttaa uskominen jakaumaan , kun totuus on :
Tarkista kaikki kolme hihnalla:
test defect rate = 0.0185
entropy of that coin = 0.1329 bits
cross-entropy of the constant predictor on test = 0.1330 bits
KL(test coin || fair coin) = 0.8671 bits
H + KL = 1.0000 bits
cross-entropy of the p=0.5 predictor on test = 1.0000 bitsKaksi asiaa näkyy siinä. Ensinnäkin malli, joka vain raportoi opetusjoukon perusosuuden, 1,69 %, saavuttaa ristientropian 0,1330 bittiä, melkein täsmälleen testilabelien entropian — kuten pitääkin, koska sillä on oikea jakauma eikä mitään muuta tietoa. Entropia on lattia, jonka yksilöstä tietämättömyys ostaa sinulle. Toiseksi malli, joka kohauttaa olkiaan ja sanoo 0,5, maksaa täsmälleen 1 bitin, ja näiden kahden väli, 0,8671 bittiä, on täsmälleen KL-divergenssi. ei ole identiteetti ulkoa opeteltavaksi; se on lasku, jonka kertymistä voit katsoa.
Ja yhteys takaisin opetukseen: kun label on yksi tunnettu luokka, "todellinen" jakauma on one-hot, sen entropia on nolla, ja ristientropia on yhtä kuin KL-divergenssi. Ristientropian minimointi ja mallin jakauman vetäminen kohti totuutta ovat sama teko.
Enemmän kuin kaksi vastausta: softmax ja siirto, joka ei maksa mitään
Linkki osioon: Enemmän kuin kaksi vastausta: softmax ja siirto, joka ei maksa mitäänViallinen ei ole yksi asia. Valussa osa voi tulla ulos vajaatäyttönä (liian vähän materiaalia), purseena (liikaa, puristuneena ulos muotista) tai palamana. Neljä tulosta, siis neljä logits, ja niistä täytyy tulla neljä todennäköisyyttä, joiden summa on yksi. Se on softmax:
Sillä on ominaisuus, joka näyttää vahingolta mutta on itse asiassa koko toteutus:
millä tahansa vakiolla , koska ja kumoutuu ylhäällä ja alhaalla. Vain logitsien erot merkitsevät mitään. Absoluuttinen taso ei ole informaatiota.
Onneksi, koska absoluuttinen taso on se, joka rikkoo tietokoneen:
logits = [800. 801. 799.]
naive softmax = [nan nan nan]
shifted by -max = [0.2447 0.6652 0.09 ]
same softmax after adding 1000 to every logit: True ylivuotaa 64-bittisen liukuluvun, summa muuttuu äärettömäksi, ja ääretön jaettuna äärettömällä on nan — ei virhe, ei kaatuminen, vain hiljainen aukko siinä, missä kolmen todennäköisyyden piti olla. Suurimman logit vähentäminen ei muuta matemaattisesti mitään ja numeerisesti kaiken, koska suurimmasta eksponentista tulee täsmälleen . Tämä on luvun 2 logsumexp-temppu työvaatteissaan, ja jokainen vakava toteutus tekee sen:
def softmax(Z):
Z = Z - Z.max(axis=1, keepdims=True)
E = np.exp(Z)
return E / E.sum(axis=1, keepdims=True)
def fit_softmax(X, Y, lr=1.0, epochs=6000):
W, b = np.zeros((X.shape[1], Y.shape[1])), np.zeros(Y.shape[1])
for _ in range(epochs):
G = (softmax(X @ W + b) - Y) / len(X)
W -= lr * (X.T @ G)
b -= lr * G.sum(0)
return W, bGradientti on taas ennuste miinus totuus, nyt kun on one-hot. Binääritapaus oli koko ajan erikoistapaus.
Opetettuna 3 000 osalla ja testattuna 1 000:lla, kolmella mittauksella kullekin (leveys, paino, sulalämpötila), se saavuttaa 94,00 % accuracyn. Tässä on, mitä tuo luku piilottaa:
| totuus ↓ / ennustettu → | ok | vajaatäyttö | purse | palama | recall |
|---|---|---|---|---|---|
| ok | 850 | 5 | 9 | 0 | 0.984 |
| vajaatäyttö | 22 | 21 | 0 | 0 | 0.488 |
| purse | 20 | 0 | 30 | 1 | 0.588 |
| palama | 3 | 0 | 0 | 39 | 0.929 |
| precision | 0.950 | 0.808 | 0.769 | 0.975 |
Malli löytää alle puolet vajaatäytöistä. Accuracy ei näe tätä, koska 86 % osista on kunnossa, ja niiden oikein saaminen riittää kantamaan keskiarvon. Macro F1 — luokkakohtaisten F1-pisteiden keskiarvo, joka painottaa harvinaista luokkaa samalla tavalla kuin yleistä — on 0,7983, kun micro F1 on 0,9400 ja määritelmän mukaan identtinen accuracyn kanssa. Aina kun joku raportoi yhden F1-luvun, kysy mikä.
Siihen päättyy mallinnus. Luvun loppu käsittelee lukuja.
Kolme mallia, yksi accuracy
Linkki osioon: Kolme mallia, yksi accuracyOta opetettu binäärimalli ja tee kaksi varianttia kertomalla jokainen logit vakiolla: 0,35 epäröivälle versiolle, 4 ylivarmalle. Positiivisella luvulla kertominen ei voi muuttaa yhtään etumerkkiä, joten kaikki kolme mallia ennustavat täsmälleen saman labelin kaikille 4 000 testiosalle. Accuracy ei erota niitä toisistaan. Ristientropialla ei ole minkäänlaista vaikeutta:
| malli | accuracy | ristientropia | keskihäviö oikein ollessa | keskihäviö väärin ollessa | pahin yksittäinen häviö |
|---|---|---|---|---|---|
| epäröivä (logits × 0.35) | 0.9830 | 0.1549 | 0.1369 | 1.1990 | 2.80 |
| kuten opetettu | 0.9830 | 0.0564 | 0.0147 | 2.4689 | 7.82 |
| yliluottavainen (logits × 4) | 0.9830 | 0.1563 | 0.0009 | 9.1427 | 27.63 |
Epäröivä malli maksaa pienen veron jokaisesta osasta, myös niistä tuhansista, jotka se saa oikein. Ylivarma malli on lähes ilmainen ollessaan oikeassa ja katastrofaalinen ollessaan väärässä — yksi osa tuossa testijoukossa maksaa sille yksin 27,63 natsia. Nämä kaksi päätyvät lähes samaan kokonaismäärään vastakkaisia reittejä, ja opetettu malli, jonka todennäköisyydet on kalibroitu dataan, istuu kolme kertaa alempana kuin molemmat.
Tämä on terävin tapa sanoa ero häviön ja metriikan välillä. Häviö on se, mitä optimoit: sen täytyy olla derivoituva, ja se näkee kaiken, mitä malli sanoi, myös sen kuinka varma se oli. Metriikka on se, jolla sinut arvioidaan: se voi olla askelfunktio, liiketoimintasääntö, laskuri ohitetuista vioista. Ne eivät ole sama objekti eivätkä aina ole samaa mieltä — siksi määrittelet molemmat ennen aloittamista etkä koskaan anna häviön korvata metriikkaa vain siksi, että se sattuu olemaan ruudulla.
Tyhmä baseline tulee ensin
Linkki osioon: Tyhmä baseline tulee ensinEnnen mitään mallia vaatimus: mihin laiskin mahdollinen vastaus yltää? Tällä hihnalla sano aina kunnossa:
always-say-fine baseline: accuracy = 0.9815
confusion (tn, fp, fn, tp) = (3926, 0, 74, 0)98,15 %. Nyt opetettu logistinen malli, oletuskynnyksellä 0,5:
logistic @0.5: accuracy=0.9830 precision=0.8000 recall=0.1081 F1=0.1905
confusion (tn, fp, fn, tp) = (3924, 2, 66, 8)98,30 %. Se voitti baselinen 0,15 prosenttiyksiköllä, ja mikä tahansa raportti, joka pysähtyy accuracyyn, kutsuu sitä voitoksi. Sekaannusmatriisi kertoo, mitä oikeasti tapahtui:
| ennustettu kunnossa | ennustettu viallinen | |
|---|---|---|
| oikeasti kunnossa | 3,924 | 2 |
| oikeasti viallinen | 66 | 8 |
Kolme lukua nimeää kolme tapaa lukea tuota taulukkoa:
- Precision . Kuinka moni sen merkitsemistä osista oli oikeasti viallinen. Tämä on hukattujen tarkastusten kustannus.
- Recall . Kuinka monta viallisista osista se sai kiinni. Tämä on huonon osan asiakkaalle lähettämisen kustannus.
- F1 , niiden harmoninen keskiarvo, joka pysyy lähellä pienempää ja kieltäytyy siksi tulemasta imarrelluksi vain toisesta.
Mikä merkitsee, riippuu tehtaasta, ei matematiikasta: tarkastus maksaa muutaman sekunnin ja toimitettu viallinen osa maksaa takaisinkutsun, joten tässä recall hallitsee ja 0,108 on epäonnistuminen.
Mutta malli ei ole ongelma. Kynnys on, eikä kynnys ole osa mallia — se on liiketoimintapäätös, joka sovelletaan jälkikäteen todennäköisyyteen. Pyyhkäise se:
| kynnys | TP | FP | FN | accuracy | precision | recall | F1 |
|---|---|---|---|---|---|---|---|
| 0.500 | 8 | 2 | 66 | 0.9830 | 0.800 | 0.108 | 0.190 |
| 0.200 | 27 | 28 | 47 | 0.9812 | 0.491 | 0.365 | 0.419 |
| 0.100 | 42 | 118 | 32 | 0.9625 | 0.263 | 0.568 | 0.359 |
| 0.050 | 54 | 236 | 20 | 0.9360 | 0.186 | 0.730 | 0.297 |
| 0.020 | 67 | 570 | 7 | 0.8558 | 0.105 | 0.905 | 0.188 |
| 0.005 | 71 | 1,360 | 3 | 0.6593 | 0.050 | 0.959 | 0.094 |
Lue accuracy-saraketta alaspäin. Se laskee koko matkan — 98,30 %:sta 65,93 %:iin — samalla kun malli siirtyy löytämään 8 vikaa 71 vikaan 74:stä. Jokainen hyödyllinen asia, jonka tämä malli voi tehdä, tekee sen accuracysta huonomman. Tiimi, joka optimoi otsikkolukua, lähettäisi version, joka ei löydä mitään.
Näytä lisätiedot
Luokkapainotus ei luo signaalia, se siirtää toimintapistettä. Tavallinen ensimmäinen refleksi epätasapainoisissa luokissa on painottaa harvinaista luokkaa häviössä. Kun niin tehdään painoilla 1, 10 ja 60 positiivisille:
| paino positiivisille | accuracy | precision | recall | F1 | AUC |
|---|---|---|---|---|---|
| 1 | 0.9830 | 0.800 | 0.108 | 0.190 | 0.9363 |
| 10 | 0.9605 | 0.253 | 0.581 | 0.352 | 0.9361 |
| 60 | 0.8290 | 0.091 | 0.919 | 0.166 | 0.9361 |
Precision ja recall liikkuvat pitkälle. AUC — todennäköisyys, että malli sijoittaa satunnaisen viallisen osan satunnaisen hyvän yläpuolelle, ja joka sivuuttaa kynnyksen kokonaan — liikkuu 0,0002, mikä ei ole mitään. Uudelleenpainotus liu'utti samaa mallia samaa vaihtokäyrää pitkin. Se on usein juuri sitä, mitä haluat, eikä se koskaan ole uutta informaatiota: jos järjestys on huono, mikään painotuskaava ei pelasta sitä.
Kolme jakoa ja vuoto, jonka olet löytämässä
Linkki osioon: Kolme jakoa ja vuoto, jonka olet löytämässäMiksi kolme jakoa eikä kaksi? Koska sillä hetkellä, kun käytät esimerkkijoukkoa valitsemaan jotakin — kynnyksen, oppimisnopeuden, minkä kuudesta mallista toimitat — sitä joukkoa on käytetty sovittamiseen, ja sen pistemäärä lakkaa olemasta harhaton.3 Tällä hihnalla mitattuna: kynnyksen pyyhkäisy validointijoukolla valitsee 0,196, ja malli saa sitten koskemattomalla testijoukolla F1 = 0,4122. Jos pyyhkäisy olisi ajettu suoraan testijoukolla, paras siellä saavutettavissa oleva oli 0,4186 — luku, jota kenelläkään ei ole oikeutta raportoida.
Ero on tässä pieni, 0,006, koska kyseessä on yksi hyperparametri, joka pyyhkäistiin kerran 4 000 validointiesimerkkiä vasten. Se kasvaa jokaisella lisäpäätöksellä ja jokaisella validointijoukon kutistumisella. Huomaa myös, ettei suunta ole taattu yksittäisessä ajossa: valittu kynnys sai validoinnissa 0,3902 ja testissä 0,4122, joten validointi aliraportoi sen tällä kertaa. Harha on systemaattinen monien päätösten yli, ei näkyvä yhdessä.4
Nyt harjoitus. Hihnaloki saapuu kolmannen sarakkeen kanssa, station_seconds: kuinka kauan kukin osa vietti tarkastusasemalla. Sen lisääminen on yhden rivin muutos esikäsittelyyn. Tässä, mitä se tekee:
| malli | accuracy | precision | recall | F1 | ristientropia | AUC |
|---|---|---|---|---|---|---|
| leveys + paino | 0.9830 | 0.800 | 0.108 | 0.190 | 0.0564 | 0.9363 |
| + station_seconds | 0.9920 | 0.792 | 0.770 | 0.781 | 0.0236 | 0.9970 |
Recall nousee 10,8 %:sta 77,0 %:iin. F1 yli nelinkertaistuu. Ja huomaa, mitä accuracy teki: 98,30 % → 99,20 %, yhdeksän kymmenesosan voitto, eli sellainen luku, joka pyöristetään yhteenvetokalvolla muotoon "noin 99 % joka tapauksessa". Accuracy ei nähnyt epäonnistumista aiemmin eikä nyt näe petosta.
Ennen kuin luet eteenpäin: malli huijaa. Selvitä miten.
Miten metsästät vuodon siinä järjestyksessä, joka löytää sen nopeimmin.
-
Vertaa opetusta ja testiä. Ylisovitus näkyy suurena erona. Tässä: rehellinen malli 0,9838 opetus / 0,9830 testi; vuotava malli 0,9936 opetus / 0,9920 testi. Molemmat erot ovat alle 0,2 pistettä. Vuoto ei näytä ylisovitukselta — vuotava piirre on yhtä lailla saatavilla testiaikana, joten malli yleistää kauniisti maailmaan, jota ei ole olemassa.
-
Opeta yksi malli per piirre, yksinään. Kaikki, mikä kantaa vastauksen, ilmoittaa itsestään:
piirre yksin accuracy recall F1 AUC leveys 0.9815 0.014 0.026 0.8691 paino 0.9815 0.000 0.000 0.7914 station_seconds0.9850 0.405 0.500 0.9960 Yksi sarake yksinään järjestää viat AUC:lla 0,9960. Kaksi mittausta, jotka on otettu työntömitalla ja vaa'alla, yltävät 0,87:ään ja 0,79:ään. Tuo epäsymmetria on hälytys.
-
Kysy, milloin kukin luku kirjoitettiin muistiin. Keskimääräinen viipymäaika: 2,23 sekuntia läpäisseille osille, 15,56 sekuntia hylätyille osille. Tietysti. Osa viipyy asemalla koska tarkastaja veti sen pois hihnalta — mikä tapahtuu sen jälkeen ja vain siksi, että joku päätti sen olevan viallinen. Sarake ei ole osan mittaus. Se on tuomion mittaus.
station = 1.8 + rng.exponential(0.35, N) # a part just passing through
audited = rng.random(N) < 0.006 # random spot checks
station[audited] += rng.uniform(6.0, 26.0, audited.sum())
station[y == 1] = 9.0 + rng.exponential(7.0, (y == 1).sum()) Korostettu rivi on vuoto: viallisen osan viipymäaika arvotaan eri jakaumasta, koska ihminen otti sen pois hihnalta. Tämä on sovelletun koneoppimisen yleisin vakava bugi, ja sillä on nimi: target leakage — opetuspiirteissä oleva informaatio, joka ei olisi saatavilla sillä hetkellä, kun ennuste täytyy tehdä.5 Se ei heitä poikkeusta. Se tuottaa paremman luvun. Jokainen projektin kannustin osoittaa sen säilyttämiseen.
Puolustus on yksi kysymys, joka kysytään jokaisesta sarakkeesta: sillä hetkellä, kun tarvitsen tämän ennusteen, onko tämä arvo jo olemassa? Elävällä hihnalla station_seconds on tuntematon siihen asti, kun osa on tarkastettu — mikä oli asia, jonka mallin piti korvata.
Montako testiesimerkkiä tarvitsen?
Linkki osioon: Montako testiesimerkkiä tarvitsen?Oletetaan, että pisteytät mallin 20 esimerkillä ja se saa 17 oikein. Raportoit 85 %.
17 correct out of 20 -> accuracy 0.8500
Wilson 95% CI : [0.6396, 0.9476]
bootstrap 95% CI : [0.7000, 1.0000]
P(a 65% model scores 17 or more out of 20) = 0.0444
P(an 85% model scores 17 or more out of 20) = 0.6477Rehellinen lukutapa 17/20:lle on jossakin 64 %:n ja 95 %:n välillä. Aidosti 65 %:n malli tuottaa tämän tuloksen 4,4 % ajasta — yksi ajo kahdestakymmenestäkolmesta — ja jos kokeilit kourallista prompts ja raportoit parhaan, valmistit tuon ajon itse. Seitsemäntoista kahdestakymmenestä ei erota 85 %:n mallia 65 %:n mallista.
Kaksi tapaa asettaa väli osuudelle, ja molemmat kuuluvat työkalupakkiisi:
def wilson(k, n, z=1.959963985):
"""95% interval for k successes in n trials. Correct at small n; no simulation."""
ph, d = k / n, 1 + z * z / n
centre = (ph + z * z / (2 * n)) / d
half = z * (ph * (1 - ph) / n + z * z / (4 * n * n)) ** 0.5 / d
return centre - half, centre + half
def bootstrap_ci(correct, n_resamples=10_000, alpha=0.05, seed=0):
"""95% interval for the mean of any per-example score array. Works on F1 too."""
rng = np.random.default_rng(seed)
correct = np.asarray(correct, dtype=float)
draws = correct[rng.integers(0, len(correct), size=(n_resamples, len(correct)))]
lo, hi = np.quantile(draws.mean(axis=1), [alpha / 2, 1 - alpha / 2])
return float(correct.mean()), float(lo), float(hi)Käytä Wilsonia6 tavalliselle onnistumisprosentille; se pysyy hyvin käyttäytyvänä millä tahansa eikä tarvitse satunnaisuutta. Huomaa yllä, että kohdassa bootstrapin yläpää on 1,0000 — 20 pisteen uudelleenotanta voi helposti nostaa 20 oikeaa, joten se ei voi esittää väliä, joka olisi kapeampi kuin sen oma rakeisuus. Käytä bootstrapia7, kun kaavaa ei ole, mikä kattaa useimmat kiinnostavat tapaukset: F1, makrokeskiarvot, BLEU, pass@1, rubriikkipohjaisen tuomarin piste. Tällä hihnalla säädetyn mallin F1 0,4122 kantaa bootstrap-väliä [0.3009, 0.5156] — ja juuri tuon luvun pitäisi näkyä raportissa, koska pelkkä piste-estimaatti kutsuu vertailuun, jota se ei voi tukea.
Vielä yksi mittaus, koska se muuttaa sitä, miten kahta mallia pitäisi verrata. Kaksi mallia pisteytettynä samoilla 500 esimerkillä:
model A: 0.8580 95% CI [0.8260, 0.8880]
model B: 0.8120 95% CI [0.7780, 0.8460]
the two intervals overlap: True
paired difference A-B: 0.0460 95% CI [0.0260, 0.0680]
they disagree on 31 of 500 examples (A right 27, B right 4)Niiden välit menevät päällekkäin, ja kansansääntö — päällekkäiset virhepalkit tarkoittavat, ettei merkittävää eroa ole — kutsuisi vertailua epäselväksi. Se ei ole. Kaksi mallia ajettiin samoilla esimerkeillä, joten oikea suure on esimerkkikohtainen ero, jonka väli on [0.0260, 0.0680], mukavasti nollan yläpuolella. Ne ovat eri mieltä vain 31:stä 500 kohteesta, ja A voittaa 27 noista erimielisyyksistä; yhteiset esimerkit, helpot ja vaikeat, kumoutuvat sen sijaan että lisäisivät kohinaa. Vertaa malleja pareittain, ja pääset samaan johtopäätökseen murto-osalla datasta.
Mihin tämä menee seuraavaksi
Linkki osioon: Mihin tämä menee seuraavaksiSinulla on nyt malli, joka tuottaa kalibroituja todennäköisyyksiä, häviö, joka on johdettu väitteestä dataa koskien eikä valittu kätevyyden vuoksi, gradientti, joka on kirjaimellisesti ennuste miinus totuus, ja — tärkeämpänä — koneisto sen selvittämiseen, toimiiko mikään siitä. Yllä oleva kymmenen rivin Wilson-väli käytetään sellaisenaan uudelleen: se kantaa prompt-variantit luvussa 15, retrieval-taulukot luvussa 19 ja golden setin luvussa 29. Bootstrap on se, johon tartut, kun kaavaa ei ole.
Mutta malli on yhä yksi kerros. Se piirtää viivan, ja luku 1 todisti neljällä XOR-rivillä, ettei viiva riitä. Korjaus on pinota: ensimmäinen kerros, joka taivuttaa avaruutta, toinen, joka piirtää viivan taivutettuun avaruuteen.
Siihen tämän luvun siisti gradientti loppuu. Kaikki yllä toimi, koska voitiin kirjoittaa käsin kerran mallille, jossa on yksi kerros syötteen ja häviön välissä. Laita toinen kerros keskelle, ja kysymys muuttaa muotoaan: mikä on häviön derivaatta sellaisen painon suhteen, joka ei koske ulostuloa lainkaan — jonka vaikutus saapuu vain toisen kerroksen kautta, mahdollisesti useita polkuja yhtä aikaa?
Tuo derivaatta on olemassa. Sen laskeminen käsin on toivotonta kaikelle lelua suuremmalle, ja sen laskeminen parametri kerrallaan on toivotonta eri mittakaavassa. Tarvitaan menetelmä, joka saa jokaisen verkon derivaatan yhdestä backward passista saman graafin yli, jonka forward pass juuri kulki.
Se on luku 5, ja se on moottori, jolla loppu kurssi käy.
Lähteet ja menetelmä
Linkki osioon: Lähteet ja menetelmäTämän luvun rinnalla kannattaa lukea myös: Bishop, Pattern Recognition and Machine Learning §1.2, §1.5, §1.6 ja §4.3, joka käsittelee todennäköisyyttä, päätösteoriaa, informaatioteoriaa ja lineaarista luokittelua siinä järjestyksessä, jota tämä luku seuraa; Murphy, Probabilistic Machine Learning: An Introduction, luvut 6 ja 10; Prince, Understanding Deep Learning §5.4–5.7; sekä Saito ja Rehmsmeier, The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets (PLOS ONE, 2015) — miksi yllä lainatun AUC:n ei pitäisi olla ainoa kynnyksetön luku, jota katsot, kun 1,7 % osista on viallisia.
Viitteet
Linkki osioon: Viitteet-
Ma, T. ja Ng, A. CS229 Lecture Notes, Stanford University, luvut 2 ja 3. Siellä kumoutuminen, joka tuottaa , lakkaa näyttämästä tuurilta: valitse eksponentiaaliperheen jakauma, joka vastaa ulostuloasi, käytä sen kanonista linkkiä, ja gradientti on aina ennuste miinus totuus. ↩
-
Olah, C. Visual Information Theory (2015),
colah.github.io/posts/2015-09-Visual-Information. Selkein saatavilla oleva selitys entropiasta, ristientropiasta ja KL-divergenssistä bittikustannuksina eikä kaavoina. ↩ -
Abu-Mostafa, Y. S., Magdon-Ismail, M. ja Lin, H.-T. Learning From Data (AMLBook, 2012), Caltech-kurssin luennot 13 ja 17. Luento 13 on validointi; luento 17, kolmesta oppimisperiaatteesta, on paikka, jossa data snooping nimetään. Yhdessä ne ovat tämän luvun kurinalaisuuden lähde: jokainen vilkaisu datajoukkoon on sovituspäätös, ajoitpa optimiserin tai et. ↩
-
James, G., Witten, D., Hastie, T. ja Tibshirani, R. An Introduction to Statistical Learning, 2. painos (Springer, 2021), luvut 2 ja 5, bias–variance-hajotelmasta ja uudelleenotannasta. Rinnakkaisteos on paikka, jossa valinta-ansa sanotaan suoraan: Hastie, Tibshirani ja Friedman, The Elements of Statistical Learning, 2. painos, §7.10.2, The Wrong and Right Way to Do Cross-validation. ↩
-
Kaufman, S., Rosset, S., Perlich, C. ja Stitelman, O. Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM Transactions on Knowledge Discovery from Data 6(4), 2012. Muodollinen käsittely yllä demonstroidusta epäonnistumisesta, tapaustutkimuksilla kilpailuista, jotka voitti malli, joka oli oppinut artefaktin siitä, miten data koottiin. ↩
-
Wilson, E. B. Probable Inference, the Law of Succession, and Statistical Inference. Journal of the American Statistical Association 22(158), s. 209–212 (1927). Score-väli, jota yllä käytettiin kohdassa
wilson(), yhä oikea oletus suhteelle. Oppikirjaväli on se, jota kannattaa välttää: se antaa järjettömyyksiä lähellä 0:aa ja 1:tä ja alikatetaan pahasti pienellä . ↩ -
Efron, B. Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics 7(1), s. 1–26 (1979). Ajatus, jonka avulla voit asettaa välin mille tahansa tilastolle, jonka pystyt laskemaan, myös niille, joilla ei ole otantateoriaa. ↩