Source code for libuplift.meta.x_learner

"""The X-learner model from Künzel et al. 'Metalearners for estimating
heterogeneous treatment effects using machine learning'.

Currently available only for regression.  Can be applied to
classification problems when treating class variable as numeric.

"""

import numpy as np

from sklearn.linear_model import LinearRegression

from .base import UpliftMetaModelBase
from ..base import UpliftRegressorMixin

[docs] class XLearnerUpliftRegressor(UpliftRegressorMixin, UpliftMetaModelBase): def __init__(self, base_estimator = LinearRegression()): super().__init__(base_estimator=base_estimator) def _get_model_names_list(self, X=None, y=None, trt=None): if self.n_trt_ > 1: raise ValueError("XLearner is only supported for single treatment.") m_names = ["model_c", "model_t", "model_c_hat", "model_t_hat"] return m_names def _iter_training_subsets(self, X, y, trt, n_trt, sample_weight): for i in range(self.n_trt_ + 1): mask = (trt==i) if sample_weight is None: wi = None else: wi = sample_weight[mask] Xi = X[mask] yi = y[mask] yield Xi, yi, wi c_mask = (trt==0) t_mask = (trt==1) # c_hat model if sample_weight is None: wi = None else: wi = sample_weight[c_mask] y_c_pred = self.models_[1][1].predict(X[c_mask]) yield X[c_mask], y_c_pred - y[c_mask], wi # t_hat model if sample_weight is None: wi = None else: wi = sample_weight[t_mask] y_t_pred = self.models_[0][1].predict(X[t_mask]) yield X[t_mask], y[t_mask] - y_t_pred, wi
[docs] def predict(self, X): n = self.n_[0] + self.n_[1] pc = self.n_[0] / n pt = self.n_[1] / n pred_c_hat = self.models_[2][1].predict(X) pred_t_hat = self.models_[3][1].predict(X) y = pc * pred_c_hat + pt * pred_t_hat return y