[PYTHON] Lernen Sie mit Causal ML Package Meta-Learner

Einführung

Als ich Uplift Modeling für die Arbeit recherchierte, kam ich zu CATE (Conditional Average Treatment Effect). CATE konditionierte ATE (durchschnittlicher Behandlungseffekt) mit einer bestimmten Merkmalsmenge, und während ATE den "durchschnittlichen" Behandlungseffekt berechnet, sollte sich der Effekt in Abhängigkeit von jedem Attribut (Merkmalsmenge) ändern. Basierend auf der Idee berechnen wir den Behandlungseffekt in Form der Einbeziehung von Heterogenität.

ATE:=E[Y(1)-Y(0)]
CATE:=E[Y(1)-Y(0)|X=x]

Wobei $ Y (1) $ und $ Y (0) $ potenzielle Ergebnisvariablen sind und $ X = x $ ein Merkmal ist.

Wenn CATE, dh der Behandlungseffekt auf Einzel- oder Segmentebene, geschätzt werden kann, ist eine gezielte Optimierung wie das Starten einer Kampagne nur für diejenigen mit positivem Behandlungseffekt und die Personalisierung von Produkten / Kanälen möglich.

Was ist kausale ML?

Ein Python-Paket, das von Mitgliedern von Uber Technologies entwickelt wurde und eine kausale Inferenzmethode mit maschinellem Lernen bietet, mit der Sie CATE aus experimentellen / beobachteten Daten abschätzen können. Die folgenden Techniken werden bereitgestellt, aber in diesem Artikel lernen wir S-Learner, T-Learner und X-Learner kennen.

Vorbereitungen

Kausale ML-Installation

> pip install causalml

Bibliotheksimport

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor

from causalml.inference.meta import BaseXRegressor, BaseSRegressor, BaseTRegressor

Datenaufbereitung

Verwenden Sie die in "Iwanami Data Science Vol.3" verwendeten Daten, um den kausalen Effekt des CM-Kontakts auf die Anwendungsnutzung abzuschätzen. Ich werde. Kato / Hoshino-Support-Seite (Iwanami Data Science Vol.3, Special Feature Causal Reasoning)

#Daten herunterladen
path = 'https://raw.githubusercontent.com/iwanami-datascience/vol3/master/kato%26hoshino/q_data_x.csv'
df = pd.read_csv(path)

X = df[['area_kanto', 'area_tokai', 'area_keihanshin', 'age', 'sex', 'marry_dummy', 'child_dummy',
        'job_dummy1', 'job_dummy2', 'job_dummy3', 'job_dummy4', 'job_dummy5', 'job_dummy6', 'job_dummy7', 
        'inc', 'pmoney', 'fam_str_dummy1', 'fam_str_dummy2', 'fam_str_dummy3', 'fam_str_dummy4', 'TVwatch_day']]
Y = df['gamesecond'] #Sekunden für die App-Nutzung
W = df['cm_dummy'] #Mit oder ohne CM-Kontakt

#Unterteilt in Trainingsdaten und Testdaten(Geschichtet mit W.)
X_train, X_test, Y_train, Y_test, W_train, W_test = train_test_split(X, Y, W, test_size=0.2, shuffle=True, random_state=42, stratify=W)

S-Learner Stage 1 Erstellen Sie ein einzelnes Vorhersagemodell, das Behandlungszuweisungen in Features enthält, und schätzen Sie das durchschnittliche Ergebnis $ μ (x) $

μ(x)=E[Y|X=x, W=w]

Stage 2 CATE-Schätzung:

\hat{τ}(x)=\hat{μ}(x, W=1)-\hat{μ}(x, W=0)
# S-Erstellen Sie eine Learner-Instanz(Diesmal basierend auf XGBoost)
learner_s = BaseSRegressor(learner=XGBRegressor(random_state=42))

#Lernen
learner_s.fit(X=X_train, treatment=W_train, y=Y_train)

#Vorhersage für Testdaten
cate_s = learner_s.predict(X=X_test)

cate_s enthält CATE-Schätzungen für jede Zeile von Testdaten.

array([[ 1139.97802734],
       [  -22.8037262 ],
       [-1353.3692627 ],
       ...,
       [ -751.50939941],
       [ 1418.30859375],
       [ -743.94995117]])

T-Learner Stage 1 Aus den behandelten und den unbehandelten Daten werden Vorhersagemodelle erstellt und die durchschnittlichen Ergebnisse von $ μ_1 (x) $ und $ μ_0 (x) $ geschätzt.

μ_1(x)=E[Y(1)|X=x] \\
μ_0(x)=E[Y(0)|X=x]

Stage 2 CATE-Schätzung:

\hat{τ}(x)=\hat{μ_1}(x)-\hat{μ_0}(x)
# T-Erstellen Sie eine Learner-Instanz(Diesmal basierend auf XGBoost)
learner_t = BaseTRegressor(learner=XGBRegressor(random_state=42))

#Lernen
learner_t.fit(X=X_train, treatment=W_train, y=Y_train)

#Vorhersage für Testdaten
cate_t = learner_t.predict(X=X_test)

X-Learner Stage 1 Aus den behandelten und den unbehandelten Daten werden Vorhersagemodelle erstellt und die durchschnittlichen Ergebnisse von $ μ_1 (x) $ und $ μ_0 (x) $ geschätzt.

μ_1(x)=E[Y(1)|X=x] \\
μ_0(x)=E[Y(0)|X=x]

Stage 2 Berechnen Sie den bedingten Behandlungseffekt $ D_i ^ {1} (x) $, $ D_i ^ {0} (x) $ in der Behandlungsgruppe und der Kontrollgruppe

D_i^{1}(x)=Y_i^{1}-\hat{μ_0}(X_i^{1}) \\
D_i^{0}(x)=\hat{μ_1}(X_i^{0})-Y_i^{0}

Erstellen Sie Vorhersagemodelle für $ D ^ {1} $ bzw. $ D ^ {0} $ und schätzen Sie CATT (bedingter durchschnittlicher Behandlungseffekt bei den Behandelten) und CATU (bedingter durchschnittlicher Behandlungseffekt bei unbehandelten Personen).

τ_1(x)=E[D^{1}|X=x] \\
τ_0(x)=E[D^{0}|X=x]

Stage 3 CATE-Schätzung:

\hat{τ}(x)=g(x)\hat{τ_0}(x)+(1-g(x))\hat{τ_1}(x)

$ g (x) $ ist eine Gewichtungsfunktion, die Werte im Bereich von 0 bis 1 annimmt und häufig eine Schätzung der Neigungsbewertung $ P [W = 1 | X = x] $ verwendet.

# X-Erstellen Sie eine Learner-Instanz(Diesmal basierend auf XGBoost)
learner_x = BaseXRegressor(learner=XGBRegressor(random_state=42))

#Lernen
#Wenn Sie diesmal keine Neigungsbewertung wie diese angeben, berechnet ElasticNet diese automatisch.
learner_x.fit(X=X_train, treatment=W_train, y=Y_train)

#Vorhersage für Testdaten
cate_x = learner_x.predict(X=X_test)

Vergleich

Überprüfen Sie die CATE-Schätzung für jede Methode auf dem Geigenplot.

plt.figure(figsize=(12,8))
plt.violinplot([cate_s.flatten(), cate_t.flatten(), cate_x.flatten()], showmeans=True)
plt.xticks([1,2,3], ['S-learner', 'T-learner', 'X-learner'])
plt.ylabel('Distribution of CATE')

violinplt.png

Die Variation nimmt in der Reihenfolge S-Learner <X-Learner <T-Learner zu. Mehr kann ich aber nicht sagen. .. Wir werden die Eigenschaften jeder Methode kennen lernen und für welche Art von Fall sie geeignet ist. Übrigens gibt es immer noch Fälle, in denen S-Learner den Baum nicht durch die Behandlungszuordnung $ W $ teilt und der geschätzte Wert gegen Null geht.

wichtiger Punkt

Referenz

Recommended Posts

Lernen Sie mit Causal ML Package Meta-Learner
Lerne Python mit ChemTHEATER
Lerne Zundokokiyoshi mit LSTM
Pandas lernen mit Chemoinfomatik
Scikit-Lernen mit Chemoinfomatik
Lernen Sie mit Chemo Informatics Matplotlib
Lernen Sie mit Chemo Informatics NumPy
DCGAN mit TF Learn
Lernen Sie Pendulum-v0 mit DDPG
Lernen Sie Librosa mit einem Tutorial 1
Lernen Sie mit Chainer elliptische Bahnen
Lernen Sie neue Daten mit PaintsChainer