DoubleMLForecaster
Double Machine Learning forecaster for causal time-series forecasting.
Implements an adaptation of Double Machine Learning (DML) framework [1] for time-series, enabling deconfounded estimation of causal effects.
The forecaster uses a three-step residualization process to separate causal effects from confounding influences:
Fit procedure
Split
Xinto exposure variablesX_exposureand confounder variablesX_confounder.X_exposure = X[exposure_vars],X_confounder = X.drop(columns=exposure_vars).Fit the outcome forecaster to obtain residuals
outcome_fcst.fit(y=y, X=X_confounder, fh=y.index),y_pred = outcome_fcst.predict(X=X_confounder),y_res = y - y_pred.Fit the treatment forecaster to obtain exposure residuals
treatment_fcst.fit(y=X_exposure, X=X_confounder, fh=y.index),X_exposure_pred = treatment_fcst.predict(X=X_confounder),X_exposure_res = X_exposure - X_exposure_pred.Fit the residual forecaster to learn deconfounded causal relationship.
residual_fcst.fit(y=y_res, X=X_exposure_res, fh=fh).Refit the outcome and treatment forecasters for use during prediction.
outcome_fcst.fit(y=y, X=X_confounder, fh=fh),treatment_fcst.fit(y=X_exposure, X=X_confounder, fh=fh).
Predict procedure
Split new
Xinto exposure variablesX_exposureand confounder variablesX_confounder.X_exposure = X[exposure_vars],X_confounder = X.drop(columns=exposure_vars).Compute the base (confounder-driven) forecast:
y_pred_base = outcome_fcst.predict(X_confounder).Compute the residualized exposures:
X_exposure_pred = treatment_fcst.predict(X_confounder).X_exposure_res = X_exposure - X_exposure_pred.Compute the causal (residual) forecast:
y_pred_res = residual_fcst.predict(X=X_exposure_res).Combine both components to obtain the final prediction:
y_pred = y_pred_base + y_pred_res.
Schnellstart
from sktime.forecasting.causal import DoubleMLForecaster
estimator = DoubleMLForecaster(outcome_fcst, treatment_fcst, residual_fcst=None, exposure_vars=None, starting_window=0.1)Parameter(5)
- outcome_fcstsktime forecaster
- Base forecaster modeling the outcome variable conditional on confounders.
- treatment_fcstsktime forecaster
- Forecaster modeling the exposure variables conditional on confounders.
- residual_fcstsktime forecaster, optional (default=None)
Forecaster modeling the residual (deconfounded) relationship between outcome and treatment. If not provided, a default forecaster is created using
make_reduction(LinearRegression(), strategy="recursive"), a recursive reduction forecaster built from a linear regression model, providing a simple and interpretable baseline.- exposure_varslist of str, optional (default=None)
Names of columns in
Xrepresenting exposure (treatment) variables. The remaining columns are treated as confounders. IfNone, all features inXare treated as confounders and used only with the outcome forecaster. In this case, the treatment forecaster is not used, andNoneexposure residuals are passed to the residual forecaster, which therefore operates only ony.- starting_windowfloat, int or None, optional (default=0.1)
- If float, must be between 0.0 and 1.0, and is interpreted as the proportion of the starting dataset to ignore when doing in-sample predictions. Proportions are rounded to the next higher integer count of samples (ceil). If int, is interpreted as total number of samples to ignore.
Beispiele
>>> from sktime.datasets import load_longley
>>> from sktime.forecasting.causal import DoubleMLForecaster
>>> from sktime.forecasting.naive import NaiveForecaster
>>> from sktime.split import temporal_train_test_split
>>>
>>> y, X = load_longley ()
>>> y_train, y_test, X_train, X_test = temporal_train_test_split (y, X, test_size = 4)
>>>
>>> # Assume 'GNP' is our exposure variable of interest
>>> exposure_vars = ['GNP' ]
>>>
>>> # Set up forecasters for nuisance functions
>>> outcome_fcst = NaiveForecaster ()
>>> treatment_fcst = NaiveForecaster ()
>>>
>>> # Create DoubleMLForecaster
>>> dml_forecaster = DoubleMLForecaster (
... outcome_fcst = outcome_fcst,
... treatment_fcst = treatment_fcst,
... exposure_vars = exposure_vars
... )
>>>
>>> # Fit and predict
>>> fh = [1, 2, 3 ]
>>> dml_forecaster. fit (y_train, X = X_train, fh = fh) DoubleMLForecaster(exposure_vars=['GNP'], outcome_fcst=NaiveForecaster(), residual_fcst=RecursiveTabularRegressionForecaster(estimator=LinearRegression(), window_length=3), treatment_fcst=NaiveForecaster())
>>> y_pred = dml_forecaster. predict (X = X_test)Referenzen
Chernozhukov, V., Chetverikov, D., Demirer, M., Duflo, E., Hansen, C., Newey, W., & Robins, J. (2018). Double/debiased machine learning for treatment and structural parameters.