[PYTHON] Apprendre avec Causal ML Package Meta-Learner

introduction

Quand je recherchais Uplift Modeling pour le travail, je suis arrivé à CATE (Conditional Average Treatment Effect). CATE conditionné ATE (effet de traitement moyen) avec une certaine quantité de caractéristiques, et tandis que ATE calcule l'effet de traitement «moyen», l'effet devrait changer en fonction de chaque attribut (quantité de caractéristiques). Sur la base de l'idée, nous calculons l'effet du traitement sous forme d'incorporation d'hétérogénéité.

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

Où $ Y (1) $ et $ Y (0) $ sont des variables de résultats potentiels et $ X = x $ est une caractéristique.

Si CATE, c'est-à-dire l'effet du traitement au niveau de l'individu ou du segment peut être estimé, l'optimisation du ciblage comme le lancement d'une campagne uniquement vers ceux qui ont un effet de traitement positif, et la personnalisation des produits / canaux sera possible.

Qu'est-ce que le ML causal?

Un package Python développé par des membres d'Uber Technologies qui fournit une méthode de raisonnement causal utilisant l'apprentissage automatique, qui vous permet d'estimer CATE à partir de données expérimentales / observées. Les techniques suivantes sont fournies, mais dans cet article, nous en apprendrons davantage sur S-Learner, T-Learner et X-Learner.

Préparation préalable

Installation causale ML

> pip install causalml

Importation de bibliothèque

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

Préparation des données

En utilisant les données utilisées dans "Iwanami Data Science Vol.3" pour estimer l'effet causal du contact CM sur l'utilisation de l'application. Je vais. Kato / Hoshino Support Page (Iwanami Data Science Vol.3 Special Feature Causal Reasoning)

#Télécharger les données
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'] #Secondes d'utilisation de l'application
W = df['cm_dummy'] #Avec ou sans contact CM

#Divisé en données d'entraînement et données de test(Stratifié avec 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 Créer un modèle prédictif unique qui inclut les affectations de traitement dans les fonctionnalités et estimer le résultat moyen $ μ (x) $

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

Stage 2 Estimation CATE:

\hat{τ}(x)=\hat{μ}(x, W=1)-\hat{μ}(x, W=0)
# S-Créer une instance Learner(Cette fois basée sur XGBoost)
learner_s = BaseSRegressor(learner=XGBRegressor(random_state=42))

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

#Prédiction pour les données de test
cate_s = learner_s.predict(X=X_test)

cate_s contient des estimations CATE pour chaque ligne de données de test.

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

T-Learner Stage 1 Des modèles prédictifs sont créés à partir des données traitées et des données non traitées, et les résultats moyens de $ μ_1 (x) $ et $ μ_0 (x) $ sont estimés.

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

Stage 2 Estimation CATE:

\hat{τ}(x)=\hat{μ_1}(x)-\hat{μ_0}(x)
# T-Créer une instance Learner(Cette fois basée sur XGBoost)
learner_t = BaseTRegressor(learner=XGBRegressor(random_state=42))

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

#Prédiction pour les données de test
cate_t = learner_t.predict(X=X_test)

X-Learner Stage 1 Des modèles prédictifs sont créés à partir des données traitées et des données non traitées, et les résultats moyens de $ μ_1 (x) $ et $ μ_0 (x) $ sont estimés.

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

Stage 2 Calculer l'effet du traitement conditionnel $ D_i ^ {1} (x) $, $ D_i ^ {0} (x) $ dans le groupe de traitement et le groupe témoin

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

Créer des modèles prédictifs ciblant respectivement $ D ^ {1} $ et $ D ^ {0} $, et estimer CATT (Effet moyen conditionnel du traitement sur le traité) et CATU (Effet moyen conditionnel du traitement sur le non traité)

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

Stage 3 Estimation CATE:

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

$ g (x) $ est une fonction de pondération qui prend des valeurs comprises entre 0 et 1 et utilise souvent une estimation du score de propension $ P [W = 1 | X = x] $.

# X-Créer une instance Learner(Cette fois basée sur XGBoost)
learner_x = BaseXRegressor(learner=XGBRegressor(random_state=42))

#Apprentissage
#Si vous ne spécifiez pas de score de propension comme cette fois, ElasticNet le calculera automatiquement.
learner_x.fit(X=X_train, treatment=W_train, y=Y_train)

#Prédiction pour les données de test
cate_x = learner_x.predict(X=X_test)

Comparaison

Vérifiez l'estimation CATE pour chaque méthode sur l'intrigue violon.

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

La variation augmente dans l'ordre de S-Learner <X-Learner <T-Learner. Mais je ne peux rien dire de plus. .. Nous apprendrons les caractéristiques de chaque méthode et à quel type de cas elle convient. À propos, il existe encore des cas où S-Learner ne divise pas l'arbre avec l'allocation de traitement $ W $, et la valeur estimée tend à se rapprocher de zéro.

point important

référence

Recommended Posts

Apprendre avec Causal ML Package Meta-Learner
Apprenez Python avec ChemTHEATER
Apprenez Zundokokiyoshi en utilisant LSTM
Pandas apprenant avec la chimioinfomatique
Apprentissage Scikit-Learn avec la chimioinfomatique
Apprenez avec Chemo Informatics Matplotlib
Apprenez avec Chemo Informatics NumPy
DCGAN avec TF Learn
Apprenez Pendulum-v0 avec DDPG
Apprenez librosa avec un tutoriel 1
Apprenez les orbites elliptiques avec Chainer
Apprenez de nouvelles données avec PaintsChainer