From 2272a18b5759fe214cac8654446d0318f923fb6a Mon Sep 17 00:00:00 2001 From: Shrey Dixit Date: Fri, 8 Jul 2022 11:40:10 +0200 Subject: [PATCH] Added notebook --- doc/examples/DoubleML meets FLAML.ipynb | 1329 +++++++++++++++++++++++ 1 file changed, 1329 insertions(+) create mode 100644 doc/examples/DoubleML meets FLAML.ipynb diff --git a/doc/examples/DoubleML meets FLAML.ipynb b/doc/examples/DoubleML meets FLAML.ipynb new file mode 100644 index 00000000..9a3b2eed --- /dev/null +++ b/doc/examples/DoubleML meets FLAML.ipynb @@ -0,0 +1,1329 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DoubleML meets FLAML: Tuning XGBoost learners\n", + "\n", + "In this example notebook, we will be illustrating how one can use [FLAML (Fast Library for Automated Machine Learning & Tuning)](https://github.com/microsoft/FLAML) to tune hyperparameters of an XGBoost learner in the [DoubleML](https://docs.doubleml.org/stable/index.html) Framework. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data\n", + "\n", + "For the first part of this tutorial, we're going to use simulated data by calling [`make_plr_CCDDHNR2018`](https://docs.doubleml.org/stable/api/generated/doubleml.datasets.make_plr_CCDDHNR2018.html). This function generates data from a partially linear regression model used in [Chernozhukov et al. (2018)](https://onlinelibrary.wiley.com/doi/abs/10.1111/ectj.12097) for Figure 1. We generate 1000 observations out of which 500 are used for tuning the XGB learners using FLAML and the rest 500 are used to train the DoubleML model. The data generated will have 50 covariates variables, 1 treatment variable and 1 outcome variable. We have set the treatment effect to be $ 0.5 $ for this particular example" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# ! pip install flaml;" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import xgboost as xgb\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import seaborn as sns\n", + "\n", + "from doubleml.datasets import make_plr_CCDDHNR2018\n", + "\n", + "import doubleml as dml\n", + "from flaml import AutoML\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import mean_squared_error\n", + "from sklearn.dummy import DummyRegressor" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "sns.set()\n", + "colors = sns.color_palette()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "plt.rcParams['figure.figsize'] = 10., 7.5\n", + "sns.set(font_scale=1.5)\n", + "sns.set_style('whitegrid', {'axes.spines.top': False,\n", + " 'axes.spines.bottom': False,\n", + " 'axes.spines.left': False,\n", + " 'axes.spines.right': False})" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = make_plr_CCDDHNR2018(alpha=0.5, n_obs=1000, dim_x=50, return_type=\"DataFrame\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
X1X2X3X4X5X6X7X8X9X10...X43X44X45X46X47X48X49X50yd
01.6572220.9467160.3779601.2325670.548446-0.601472-0.639983-0.888613-0.1098920.865485...1.6623510.0568520.345201-0.933119-0.864177-1.4558190.2774210.4325553.8207682.871799
1-0.1403730.3181781.326577-0.038081-0.0815260.5250320.1739630.9889392.0520821.225609...2.3662731.6606310.1691730.1153050.0050490.129702-0.2571080.7174112.782493-0.683040
2-1.230496-1.1479150.0573840.8222330.3169330.321593-0.138514-0.9990750.231421-0.651108...-1.443120-0.648600-1.081062-0.834230-1.232478-0.582722-0.313851-1.4241370.643945-0.527346
3-0.0332240.8265160.348916-0.558627-1.092446-0.445529-0.404820-0.860091-1.155255-2.058850...-0.282183-1.089843-0.759434-1.019423-1.391079-1.443890-0.215652-0.836138-0.0030380.383504
4-1.542770-1.374956-0.221876-0.104524-0.618885-0.505555-0.7648990.402509-0.308056-0.364675...-0.185257-0.9118340.7071090.5379420.4875480.7400120.3611880.309118-2.316022-2.028819
\n", + "

5 rows × 52 columns

\n", + "
" + ], + "text/plain": [ + " X1 X2 X3 X4 X5 X6 X7 \\\n", + "0 1.657222 0.946716 0.377960 1.232567 0.548446 -0.601472 -0.639983 \n", + "1 -0.140373 0.318178 1.326577 -0.038081 -0.081526 0.525032 0.173963 \n", + "2 -1.230496 -1.147915 0.057384 0.822233 0.316933 0.321593 -0.138514 \n", + "3 -0.033224 0.826516 0.348916 -0.558627 -1.092446 -0.445529 -0.404820 \n", + "4 -1.542770 -1.374956 -0.221876 -0.104524 -0.618885 -0.505555 -0.764899 \n", + "\n", + " X8 X9 X10 ... X43 X44 X45 X46 \\\n", + "0 -0.888613 -0.109892 0.865485 ... 1.662351 0.056852 0.345201 -0.933119 \n", + "1 0.988939 2.052082 1.225609 ... 2.366273 1.660631 0.169173 0.115305 \n", + "2 -0.999075 0.231421 -0.651108 ... -1.443120 -0.648600 -1.081062 -0.834230 \n", + "3 -0.860091 -1.155255 -2.058850 ... -0.282183 -1.089843 -0.759434 -1.019423 \n", + "4 0.402509 -0.308056 -0.364675 ... -0.185257 -0.911834 0.707109 0.537942 \n", + "\n", + " X47 X48 X49 X50 y d \n", + "0 -0.864177 -1.455819 0.277421 0.432555 3.820768 2.871799 \n", + "1 0.005049 0.129702 -0.257108 0.717411 2.782493 -0.683040 \n", + "2 -1.232478 -0.582722 -0.313851 -1.424137 0.643945 -0.527346 \n", + "3 -1.391079 -1.443890 -0.215652 -0.836138 -0.003038 0.383504 \n", + "4 0.487548 0.740012 0.361188 0.309118 -2.316022 -2.028819 \n", + "\n", + "[5 rows x 52 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "data_flaml, data_dml = train_test_split(data, test_size=0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hyperparameter Tuning using FLAML\n", + "\n", + "We will be training two [`XGBRegressor`](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.XGBRegressor) models: first one for estimatating the nuisance function $ l_{\\theta}(X) = E[Y|X] $, and the second one to estimate the nuisance function $ m_{\\theta}(X) = E[D|X] $. We will be doing so by minimizing the mean squared error between the true values and the predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[flaml.automl: 07-08 11:24:41] {2322} WARNING - Time taken to find the best model is 83% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget.\n" + ] + } + ], + "source": [ + "automl_l = AutoML()\n", + "settings = {\n", + " \"time_budget\": 120, # total running time in seconds\n", + " \"metric\": 'mse', # primary metrics for regression can be chosen from: ['mae','mse','r2','rmse','mape']\n", + " \"estimator_list\": ['xgboost'], # list of ML learners; we tune xgboost in this example\n", + " \"task\": 'regression', # task type \n", + "}\n", + "\n", + "automl_l.fit(X_train=data_flaml.drop(columns = [\"y\", \"d\"]).values, y_train=data_flaml[\"y\"].values, verbose=2, **settings)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best hyperparmeter config: {'n_estimators': 9, 'max_leaves': 8, 'min_child_weight': 45.63982015489896, 'learning_rate': 0.8271174453352466, 'subsample': 0.8887851542660552, 'colsample_bylevel': 0.8861407627871792, 'colsample_bytree': 0.6360227175852697, 'reg_alpha': 0.24333444176621818, 'reg_lambda': 0.149045122688325}\n", + "Best mse on validation data: 1.37\n", + "Training duration of best run: 0.01917 s\n" + ] + } + ], + "source": [ + "# retrieve best config\n", + "print('Best hyperparmeter config:', automl_l.best_config)\n", + "print('Best mse on validation data: {0:.4g}'.format(automl_l.best_loss))\n", + "print('Training duration of best run: {0:.4g} s'.format(automl_l.best_config_train_time))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "XGBRegressor(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=0.8861407627871792, colsample_bynode=1,\n", + " colsample_bytree=0.6360227175852697, gamma=0, gpu_id=-1,\n", + " grow_policy='lossguide', importance_type='gain',\n", + " interaction_constraints='', learning_rate=0.8271174453352466,\n", + " max_delta_step=0, max_depth=0, max_leaves=8,\n", + " min_child_weight=45.63982015489896, missing=nan,\n", + " monotone_constraints='()', n_estimators=1, n_jobs=-1,\n", + " num_parallel_tree=1, random_state=0, reg_alpha=0.24333444176621818,\n", + " reg_lambda=0.149045122688325, scale_pos_weight=1,\n", + " subsample=0.8887851542660552, tree_method='hist',\n", + " use_label_encoder=False, validate_parameters=1, verbosity=0)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "automl_l.model.estimator" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "automl_m = AutoML()\n", + "settings = {\n", + " \"time_budget\": 120, # total running time in seconds\n", + " \"metric\": 'mse', # primary metrics for regression can be chosen from: ['mae','mse','r2','rmse','mape']\n", + " \"estimator_list\": ['xgboost'], # list of ML learners; we tune xgboost in this example\n", + " \"task\": 'regression', # task type \n", + "}\n", + "\n", + "automl_m.fit(X_train=data_flaml.drop(columns = [\"y\", \"d\"]).values, y_train=data_flaml[\"d\"].values, verbose=2, **settings)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best hyperparmeter config: {'n_estimators': 23, 'max_leaves': 9, 'min_child_weight': 42.84308837737722, 'learning_rate': 1.0, 'subsample': 0.9908960911521747, 'colsample_bylevel': 0.7908024341286631, 'colsample_bytree': 0.7922331300866388, 'reg_alpha': 0.02047249913685125, 'reg_lambda': 0.5100784572580507}\n", + "Best mse on validation data: 1.173\n", + "Training duration of best run: 0.01911 s\n" + ] + } + ], + "source": [ + "# retrieve best config\n", + "print('Best hyperparmeter config:', automl_m.best_config)\n", + "print('Best mse on validation data: {0:.4g}'.format(automl_m.best_loss))\n", + "print('Training duration of best run: {0:.4g} s'.format(automl_m.best_config_train_time))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "XGBRegressor(base_score=0.5, booster='gbtree',\n", + " colsample_bylevel=0.7908024341286631, colsample_bynode=1,\n", + " colsample_bytree=0.7922331300866388, gamma=0, gpu_id=-1,\n", + " grow_policy='lossguide', importance_type='gain',\n", + " interaction_constraints='', learning_rate=1.0, max_delta_step=0,\n", + " max_depth=0, max_leaves=9, min_child_weight=42.84308837737722,\n", + " missing=nan, monotone_constraints='()', n_estimators=1, n_jobs=-1,\n", + " num_parallel_tree=1, random_state=0, reg_alpha=0.02047249913685125,\n", + " reg_lambda=0.5100784572580507, scale_pos_weight=1,\n", + " subsample=0.9908960911521747, tree_method='hist',\n", + " use_label_encoder=False, validate_parameters=1, verbosity=0)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "automl_m.model.estimator" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overfit Check\n", + "Before continuing with the DML experiments, we make sure that the estimators trained by FLAML are not overfitted to the data they're trained. For this, we compare the in-sample (MSE for FLAML data) and out-of-sample (MSE for DML data) and verify if they vary significantly." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Check for Overfitting: Compare in-sample (train), out-of-sample (test) MSE\n", + "\n", + "# ml_l\n", + "pres_ins_ml_l = automl_l.model.estimator.predict(data_flaml.drop(columns = [\"y\", \"d\"]).values)\n", + "mse_ins_ml_l = np.mean((pres_ins_ml_l - data_flaml.y.values)**2)\n", + "pres_oos_ml_l = automl_l.model.estimator.predict(data_dml.drop(columns = [\"y\", \"d\"]).values)\n", + "mse_oos_ml_l = np.mean((pres_oos_ml_l - data_dml.y.values)**2)\n", + "\n", + "# ml_m\n", + "pres_ins_ml_m = automl_m.model.estimator.predict(data_flaml.drop(columns = [\"y\", \"d\"]).values)\n", + "mse_ins_ml_m = np.mean((pres_ins_ml_m - data_flaml.d.values)**2)\n", + "pres_oos_ml_m = automl_m.model.estimator.predict(data_dml.drop(columns = [\"y\", \"d\"]).values)\n", + "mse_oos_ml_m = np.mean((pres_oos_ml_m - data_dml.d.values)**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ins mse, ml_l: 1.2759536289191706\n", + "oos mse, ml_l: 1.3618780092147345\n", + "ins mse, ml_m: 0.9963568938504447\n", + "oos mse, ml_m: 1.0363425121122045\n" + ] + } + ], + "source": [ + "print(\"ins mse, ml_l:\", mse_ins_ml_l)\n", + "print(\"oos mse, ml_l:\", mse_oos_ml_l)\n", + "\n", + "print(\"ins mse, ml_m:\", mse_ins_ml_m)\n", + "print(\"oos mse, ml_m:\", mse_oos_ml_m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can observe, the MSE on training data is a little lower than validation data (DML data). However, this is not very significant and we can use these estimators for DML." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Double / Debiased Machine Learning\n", + "\n", + "Now that we have our tuned XGB Learners, we can train our Double Machine Learning model." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================== DoubleMLData Object ==================\n", + "\n", + "------------------ Data summary ------------------\n", + "Outcome variable: y\n", + "Treatment variable(s): ['d']\n", + "Covariates: ['X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12', 'X13', 'X14', 'X15', 'X16', 'X17', 'X18', 'X19', 'X20', 'X21', 'X22', 'X23', 'X24', 'X25', 'X26', 'X27', 'X28', 'X29', 'X30', 'X31', 'X32', 'X33', 'X34', 'X35', 'X36', 'X37', 'X38', 'X39', 'X40', 'X41', 'X42', 'X43', 'X44', 'X45', 'X46', 'X47', 'X48', 'X49', 'X50']\n", + "Instrument variable(s): None\n", + "No. Observations: 500\n", + "\n", + "------------------ DataFrame info ------------------\n", + "\n", + "Int64Index: 500 entries, 261 to 256\n", + "Columns: 52 entries, X1 to d\n", + "dtypes: float64(52)\n", + "memory usage: 207.0 KB\n", + "\n" + ] + } + ], + "source": [ + "obj_dml_data = dml.DoubleMLData(data_dml, \"y\", \"d\")\n", + "print(obj_dml_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def print_scores(dml_plr_obj, return_scores=False):\n", + " # export data, fitted coefficient and predictions of the DoubleML model\n", + " y = dml_plr_obj._dml_data.y\n", + " d = dml_plr_obj._dml_data.d\n", + "\n", + " y_preds_ml_l = dml_plr_obj.predictions['ml_l'][:, 0, 0]\n", + " y_preds_ml_m = dml_plr_obj.predictions['ml_m'][:, 0, 0]\n", + "\n", + " if return_scores:\n", + " return mean_squared_error(y, y_preds_ml_l), mean_squared_error(y, y_preds_ml_m)\n", + "\n", + " print(f\"The mean squared error for l_of_X: {mean_squared_error(y, y_preds_ml_l):.3f}\")\n", + " print(f\"The mean squared error for m_of_X: {mean_squared_error(y, y_preds_ml_m):.3f}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tuned Learner" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coefstd errtP>|t|2.5 %97.5 %
d0.4777970.0504829.4646612.945135e-210.3788540.576741
\n", + "
" + ], + "text/plain": [ + " coef std err t P>|t| 2.5 % 97.5 %\n", + "d 0.477797 0.050482 9.464661 2.945135e-21 0.378854 0.576741" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dml_plr_obj_tuned = dml.DoubleMLPLR(obj_dml_data, automl_l.model.estimator, automl_m.model.estimator)\n", + "automl_tuned_summary = dml_plr_obj_tuned.fit(store_predictions = True).summary\n", + "automl_tuned_summary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can observe the coefficient i.e. the treatment effect calculated by our model is very close to the actual treatment effect of $ 0.5 $ and the standard error is also very low. Now will also evaluate the learners themselves by calculating their mean squared error." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The mean squared error for l_of_X: 1.368\n", + "The mean squared error for m_of_X: 1.665\n" + ] + } + ], + "source": [ + "print_scores(dml_plr_obj_tuned)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Untuned XGB Learners\n", + "\n", + "Now we compare these metrics with DoubleML model that uses untuned XGB learners" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coefstd errtP>|t|2.5 %97.5 %
d0.4196970.0483358.6830283.853698e-180.3249620.514433
\n", + "
" + ], + "text/plain": [ + " coef std err t P>|t| 2.5 % 97.5 %\n", + "d 0.419697 0.048335 8.683028 3.853698e-18 0.324962 0.514433" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ml_l = ml_m = xgb.XGBRegressor()\n", + "\n", + "dml_plr_obj_untuned = dml.DoubleMLPLR(obj_dml_data, ml_l, ml_m)\n", + "untuned_summary = dml_plr_obj_untuned.fit(store_predictions = True).summary\n", + "untuned_summary" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The mean squared error for l_of_X: 1.544\n", + "The mean squared error for m_of_X: 1.806\n" + ] + } + ], + "source": [ + "print_scores(dml_plr_obj_untuned)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can observe, the estimated coefficient is not as close to the true treatment effect compared to the tuned case. We also calculated the mean squared error of the learners themselves and found them to be higher than their tuned counterparts. This further proves our hypothesis.\n", + "\n", + "Now, we'll run some more experiments to validate if the FLAML approach is indeed superior" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dummy Learner" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coefstd errtP>|t|2.5 %97.5 %
d0.7233190.03372721.4465384.919298e-1020.6572160.789422
\n", + "
" + ], + "text/plain": [ + " coef std err t P>|t| 2.5 % 97.5 %\n", + "d 0.723319 0.033727 21.446538 4.919298e-102 0.657216 0.789422" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ml_l = ml_m = DummyRegressor()\n", + "\n", + "dml_plr_obj_dummy = dml.DoubleMLPLR(obj_dml_data, ml_l, ml_m)\n", + "dummy_summary = dml_plr_obj_dummy.fit(store_predictions = True).summary\n", + "dummy_summary" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The mean squared error for l_of_X: 2.036\n", + "The mean squared error for m_of_X: 2.335\n" + ] + } + ], + "source": [ + "print_scores(dml_plr_obj_dummy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### AutoML Untuned Learner" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best hyperparmeter config: {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.09999999999999995, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}\n", + "Best mse on validation data: 2.105\n", + "Training duration of best run: 0.03583 s\n" + ] + } + ], + "source": [ + "automl_untuned_l = AutoML()\n", + "settings = {\n", + " \"time_budget\": 0.01, # total running time in seconds\n", + " \"metric\": 'mse', # primary metrics for regression can be chosen from: ['mae','mse','r2','rmse','mape']\n", + " \"estimator_list\": ['xgboost'], # list of ML learners; we tune xgboost in this example\n", + " \"task\": 'regression', # task type \n", + "}\n", + "\n", + "automl_untuned_l.fit(X_train=data_flaml.drop(columns = [\"y\", \"d\"]).values, y_train=data_flaml[\"y\"].values, verbose=0, **settings)\n", + "\n", + "# retrieve best config\n", + "print('Best hyperparmeter config:', automl_untuned_l.best_config)\n", + "print('Best mse on validation data: {0:.4g}'.format(automl_untuned_l.best_loss))\n", + "print('Training duration of best run: {0:.4g} s'.format(automl_untuned_l.best_config_train_time))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best hyperparmeter config: {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.09999999999999995, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}\n", + "Best mse on validation data: 2.039\n", + "Training duration of best run: 0.02979 s\n" + ] + } + ], + "source": [ + "automl_untuned_m = AutoML()\n", + "settings = {\n", + " \"time_budget\": 0.01, # total running time in seconds\n", + " \"metric\": 'mse', # primary metrics for regression can be chosen from: ['mae','mse','r2','rmse','mape']\n", + " \"estimator_list\": ['xgboost'], # list of ML learners; we tune xgboost in this example\n", + " \"task\": 'regression', # task type \n", + "}\n", + "\n", + "automl_untuned_m.fit(X_train=data_flaml.drop(columns = [\"y\", \"d\"]).values, y_train=data_flaml[\"d\"].values, verbose=0, **settings)\n", + "\n", + "# retrieve best config\n", + "print('Best hyperparmeter config:', automl_untuned_m.best_config)\n", + "print('Best mse on validation data: {0:.4g}'.format(automl_untuned_m.best_loss))\n", + "print('Training duration of best run: {0:.4g} s'.format(automl_untuned_m.best_config_train_time))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coefstd errtP>|t|2.5 %97.5 %
d0.6169570.0344117.9296226.924914e-720.5495150.684399
\n", + "
" + ], + "text/plain": [ + " coef std err t P>|t| 2.5 % 97.5 %\n", + "d 0.616957 0.03441 17.929622 6.924914e-72 0.549515 0.684399" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dml_plr_obj_untuned_automl = dml.DoubleMLPLR(obj_dml_data, automl_untuned_l.model.estimator, automl_untuned_m.model.estimator)\n", + "untuned_automl_summary = dml_plr_obj_untuned_automl.fit(store_predictions = True).summary\n", + "untuned_automl_summary" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The mean squared error for l_of_X: 1.894\n", + "The mean squared error for m_of_X: 1.892\n" + ] + } + ], + "source": [ + "print_scores(dml_plr_obj_untuned_automl)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Results and Conclusion" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coefstd errtP>|t|2.5 %97.5 %
automl_tuned0.4777970.0504829.4646612.945135e-210.3788540.576741
untuned0.4196970.0483358.6830283.853698e-180.3249620.514433
dummy0.7233190.03372721.4465384.919298e-1020.6572160.789422
untuned_automl0.6169570.03441017.9296226.924914e-720.5495150.684399
\n", + "
" + ], + "text/plain": [ + " coef std err t P>|t| 2.5 % \\\n", + "automl_tuned 0.477797 0.050482 9.464661 2.945135e-21 0.378854 \n", + "untuned 0.419697 0.048335 8.683028 3.853698e-18 0.324962 \n", + "dummy 0.723319 0.033727 21.446538 4.919298e-102 0.657216 \n", + "untuned_automl 0.616957 0.034410 17.929622 6.924914e-72 0.549515 \n", + "\n", + " 97.5 % \n", + "automl_tuned 0.576741 \n", + "untuned 0.514433 \n", + "dummy 0.789422 \n", + "untuned_automl 0.684399 " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "summary = pd.concat((automl_tuned_summary, untuned_summary, dummy_summary, untuned_automl_summary))\n", + "summary.index = ('automl_tuned', 'untuned', 'dummy', 'untuned_automl')\n", + "summary" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "summary.to_pickle(\"summary_simulated_data_split.pkl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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HD7btGmTlnWIiIiIyDNAy2uKiIiIiM081fKaANeuXePAgQPcunXroeU1AVq3bp0adYmIiIhIFpTi8Gk2m/n444+ZP38+ZrP5sccpfIqIiIjI46Q4fE6fPp05c+bQqlUrateuzeDBgxk0aBA5c+bk559/xsXFhQEDBqRlrSIiIiKSyaW4z2doaCh16tThyy+/pF69esD9uT87derEwoULuXnzJgcPHkyzQkVEREQk80tx+IyIiDBCp53d/ZclJCQA4OzsTNu2bZk3b14alCgiIiIiWUWKw2f27NlxcLj/lN7Z2RmTycT169eN/QUKFODy5cupX6GIiIiIZBkpDp9FixYlIiICgGzZslGiRAk2bNhg7N+8eTP58uVL/QpFREREJMtI8YCjgIAAVq5cyeDBgwF44YUXmDBhAleuXAFg586d9OjRI22qFBEREZEsIcXhs0ePHtSuXZu4uDgcHR158803uXHjBn/88Qd2dna89NJLvPvuu2lZq4iIiIhkcikOnwULFqRgwYLGz/b29gwfPpzhw4enSWEiIiIikvVoeU0RERERsRmFTxERERGxGYVPEREREbEZhU8RERERsRmFTxERERGxGYVPEREREbGZ/xw+b9y4wZkzZ1KhFBERERHJ6lIcPkNDQxkxYkSSbV9//TW1a9emWbNmdOzYkZiYmFQvUERERESyjhSHz9mzZ5OQkGD8vH//fr777juqVatG+/bt2b9/Pz/99FNa1CgiIiIiWUSKVzg6d+4cTZs2NX4OCwsjT548TJ8+HUdHR0wmE8uWLaN3795pUqiIiIhIRvb5O3UIDw9P7zIyvBS3fEZHR+Pi4mL8vGXLFmrVqoWjoyMAvr6+XLx4MfUrFBEREZEsI8Xhs0CBApw9exa4P8joyJEjVKtWzdh/+/Zt7O3tU79CEREREckyUvzYvUaNGsycOZM8efKwbds2TCYTgYGBxv7Tp09TqFChNClSRERERLKGFIfPvn37snv3br766isA3n77bYoXLw5AQkICK1asoHHjxmlTpYiIiIhkCSkOn4ULF+bPP//kxIkTuLi4ULRoUWPf3bt3+eSTT/Dx8UmTIkVEREQka3iqeT4vXbqEt7d3kuAJkCtXLsqVK8eOHTtSvUARERERyTpSHD6HDh3K7t27H7t/3759DB06NFWKEhEREZGsKcXh02KxJLs/Pj4eOzst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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "errors = np.full((2, summary.shape[0]), np.nan)\n", + "errors[0, :] = summary['coef'] - summary['2.5 %']\n", + "errors[1, :] = summary['97.5 %'] - summary['coef']\n", + "plt.errorbar(summary.index, summary.coef, fmt='o', yerr=errors)\n", + "plt.axhline(0.5)\n", + "\n", + "plt.xlabel('ML method')\n", + "plt.ylabel('Coefficients and 95%-CI')\n", + "plt.xticks(rotation = 20)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The FLAML AutoML approach leads to the coefficient that is the closest to the actual coefficient with the least wide confidence interval." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
automl_tuneduntuneddummyautoml_untuned
MSE l_of_X1.3676881.5442242.0358791.893867
MSE m_of_X1.6647191.8064712.3354721.892149
\n", + "
" + ], + "text/plain": [ + " automl_tuned untuned dummy automl_untuned\n", + "MSE l_of_X 1.367688 1.544224 2.035879 1.893867\n", + "MSE m_of_X 1.664719 1.806471 2.335472 1.892149" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scores = {}\n", + "scores[\"automl_tuned\"] = print_scores(dml_plr_obj_tuned, True)\n", + "scores[\"untuned\"] = print_scores(dml_plr_obj_untuned, True)\n", + "scores[\"dummy\"] = print_scores(dml_plr_obj_dummy, True)\n", + "scores[\"automl_untuned\"] = print_scores(dml_plr_obj_untuned_automl, True)\n", + "scores = pd.DataFrame(scores, index = [\"MSE l_of_X\", \"MSE m_of_X\"])\n", + "scores" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "scores.to_pickle(\"scores_simulated_data_split.pkl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAJKCAYAAACcfmlJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABMMklEQVR4nO3de3xNV/7/8feRCEFuEndalxAVVIUk1f6kgmnHtIgyhgpaoy6JGmr0Ypia8XXpBZ0Q2ko7pZhOEYqObyUxpi0VUqat+21o+WoESdwiyPn90YczPT25nIjkrByv5+PRR5u91j77s2U5+929197bYrVarQIAAIBxqri6AAAAABSOoAYAAGAoghoAAIChCGoAAACGIqgBAAAYiqAGAABgKIIagLvC/v37NWzYMHXu3FkhISFKSEiokO1GR0crNja23LezadMm9e7dW+3bt1dISIh27NhR7tsEUP48XV0AgMpnx44dGjp0qCTpqaee0rRp0xz6nDt3TlFRUbp+/brCw8O1bNkyW9vNmze1fv16ffjhhzp58qRyc3MVEBCge++9V506ddKYMWPk5eUlSVqzZo1eeumlImu55557tHnz5mLrvXHjhsaNG6cbN25o/Pjx8vHxUUhIyO3supGOHz+u559/Xh06dNDUqVPl5eWlFi1aOLXu3Llz9dZbb2nmzJl68skn7dqsVqtiY2O1Z88erVmzRq1atSqP8gEUg6AG4LZVq1ZNGzZs0IsvvmgLVresW7dOVqtVnp6OXzPPP/+8/vGPf6hjx456+umn5efnp9OnT+vrr7/WW2+9pdjYWNWuXdtundjYWLVr187hs2rWrFlind99952+++47vfjiixoyZEgp99J86enpunHjhl5++WWFhoaWat34+Hht2bJFs2bNUpcuXdSgQQNb2/vvv6+dO3fq+eefJ6QBLkJQA3DbevbsqQ0bNiglJUW9evWya1uzZo26du2qL7/80m75t99+q3/84x/q2bOnFixY4PCZWVlZ8vHxcVjeqVMnPfbYY7dVZ1ZWliTJz8/vttYvitVq1ZUrV5wKi+Xp7Nmzkm5v/7y8vDR79mz9+te/1h/+8AclJSVJko4dO6Z58+bp/vvv14gRI+5ovQCcxxw1ALetTZs2at26tdasWWO3/Ouvv9bhw4cdLqVJ0okTJyRJkZGRhX5mUFCQqlatesdqjI2NtZ1Fe+mllxQSEqKQkBB9//33kqQrV67ojTfeUI8ePdS2bVs99NBDmjx5sk6dOmX3OTt27FBISIjWrFmj5cuXq1evXmrXrp3efffdO1brz+3cuVNPP/20wsLC1L59e8XExOijjz6y6/PT+Xbdu3dXSEiIoqOjS7Wd0NBQPfvss/r888/14Ycf6ubNm3rhhRdktVo1e/ZseXh43LF9AlA6nFEDUCb9+vXT7NmzdebMGdWvX1+StGrVKgUGBuqRRx5x6N+kSRNJP05+f+KJJ5w+C3T58mWdP3/eYXn16tVVo0aNItcbPXq0OnbsqMWLF2vgwIEKCwuTJNWuXVs3btzQiBEj9NVXX+nRRx/V008/rRMnTmjlypX64osvtHr1ats+3fL+++8rOztbAwYMUJ06dRza75S0tDTFx8crKChITz/9tGrVqqWNGzfqD3/4g77//ntNmDBBkvTqq69q8+bN2rx5s1566SUFBATc1hm+sWPHasuWLZozZ47279+vr7/+Wi+99JKaN29+p3cNQCkQ1ACUSe/evfXaa69p7dq1Gj16tPLy8vTJJ59owIABhc5Pa9++vbp166YtW7YoKipKDzzwgNq3b6/7779fDz74oLy9vQvdzssvv1zo8qJuZrjloYcekqenpxYvXqwOHTqoT58+tra///3v+uqrrzRixAhNnjzZtrxLly4aNWqU3njjDb322mt2n/d///d/+sc//qHAwMBi/1zK4ubNm/rzn/+sGjVq6KOPPlK9evUkSYMHD9bQoUP19ttvKyYmRk2bNlWfPn108uRJbd68WT169FDjxo1va5tVq1bV7Nmz1b9/f61cuVJhYWG2G0YAuA5BDUCZBAQEKDo6WsnJyRo9erQ+/fRTXbx4sdDLnrckJCToww8/1Lp165Senq5t27ZJ+vHGgPj4eD3zzDMO68TFxalTp04Oy8tyRmvz5s2qUqWKRo0aZbf8kUce0X333afU1FQVFBSoSpX/zhLp06dPuYY0Sdq7d69Onz6t4cOH20Ka9ON8st/+9reKi4tTamrqHZ87VqtWLVWtWlXXr19XVFSU3X4DcA2CGoAye/LJJ/Xss89q165dWr16tdq3b6/g4OAi+1etWlVDhgzRkCFDlJeXp2+//Vb/+te/tGzZMs2ZM0d169bV448/brdOq1at1KVLlzta9/fff6+6desWevk1ODhY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OztbjRs31tq1a5WRkaHExERbv9jYWKWnp+vgwYO2ZSNGjNDHH3+sZ599VnFxcfL09NSiRYvk6emp0aNH2/oFBARo1KhRSkxMlI+PjyIiIrRnzx4tWbJEQ4cOVYMGDe7wbgMAAJjPYrVarSV1unTpkubOnav//d//VW5uroKDgxUXF6cePXrY+hQW1CTpP//5j+bMmaMdO3bIarUqLCxML7zwgsPlTKvVqvfff18rVqzQ6dOnVbduXQ0cOFAjR450eDQIAADA3cCpoAYAAICKx6kqAAAAQxHUAAAADEVQAwAAMBRBDQAAwFAENQBAqezYscPVJQB3De76BACUSuvWrRUcHKzBgwerT58+qlmzpqtLAtwWQc2NDB061Om+FotF77//fjlWA8BdpaamasWKFdq2bZtq1Kihvn37avDgwWrRooWrS4MBOBbdWSW+mQCVx88z9/Hjx5WVlaWGDRuqTp06Onv2rE6fPq06deqoWbNmLqoSJnnppZec7muxWDRz5sxyrAaVRffu3dW9e3edOHFCK1euVHJyslasWKHOnTtryJAh6tGjBw8qv4txLLqzOKPmpv75z39q6tSpmjdvnjp16mRbvmvXLk2cOFF//vOfFRUV5cIKYYKfv0f34sWLunjxojw8PBQQEKALFy7o5s2b8vHxka+vr1JTU11UKUx27do1bdiwQcuWLdPBgwdtb5YZNGiQAgICXF0eXIhjUdkR1NxUTEyMBg8erAEDBji0ffjhh1q5cqXWrl1b8YXBWP/+978VHx+vSZMm6fHHH5eHh4du3ryp9evX64033tDChQvVvn17V5cJA33//ff629/+plWrVunixYvq0KGDvvnmG3l5eemNN97gQHwX41hUdlz6dFNHjx4t8mX2jRo10rFjxyq4Iphu9uzZGjFihPr06WNb5uHhob59++rChQuaOXOm/va3v7mwQphm69atWrFihT7//HP5+PhowIABGjx4sBo0aKDMzEz94Q9/0MyZMwlqdzGORWXHJAI3FRQUpM2bNxfa9umnnyooKKiCK4Lp9u3bp5CQkELbQkJCdODAgQquCKZ655131KNHD40aNUo//PCDpk+frq1bt+r555+3HZTr1q2r0aNH6+TJky6uFq7EsajsOKPmpn7zm99o7ty5unjxoh5//HEFBQUpKytL69ev16ZNmzRx4kRXlwjD+Pj46Msvv9SDDz7o0LZ9+3bVqlXLBVXBRPPnz1f37t01e/Zsu3lHP9e4cWPFxcVVYGUwDceismOOmhubP3++3nvvPeXn50v68U6catWq6ZlnntH48eNdXB1MM2fOHC1dulTPPPOMHn/8cdvdWevXr9d7772nYcOGafLkya4uEwY4c+aM6tev7+oyUElwLCobgpqby83N1e7du5WTkyN/f3916NBBvr6+ri4LBrp+/bpefvllrV+/XhaLxbbcarWqd+/emjlzpjw9OQkPoPQ4Ft0+ghoAO0ePHtWOHTtsX6jh4eE8yBQO0tLStGHDBp0+fVrXrl2za7NYLFqzZo2LKgPcC/977MaysrL03nvvaefOncrOztbChQvVsmVLLV++XPfff7/atm3r6hJhoBYtWhDMUKykpCS99tprql27tu655x7mL6JYHIvKhqDmpk6cOKFBgwbp6tWratOmjb777jvb/IBjx47p3//+t1599VUXVwnT5OXlac2aNbYv1D/+8Y9q2rSpPv30U4WEhOjee+91dYkwwPLly9W/f39Nnz5dHh4eri4HBuNYVHY8nsNNvfrqqwoMDNSnn36q999/3+6VHh07dtSePXtcVxyMlJWVpX79+unPf/6zdu/erS+//FKXL1+W9OPTxZOSklxcIUyRnZ2tX/3qV4Q0lIhjUdkR1NzUjh07NHbsWNWpU8duYrgk1alTR5mZmS6qDKZ67bXXdOXKFSUnJyslJcXuCzUiIkI7d+50YXUwSXh4uA4dOuTqMlAJcCwqO4Kam7px44Z8fHwKbbt06RL/JwwHW7du1e9+9zu1bt3a4Qu1Xr16+uGHH1xUGUwzZcoUffTRR9qwYYNyc3NdXQ4MxrGo7Jij5qaCg4P1z3/+Uw8//LBD27Zt29SmTRsXVAWTXblyRfXq1Su07dq1a+IGcdxSr1493X///fr9739faLvFYtG+ffsquCqYiGNR2RHU3NSQIUP08ssvy9vbW48//rgkKTMzU7t27dKHH36o119/3cUVwjT33nuv0tPTC30zwVdffcWdoLD505/+pNWrV9se3VK1alVXlwRDcSwqO56j5sb+8pe/6O2339bNmzdltVplsVjk4eGh0aNHKz4+3tXlwTB//etfNW/ePL300kvq1auXwsPD9fe//12ZmZl64YUX9MILL+jXv/61q8uEATp16qQRI0ZozJgx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rhYtWvAMz9tAUHMj165ds51atlgsunz5sgoKCuz6eHl56fHHHy/yrQUAANwpmzZt0vjx4zVmzBhXl1Jpcdenm4qOjlZiYqJat27t6lIAAHep8PBwvfnmm9z1WQbcTOCm0tLSCGkAAJfq1q2bvvzyS1eXUalx6dNNnT59usQ+DRs2rIBKAAB3q5iYGE2dOlXXr19XVFSU/Pz8HPpwUqF4XPp0U61bt5bFYim2z/79+yuoGgDA3einIeznxySr1SqLxcKxqAScUXNTM2fOdPhLceHCBaWlpenMmTNM7AQAlLtZs2a5uoRKjzNqd6HnnntOrVq14s5PAAAMx80Ed6F+/fpp1apVri4DAHAXOX78uHbv3q3jx4+7upRKhUufd6EbN27wKg8AQIX4+OOP9cYbbygzM9O2rF69epo8ebJ69erlwsoqB4LaXeT69es6ePCgEhISuMsGAFDuUlJSNHnyZLVp00ZPP/206tatq8zMTK1fv17PP/+8qlevrujoaFeXaTTmqLmp4u769PX1VVJSktq2bVvBVQEA7ib9+/dXnTp1tGjRIoe20aNH6/z58/r73//ugsoqD86ouam4uDiHoObl5aXGjRura9euDu8ABQDgTjt8+HCRN6795je/0fjx4yu4osqHoOamxo0b5+oSAAB3uapVq+rKlSuFtl25coWXtDuBuz4BAEC56NixoxITE3X+/Hm75efPn1diYqI6derkosoqD+aoubHz589r48aNOnbsmPLy8uzaLBaLZs6c6aLKAAB3g/3792vw4MGSpIceekhBQUHKysrSF198oSpVqmjFihUKCQlxcZVmI6i5qZMnT2rAgAHKz89XXl6eAgIClJOTo5s3b8rPz0+1atVSamqqq8sEALi5w4cPa+HChUpPT1dOTo78/f0VGRmpsWPHqkWLFq4uz3gENTf13HPPKTc3V4sXL1aHDh20evVqtWrVSqtWrVJiYqLeffddtWzZ0tVlAgCAYjBHzU19/fXXGjRokLy8vCT9+PLbqlWratCgQRo4cKBmz57t4goBAO5u6NChOnr0aKFtx48f19ChQyu4osqHoOamLly4oMDAQFWpUkXe3t66ePGirS0sLEy7d+92YXUAgLtBenq6Ll++XGjb5cuXtXPnzgquqPIhqLmpunXrKicnR5LUuHFj7dq1y9Z26NAhVa9e3VWlAQCg77//Xt7e3q4uw3g8R81NderUSbt371b37t3Vp08fzZ8/Xz/88IM8PT2VnJzM+9UAAOUiOTlZycnJtp9feeUVh4esX7t2TQcOHODxHE4gqLmpMWPG2F6AO2zYMJ06dUobN26UxWLRo48+qpdfftnFFQIA3NG1a9eUm5sr6cdHQV2+fFkFBQV2fby8vPT4448X+dYC/Bd3fQIAgHIRHR2txMREtW7d2tWlVFoENQAAAENx6RMAAJSL06dPl9inYcOGFVBJ5cUZNQAAUC5at24ti8VSbJ/9+/dXUDWVE2fUAABAuZg5c6ZDULtw4YLS0tJ05swZjRkzxkWVVR6cUQMAABXuueeeU6tWrbjzswQ88BYAAFS4fv36adWqVa4uw3gENQAAUOFu3Lhhe94aisYcNQAAUGGuX7+ugwcPKiEhgeerOYGgBgAAykVxd336+voqKSmpgiuqfAhqAACgXMTFxTkENS8vLzVu3Fhdu3Z1eAcoHHHXJwAAgKG4mQAAAMBQXPoEAADl5vz589q4caOOHTumvLw8uzaLxaKZM2e6qLLKgaAGAADKxcmTJzVgwADl5+crLy9PAQEBysnJ0c2bN+Xn58ccNSdw6RMAAJSL119/Xffdd5+2b98uq9Wqd955R3v27NEf//hHeXl5afHixa4u0XgENQAAUC6+/vprDRo0SF5eXpIkq9WqqlWratCgQRo4cKBmz57t4grNR1ADAADl4sKFCwoMDFSVKlXk7e2tixcv2trCwsK0e/duF1ZXORDUAABAuahbt65ycnIkSY0bN9auXbtsbYcOHVL16tVdVVqlwc0EAACgXHTq1Em7d+9W9+7d1adPH82fP18//PCDPD09lZycrF69erm6ROPxwFsAAFAuTp48qczMTHXq1EnXr1/XzJkztXHjRlksFkVFRWnq1Kny8fFxdZlGI6gBAAAYijlqAAAAhiKoAQAAGIqgBgAAYCiCGgAAgKH+P8JhWRLRNR1XAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "scores.iloc[0].plot(kind=\"bar\", title=\"MSE for l_of_X\");" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAJKCAYAAACLXPmAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA7PUlEQVR4nO3deVxVdeL/8feVxSUREdRyyY1AxdIEGZe+4jrN1yyXdExHbSZbXDDLyjTHmaH6otaoNbg0FW2mjSlgqTN+FSnnkbumU4miqbkxRoCASrjg/f0xP+83uigXxc+5B17Px8PHxDnn3vPGztzz7pzP+VyH0+l0CgAAAMZUszoAAABAVUMBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAC83r59+/Twww+rU6dOCg8PV0JCgtWRLHX8+HGNHz9enTt3Vnh4uKZOnWp1JADl5Gt1AABmbdu2TaNHj5Yk/eY3v9Ef/vAHt21ycnIUExOjixcvKjo6WosXL3atKy4u1qpVq7Rs2TIdO3ZMBQUFCgoKUrNmzRQVFaVx48bJ399fkpScnKxp06ZdNcvtt9+u9evXXzPvpUuXNHHiRF26dEmTJk1SQECAwsPDr+dXrzSmTZumjIwMjR07ViEhIbr99ts9el1GRoYefPBB3X333frggw/kcDhKrF++fLl+//vfa+zYsXr66advRnQA/x8FDKiiqlevrtWrV2vq1KmuwnTFJ598IqfTKV9f94+IZ555Rv/4xz/UsWNH/e53v1NgYKAyMzP11Vdf6a9//atGjRqlevXqlXjNqFGjdOedd7q91y233FJmzuPHj+v48eOaOnWqRo4cWc7fsvK5cOGCdu7cqZEjR2rMmDHlem14eLhiY2M1b948LV682FXEJSkzM1OzZs1SWFiYJkyYUNGxAfwMBQyoovr27avVq1crNTVV/fr1K7EuOTlZ3bt319atW0ss/+abb/SPf/xDffv21fz5893eMzs7WwEBAW7Lo6Ki9Ktf/eq6cmZnZ0uSAgMDr+v1V+N0OlVYWOhRCfQm2dnZcjqd1/338dhjjyk1NVVz585VTEyMmjVrJqfTqWnTpun8+fOaPXu2WyEHUPEYAwZUUW3btlXr1q2VnJxcYvlXX32lgwcP6sEHH3R7zdGjRyVJnTt3LvU9Q0JC5OfnV2EZR40a5brqNW3aNIWHhys8PFwnTpyQJBUWFmrOnDnq06eP2rVrp27dumnKlCk6efJkiffZtm2bwsPDlZycrCVLlqhfv36688479c4771xz/1fGV23ZskXDhg1T+/bt1b17d7355puSpPz8fL3wwgvq0qWL2rdvryeeeELff//9df2uubm5iouLU0xMjNq1a6eYmBjFxcXp9OnTrm2mTp2qnj17SpLmz5/v+vvYtm2bx/vx8fHR7NmzVVxcrKlTp+ry5cv68MMPtXXrVo0dO1Zt27a9rvwAyocrYEAVNnjwYM2aNUunTp3SrbfeKklasWKFgoOD1aNHD7ftmzZtKklau3at7r//fo+vwpw7d065ubluy2vUqKFatWpd9XVjx45Vx44d9cYbb2jYsGGKjIyUJNWrV0+XLl3SmDFj9OWXX+ree+/V7373Ox09elQfffSRNm3apKSkJNfvdMX777+vvLw8DR06VPXr13dbX5r09HR99tln+vWvf60BAwboH//4h+bMmaPq1atr5cqVaty4sWJjY3Xs2DEtXrxYzz//vN577z2P/l6uOHPmjIYPH66jR4/qwQcfVNu2bbVv3z599NFH2rp1q5YvX67atWtr2LBhat26tWbOnKm+ffuqb9++kqRWrVqVa3+tWrXSpEmT9Oqrr+p//ud/lJSUpIiICI0dO7Zc7wPgBjgBVClbt251hoWFOd9++21nbm6uMyIiwrlo0SKn0+l0/vjjj87IyEjnrFmznE6n09mhQwfnyJEjS7z+iSeecIaFhTnbt2/v/O1vf+ucO3euc8OGDc7CwkK3fSUlJTnDwsKu+icuLs7jvElJSSWWL1u2zBkWFuacPXt2ieWfffaZMywszPnss8+6vUenTp2c2dnZnv1FOZ3OsLAwZ3h4uHPPnj2uZefPn3d269bNGR4e7nzppZdKbB8fH+8MCwtzHjp0yON9OJ1O59y5c51hYWHODz/8sMTyDz/80BkWFuacN2+ea9nx48edYWFhzr/85S/l2sfPFRcXO4cNG+YMCwtzRkREODMyMm7o/QCUD1fAgCosKChIvXr1UkpKisaOHat169bpzJkzpd5+vCIhIUHLli3TJ598ou3bt2vz5s2S/jOgPjY2Vo888ojbayZMmKCoqCi35Z5cgbqa9evXq1q1anriiSdKLO/Ro4fatGmjDRs26PLly6pW7f9GWgwYMEDBwcHl2k+H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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "scores.iloc[1].plot(kind=\"bar\", title=\"MSE for m_of_X\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In all of our tests, we found out that the FLAML AutoML approach leads to the closest coefficient to the true one with the lowest MSE for $ l_{\\theta}(X) $ and $ m_{\\theta}(X) $. In conclusion, this approach can save a lot of time spent on hyperparameter tuning without compromising performance." + ] + } + ], + "metadata": { + "interpreter": { + "hash": "78ea0f640d7ba82461c68eabb12a1cf14510fff2c8bf1b2902d34c8551bd83b1" + }, + "kernelspec": { + "display_name": "Python 3.8.8 ('base')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}