Enhet 10 / 11

Dataläckage och reproducerbarhet: Tysta katastrofer och disciplin

Vinster:

  • Möjlighet att känna igen typer av dataläckage (mål, tid, förbearbetning, grupperad rad) och fråga om "för bra för att vara sant" som ett larm
  • Förmåga att förhindra läckage med tidig separation av testset, pipeline och korrekt uppdelning (kronologisk/grupperad)
  • Förmåga att göra analys reproducerbar med fasta frön, versionskontroll och borttagning av manuella steg

Det finns två misstag som slösar mest ansträngning inom datavetenskap, och de är båda lömska eftersom de leder till katastrof precis när allt "verkar vara bra." Det första är dataläckage: modellen fungerar utmärkt på testsetet men kraschar i produktionen. Det andra är irreproducerbarhet: du kör en analys sex månader senare och får ett helt annat resultat. Denna enhet är dedikerad till att känna till och undvika dessa två fallgropar på djupet. AI kan öka båda riskerna (genererar snabbt, föreslår dolda läckor, gör det lättare för dig att ta manuella steg) men kan också minska dem om de används på rätt sätt. Skillnaden ligger i disciplinen.

Dataläcka: klärvoajant modell

Dataläckage är när modellen ser information under träning som den inte kommer att ha vid tidpunkten för den faktiska förutsägelsen. Modellen "fuskar" med denna information, ser bra ut på testsetet, men kraschar i produktion utan den informationen. Symptomet på en läcka är nästan alltid detsamma: för bra för att vara sant. Innan du jublar när du ser 99% träffsäkerhet bör du leta efter läckor.

De viktigaste typerna av läckage är:

1. Målläckage: En funktion är ett resultat av målet. I prognosen "avbröts" är kolumnerna "avbokningsdatum" eller "återbetalningsbelopp" resultatet av målet; De fylls först när resultatet är klart.

2. Tidsläcka: Att föra framtida information till det förflutna. När du beräknar "genomsnittet för de senaste 30 dagarna", inkludera dagarna efter prognosdagen, eller dela tidsserien slumpmässigt.

3. Förbearbetningsläckage: Lärande transformationer såsom skalning, fyllning, kodning från all data före tränings-/testpartitionen. Genomsnittet av testdata stör träningen.

4. Duplicerad/grupperad radläcka: Rader som tillhör samma person förekommer i både träning och testning (två besök av samma patient i olika uppsättningar). Modellen memorerar personen.

Läck typ

Hur föds

Hur man förebygger

målläcka

Kolumn som är resultatet av målet

"Har jag det vid tidpunkten för förutsägelse" test

tidsläcka

Att föra framtiden till det förflutna

Kronologisk indelning, fönsterkontroll

Förbehandlingsläcka

Fördelad konvertering

Pipeline, passa precis från träning

Grupperad radläcka

Samma enhet i två set

Dela upp efter grupp (GroupKFold)

Den enda disciplinen för att förhindra läckage

Den gemensamma lösningen för alla typer av läckor kokar ner till en mening: Isolera testsetet så tidigt som möjligt för att efterlikna den verkliga framtiden, och "lära" den inte någonting. I praktiken betyder detta: först dela upp, lär dig sedan alla transformationer endast från utbildningen och tillämpa dem i en pipeline (en struktur som samlar alla steg i en enda kedja). För varje funktion, ställ frågan "har jag denna information vid tidpunkten för förutsägelsen?" Om det finns tid, dela upp den kronologiskt; Om samma enhet är repetitiv, dela efter grupp.

Varning: Den farligaste aspekten av en läcka är att den framstår som en framgång. En dålig modell ger uppenbarligen dåliga resultat och kommer att märkas; En läckt modell fungerar utmärkt, gläder alla och sätts i produktion — det är där kollapsen börjar. Det är därför ett "mycket bra" resultat är orsak till oro, inte firande.

Reproducerbarhet: får samma resultat två gånger

Reproducerbarhet är förmågan att få samma resultat när du kör en analys igen vid ett annat tillfälle, på en annan maskin. Utan detta är din analys tillfällig, inte vetenskaplig. Huvudorsaker och lösningar som försämrar reproducerbarheten:

Manuella steg: Ändra en cell manuellt i Excel, redigera ett diagram manuellt. Lösning: ha varje steg i koden.

Ofixerad slumpmässighet: Modellträning, provtagning, delning involverar slumpmässighet. Lösning: fixa det slumpmässiga fröet (det initiala värdet för slumpgeneratorn) (random_state=42).

Versionsskiftningar: Resultatet kan ändras när biblioteksversionen ändras. Lösning: fixa beroenden (requirements.txt, miljöfil).

Ingen journalföring: Det framgår inte vilken data, vilken kod, vilken parameter som användes. Lösning: versionskontroll (Git — systemet som sparar alla versioner av koden) och dataversionering.

"Det fungerar bara på min maskin": Lösning: dokumentera miljön, använd behållare (Docker) om möjligt.

tre minifodral

Fall 1 — Målläcka. En hälsoanalys innehöll kolumnen "medicinering efter utskrivning" för att förutsäga "om patienten kommer att läggas in igen." Denna kolumn fylldes först efter att patienten hade skrivits ut. Modellen gav 96%, i produktion 61%. 8 veckors projektet var skräp. Lektion: fråga varje funktion "finns den närvarande vid tidpunkten för förutsägelse?"

Fall 2 — Förbehandlingsläcka. Ett team skalade all data och delade sedan upp den. Medelvärdet av testdata var involverat i skalningen. CV-poäng 89%, faktisk produktion 76%. Den falska framgången försvann när jag flyttade till Pipeline och lärde mig om förvandlingar endast från träning. Lektion: dividera först, transformera senare.

Fall 3 — Underlåtenhet att reproducera. En analytiker ville uppdatera diagrammet han presenterade för ledningen tre månader senare men kunde inte komma ihåg hur han tog fram det; många steg gjordes manuellt i Excel. Resultatet blev inte av och förtroendet rubbades. Lektion: inga manuella steg, allt är i kod och Git.

Fyra kopierbara mallar

1) Läckageinspektion:

Din roll: läckageinspektör. Mål: "churn" (0/1), prognostiskt referensdatum: record_date. Jag kommer att ge dig den här listan med funktioner. För VARJE funktion: (a) är det en konsekvens av målet, (b) är det tillgängligt för mig vid tidpunkten för förutsägelsen, (c) inkluderar tidsfönstret framtiden? Markera det som "osäkert/misstänkt/läckage" och skriv en anledning. Funktioner: [lista]

2) Läckagefri rörledning:

Konfigurera sklearn Pipeline: först dela tåget/testet (stratifierat, seed=42), SENDA lägg in all förbearbetning (imputera, skala, koda) i pipelinen ENDAST från träningen. Förklara varför koden är läckagefri, vilket steg man lärde sig var.

3) Reproducerbarhet checklista kod:

Jag vill göra min analys reproducerbar. Föreslå kod/struktur som lägger till: (1) hårt frö för all slumpmässighet, (2) använda utskriftsbiblioteksversioner, (3) datum/versionstagg för data och utdata. Ge mig också en checklista för att se till att det inte finns några manuella steg.

4) Grupperad partition (samma enhetsläcka):

I data finns samma customer_id i flera rader. Gör en split (GroupKFold ellerGroupShuffleSplit, group = customer_id) som HINDER samma kund från att vara med i både utbildning och testning. Inkludera kod för att verifiera att inga kunder finns i båda uppsättningarna efter uppdelningen.

Svag prompt / Stark prompt

Svag uppmaning:

Min modell gav 98% noggrannhet, är inte det bra? Optimera koden.

Att fira 98 % döljer läckan. Innan du optimerar bör det ifrågasättas om denna poäng är verklig eller inte.

Kraftfull uppmaning:

Din roll: läckageinspektör. Min modell ger 98% noggrannhet på testsetet, vilket låter "för bra för att vara sant" för mig. Kontrollera: (1) är några funktioner resultatet av målet, (2) är omvandlingarna gjorda före delning, (3) är samma enhet i två uppsättningar, (4) finns det några tidsläckor. Lista eventuella misstänkta punkter; Fokusera på att hitta läckan, inte att fixa poängen.

Här behandlas en hög poäng som ett tecken att ifrågasättas, inte att firas.

Vanliga misstag

  • Vi firar det "mycket bra" resultatet. En poäng som är för bra för att vara sann är en läckagevarning, inte en prestation.
  • Att lära sig transformationen från all data före delning. Den vanligaste läckan; Dela först med pipeline.
  • Dela upp tidsserien slumpmässigt. Modellen ser framtiden; Kronologisk uppdelning är ett måste.
  • Lämnar samma enhet i två uppsättningar. Modellen memorerar personen; Dela in efter grupp.
  • Att inte kliva in manuellt och skriva in i koden. Analysen blir irreproducerbar; allt ska vara i kod och Git.
Tips: Skriv ett "hederslöfte" i två meningar i början av ditt projekt: "Jag har inte rört testsetet på något sätt innan jag ser det i produktion. Varje steg är i koden och fröet är fixat." Om du inte kan underteckna dessa två meningar ärligt är ditt resultat inte tillförlitligt ännu.

Sammanfattningsvis

Dataläckage och icke-reproducerbarhet är de två dyraste tysta felen inom datavetenskap. Läckage är modellens framtidsvision och framställer sig som falsk framgång; Lösningen är att dela upp testsetet tidigt, lära sig transformationerna endast från träning (pipeline), ställa varje funktion frågan "Har jag den vid tidpunkten för förutsägelse" och göra korrekt uppdelning (kronologisk/grupperad). Reproducerbarhet är att kunna få samma resultat två gånger; hans lösning är att manuellt ta bort steg, fästa fröet, frysa versionerna och behålla allt i Git. AI kan antingen öka eller minska dessa risker; Det är din disciplin som avgör.

Applikationsuppgift

Ta funktionslistan för en modell du har byggt (eller en hypotetisk) och ställ varje funktion frågan "har jag denna information vid tidpunkten för förutsägelsen?" skriftligt; Hitta minst en läckakandidat. Fyll sedan i en checklista för att göra din analys reproducerbar: är fröet fixat, finns det manuella steg, är versionerna registrerade, är de i Git. Åtgärda bristerna.

checklista

  • [ ] Frågade jag poängen "för bra för att vara sant" som en läckavarning?
  • [ ] Lärde jag mig alla transformationer efter split, bara genom träning?
  • [ ] Har jag delat efter tid/gruppstruktur (kronologisk/GroupKFold)?
  • [ ] Har jag gjort all slumpmässighet repeterbar med fast utsäde?
  • [ ] Tog jag bort de manuella stegen och behöll allt i kod och versionskontroll?