Scoperta causale: il canto del gallo fa sorgere il sole?

10 righe di codice Python per automatizzare la scoperta causale che devi vedere

Foto di Egor Myznik on Unsplash

Il focus della mia recente ricerca è stato inferenza causale spinto dalle crescenti richieste che ricevo dai clienti di andare oltre le previsioni del machine learning per rispondere a "e se?" digitare domande per favorire l'impatto e i risultati.

Una delle cose che inizialmente mi ha incuriosito è stata: “Come vengono costruiti i diagrammi causali?”. In molti degli esempi online sembrano prendere vita completamente formati senza alcuna spiegazione di come siano stati identificati i nodi e i collegamenti.

Ciò mi ha portato a leggere “The Book of Why” di Judea Pearl e Dana Mackenzie (diverse volte!) e un punto di vista espresso è che non è possibile decodificare un diagramma causale, noto anche come grafico aciclico diretto (DAG), dai dati solo.

I dati possono rivelare la correlazione ma non la causalità, quindi come è possibile “scoprire” la causalità?

Nota: tutti i set di dati in questo articolo sono concessi in licenza per uso pubblico, consultare la sezione dei riferimenti alla fine dell'articolo per tutte le fonti e i riferimenti.

Prima di immergerci nella scoperta causale, considera...

Mi unisco a Medium con il mio link di riferimento (Riceverò una parte della commissione se ti iscrivi utilizzando questo link).

Iscrizione a una e-mail gratuita ogni volta che pubblico una nuova storia.

Dando una rapida occhiata ai miei articoli precedenti.

Sto scaricando il mio framework gratuito per il processo decisionale strategico basato sui dati.

Visitando il mio sito Web di scienza dei dati: Il blog dei dati.

Considera i conteggi dei valori dal seguente set di dati binari:

Nota: il set di dati del sorgere del sole/galletto è un dato sintetico creato dall'autore, consultare la sezione dei riferimenti alla fine dell'articolo per la fonte completa e i dettagli di riferimento.

Immagine dell'autore

Possiamo vedere che il gallo canta quando il sole sorge nel 90.25% delle osservazioni, ma come facciamo a sapere se il sorgere del sole fa cantare il gallo o il canto del gallo fa sorgere il sole basandosi solo sui dati?

Il numero di casi in cui il galletto canta quando il sole non sorge o quando il sole sorge ma il galletto resta in silenzio è praticamente identico (50,000 contro 47,500), quindi la risposta causale non può essere trovata confrontando i relativi volumi di dati.

Un approccio potrebbe essere quello di considerare l’aspetto temporale. Se il sole sorge costantemente prima del canto del gallo, ciò sarà un buon indicatore di causalità, ma cosa succede se il nostro galletto si alza presto?

La risposta è consultare gli esperti del settore. Se potessimo mettere insieme una squadra composta da un astrologo, un fisico e un allevatore di pollame, concluderemmo che è il sole a far cantare il gallo e non il contrario!

Foto di Federico Respini on Unsplash

Imperterrito dal sorgere del sole e dal canto dei galli, sono partito alla ricerca di qualcosa che era già là fuori e che potesse essere in grado di compiere la magia della scoperta causale basata sui dati.

Esiste un algoritmo chiamato "NOTEARS" che afferma di essere in grado di implementare la scoperta causale, quindi proviamolo e vediamo cosa può fare...

Nota: il set di dati sul vaiolo è un dato sintetico creato dall'autore, consultare la sezione dei riferimenti alla fine dell'articolo per la fonte completa e i dettagli di riferimento.

Immagine dell'autore

Questo set di dati sta modellando le relazioni di causa-effetto nelle vaccinazioni contro il vaiolo. Eseguiamo l'algoritmo NOTEARS contro di esso e vediamo cosa può fare...

[('Reazione?', 'Vaccinazione?'),
("Vaiolo?", "Reazione?"),
("Morte?", "Reazione?"),
("Morte?", "Vaiolo?")]

Se dovessimo visualizzare i risultati prodotti da NOTEARS sarebbero così …

Immagine dell'autore

Non sembra molto bello, vero? Secondo NOTEARS la morte causa il vaiolo. L'aspetto temporale ci dice che il vaiolo viene prima quindi non può essere causato dalla morte. Né il vaiolo può causare la reazione (il vaccino provoca la reazione) e la reazione certamente non può causare la vaccinazione.

Usando le conoscenze degli esperti del settore possiamo facilmente stabilire che la vaccinazione ha un effetto causale sul fatto che il paziente abbia una reazione e se sviluppi la malattia e che la reazione e il vaiolo abbiano entrambi un nesso causale con la morte…

Immagine dell'autore

Quindi, abbiamo stabilito che anche in un modello causale molto semplice l'algoritmo di scoperta causale di NOTEARS non produce risultati corretti. Inoltre, un lettore di uno dei miei articoli precedenti ha sottolineato che NOTEARS non funziona in Python 3.9 e poiché sto per aggiornare questo è un altro grosso problema.

Se vuoi saperne di più sull'inadeguatezza di NOTEARS per la causalità, ecco un eccellente articolo accademico: https://arxiv.org/pdf/2104.05441.pdf (Marcus Kaiser e Maksim Sipos).

Prima di rinunciare alla scoperta causale completamente automatizzata, diamo un'occhiata a un'alternativa a NOTEARS, l'algoritmo "Lasso" -

Nota: il set di dati sui redditi censiti/guadagni dei laureati è concesso in licenza per uso pubblico, consultare la sezione dei riferimenti alla fine dell'articolo per la fonte completa e i dettagli di riferimento.

Immagine dell'autore
Immagine dell'autore

Oddio, Lasso è un disastro! Ha predetto che ogni cosa causa tutto il resto e che anche i nodi causano se stessi!

I miei ultimi tentativi sono stati quelli di provare gli algoritmi GES, GIES e LINGAM, ma tutti richiedono librerie R. Non utilizzo R e anche se riuscissi a ottenere la configurazione corretta non sarei mai in grado di creare codice portatile che altri data scientist potrebbero utilizzare.

Le librerie e gli algoritmi di scoperta causale disponibili non funzionano e questo ha rafforzato l'opinione espressa in "Il Libro dei Perché", ovvero che la causalità non può essere decodificata a partire dai soli dati.

Questa conclusione mi ha portato a sviluppare il mio approccio…

Foto di Amanda Jones on Unsplash

Carte in tavola, non ho scritto un algoritmo di scoperta causale. Piuttosto il mio algoritmo implementa la scoperta correlativa con una svolta (nessun gioco di parole!).

Quando avevo rinunciato alle librerie di scoperta causale avevo ancora bisogno di un modo per visualizzare la causalità come punto di partenza per la conversazione con gli esperti del dominio.

Ho pensato che avrei potuto calcolare facilmente le correlazioni tra le caratteristiche/nodi e che questo sarebbe stato almeno un buon punto di partenza.

Ho sviluppato il mio pensiero come segue: nei modelli di scoperta causale di solito identifichiamo l '"effetto", ovvero la caratteristica dei dati a cui siamo interessati (come il "bersaglio" nelle previsioni dell'apprendimento automatico). Nell’esempio del vaiolo questo è “Morte?”, e nell’esempio dei guadagni dei laureati è guadagni “maggioreGrazie50k”.

Pertanto, se ci sono correlazioni tra qualsiasi caratteristica e l'“effetto”, la direzione causale deve essere dalle altre caratteristiche all'effetto così come si trova alla “fine della linea”.

Il mio passo successivo è stato quello di sviluppare un algoritmo ricorsivo che può essere visualizzato come segue:

Immagine dell'autore

I duplicati e i collegamenti bidirezionali devono essere esclusi con la forza. Volevo anche essere in grado di includere o escludere esplicitamente le connessioni (bordi) e di escludere esplicitamente le funzionalità (nodi).

Queste sono le 10 righe di codice Python ricorsivo che ho ideato per implementare la scoperta causale

Per mostrare come funziona la soluzione ho selezionato alcuni dati relativi alle cancellazioni delle prenotazioni alberghiere.

Cominciamo leggendo i dati e dando una sbirciatina alle correlazioni...

Nota: il set di dati delle prenotazioni alberghiere è concesso in licenza per uso pubblico, consultare la sezione dei riferimenti alla fine dell'articolo per la fonte completa e i dettagli di riferimento.

Immagine dell'autore

La prima esecuzione dell'algoritmo di scoperta prevede di mantenere le iterazioni fino a 1, quindi stiamo solo osservando le correlazioni (che dovrebbero essere causali) con l '"effetto", ovvero se la prenotazione dell'hotel viene cancellata o meno...

Immagine dell'autore

OK, non è un brutto inizio, aumentiamo il numero di iterazioni/ricorsioni/strati a 3, modifichiamo un po' la soglia di correlazione e vediamo cosa otteniamo...

Immagine dell'autore

OK, neanche troppo male, ma è un po' "occupato", quindi il passo successivo è escludere alcuni dei nodi che sospettiamo possano causare un po' di rumore (nota: in un caso aziendale reale dovremmo parlare con i nostri esperti di dominio in questa fase).

Immagine dell'autore

La situazione comincia ad andare meglio. Ricorda che il mio algoritmo è sicuro che i collegamenti a "IsCancelled" siano causali perché è l '"effetto", quindi non viene nulla dopo.

Gli altri strati dell'albero però sono semplicemente correlativi, la direzione delle frecce è stata aggiunta semplicemente in base all'ordine in cui l'algoritmo le ha trovate.

Lavorando con gli esperti del settore (o con la mia esperienza di prenotazione di hotel in questo caso!) ho notato quanto segue:

  • Il collegamento da "DifferentRoomAssigned" a "LeadTime" è nella direzione sbagliata perché un lead time di prenotazione lungo aumenta la probabilità che la prenotazione della camera cambi e non viceversa.
  • La correlazione tra "BookingChanges" e "DifferentRoomAssigned" è inferiore alla soglia ma potrebbe rappresentare un fattore causale significativo, pertanto deve essere inclusa.

Il tentativo successivo indica all'algoritmo di apportare queste correzioni:

Immagine dell'autore

Un “confondente non osservato” è un fattore che riteniamo abbia un impatto sul nostro modello causale fornendo un collegamento tra alcuni nodi, ma che non è stato misurato e quindi non è stato incluso nel diagramma.

La mia esperienza di viaggio negli hotel e la mia conoscenza del set di dati degli hotel mi hanno fatto sospettare che esista un "confondente non osservato" che influenza i dati degli hotel.

Nei dati sono presenti due hotel: un hotel “città” e un hotel “resort”. Ciò mi porta a ipotizzare che il confondente non osservato in questo modello causale sia il “motivo del soggiorno in hotel”.

La mia ipotesi è questa i vacanzieri soggiornano principalmente negli hotel resort, gli uomini d'affari e i turisti in città soggiornano principalmente negli hotel cittadini.

Inoltre ho ipotizzato che questi due gruppi abbiano comportamenti diversi e che questo sia il “confondente non osservato” (non osservato perché i dati non catturano il “motivo della permanenza”).

NOTEARS e altri algoritmi simili non possono tenere conto dei "confondenti non osservati", ma l'algoritmo che ho sviluppato può tenerne conto includendoli esplicitamente come segue...

Immagine dell'autore

Il risultato dell'iterazione finale è una visualizzazione plausibile, leggibile e comprensibile per la causalità nei dati dell'hotel che sarei fiducioso di esplorare e perfezionare con gli esperti del settore. Questi i punti chiave…

  • Esiste un "confusore non osservato" che è il motivo principale del soggiorno (vacanza vs. lavoro/vacanza in città).
  • Il “Paese” ha un effetto causale sul fattore di confusione non osservato: coloro che viaggiano da alcuni paesi hanno maggiori probabilità di essere in vacanza.
  • Lo stesso vale per “TotalGuests”. È più probabile che i grandi gruppi siano in vacanza, i single siano in viaggio d'affari e i doppi durante le vacanze in città.
  • Il “motivo del soggiorno” non osservato ha un effetto causale su “LeadTime”, “HotelType” e “DepositType”.
  • "LeadTime", "DifferentRoomAssigned", "HotelType", "DepositType" e "Reason for Stay" (U) hanno tutti un effetto causale su "IsCanceled".

Scoperta causale è il processo che va oltre i collegamenti correlativi per scoprire i collegamenti causali (cioè a quale estremità della linea correlativa appartiene la freccia?). Questo non è possibile, o almeno proibitivamente difficile, da automatizzare con algoritmi come NOTEARS perché le risposte non esistono solo nei dati.

Tuttavia, esiste ancora un bisogno fondamentale di visualizzare la causalità in modo che possa essere esplorata con esperti del settore al fine di costruire un diagramma causale (noto anche come grafico aciclico diretto o DAG).

In questo articolo è stato proposto un algoritmo basato sull'aumento della scoperta correlativa utilizzando solo 10 righe di codice Python che possono essere utilizzate con esperti del settore per affinare ripetutamente la sensibilità (soglia) e per correggere, aggiungere o rimuovere i collegamenti (frecce) ed escludere elementi irrilevanti nodi.

Negli articoli futuri questi diagrammi causali verranno utilizzati per costruire un modello di apprendimento automatico causale completo in grado di rispondere al complesso "e se?" digitare domande da parte di clienti e leader aziendali.

Se ti è piaciuto questo articolo, considera…

Mi unisco a Medium con il mio link di riferimento (Riceverò una parte della commissione se ti iscrivi utilizzando questo link).

Iscrizione a una e-mail gratuita ogni volta che pubblico una nuova storia.

Dando una rapida occhiata ai miei articoli precedenti.

Sto scaricando il mio framework gratuito per il processo decisionale strategico basato sui dati.

Visitando il mio sito Web di scienza dei dati: Il blog dei dati.

Dati sul sorgere del sole/sul canto del gallo

Dati sul vaiolo

Guadagni dei laureati/Dati sui redditi censiti

Dati sulle prenotazioni alberghiere

Scoperta causale: il canto del gallo fa sorgere il sole? Ripubblicato dalla fonte https://towardsdatascience.com/causal-discovery-does-the-cockerel-crowing-cause-the-sun-to-rise-f4308453ecfa?source=rss—-7f60cf5620c9—4 tramite https://towardsdatascience. com/feed

<!–

->

Timestamp:

Di più da Consulenti Blockchain