Salta al contenuto
Note per Studenti Esercizio - Rete bayesiana dell'offerta di lavoro e intervento do (esempio di forma d'esame)

Esercizio - Rete bayesiana dell'offerta di lavoro e intervento do (esempio di forma d'esame)

Questo è l'esempio di forma d'esame per la parte di laboratorio (Solution_Illustrative_exam_format_test): un breve notebook con una rete bayesiana, tre domande e codice da completare. L'esame è un quiz su Moodle (4 CFU di teoria e 2 di laboratorio per il corso da 6 CFU; 6 e 3 per quello da 9); questo notebook è l'esempio fornito dal corso per quella parte (l'intestazione originale lo chiama per errore "Laboratory Lecture 9", ma riguarda reti bayesiane e inferenza causale, non i processi decisionali di Markov del laboratorio 9). Teoria: Reti bayesiane - semantica, indipendenze e inferenza esattaUna rete bayesiana è un grafo diretto aciclico (DAG) con una variabile per nodo e una tabella delle probabilità condizionate (CPT) $P(X_i\mid\text{Parents}(X_i))$ per nodo; rappresenta la congiunta come prodotto $P(x_1,\dots,x_n)=\prod_i P(x_i\mid\text{parents}(X_i))$, con molti meno numeri della tabella completa (rete dell'allarme: 10 contro 31). Tre strutture elementari: catena $X\to Y\to Z$ e fork $Y\leftarrow X\to Z$ (estremi indipendenti dato il centro), collider $X\to Z\leftarrow Y$ (indipendenti, ma dipendenti se si osserva $Z$ o un suo discendente). Modelli causali (genitori = cause) danno reti più piccole. Inferenza esatta per enumerazione: $\mathbf P(X\mid\mathbf e)=\alpha\sum_{\mathbf y}\mathbf P(X,\mathbf e,\mathbf y)$ calcolata come somma di prodotti, in profondità e da sinistra a destra; per l'allarme $\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle$. Molti prodotti si ripetono: l'eliminazione di variabili li salva come fattori e li riusa.Reti bayesiane - semantica, indipendenze e inferenza esatta → e Interventi e operatore do - criterio backdoor e aggiustamentoOsservare $X=x$ e forzare $X=x$ sono cose diverse: $P(y\mid x)\ne P(y\mid do(x))$ quando c'è un confondente. L'intervento $do(X=x)$ si calcola con la «chirurgia» del grafo (si tolgono le frecce entranti in X) e si traduce in probabilità osservazionali con la formula di aggiustamento $P(y\mid do(x))=\sum_z P(y\mid x,z)P(z)$, dove $Z$ sono i genitori di X, o più in generale un insieme S che soddisfa il criterio backdoor: blocca ogni cammino backdoor (cammino da X a Y che inizia con una freccia entrante in X) e non contiene discendenti di X. Effetto causale medio $ACE=P(y\mid do(x))-P(y\mid do(\neg x))$. Se il confondente non è osservabile ma c'è un mediatore Z con X→Z→Y, vale il front-door $P(y\mid do(x))=\sum_z P(z\mid x)\sum_{x'}P(y\mid x',z)P(x')$. Mediazione: effetto diretto controllato CDE con $do(x),do(z)$. Se due insiemi backdoor danno risultati diversi sui dati, il modello è sbagliato. Argomento del corso da 9 CFU.Interventi e operatore do - criterio backdoor e aggiustamento →.

Testo. Si consideri la rete bayesiana in figura, con quattro nodi Experience, Grades, Interview, Offer e gli archi Experience →\to Interview, Grades →\to Interview, Interview →\to Offer (l'esperienza e i voti determinano il colloquio, il colloquio determina l'offerta di lavoro). La figura del testo originale non è disponibile: il grafo è ricavato dalla soluzione del corso.

Q1. Qual è la probabilità congiunta rappresentata dalla rete bayesiana?

Q2. Completare l'implementazione della rete bayesiana usando la libreria CausalGraphicalModels.

Q3. Supponendo di poter fare un intervento su Experience, come si implementerebbe usando la libreria CausalGraphicalModels?

Soluzione

Q1: la probabilità congiunta

Una rete bayesiana scrive la congiunta come prodotto di una probabilità condizionata per nodo, dato i suoi genitori: P(X1,…,Xn)=∏iP(Xi∣genitori(Xi))P(X_1,\dots,X_n)=\prod_iP(X_i\mid\text{genitori}(X_i)). Qui Experience e Grades non hanno genitori (probabilità a priori), Interview ha come genitori Experience e Grades, Offer ha come genitore Interview: P(Experience,Grades,Interview,Offer)=P(Experience) P(Grades) P(Interview∣Experience,Grades) P(Offer∣Interview).P(\text{Experience},\text{Grades},\text{Interview},\text{Offer})=P(\text{Experience})\,P(\text{Grades})\,P(\text{Interview}\mid\text{Experience},\text{Grades})\,P(\text{Offer}\mid\text{Interview}). È la risposta del corso. Con quattro variabili booleane, la tabella della congiunta avrebbe 24−1=152^4-1=15 numeri liberi; la fattorizzazione ne usa 1+1+4+2=81+1+4+2=8 (una probabilità per Experience, una per Grades, quattro per Interview, due per Offer).

Q2: la rete con CausalGraphicalModel

python
from causalgraphicalmodels import CausalGraphicalModel

offer = CausalGraphicalModel(
    nodes=["Experience", "Grades", "Interview", "Offer"],
    edges=[
        ("Experience", "Interview"),
        ("Grades", "Interview"),
        ("Interview", "Offer"),
    ]
)
offer.draw()

nodes è l'elenco dei nodi, edges l'elenco delle coppie (genitore, figlio); draw() disegna il grafo (richiede Graphviz). (Nota del corso: per la compatibilità con Python 3.12 il file cgm.py della libreria va modificato sostituendo collections con collections.abc; la libreria non è installata nell'ambiente in cui sono stati controllati questi appunti.)

Q3: l'intervento

python
new_offer = offer.do("Experience")
new_offer.draw()

do(nodo) restituisce il grafo dopo l'intervento: taglia gli archi che entrano nel nodo (il valore del nodo non dipende più dai suoi genitori, ma è fissato dall'esterno). Qui Experience non ha genitori, quindi non c'è nessun arco da tagliare e il grafo è identico: la rete dopo do(Experience)do(\text{Experience}) ha gli stessi tre archi. Lo si controlla con una funzione di poche righe che riproduce lo stesso comportamento:

python
archi = [("Experience", "Interview"), ("Grades", "Interview"), ("Interview", "Offer")]

def do(archi, nodo):
    """Intervento do(nodo): si tagliano gli archi che ENTRANO nel nodo."""
    return [(a, b) for a, b in archi if b != nodo]

print(do(archi, "Experience") == archi)      # True
print(do(archi, "Interview"))                # [('Interview', 'Offer')]

Con do(Interview)do(\text{Interview}) invece gli archi da Experience e da Grades a Interview spariscono e resta solo Interview →\to Offer.

Un esempio numerico per capire le tre risposte

Per vedere che cosa dice la rete si scelgono, solo per questo esempio, variabili booleane e queste probabilità: P(Experience=1)=0,4P(\text{Experience}=1)=0{,}4; P(Grades=1)=0,3P(\text{Grades}=1)=0{,}3; P(Interview=1∣E,G)P(\text{Interview}=1\mid E,G): 0,90{,}9 per (1,1)(1,1), 0,50{,}5 per (1,0)(1,0), 0,40{,}4 per (0,1)(0,1), 0,10{,}1 per (0,0)(0,0); P(Offer=1∣Interview=1)=0,8P(\text{Offer}=1\mid\text{Interview}=1)=0{,}8, P(Offer=1∣Interview=0)=0,1P(\text{Offer}=1\mid\text{Interview}=0)=0{,}1.

  1. L'intervento non cambia nulla perché non ci sono confondenti. P(Offer=1∣Experience=1)P(\text{Offer}=1\mid\text{Experience}=1): P(I=1∣E=1)=0,3⋅0,9+0,7⋅0,5=0,62P(I=1\mid E=1)=0{,}3\cdot0{,}9+0{,}7\cdot0{,}5=0{,}62, quindi P(O=1∣E=1)=0,62⋅0,8+0,38⋅0,1=0,534P(O=1\mid E=1)=0{,}62\cdot0{,}8+0{,}38\cdot0{,}1=0{,}534. Analogamente P(I=1∣E=0)=0,3⋅0,4+0,7⋅0,1=0,19P(I=1\mid E=0)=0{,}3\cdot0{,}4+0{,}7\cdot0{,}1=0{,}19 e P(O=1∣E=0)=0,19⋅0,8+0,81⋅0,1=0,233P(O=1\mid E=0)=0{,}19\cdot0{,}8+0{,}81\cdot0{,}1=0{,}233. Con la formula troncata (si toglie il fattore P(Experience)P(\text{Experience}) dalla congiunta) P(O=1∣do(E=1))=0,534P(O=1\mid do(E=1))=0{,}534 e P(O=1∣do(E=0))=0,233P(O=1\mid do(E=0))=0{,}233: uguali alle condizionate, perché Experience non ha cause in comune con Offer. (Quando c'è un confondente, osservare e intervenire danno numeri diversi: Interventi e operatore do - criterio backdoor e aggiustamentoOsservare $X=x$ e forzare $X=x$ sono cose diverse: $P(y\mid x)\ne P(y\mid do(x))$ quando c'è un confondente. L'intervento $do(X=x)$ si calcola con la «chirurgia» del grafo (si tolgono le frecce entranti in X) e si traduce in probabilità osservazionali con la formula di aggiustamento $P(y\mid do(x))=\sum_z P(y\mid x,z)P(z)$, dove $Z$ sono i genitori di X, o più in generale un insieme S che soddisfa il criterio backdoor: blocca ogni cammino backdoor (cammino da X a Y che inizia con una freccia entrante in X) e non contiene discendenti di X. Effetto causale medio $ACE=P(y\mid do(x))-P(y\mid do(\neg x))$. Se il confondente non è osservabile ma c'è un mediatore Z con X→Z→Y, vale il front-door $P(y\mid do(x))=\sum_z P(z\mid x)\sum_{x'}P(y\mid x',z)P(x')$. Mediazione: effetto diretto controllato CDE con $do(x),do(z)$. Se due insiemi backdoor danno risultati diversi sui dati, il modello è sbagliato. Argomento del corso da 9 CFU.Interventi e operatore do - criterio backdoor e aggiustamento →.)
  2. Experience e Grades sono indipendenti, ma diventano dipendenti conoscendo Interview (Interview è un collider, un nodo con due frecce in ingresso). A priori P(E=1∣G=1)=0,4=P(E=1)P(E=1\mid G=1)=0{,}4=P(E=1). Dopo aver osservato un colloquio positivo: P(I=1)=0,4⋅0,62+0,6⋅0,19=0,362P(I=1)=0{,}4\cdot0{,}62+0{,}6\cdot0{,}19=0{,}362 e P(E=1∣I=1)=0,2480,362=0,685P(E=1\mid I=1)=\dfrac{0{,}248}{0{,}362}=0{,}685. Se in più si sa che i voti sono buoni, P(E=1∣I=1,G=1)=0,4⋅0,90,4⋅0,9+0,6⋅0,4=0,6P(E=1\mid I=1,G=1)=\dfrac{0{,}4\cdot0{,}9}{0{,}4\cdot0{,}9+0{,}6\cdot0{,}4}=0{,}6; se sono scarsi, P(E=1∣I=1,G=0)=0,4⋅0,50,4⋅0,5+0,6⋅0,1=0,769P(E=1\mid I=1,G=0)=\dfrac{0{,}4\cdot0{,}5}{0{,}4\cdot0{,}5+0{,}6\cdot0{,}1}=0{,}769. Se i voti spiegano il colloquio positivo, l'esperienza diventa meno probabile ("explaining away").
python
import itertools
pE, pG = 0.4, 0.3
pI = {(1, 1): .9, (1, 0): .5, (0, 1): .4, (0, 0): .1}         # P(Interview=1 | Experience, Grades)
pO = {1: .8, 0: .1}                                           # P(Offer=1 | Interview)

def joint(e, g, i, o):                                        # fattorizzazione della rete
    p = (pE if e else 1 - pE) * (pG if g else 1 - pG)
    p *= pI[(e, g)] if i else 1 - pI[(e, g)]
    return p * (pO[i] if o else 1 - pO[i])

def P(query, cond):                                           # probabilita' condizionata per enumerazione
    tot = lambda d: sum(joint(*x) for x in itertools.product((0, 1), repeat=4)
                        if all(x[k] == v for k, v in d.items()))
    return tot({**cond, **query}) / tot(cond)

E, G, I, O = 0, 1, 2, 3                                       # posizioni nella tupla (e, g, i, o)
print(round(P({O: 1}, {E: 1}), 3), round(P({O: 1}, {E: 0}), 3))              # 0.534 0.233
print(round(P({E: 1}, {G: 1}), 3))                                           # 0.4
print(round(P({E: 1}, {I: 1}), 3), round(P({E: 1}, {I: 1, G: 1}), 3), round(P({E: 1}, {I: 1, G: 0}), 3))   # 0.685 0.6 0.769
pdo = lambda e0: sum((pG if g else 1 - pG) * (pI[(e0, g)] if i else 1 - pI[(e0, g)]) * pO[i]
                     for g in (0, 1) for i in (0, 1))
print(round(pdo(1), 3), round(pdo(0), 3))                                    # 0.534 0.233

Versione ripasso

Teoria: Reti bayesiane - semantica, indipendenze e inferenza esattaUna rete bayesiana è un grafo diretto aciclico (DAG) con una variabile per nodo e una tabella delle probabilità condizionate (CPT) $P(X_i\mid\text{Parents}(X_i))$ per nodo; rappresenta la congiunta come prodotto $P(x_1,\dots,x_n)=\prod_i P(x_i\mid\text{parents}(X_i))$, con molti meno numeri della tabella completa (rete dell'allarme: 10 contro 31). Tre strutture elementari: catena $X\to Y\to Z$ e fork $Y\leftarrow X\to Z$ (estremi indipendenti dato il centro), collider $X\to Z\leftarrow Y$ (indipendenti, ma dipendenti se si osserva $Z$ o un suo discendente). Modelli causali (genitori = cause) danno reti più piccole. Inferenza esatta per enumerazione: $\mathbf P(X\mid\mathbf e)=\alpha\sum_{\mathbf y}\mathbf P(X,\mathbf e,\mathbf y)$ calcolata come somma di prodotti, in profondità e da sinistra a destra; per l'allarme $\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle$. Molti prodotti si ripetono: l'eliminazione di variabili li salva come fattori e li riusa.Reti bayesiane - semantica, indipendenze e inferenza esatta →, Interventi e operatore do - criterio backdoor e aggiustamentoOsservare $X=x$ e forzare $X=x$ sono cose diverse: $P(y\mid x)\ne P(y\mid do(x))$ quando c'è un confondente. L'intervento $do(X=x)$ si calcola con la «chirurgia» del grafo (si tolgono le frecce entranti in X) e si traduce in probabilità osservazionali con la formula di aggiustamento $P(y\mid do(x))=\sum_z P(y\mid x,z)P(z)$, dove $Z$ sono i genitori di X, o più in generale un insieme S che soddisfa il criterio backdoor: blocca ogni cammino backdoor (cammino da X a Y che inizia con una freccia entrante in X) e non contiene discendenti di X. Effetto causale medio $ACE=P(y\mid do(x))-P(y\mid do(\neg x))$. Se il confondente non è osservabile ma c'è un mediatore Z con X→Z→Y, vale il front-door $P(y\mid do(x))=\sum_z P(z\mid x)\sum_{x'}P(y\mid x',z)P(x')$. Mediazione: effetto diretto controllato CDE con $do(x),do(z)$. Se due insiemi backdoor danno risultati diversi sui dati, il modello è sbagliato. Argomento del corso da 9 CFU.Interventi e operatore do - criterio backdoor e aggiustamento →.

Rete. Nodi Experience, Grades, Interview, Offer; archi Experience →\to Interview, Grades →\to Interview, Interview →\to Offer. Q1 (congiunta): P(Experience) P(Grades) P(Interview∣Experience,Grades) P(Offer∣Interview)P(\text{Experience})\,P(\text{Grades})\,P(\text{Interview}\mid\text{Experience},\text{Grades})\,P(\text{Offer}\mid\text{Interview}). Con 4 booleane: 8 numeri liberi invece di 15.

Q2 (libreria). CausalGraphicalModel(nodes=[...], edges=[(genitore, figlio), ...]), poi .draw().

Q3 (intervento). offer.do("Experience") taglia gli archi entranti nel nodo; Experience non ha genitori, quindi il grafo non cambia. Con do(Interview)do(\text{Interview}) resta solo Interview →\to Offer.

python
def do(archi, nodo):
    return [(a, b) for a, b in archi if b != nodo]

Numeri di esempio (P(E)=0,4P(E)=0{,}4, P(G)=0,3P(G)=0{,}3, P(I∣E,G)=0,9;0,5;0,4;0,1P(I\mid E,G)=0{,}9;0{,}5;0{,}4;0{,}1, P(O∣I)=0,8;0,1P(O\mid I)=0{,}8;0{,}1).

  • P(I=1∣E=1)=0,62P(I=1\mid E=1)=0{,}62, P(O=1∣E=1)=0,534P(O=1\mid E=1)=0{,}534; P(I=1∣E=0)=0,19P(I=1\mid E=0)=0{,}19, P(O=1∣E=0)=0,233P(O=1\mid E=0)=0{,}233. Con la formula troncata P(O=1∣do(E))P(O=1\mid do(E)) dà gli stessi valori: nessun confondente.
  • Collider: P(E=1∣G=1)=0,4=P(E=1)P(E=1\mid G=1)=0{,}4=P(E=1) (indipendenti), ma P(E=1∣I=1)=0,248/0,362=0,685P(E=1\mid I=1)=0{,}248/0{,}362=0{,}685; con G=1G=1 scende a 0,60{,}6, con G=0G=0 sale a 0,7690{,}769 (explaining away).

Perché la fattorizzazione. Ogni nodo contribuisce con una condizionata dati i suoi genitori (Reti bayesiane - semantica, indipendenze e inferenza esattaUna rete bayesiana è un grafo diretto aciclico (DAG) con una variabile per nodo e una tabella delle probabilità condizionate (CPT) $P(X_i\mid\text{Parents}(X_i))$ per nodo; rappresenta la congiunta come prodotto $P(x_1,\dots,x_n)=\prod_i P(x_i\mid\text{parents}(X_i))$, con molti meno numeri della tabella completa (rete dell'allarme: 10 contro 31). Tre strutture elementari: catena $X\to Y\to Z$ e fork $Y\leftarrow X\to Z$ (estremi indipendenti dato il centro), collider $X\to Z\leftarrow Y$ (indipendenti, ma dipendenti se si osserva $Z$ o un suo discendente). Modelli causali (genitori = cause) danno reti più piccole. Inferenza esatta per enumerazione: $\mathbf P(X\mid\mathbf e)=\alpha\sum_{\mathbf y}\mathbf P(X,\mathbf e,\mathbf y)$ calcolata come somma di prodotti, in profondità e da sinistra a destra; per l'allarme $\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle$. Molti prodotti si ripetono: l'eliminazione di variabili li salva come fattori e li riusa.Reti bayesiane - semantica, indipendenze e inferenza esatta →): Experience e Grades sono radici (a priori), Interview ha i genitori Experience e Grades, Offer ha il genitore Interview. Numeri liberi: 1+1+4+2=81+1+4+2=8 contro 24−1=152^4-1=15 della congiunta completa.

Intervento e confondenti. Dopo do(X)do(X) la congiunta perde il fattore di XX ("formula troncata"). Se XX non ha genitori (e quindi nessun confondente) P(Y∣do(X))=P(Y∣X)P(Y\mid do(X))=P(Y\mid X); altrimenti serve il criterio backdoor (Interventi e operatore do - criterio backdoor e aggiustamentoOsservare $X=x$ e forzare $X=x$ sono cose diverse: $P(y\mid x)\ne P(y\mid do(x))$ quando c'è un confondente. L'intervento $do(X=x)$ si calcola con la «chirurgia» del grafo (si tolgono le frecce entranti in X) e si traduce in probabilità osservazionali con la formula di aggiustamento $P(y\mid do(x))=\sum_z P(y\mid x,z)P(z)$, dove $Z$ sono i genitori di X, o più in generale un insieme S che soddisfa il criterio backdoor: blocca ogni cammino backdoor (cammino da X a Y che inizia con una freccia entrante in X) e non contiene discendenti di X. Effetto causale medio $ACE=P(y\mid do(x))-P(y\mid do(\neg x))$. Se il confondente non è osservabile ma c'è un mediatore Z con X→Z→Y, vale il front-door $P(y\mid do(x))=\sum_z P(z\mid x)\sum_{x'}P(y\mid x',z)P(x')$. Mediazione: effetto diretto controllato CDE con $do(x),do(z)$. Se due insiemi backdoor danno risultati diversi sui dati, il modello è sbagliato. Argomento del corso da 9 CFU.Interventi e operatore do - criterio backdoor e aggiustamento →).

Errori tipici: pensare che do(Experience)do(\text{Experience}) cambi il grafo anche se non ha genitori; scrivere la congiunta senza i fattori dei nodi senza genitori; credere che Experience e Grades restino indipendenti dopo aver osservato Interview.

Esercizi su questo argomento

Teoria collegata