Årsaksoppdagelse: Får hanen som galer solen til å stige?

10 linjer med Python-kode for å automatisere årsaksoppdagelse som du må se

Photo by Egor Myznik on Unsplash

Fokuset for min nylige forskning har vært årsaksslutning drevet av de økende forespørslene jeg får fra kunder om å gå utover maskinlæringsspådommer til å svare "hva hvis?" skriv spørsmål for å skape effekt og resultater.

En av tingene som fascinerte meg i utgangspunktet var - "Hvordan er årsaksdiagrammer konstruert?". I mange av netteksemplene ser det ut til at de kommer inn i livet fullt utformet uten noen forklaring på hvordan nodene og koblingene ble identifisert.

Dette førte til at jeg leste «The Book of Why» av Judea Pearl og Dana Mackenzie (flere ganger!), og en oppfatning som ble uttrykt er at du ikke kan reversere et årsaksdiagram, også kjent som en Directed Acyclic Graph (DAG), fra dataene alene.

Data kan avsløre korrelasjon, men ikke årsakssammenheng, så hvordan er det mulig å "oppdage" årsakssammenheng?

Merk: alle datasettene i denne artikkelen er lisensiert for offentlig bruk, se referansedelen på slutten av artikkelen for alle kilder og referanser.

Før vi dykker inn i årsaksfunn, vennligst vurder …

Blir med i Medium med min henvisningslink (Jeg vil motta en andel av gebyrene hvis du registrerer deg ved å bruke denne lenken).

Abonnere på en gratis e-post hver gang jeg publiserer en ny historie.

Ta en rask titt på mine tidligere artikler.

Laster ned mitt gratis strategiske datadrevne beslutningsrammeverk.

Besøker nettstedet mitt for datavitenskap – Databloggen.

Tenk på verditellingene fra følgende binære datasett ...

Merk: datasettet for soloppgang/hane er syntetiske data laget av forfatteren, se referansedelen på slutten av artikkelen for fullstendig kilde- og referansedetaljer.

Bilde av forfatter

Vi kan se at hanen galer når solen står opp i 90.25 % av observasjonene, men hvordan vet vi om soloppgangen får hanen til å gale eller at hanen galer får solen til å stå opp basert på dataene alene?

Antallet tilfeller når hanen galer når solen ikke står opp eller når solen står opp, men hanen holder seg stille, er praktisk talt identiske (50,000 47,500 mot XNUMX XNUMX), så årsakssvaret kan ikke finnes ved å sammenligne de relative datavolumene.

En tilnærming kan være å se på det tidsmessige aspektet. Hvis solen stiger konsekvent før hanen galer, vil det være en god indikator på årsakssammenheng, men hva om hanen vår er tidlig oppe?

Svaret er å konsultere domeneekspertene. Hvis vi kunne sette sammen et team med en astrolog, en fysiker og en fjørfeoppdretter, ville de konkludert med at solen får hanen til å gale og ikke omvendt!

Photo by Federico Respini on Unsplash

Uavskrekket av soler som står opp og haner som galer, satte jeg av gårde på jakt etter noe som allerede var der ute som kanskje kunne utføre magien med årsaksoppdagelser basert på dataene.

Det er en algoritme kalt "NOTEARS" som hevder å være i stand til å implementere kausal oppdagelse, så la oss prøve det og se hva det kan gjøre ...

Merk: koppedatasettet er syntetiske data laget av forfatteren, se referansedelen på slutten av artikkelen for fullstendig kilde- og referansedetaljer.

Bilde av forfatter

Dette datasettet modellerer årsak-og-virkning-forhold i koppevaksinasjoner. La oss kjøre NOTEARS-algoritmen mot den og se hva den kan gjøre ...

[('Reaksjon?', 'Vaksinasjon?'),
('Kopper?', 'Reaksjon?'),
('Død?', 'Reaksjon?'),
('Døden?', 'Kopper?')]

Hvis vi skulle visualisere resultatene produsert av NOTEARS ville det sett slik ut …

Bilde av forfatter

Det ser ikke veldig bra ut? I følge NOTEARS forårsaker døden kopper. Det tidsmessige aspektet forteller oss at kopper kommer først, så det kan ikke være forårsaket av døden. Heller ikke kopper kan forårsake reaksjonen (vaksinen forårsaker reaksjonen) og reaksjonen kan absolutt ikke forårsake vaksinasjonen.

Ved å bruke kunnskapen til domeneeksperter kan vi enkelt fastslå at vaksinasjonen har en årsakseffekt på om pasienten har en reaksjon og om de fortsetter å utvikle sykdommen og reaksjonen og kopper har begge en årsakssammenheng med død ...

Bilde av forfatter

Så vi har fastslått at selv i en veldig enkel årsaksmodell gir NOTEARS årsaksoppdagelsesalgoritmen ikke korrekte resultater. En leser av en av mine tidligere artikler påpekte også at NOTEARS ikke fungerer i Python 3.9, og da jeg skal oppgradere er dette et annet stort problem.

Hvis du vil lese mer om NOTEARS' uegnethet for årsakssammenheng, er her en utmerket akademisk oppgave — https://arxiv.org/pdf/2104.05441.pdf (Marcus Kaiser og Maksim Sipos).

Før vi gir opp helautomatisk årsaksoppdagelse, la oss ta en titt på et alternativ til NOTEARS, «Lasso»-algoritmen –

Merk: Datasettet for folketellingsinntekter/avgangsinntekter er lisensiert for offentlig bruk, se referansedelen på slutten av artikkelen for fullstendig kilde- og referansedetaljer.

Bilde av forfatter
Bilde av forfatter

Å kjære, Lasso er en katastrofe! Den har spådd at alt forårsaker alt annet og at nodene også forårsaker seg selv!

Mine siste forsøk var å prøve GES-, GIES- og LINGAM-algoritmene, men disse krever alle R-biblioteker. Jeg bruker ikke R, og selv om jeg klarte å få konfigurasjonen riktig, ville jeg aldri kunne lage bærbar kode som andre dataforskere kunne bruke.

Årsaksoppdagelsesbibliotekene og algoritmene som er tilgjengelige fungerer ikke, og dette har forsterket synspunktet som er uttrykt i "The Book of Why", dvs. at årsakssammenheng ikke kan omvendt konstrueres fra data alene.

Denne konklusjonen førte til at jeg utviklet min egen tilnærming …

Photo by Amanda Jones on Unsplash

Kort på bordet, jeg har ikke skrevet en kausal oppdagelsesalgoritme. Algoritmen min implementerer snarere korrelativ oppdagelse med en vri (ingen ordspill ment!).

Da jeg hadde gitt opp kausalfunnbibliotekene, trengte jeg fortsatt en måte å visualisere årsakssammenheng som et utgangspunkt for samtalen med domeneeksperter.

Jeg begrunnet at jeg kunne beregne korrelasjonene mellom funksjonene/nodene enkelt og at dette i det minste ville være et godt utgangspunkt.

Jeg utviklet min tenkning som følger - i kausale funnmodeller identifiserer vi vanligvis "effekten", dvs. datafunksjonen vi er interessert i (som "målet" i maskinlæringsprediksjoner). I koppeeksemplet er dette «Døden?», og i eksemplet med opptjening for kandidater er det inntjening «greaterThank50k».

Derfor, hvis det er korrelasjoner mellom et trekk og "effekten", må årsaksretningen være fra de andre trekkene til effekten slik den er ved "end-of-the-line".

Mitt neste steg var å utvikle en rekursiv algoritme som kan visualiseres som følger ...

Bilde av forfatter

Duplikater og toveiskoblinger må tvangsekskluderes. Jeg ønsket også å eksplisitt kunne inkludere eller ekskludere forbindelser (kanter) og å eksplisitt ekskludere funksjoner (noder).

Dette er de 10 linjene med rekursiv Python-kode som jeg kom opp med for å implementere kausal oppdagelse

For å vise hvordan løsningen fungerer har jeg valgt noen data om kanselleringsdata for hotellbestillinger.

La oss starte med å lese inn dataene og ta en titt på korrelasjonene ...

Merk: datasettet for hotellbestillinger er lisensiert for offentlig bruk, se referansedelen på slutten av artikkelen for fullstendig kilde- og referansedetaljer.

Bilde av forfatter

Den første kjøringen av oppdagelsesalgoritmen innebærer å holde iterasjonene nede til 1, så vi ser bare på korrelasjonene (som burde være årsakssammenheng) med "effekten", dvs. om hotellbestillingen er kansellert eller ikke ...

Bilde av forfatter

OK, det er ikke en dårlig start, la oss øke antall iterasjoner / rekursjoner / lag til 3, justere korrelasjonsterskelen litt og se hva vi får ...

Bilde av forfatter

OK, ikke så ille heller, men det er litt "opptatt", så neste trinn er å utelukke noen av nodene vi mistenker kan forårsake noe av støyen (merk: i en virkelig forretningssak vil vi snakke med våre domeneeksperter på dette stadiet).

Bilde av forfatter

Dette begynner å se bedre ut. Husk at my-algoritmen er sikker på at koblinger til "IsCancelled" er årsakssammenheng fordi det er "effekten", og derfor kommer ingenting etter den.

De andre lagene i treet er bare korrelative, men retningen til pilene ble lagt til basert ganske enkelt på rekkefølgen som algoritmen fant dem i.

I samarbeid med domeneekspertene (eller min egen erfaring med hotellbestillinger i dette tilfellet!) la jeg merke til følgende –

  • Koblingen fra «DifferentRoomAssigned» til «LeadTime» er i feil retning fordi lang bestillingstid øker sannsynligheten for at rombestillingen endres og ikke omvendt.
  • Korrelasjonen mellom "BookingChanges" og "DifferentRoomAssigned" er under terskelen, men det kan være en betydelig årsak, så den må inkluderes.

Det neste forsøket instruerer algoritmen til å gjøre disse korreksjonene –

Bilde av forfatter

En "uobservert konfounder" er en faktor som vi tror påvirker vår årsaksmodell ved å gi en kobling mellom noen av nodene, men som ikke er målt og derfor ikke inkludert i diagrammet.

Min erfaring med å reise til hotell og min kunnskap om hotelldatasettet gjorde at jeg mistenkte at det er en "uobservert forvirring" som påvirker hotelldataene.

Det er to hoteller i dataene – et "byhotell" og et "resort"-hotell. Dette førte meg til å anta at den uobserverte konfounderen i denne årsaksmodellen er “grunn til hotelloppholdet”.

Min hypotese er det feriegjester bor primært på resorthotellet, og forretningsfolk og city-breakers bor primært på byhotellet.

Videre har jeg antatt at disse to gruppene har forskjellig atferd og at dette er den "uobserverte konfounderen" (uobservert fordi dataene ikke fanger opp "årsaken til oppholdet").

NOTEARS og andre lignende algoritmer kan ikke gjøre rede for "uobserverte konfounders", men algoritmen jeg har utviklet kan ta hensyn til dem ved å ha dem eksplisitt inkludert som følger ...

Bilde av forfatter

Resultatet av den endelige iterasjonen er en plausibel, lesbar og forståelig visualisering av årsakssammenhengen i hotelldataene som jeg ville være trygg på å utforske og avgrense med domeneekspertene. Dette er hovedpunktene…

  • Det er en "uobservert forvirring" som er den primære årsaken til oppholdet (ferie vs. forretnings-/byferie).
  • "Landet" har en årsakseffekt på den uobserverte forvirringen - de som reiser fra noen land er mer sannsynlig å være på ferie.
  • Det samme gjelder "TotalGuests". Store selskaper er mer sannsynlig å feriere, single på forretningsreise og dobbeltrom på storbyferier.
  • Den uobserverte "reason for stay" har en kausal effekt på "LeadTime", "HotelType" og "DepositType".
  • "LeadTime", "DifferentRoomAssigned", "HotelType", "DepositType" og "Reason for Stay" (U) har alle en årsakseffekt på "IsCanceled".

Årsaksoppdagelse er prosessen med å gå utover korrelative koblinger til å oppdage årsakssammenhenger (dvs. i hvilken ende av en korrelativ linje hører pilen til?). Dette er ikke mulig, eller i det minste uoverkommelig vanskelig, å automatisere med algoritmer som NOTEARS fordi svarene ikke finnes i dataene alene.

Imidlertid er det fortsatt et kritisk behov for å visualisere årsakssammenheng slik at det kan utforskes med domeneeksperter for å bygge et årsaksdiagram (også referert til som en rettet asyklisk graf eller DAG).

I denne artikkelen er det foreslått en algoritme basert på å øke korrelativ oppdagelse ved å bruke bare 10 linjer med Python-kode som kan brukes med domeneeksperter for å gjentatte ganger avgrense sensitiviteten (terskel) og for å korrigere, legge til eller fjerne koblingene (pilene) og ekskludere irrelevante noder.

I fremtidige artikler vil disse årsaksdiagrammene bli brukt til å bygge en komplett årsaksmodell for maskinlæring som kan svare på komplekse "hva om?" type spørsmål fra kunder og bedriftsledere.

Hvis du likte denne artikkelen, vurder...

Blir med i Medium med min henvisningslink (Jeg vil motta en andel av gebyrene hvis du registrerer deg ved å bruke denne lenken).

Abonnere på en gratis e-post hver gang jeg publiserer en ny historie.

Ta en rask titt på mine tidligere artikler.

Laster ned mitt gratis strategiske datadrevne beslutningsrammeverk.

Besøker nettstedet mitt for datavitenskap – Databloggen.

Sun Rising / Cockerel Crowing Data

Data om kopper

Graduate inntekter / folketelling inntektsdata

Hotellbestillingsdata

Årsaksoppdagelse: Får hanen som galer solen til å stige? Republisert fra kilde https://towardsdatascience.com/causal-discovery-does-the-cockerel-crowing-cause-the-sun-to-rise-f4308453ecfa?source=rss—-7f60cf5620c9—4 via https://towardsdatascience. no/feed

<!–

->

Tidstempel:

Mer fra Blockchain-konsulenter