Orsaksupptäckt: Får tuppen att gala solen att gå upp?

10 rader med Python-kod för att automatisera kausal upptäckt som du måste se

Foto: Egor Myznik on Unsplash

Fokus för min senaste forskning har varit kausal slutledning drivs av de ökande förfrågningar jag får från kunder att gå bortom maskininlärningsförutsägelser till att svara "vad-om?" typ frågor för att få effekt och resultat.

En av de saker som fascinerade mig från början var — "Hur är kausala diagram uppbyggda?". I många av onlineexemplen tycks de komma in i livet fullt formade utan någon förklaring av hur noderna och länkarna identifierades.

Detta ledde till att jag läste "The Book of Why" av Judea Pearl och Dana Mackenzie (flera gånger!) och en åsikt som uttrycks är att man inte kan bakåtkonstruera ett kausaldiagram, även känt som en Directed Acyclic Graph (DAG), från data ensam.

Data kan avslöja samband men inte orsakssamband, så hur är det möjligt att "upptäcka" orsakssamband?

Obs: alla datamängder i denna artikel är licensierade för allmänt bruk, se referensavsnittet i slutet av artikeln för alla källor och referenser.

Innan vi dyker in i orsaksupptäckt, vänligen överväg...

Går med i Medium med min hänvisningslänk (Jag kommer att få en del av avgifterna om du registrerar dig via denna länk).

Prenumerera på ett gratis e-postmeddelande när jag publicerar en ny berättelse.

Ta en snabb titt på mina tidigare artiklar.

Laddar ner mitt kostnadsfria strategiska datadrivna ramverk för beslutsfattande.

Besöker min webbplats för datavetenskap — Databloggen.

Betrakta värderäkningarna från följande binära datamängd ...

Notera: datauppsättningen för soluppgång/tupp är syntetiska data som skapats av författaren, se referensavsnittet i slutet av artikeln för fullständig källa och referensdetaljer.

Bild av författare

Vi kan se att tuppen galar när solen går upp i 90.25% av observationerna men hur vet vi om soluppgången får tuppen att gala eller att tuppen galar får solen att gå upp baserat enbart på data?

Antalet fall då tuppen galar när solen inte går upp eller när solen går upp men tuppen förblir tyst är praktiskt taget identiska (50,000 47,500 mot XNUMX XNUMX) så orsakssvaret kan inte hittas genom att jämföra de relativa datavolymerna.

Ett tillvägagångssätt kan vara att titta på den tidsmässiga aspekten. Om solen går upp konsekvent innan tuppen kråkar kommer det att vara en bra indikator på orsakssamband, men vad händer om vår tupp är en tidig stigare?

Svaret är att rådfråga domänexperterna. Om vi ​​kunde sätta ihop ett team med en astrolog, en fysiker och en fjäderfäuppfödare skulle de dra slutsatsen att solen får tuppen att gala och inte tvärtom!

Foto: Federico Respini on Unsplash

Oavskräckt av solar som går upp och tuppar som galar gav jag mig iväg på jakt efter något som redan fanns där ute och som kanske skulle kunna utföra magin med orsaksupptäckt baserat på data.

Det finns en algoritm som heter "NOTEARS" som gör anspråk på att kunna implementera kausal upptäckt, så låt oss prova det och se vad den kan göra ...

Obs: smittkoppsdatauppsättningen är syntetisk data skapad av författaren, se referensavsnittet i slutet av artikeln för fullständig källa och referensinformation.

Bild av författare

Denna datauppsättning modellerar orsak-och-verkan-sambanden vid smittkoppsvaccinationer. Låt oss köra NOTEARS-algoritmen mot den och se vad den kan göra ...

[('Reaktion?', 'Vaccination?'),
('Smittkoppor?', 'Reaktion?'),
('Döden?', 'Reaktion?'),
('Döden?', 'Smittkoppor?')]

Om vi ​​skulle visualisera resultaten från NOTEARS skulle det se ut så här...

Bild av författare

Det ser väl inte så bra ut? Enligt NOTEARS orsakar döden smittkoppor. Den tidsmässiga aspekten säger oss att smittkoppor kommer först så det kan inte orsakas av döden. Inte heller kan smittkoppor orsaka reaktionen (vaccinet orsakar reaktionen) och reaktionen kan absolut inte orsaka vaccinationen.

Med hjälp av domänexperternas kunskap kan vi enkelt fastställa att vaccinationen har en orsakseffekt på om patienten har en reaktion och om de fortsätter att utveckla sjukdomen och reaktionen och smittkoppor har båda ett orsakssamband med döden ...

Bild av författare

Så vi har fastställt att även i en mycket enkel kausal modell ger NOTEARS kausal upptäcktsalgoritm inte korrekta resultat. Dessutom påpekade en läsare av en av mina tidigare artiklar att NOTEARS inte fungerar i Python 3.9 och eftersom jag är på väg att uppgradera är detta ett annat stort problem.

Om du vill läsa mer om NOTEARS olämplighet för kausalitet här är en utmärkt akademisk uppsats — https://arxiv.org/pdf/2104.05441.pdf (Marcus Kaiser och Maksim Sipos).

Innan vi ger upp helt automatiserad orsaksupptäckt, låt oss ta en titt på ett alternativ till NOTEARS, "Lasso"-algoritmen -

Obs: datauppsättningen folkräkningsinkomster / examensintäkter är licensierade för allmänt bruk, se referensavsnittet i slutet av artikeln för fullständig källa och referensinformation.

Bild av författare
Bild av författare

Åh kära du, Lasso är en katastrof! Den har förutspått att allting orsakar allt annat och att noderna också orsakar sig själva!

Mina sista försök var att prova algoritmerna GES, GIES och LINGAM men dessa kräver alla R-bibliotek. Jag använder inte R och även om jag lyckades få rätt konfiguration skulle jag aldrig kunna skapa bärbar kod som andra dataforskare skulle kunna använda.

De kausala upptäcktsbiblioteken och algoritmerna som är tillgängliga fungerar inte och detta har förstärkt uppfattningen som uttrycks i "The Book of Why", dvs. att kausalitet inte kan omvändas från enbart data.

Denna slutsats ledde till att jag utvecklade mitt eget förhållningssätt...

Foto: Amanda Jones on Unsplash

Kort på bordet, jag har inte skrivit en kausal upptäcktsalgoritm. Snarare implementerar min algoritm korrelativ upptäckt med en twist (ingen ordlek!).

När jag hade gett upp kausalupptäcktsbiblioteken behövde jag fortfarande ett sätt att visualisera orsakssamband som en utgångspunkt för samtalet med domänexperter.

Jag resonerade att jag lätt kunde beräkna korrelationerna mellan funktionerna/noderna och att detta åtminstone skulle vara en bra utgångspunkt.

Jag utvecklade mitt tänkande enligt följande - i kausala upptäcktsmodeller identifierar vi vanligtvis "effekten", dvs den datafunktion vi är intresserade av (som "målet" i maskininlärningsförutsägelser). I smittkoppsexemplet är detta "Döden?", och i exemplet med exemplet med examensinkomster är det inkomster "större Tack 50k".

Därför, om det finns korrelationer mellan något särdrag och "effekten" måste orsaksriktningen vara från de andra särdragen till effekten som den är i "änden av linjen".

Mitt nästa steg var att utveckla en rekursiv algoritm som kan visualiseras enligt följande ...

Bild av författare

Dubletter och dubbelriktade länkar måste med tvång uteslutas. Jag ville också explicit kunna inkludera eller utesluta anslutningar (kanter) och att explicit utesluta funktioner (noder).

Det här är de 10 raderna med rekursiv Python-kod som jag kom fram till för att implementera kausal upptäckt

För att visa hur lösningen fungerar har jag valt några uppgifter om avbokningsdata för hotellbokningar.

Låt oss börja med att läsa in data och ta en titt på sambanden ...

Obs: datauppsättningen för hotellbokningar är licensierad för allmänt bruk, se referensavsnittet i slutet av artikeln för fullständig källa och referensinformation.

Bild av författare

Den första körningen av upptäcktsalgoritmen innebär att hålla iterationerna nere på 1 så vi tittar bara på korrelationerna (som borde vara orsakssamband) med "effekten", dvs om hotellbokningen avbryts eller inte ...

Bild av författare

OK, det är ingen dålig start, låt oss öka antalet iterationer / rekursioner / lager till 3, justera korrelationströskeln lite och se vad vi får ...

Bild av författare

OK, inte så illa det heller, men det är lite "upptaget" så nästa steg är att utesluta några av de noder som vi misstänker kan orsaka en del av bruset (notera: i ett verkligt affärsfall skulle vi prata med våra domänexperter i detta skede).

Bild av författare

Det här börjar se bättre ut. Kom ihåg att my-algoritmen är säker på att länkar till "IsCancelled" är orsakssamband eftersom det är "effekten", därför kommer ingenting efter det.

De andra lagren i trädet är dock bara korrelerande, pilarnas riktning lades till baserat helt enkelt på den ordning som algoritmen hittade dem i.

När jag arbetade med domänexperterna (eller min egen erfarenhet av hotellbokningar i det här fallet!) märkte jag följande –

  • Länken från "DifferentRoomAssigned" till "LeadTime" är åt fel håll eftersom en lång bokningsledtid ökar sannolikheten för att rumsbokningen ändras och inte vice versa.
  • Korrelationen mellan "BookingChanges" och "DifferentRoomAssigned" ligger under tröskeln, men det kan vara en signifikant orsak så den måste inkluderas.

Nästa försök instruerar algoritmen att göra dessa korrigeringar –

Bild av författare

En "oobserverad confounder" är en faktor som vi tror påverkar vår orsaksmodell genom att tillhandahålla en länk mellan några av noderna, men som inte har mätts och därför inte inkluderats i diagrammet.

Min erfarenhet av att gå till hotell och min kunskap om hotellets datauppsättning fick mig att misstänka att det finns en "obeserverad konfounder" som påverkar hotelldatan.

Det finns två hotell i uppgifterna – ett "stadshotell" och ett "resortshotell". Detta ledde mig till hypotesen att den oobserverade konfunderaren i denna kausala modell är “anledning till hotellvistelsen”.

Min hypotes är det semesterfirare bor i första hand på resorthotellet och affärsmän och city-breakers bor i första hand på stadshotellet.

Vidare har jag antagit att dessa två grupper har olika beteenden och att detta är den "oobserverade konfoundern" (oobserverad eftersom data inte fångar "orsaken till vistelsen").

NOTEARS och andra liknande algoritmer kan inte ta hänsyn till "oobserverade konfounders" men algoritmen jag har utvecklat kan ta hänsyn till dem genom att ha dem uttryckligen inkluderade enligt följande ...

Bild av författare

Resultatet av den slutliga iterationen är en rimlig, läsbar och begriplig visualisering av kausaliteten i hotelldata som jag skulle vara säker på att utforska och förfina med domänexperterna. Det här är nyckelpunkterna...

  • Det finns en "oobserverad confounder" som är den primära orsaken till vistelsen (semester kontra affärs-/stadssemester).
  • "Landet" har en orsakseffekt på den oobserverade konfoundern - de som reser från vissa länder är mer benägna att vara på semester.
  • Detsamma gäller för "TotalGuests". Stora sällskap är mer benägna att semestra, singlar på affärsresor och dubblar på storstadssemester.
  • Den oobserverade "reason for stay" har en orsakseffekt på "LeadTime", "HotelType" och "DepositType".
  • "LeadTime", "DifferentRoomAssigned", "HotelType", "DepositType" och "Reason for Stay" (U) har alla en orsakseffekt på "IsCanceled".

Orsaksupptäckt är processen att gå bortom korrelativa länkar till att upptäcka orsakssamband (dvs i vilken ände av en korrelativ linje hör pilen?). Detta är inte möjligt, eller åtminstone oöverkomligt svårt, att automatisera med algoritmer som NOTEARS eftersom svaren inte finns enbart i data.

Det finns dock fortfarande ett kritiskt behov av att visualisera orsakssamband så att det kan utforskas med domänexperter för att bygga ett kausalt diagram (även kallat en riktad acyklisk graf eller DAG).

I den här artikeln har en algoritm baserad på att öka korrelativ upptäckt föreslagits med användning av bara 10 rader Python-kod som kan användas med domänexperter för att upprepade gånger förfina känsligheten (tröskelvärdet) och för att korrigera, lägga till eller ta bort länkarna (pilarna) och utesluta irrelevanta knutpunkter.

I framtida artiklar kommer dessa kausala diagram att användas för att bygga en komplett kausal maskininlärningsmodell som kan svara på komplexa "tänk om?" typ frågor från kunder och företagsledare.

Om du gillade den här artikeln, överväg...

Går med i Medium med min hänvisningslänk (Jag kommer att få en del av avgifterna om du registrerar dig via denna länk).

Prenumerera på ett gratis e-postmeddelande när jag publicerar en ny berättelse.

Ta en snabb titt på mina tidigare artiklar.

Laddar ner mitt kostnadsfria strategiska datadrivna ramverk för beslutsfattande.

Besöker min webbplats för datavetenskap — Databloggen.

Sun Rising / Cockerel Crowing Data

Smittkoppsdata

Utexaminerade inkomster / Census inkomstdata

Hotellbokningsdata

Orsaksupptäckt: Får tuppen att gala solen att gå upp? Återpublicerad från källa https://towardsdatascience.com/causal-discovery-does-the-cockerel-crowing-cause-the-sun-to-rise-f4308453ecfa?source=rss—-7f60cf5620c9—4 via https://towardsdatascience. se/flöde

<!–

->

Tidsstämpel:

Mer från Blockchain-konsulter