IA causale, esplorando l'integrazione del ragionamento causale nell'apprendimento automatico

fotografato da Nesetril scelto SU Unsplash

Benvenuti nella mia serie sull'intelligenza artificiale causale, in cui esploreremo l'integrazione del ragionamento causale nei modelli di apprendimento automatico. Aspettatevi di esplorare una serie di applicazioni pratiche in diversi contesti aziendali.

Nell'ultimo articolo abbiamo esplorato far funzionare la scoperta causale in contesti aziendali reali. Questa volta copriremo effetti del trattamento de-biasing con Double Machine Learning.

Se ti sei perso l'ultimo articolo sulla scoperta causale, dai un'occhiata qui:

Questo articolo dimostrerà perché il Double Machine Learning è una parte essenziale degli strumenti dell'intelligenza artificiale causale:

Aspettatevi di acquisire una profonda comprensione di:

  • Effetti medi del trattamento (ATE)
  • Le sfide legate all'utilizzo della regressione lineare per stimare l'ATE
  • Il Double Machine Learning e come supera le sfide che la regressione lineare deve affrontare
  • Un caso di studio pratico in Python che illustra come applicare il Double Machine Learning.

Il quaderno completo lo trovate qui:

MANGIÒ

La ATE è l’impatto medio di un trattamento o di un intervento su una popolazione. Possiamo calcolarlo confrontando la variazione media in una metrica scelta tra un gruppo di trattamento e uno di controllo.

Ad esempio, supponiamo che un team di marketing stia eseguendo una promozione. Il gruppo di trattamento è composto da clienti che ricevono un'offerta, mentre il gruppo di controllo è composto da clienti che non l'hanno ricevuta. Possiamo calcolare l'ATE confrontando il numero medio di ordini nel gruppo di trattamento e di controllo.

Quadro dei risultati potenziali

Il quadro dei risultati potenziali è stato sviluppato da Donald Rubin ed è diventato un concetto fondamentale nell'inferenza causale. Proviamo a capirlo utilizzando l'esempio sopra riportato dal team di marketing.

  1. Assegnazione del trattamento: Ogni cliente ha due potenziali risultati, il risultato di essere nel gruppo di trattamento (offerta inviata) e il risultato di essere nel gruppo di controllo (offerta non inviata). Tuttavia, viene osservato un solo risultato potenziale per ciascun cliente.
  2. Controfattuali: Il risultato potenziale che non viene osservato è controfattuale, ad esempio cosa sarebbe successo se questo cliente fosse stato nel gruppo di controllo (offerta non inviata).
  3. Effetto causale: L'effetto causale di un trattamento è la differenza tra i risultati potenziali in diverse condizioni di trattamento (offerta espulsa vs offerta non inviata).
  4. Stima: Gli effetti causali possono essere stimati utilizzando dati sperimentali o osservativi utilizzando una serie di tecniche causali.

Vengono fatte diverse ipotesi per garantire che gli effetti stimati siano validi:

  • Presupposto del valore del trattamento per unità stabile (SUTVA): Il risultato potenziale per qualsiasi cliente non è influenzato dall'assegnazione del trattamento ad altri clienti.
  • Positività: Per qualsiasi combinazione di caratteristiche, deve esserci una certa probabilità che un cliente possa ricevere il trattamento o il controllo
  • Ignorabilità: Vengono osservati tutti i fattori confondenti che influiscono sia sul trattamento che sull'esito.

Dati sperimentali

La stima dell’ATE con dati sperimentali è relativamente semplice.

Gli studi randomizzati e controllati (RCT) o test AB sono progettati per assegnare in modo casuale i partecipanti ai gruppi di trattamento e di controllo. Ciò garantisce che eventuali differenze nei risultati possano essere attribuite all’effetto del trattamento piuttosto che alle caratteristiche preesistenti dei partecipanti.

Torniamo all'esempio del team di marketing. Se si dividono casualmente i clienti tra il gruppo di trattamento e quello di controllo, la differenza media negli ordini è l'effetto causale dell'offerta inviata.

Dati osservativi

La stima dell’ATE utilizzando i dati osservativi è più impegnativa.

La sfida più comune è il confondimento delle variabili che influenzano sia il trattamento che il risultato. Il mancato controllo dei fattori confondenti porterà a stime distorte dell’effetto del trattamento. Torneremo su questo argomento più avanti nell'articolo sul caso di studio elaborato.

Altre sfide includono:

  • Bias di selezione: l’assegnazione del trattamento è influenzata da fattori legati al risultato.
  • Effetti del trattamento eterogenei: l’effetto del trattamento varia tra i diversi sottogruppi della popolazione.

Panoramica

La regressione lineare può essere utilizzata per stimare l'ATE utilizzando dati osservativi. Le caratteristiche del trattamento (T) e del controllo (X) sono incluse come variabili nel modello.

Usa l'immagine generata

Il coefficiente della variabile di trattamento è l'ATE, ovvero la variazione media della variabile di risultato associata a una variazione unitaria della variabile di trattamento, mantenendo costanti le caratteristiche di controllo.

Processo di generazione dei dati

Possiamo utilizzare un semplice processo di generazione dei dati con un risultato, trattamento e fattore di confondimento per illustrare come possiamo utilizzare la regressione lineare per stimare la ATE.

Innanzitutto possiamo visualizzare il grafico causale:

# Create node lookup variables
node_lookup = {0: 'Confounder',
1: 'Treatment',
2: 'Outcome'
}

total_nodes = len(node_lookup)

# Create adjacency matrix - this is the base for our graph
graph_actual = np.zeros((total_nodes, total_nodes))

# Create graph using expert domain knowledge
graph_actual(0, 1) = 1.0 # Confounder -> Treatment
graph_actual(0, 2) = 1.0 # Confounder -> Outcome
graph_actual(1, 2) = 1.0 # Treatment -> Outcome

plot_graph(input_graph=graph_actual, node_lookup=node_lookup)

Immagine generata dall'utente

E poi possiamo creare campioni utilizzando il semplice processo di generazione dei dati. Presta molta attenzione al coefficiente della variabile di trattamento (0,75): questa è la nostra verità fondamentale ATE.

np.random.seed(123)

# Create dataframe with a confounder, treatment and outcome
df = pd.DataFrame(columns=('Confounder', 'Treatment', 'Outcome'))
df('Confounder') = np.random.normal(loc=100, scale=25, size=1000)
df('Treatment') = np.random.normal(loc=50, scale=10, size=1000) + 0.50 * df('Confounder')
df('Outcome') = 0.25 * df('Confounder') + 0.75 * df('Treatment') + np.random.normal(loc=0, scale=5, size=1000)

sns.pairplot(df, corner=True)

Immagine generata dall'utente

Regressione lineare

Possiamo quindi addestrare un modello di regressione lineare ed estrarre il coefficiente della variabile di trattamento: possiamo vedere che stima correttamente l'ATE (0,75).

# Set target and features
y = df('Outcome')
X = df(('Confounder', 'Treatment'))

# Train model
model = RidgeCV()
model = model.fit(X, y)

# Extract the treatment coefficient
ate_lr = round(model.coef_(1), 2)

print(f'The average treatment effect using Linear Regression is: {ate_lr}')

Immagine generata dall'utente

Sfide

La regressione lineare può essere un metodo molto efficace per stimare l'ATE. Tuttavia, ci sono alcune sfide di cui essere consapevoli:

  • Fa fatica quando disponiamo di dati ad alta dimensione.
  • I “parametri di disturbo” (le caratteristiche di controllo che sono un “fastidio” da stimare) potrebbero essere troppo complessi per essere stimati dalla regressione lineare.
  • Si presuppone che l'effetto del trattamento sia costante tra i diversi sottogruppi della popolazione (ad esempio, nessuna eterogeneità).
  • Non presuppone alcun confondente non osservato.
  • Presuppone che l'effetto del trattamento sia lineare.

Panoramica

Il Double Machine Learning è un metodo causale introdotto per la prima volta nel 2017 nel documento “Double/Debiased Machine Learning for Treatment and Structural Parametri”:

Ha lo scopo di ridurre le distorsioni e migliorare la stima degli effetti causali in situazioni in cui disponiamo di dati ad alta dimensione e/o parametri di disturbo complessi.

Si ispira al teorema di Frisch-Waugh-Lovell, quindi iniziamo a capirlo.

Teorema di Frisch-Waugh-Lovell

Il teorema FWL viene utilizzato per scomporre gli effetti di più regressori su una variabile di risultato, consentendoci di isolare gli effetti di interesse.

Immagina di avere due serie di funzionalità, X1 e X2. Potresti stimare i parametri del modello utilizzando la regressione lineare come abbiamo fatto prima. Tuttavia, puoi anche ottenere lo stesso parametro per X1 seguendo questi passaggi:

  1. Usa X2 solo per prevedere il risultato
  2. Utilizzare X2 solo per prevedere X1
  3. Calcolare i residui dal modello di risultato (passaggio 1) e dal modello di funzionalità (passaggio 2)
  4. Regredire i residui del modello di risultato sui residui del modello delle caratteristiche per stimare il parametro per X1

A prima vista può essere piuttosto difficile da seguire, quindi proviamolo in Python per illustrarlo. Utilizziamo gli stessi dati di prima, ma prendiamo la colonna del trattamento come X1 e la colonna del confondente come X2:

# Set treatment, outcome and confounder samples
treatment = df('Treatment').to_numpy().reshape(-1,1)
outcome = df('Outcome').to_numpy().reshape(-1,1)
confounder = df('Confounder').to_numpy().reshape(-1,1)

# Train treatment model and calculate residuals
treatment_model = RidgeCV()
treatment_model = treatment_model.fit(confounder, treatment)
treatment_pred = treatment_model.predict(confounder)
treatment_residuals = treatment - treatment_pred

# Train outcome model and calculate residuals
outcome_model = RidgeCV()
outcome_model = outcome_model.fit(confounder, outcome)
outcome_pred = outcome_model.predict(confounder)
outcome_residuals = outcome - outcome_pred

# Train residual model and calculate average treatment effect
final_model = RidgeCV()
final_model = final_model.fit(treatment_residuals, outcome_residuals)
ate_dml = round(final_model.coef_(0)(0), 2)

print(f'The average treatment effect is: {ate_fwl}')

Immagine generata dall'utente

Possiamo vedere che stima correttamente il coefficiente della variabile di trattamento (0,75).

Doppio apprendimento automatico

Double Machine Learning si basa sul FWL isolando gli effetti delle funzionalità di trattamento e controllo e utilizzando modelli flessibili di apprendimento automatico.

La prima fase viene spesso definita ortogonalizzazione poiché i parametri di disturbo vengono stimati indipendentemente dalla stima dell’effetto del trattamento.

Primo stadio:

  • Modello di trattamento (de-biasing): Modello di machine learning utilizzato per stimare la probabilità di assegnazione del trattamento (spesso indicato come punteggio di propensione). Vengono quindi calcolati i residui del modello di trattamento.
  • Modello di risultato (de-noising): Modello di apprendimento automatico utilizzato per stimare il risultato utilizzando solo le funzionalità di controllo. Vengono quindi calcolati i residui del modello di risultato.

Seconda fase:

  • I residui del modello di trattamento vengono utilizzati per prevedere i residui del modello di risultato.

Il coefficiente del modello della seconda fase è l'ATE. Vale la pena notare che il modello della seconda fase è un modello lineare, il che significa che stiamo presupponendo che l’effetto del nostro trattamento sia lineare (questo è il motivo per cui chiamiamo DML un modello parzialmente lineare).

Invece di codificarlo da soli, possiamo utilizzare il pacchetto Microsoft EconML. EconML dispone di un'ampia gamma di tecniche di Causal ML implementate, incluse numerose implementazioni di DML:

# Train DML model
dml = LinearDML(discrete_treatment=False)
dml.fit(df('Outcome').to_numpy().reshape(-1,1), T=df('Treatment').to_numpy().reshape(-1,1), X=None, W=df('Confounder').to_numpy().reshape(-1,1))

# Calculate average treatment effect
ate_dml = round(dml.ate()(0), 2)

print(f'The average treatment effect using the DML is: {ate_dml}')

Immagine generata dall'utente

Possiamo ancora una volta vedere che stima correttamente il coefficiente della variabile di trattamento (0,75).

Sfondo

Il team Marketing invia offerte interessanti a clienti selezionati. Al momento non presentano un campione di clienti selezionato casualmente per misurare l'impatto delle offerte.

Al team di Data Science viene chiesto di stimare in che modo le offerte influiscono sugli ordini dei clienti.

Pregiudizi confusi

Il confronto ingenuo tra i clienti a cui sono state inviate offerte e quelle a cui non sono state inviate è parziale. Ciò è causato da fattori confondenti:

  • I clienti che disattivano la posta elettronica non possono ricevere un'offerta: questa popolazione è meno coinvolta e meno propensa a ordinare.
  • Il team CRM si rivolge ai clienti in base alla cronologia degli ordini: la cronologia degli ordini influisce sulla probabilità che tu effettui un nuovo ordine.

Processo di generazione dei dati

Impostiamo un processo di generazione dei dati con le seguenti caratteristiche:

  • Parametri di disturbo difficili
  • Effetto del trattamento semplice (nessuna eterogeneità)

Le caratteristiche X sono caratteristiche del cliente rilevate prima del trattamento:

Immagine generata dall'utente

T è un flag binario che indica se il cliente ha ricevuto l'offerta.

Immagine generata dall'utente
np.random.seed(123)

# Set number of observations
n=100000

# Set number of features
p=10

# Create features
X = np.random.uniform(size=n * p).reshape((n, -1))

# Nuisance parameters
b = (
np.sin(np.pi * X(:, 0) * X(:, 1))
+ 2 * (X(:, 2) - 0.5) ** 2
+ X(:, 3)
+ 0.5 * X(:, 4)
+ X(:, 5) * X(:, 6)
+ X(:, 7) ** 3
+ np.sin(np.pi * X(:, 8) * X(:, 9))
)

# Create binary treatment
T = np.random.binomial(1, expit(b))

# Set treatment effect
tau = 0.75

# Calculate outcome
y = b + T * tau + np.random.normal(size=n)

Il codice Python del processo di generazione dei dati si basa sul creatore di dati sintetici del pacchetto Ubers Causal ML. Essere in grado di creare dati sintetici realistici è fondamentale quando si tratta di valutare metodi di inferenza causale, quindi ti consiglio vivamente di provarli:

Regressione lineare

Iniziamo utilizzando la regressione lineare per stimare l'ATE. La nostra aspettativa è che avrà difficoltà a catturare i parametri fastidiosi e quindi potenzialmente a specificare erroneamente l’effetto del trattamento.

# Append features and treatment
X_T = np.append(X, T.reshape(-1, 1), axis=1)

# Train linear regression model
model = RidgeCV()
model = model.fit(X_T, y)
y_pred = model.predict(X_T)

# Extract the treatment coefficient
ate_lr = round(model.coef_(-1), 2)

print(f'The average treatment effect using Linear Regression is: {ate_lr}')

Immagine generata dall'utente

Doppio apprendimento automatico

Quindi addestriamo un modello DML utilizzando LightGBM come modelli flessibili di prima fase. Ciò dovrebbe consentirci di catturare i difficili parametri di disturbo calcolando correttamente l’effetto del trattamento.

np.random.seed(123)

# Train DML model using flexible stage 1 models
dml = LinearDML(model_y=LGBMRegressor(), model_t=LGBMClassifier(), discrete_treatment=True)
dml.fit(y, T=T, X=None, W=X)

# Calculate average treatment effect
ate_dml = round(dml.ate(), 2)

print(f'The average treatment effect using the DML is: {ate_dml}')

Immagine generata dall'utente

Confronto

Quando confrontiamo i risultati, osserviamo che la regressione lineare ci fornisce una stima distorta mentre DML è molto vicino alla realtà. Questo dimostra davvero la potenza di DML!

# Plot comparison of results
categories = ('Ground truth', 'DML', 'Linear Regression')
sns.barplot(x=categories, y=(tau, ate_dml, ate_lr))
plt.ylabel('ATE')
plt.title('Average Treatment Effect comparison')
plt.show()
Immagine generata dall'utente

Esistono molti altri metodi causali che possiamo utilizzare per stimare ATE (molti dei quali sono implementati sia nei pacchetti EconML che CausalML):

  • Corrispondenza del punteggio di propensione (PSM)
  • Corrispondenza del punteggio di propensione inversa (IPSM)
  • S-Learner
  • T-Learner
  • Studente doppiamente robusto (DR)
  • Studente variabile dello strumento (IV)

Se desideri approfondire ulteriormente questi metodi, ti consiglio di iniziare con S-Learner e T-Learner (spesso indicati come meta-learner). Un paio di insegnamenti chiave per aiutarti a iniziare a capire quando e dove applicarli:

  • Quando il trattamento è binario e le dimensioni del trattamento e del controllo sono equamente bilanciate, T-Learner è spesso un'alternativa più semplice al DML.
  • Quando il trattamento è continuo e si sospetta che l'effetto del trattamento possa essere non lineare, S-Learner potrebbe essere più appropriato di DML.
  • I meta-studenti possono lottare con i pregiudizi di regolarizzazione (in particolare lo studente S): quando vediamo che DML supera i meta-studenti, di solito questo è il motivo.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *