From 1fd80995d5fa22d291319f84440853998a445961 Mon Sep 17 00:00:00 2001 From: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:48:06 +0100 Subject: [PATCH 1/6] Delete notebooks/AB testing.ipynb Signed-off-by: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> --- notebooks/AB testing.ipynb | 455 ------------------------------------- 1 file changed, 455 deletions(-) delete mode 100644 notebooks/AB testing.ipynb diff --git a/notebooks/AB testing.ipynb b/notebooks/AB testing.ipynb deleted file mode 100644 index 644c49aa..00000000 --- a/notebooks/AB testing.ipynb +++ /dev/null @@ -1,455 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# AB Testing with CausalTune" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "import os\n", - "import sys\n", - "import pandas as pd\n", - "import numpy as np\n", - "import warnings\n", - "\n", - "from sklearn.ensemble import RandomForestRegressor\n", - "from sklearn.metrics import mean_squared_error\n", - "\n", - "import gc\n", - "\n", - "root_path = root_path = os.path.realpath('../..')\n", - "try:\n", - " import causaltune\n", - "except ModuleNotFoundError:\n", - " sys.path.append(os.path.join(root_path, \"causaltune\"))\n", - "\n", - "from causaltune import CausalTune\n", - "from causaltune.data_utils import CausalityDataset\n", - "from causaltune.datasets import generate_synth_data_with_categories\n", - "\n", - "from flaml import AutoML\n", - "import matplotlib.pyplot as plt\n", - "%pip install seaborn as sns\n", - "import seaborn as sns\n", - "%matplotlib inline\n", - "\n", - "warnings.filterwarnings(\"ignore\")\n", - "\n", - "%pip install plotly\n", - "import plotly.io as pio\n", - "pio.renderers.default = \"png\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*Note*: This notebook uses the the package *wise-pizza* which is not listed as a requirement to run CausalTune. It is merely used to showcase what is possible as an AB testing workflow.\n", - "\n", - "Install via\n", - "`pip install wise-pizza`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install wise_pizza" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "import wise_pizza as wp" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CausalTune for AB Testing \n", - "\n", - "CausalTune can be used for AB Testing in two ways:\n", - "1. Variance Reduction\n", - "2. Segmentation analysis\n", - "\n", - "#### 1. Variance Reduction\n", - "A standard variance reduction technique is to control for natural variation in the experiment's outcome metric. The simplest way to do so is by running a simple regression with a selection of controls. A potentially more powerful and automated approach is to run CausalTune. \n", - "\n", - "#### 2. Segmentation Analysis\n", - "\n", - "We use the heterogeneous treatment effect estimates from CausalTune to feed them into the segmentation analytics tool Wise-Pizza." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Data Generating Process" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first create synthetic data from a DGP with perfect randomisation of the treatment as we are replicating an AB test environment" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is substantial variation within the outcome metric per variant which can be seen from the cdf per variant:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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gsdt4QZg7NixzJo1iy+//JL9+/czZswYIiMjbe+tmTBhAv369bONHzZsGMePH2fs2LHs37+fL7/8ktmzZ/Pcc8+5axdEREQkj3HrPTe9e/fm3LlzTJo0iaioKBo2bMjSpUupVq0aAFFRUURGRtrGBwcHs3TpUsaMGcOnn35KxYoV+fjjj/PNO26ywt/fn9deey3NpTRPV1D3GwruvhfU/YaCu+8Fdb+h4O67u/bbre+5EREREcltbr0sJSIiIpLbFG5ERETEoyjciIiIiEdRuBERERGPonDjYtOnTyc4OJiAgABCQkJYt25dpuPXrFlDSEgIAQEB3HLLLXz22WcuqjT3ZWffV69ejclkSvNx4MABF1Z889auXUvPnj2pWLEiJpOJJUuW/Oc2nnLMs7vvnnLMp0yZQosWLShWrBjlypWjV69eHDx48D+3y+/HPSf77SnHfMaMGTRq1Mj2orrQ0FB+//33TLfJ78cbsr/frjzeCjcuNH/+fEaPHs1LL71EeHg47du3p3v37g6Pu18vIiKCHj160L59e8LDw3nxxRcZNWoUP/74o4srv3nZ3fdrDh48SFRUlO2jVq1aLqo4d1y+fJnGjRszbdq0LI33pGOe3X2/Jr8f8zVr1jBixAg2b95MWFgYqampdO3alcuXL2e4jScc95zs9zX5/ZhXrlyZt956i61bt7J161Y6duzIvffey969e9Md7wnHG7K/39e45Hgb4jItW7Y0hg0b5tBXt25dY/z48emOf/755426des69D355JNG69atnVajs2R331etWmUAxoULF1xQnWsAxuLFizMd40nH/HpZ2XdPPOaGYRjR0dEGYKxZsybDMZ543LOy3556zA3DMEqWLGnMmjUr3XWeeLyvyWy/XXm8debGRZKTk9m2bRtdu3Z16O/atSsbN25Md5tNmzalGd+tWze2bt1KSkqK02rNbTnZ92uaNm1KhQoV6NSpE6tWrXJmmXmCpxzzm+Fpxzw2NhaAUqVKZTjGE497Vvb7Gk865mazme+//57Lly8TGhqa7hhPPN5Z2e9rXHG8FW5cJCYmBrPZnGZS0KCgoDSTgV5z5syZdMenpqYSExPjtFpzW072vUKFCnz++ef8+OOPLFq0iDp16tCpUyfWrl3ripLdxlOOeU544jE3DIOxY8fSrl07GjZsmOE4TzvuWd1vTzrmu3fvpmjRovj7+zNs2DAWL15M/fr10x3rScc7O/vtyuPt1ukXCiKTyeSwbBhGmr7/Gp9ef36QnX2vU6cOderUsS2HhoZy4sQJ3nvvPW677Tan1ulunnTMs8MTj/nIkSPZtWsX69ev/8+xnnTcs7rfnnTM69Spw44dO7h48SI//vgj/fv3Z82aNRn+oveU452d/Xbl8daZGxcpU6YM3t7eac5UREdHp0nw15QvXz7d8T4+PpQuXdpptea2nOx7elq3bs0///yT2+XlKZ5yzHNLfj7mTz/9ND///DOrVq2icuXKmY71pOOenf1OT3495n5+ftSsWZPmzZszZcoUGjduzEcffZTuWE863tnZ7/Q463gr3LiIn58fISEhhIWFOfSHhYXRpk2bdLcJDQ1NM37FihU0b94cX19fp9Wa23Ky7+kJDw+nQoUKuV1enuIpxzy35MdjbhgGI0eOZNGiRfz5558EBwf/5zaecNxzst/pyY/HPD2GYZCUlJTuOk843hnJbL/T47Tj7fRblsXm+++/N3x9fY3Zs2cb+/btM0aPHm0UKVLEOHbsmGEYhjF+/Hijb9++tvFHjx41ChcubIwZM8bYt2+fMXv2bMPX19f44Ycf3LULOZbdff/ggw+MxYsXG4cOHTL27NljjB8/3gCMH3/80V27kCPx8fFGeHi4ER4ebgDG1KlTjfDwcOP48eOGYXj2Mc/uvnvKMX/qqaeMwMBAY/Xq1UZUVJTtIyEhwTbGE497TvbbU475hAkTjLVr1xoRERHGrl27jBdffNHw8vIyVqxYYRiGZx5vw8j+frvyeCvcuNinn35qVKtWzfDz8zOaNWvm8Jhk//79jdtvv91h/OrVq42mTZsafn5+RvXq1Y0ZM2a4uOLck519f/vtt40aNWoYAQEBRsmSJY127doZv/32mxuqvjnXHn288aN///6GYXj2Mc/uvnvKMU9vnwFjzpw5tjGeeNxzst+ecswHDhxo+9lWtmxZo1OnTrZf8IbhmcfbMLK/36483ibDuHoXk4iIiIgH0D03IiIi4lEUbkRERMSjKNyIiIiIR1G4EREREY+icCMiIiIeReFGREREPIrCjYiIiHgUhRsRERHxKAo3IpKvGYZB586d6datW5p106dPJzAwkMjISDdUJiLuonAjIvmayWRizpw5bNmyhZkzZ9r6IyIieOGFF/joo4+oWrWqGysUEVfT9Asi4hG++uorRo4cya5du6hevTqdOnWiePHiLFmyxN2liYiLKdyIiMfo1asXFy9e5IEHHuCNN95gz549lCtXzt1liYiLKdyIiMeIjo6mYcOGnDt3jh9++IH77rvP3SWJiBvonhsR8RjlypVj6NCh1KtXT8FGpABTuBERj+Lj44OPj4+7yxARN1K4EREREY+icCMiIiIeReFGREREPIqelhIRERGPojM3IiIi4lEUbkRERMSjKNyIiIiIR1G4EREREY+icCMiIiIeReFGREREPIrCjYiIiHgUhRsRERHxKAo3IiIi4lEUbkRERMSjKNyIiIiIR1G4EREREY/y/2aSHQ1HdScEAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "TRUE_EFFECT = 0.1\n", - "cd = generate_synth_data_with_categories(n_samples=8000, n_x=3, true_effect=TRUE_EFFECT)\n", - "cd.preprocess_dataset()\n", - "sns.ecdfplot(data=cd.data, x=cd.outcomes[0], hue=cd.treatment)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1. ATE estimation: Running CausalTune\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# CausalTune configuration\n", - "num_samples = 5\n", - "components_time_budget = 10\n", - "train_size = 0.7\n", - "\n", - "target = cd.outcomes[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ct_ab = CausalTune(\n", - " num_samples=num_samples,\n", - " components_time_budget=components_time_budget,\n", - " metric=\"energy_distance\",\n", - " verbose=3,\n", - " components_verbose=3,\n", - " train_size=train_size,\n", - ") \n", - "ct_ab.fit(data=cd, outcome=target)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The point estimates compare as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 178, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Difference in means estimate (naive ATE): 0.085830\n", - "CausalTune ATE estimate:: 0.091231\n", - "True ATE: 0.1\n" - ] - } - ], - "source": [ - "print(f'Difference in means estimate (naive ATE): {ct_ab.scorer.naive_ate(ct_ab.test_df[cd.treatment], ct_ab.test_df[target])[0]:5f}')\n", - "print(f'CausalTune ATE estimate:: {ct_ab.effect(ct_ab.test_df).mean():5f}')\n", - "print(f'True ATE: {TRUE_EFFECT}')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Explainable variation\n", - "\n", - "As a first performance check of this approach we test how much of the variation in the outcome metric remains unexplained with our outcome model prediction approach. \n", - "\n", - "For this, we use AutoML to predict outcomes as is done under the hood of CausalTune.\n", - "The lower the unexplained variation, the more promising it is to use CausalTune for AB Testing." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "automl = AutoML()\n", - "automl.fit(ct_ab.train_df[ct_ab.train_df.columns.drop([target])], ct_ab.train_df[target], task='regression', time_budget=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 183, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Variation unexplained: 8.19%\n" - ] - } - ], - "source": [ - "# Fraction of variation unexplained\n", - "mse = mean_squared_error(automl.predict(ct_ab.test_df[ct_ab.test_df.columns.drop([target])]), ct_ab.test_df[target])\n", - "var_y = ct_ab.test_df[target].var()\n", - "fvu = mse / var_y\n", - "print(f'Variation unexplained: {100*fvu:.2f}%')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bootstrapping with simple component models for inference\n" - ] - }, - { - "cell_type": "code", - "execution_count": 165, - "metadata": {}, - "outputs": [], - "source": [ - "# bootstrap configuration\n", - "\n", - "n_samples = 30\n", - "n_sample_size = cd.data.shape[0]\n", - "\n", - "components_time_budget = 5\n", - "train_size = .7\n", - "num_samples= 10\n", - "\n", - "ct_ate = []\n", - "scores = []\n", - "naive_ate = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for _ in range(n_samples):\n", - " cd_bt = generate_synth_data_with_categories(n_samples=5000, n_x=3, true_effect=TRUE_EFFECT)\n", - " cd_bt.preprocess_dataset()\n", - " outcome_regressor = RandomForestRegressor()\n", - " \n", - " ct = CausalTune(\n", - " num_samples=num_samples,\n", - " components_time_budget=components_time_budget,\n", - " metric=\"energy_distance\",\n", - " train_size=train_size,\n", - " propensity_model='dummy',\n", - " outcome_model=outcome_regressor\n", - " ) \n", - "\n", - " ct.fit(data=cd, outcome=target)\n", - "\n", - " ct_ate.append(ct.effect(ct.test_df).mean())\n", - " scores.append(ct.best_score)\n", - " naive_ate.append(ct.scorer.naive_ate(cd_bt.data[cd_bt.treatment], cd_bt.data[target])[0])\n", - " del ct, cd_bt, outcome_regressor\n", - " gc.collect()" - ] - }, - { - "cell_type": "code", - "execution_count": 187, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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AQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABiPwAIAAIxHYAEAAMYjsAAAAOMRWAAAgPEILAAAwHihgW4AaK2urk5lZWXnrauvr1d5ebmSk5MVFRXVYW1KSoqio6P91SIAIAAILDBKWVmZrFarX8e02WzKyMjw65gAgIuLwAKjpKSkyGaznbfObrcrOztb69evl8ViOe+YAIDujcACo0RHR3u1G2KxWNg9AYAfAS66BQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4PgWWlStXasiQIYqMjJTVatX27ds91lZWVmratGkaPny4goODNXv27Hbr3nrrLaWmpioiIkKpqal65513fGkNAAD0QF4Hlk2bNmn27NnKzc1VcXGxsrKyNHHiRFVUVLRb39DQoEsvvVS5ubkaNWpUuzU7d+7U1KlTlZOTo927dysnJ0e33XabPv30U2/bAwAAPVCotycsX75c06dP14wZMyRJ+fn52rJli1atWqW8vLw29cnJyXr66aclSevWrWt3zPz8fN1www2aN2+eJGnevHnaunWr8vPz9dprr3nV3/ffSyEhbY+HhEiRke51ngQHS1FRvtXW1UlOZ/u1QUFSdLRvtfX1UlOT5z569fKt9tQpqbHRP7XR0c19S1JDg3T2rH9qo6Kav86SdPq0dOaMVF8fLCla9fXBbv8+7dV6Ehl57v+KN7VnzjTXexIRIYWGel979mzz18KT8HApLMz72sbG5n87T8LCmuu9rW1qav6/5o/a0NDmr4XUPCfq6vxT6828Z41ov9abNUKKaDMnW7uYa4TU/jrBGtG21oQ1olOcXmhoaHCGhIQ43377bbfjDz74oHP8+PHnPf/aa691PvTQQ22OJyYmOpcvX+52bPny5c7Bgwd7HOvUqVNOh8Phuh05csQpySk5nM1T3P02aZL7+dHRbWtabtde614bH++5NjPTvTYpyXNtaqp7bWqq59qkJPfazEzPtfHxP/w6e66NjnavnTTJc+0P/3dMmdJxbW3tudq77uq49vjxc7UPPNBx7eHD52offrjj2tLSc7ULF3Zc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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "\n", - "ax.boxplot([ct_ate, naive_ate])\n", - "ax.set_xticklabels(['$\\hat{\\mu}_{CausalTune}$', '$\\hat{\\mu}_{DiffInMeans}$'])\n", - "plt.axhline(y = TRUE_EFFECT, color = 'b', linestyle = '--')\n", - "plt.show()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2. Segmentation with Wise Pizza" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The underlying estimators of CausalTune provide heterogeneous treatment effect estimates. Apart from simply predicting treatment effects for customers with certain characteristics, one can also perform an automatic segmentation of customers by treatment impact via [wise-pizza](https://github.com/transferwise/wise-pizza/tree/main) as we demonstrate here.\n", - "\n", - "In the synthetic dataset at hand, there are heterogeneous treatment effects by category, e.g. $.5*$TRUE_EFFECT if $X_1=1$ or $-.5*$TRUE_EFFECT if $X_1=2$\n", - "\n", - "The plot below displays an automated selection of relevant segments by CATE." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "segments = list(set(cd.data.columns) - set([cd.treatment]) - set(cd.outcomes) - set(['random']) - set(['X_continuous']))\n", - "\n", - "df_effects = ct_ab.test_df[segments + [cd.treatment]]\n", - "df_effects['CATE'] = ct_ab.effect(ct_ab.test_df)\n", - "df_eff_by_seg = df_effects.groupby(by=segments, as_index=False).agg({'CATE':'sum', 'variant': len}).rename(columns={'variant': 'size'})" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAFUCAYAAAC5sarpAAAgAElEQVR4XuydCZxN5f/HP3fMwjB2si8RSrRQKlFRJEkUWaLILkSU9VcSEWUrlDXK3q5E2VJUFFJaJLLvjDFj9vt7fZ/p3O4sd+6555w7c+bez3m9/q/+P/M8zznn/Xyfc5/3eZbjcDqdTvAgARIgARIgARIgARIgARIgARMEHBQLE/SYlQRIgARIgARIgARIgARIQBGgWDAQSIAESIAESIAESIAESIAETBOgWJhGyAJIgARIgARIgARIgARIgAQoFowBEiABEiABEiABEiABEiAB0wQoFqYRsgASIAESIAESIAESIAESIAGKBWOABEiABEiABEiABEiABEjANAGKhWmELIAESIAESIAESIAESIAESIBiwRggARIgARIgARIgARIgARIwTYBiYRohCyABEiABEiABEiABEiABEqBYMAZIgARIgARIgARIgARIgARME6BYmEbIAkiABEiABEiABEiABEiABCgWjAESIAESIAESIAESIAESIAHTBCgWphGyABIgARIgARIgARIgARIgAYoFY4AESIAESIAESIAESIAESMA0AYqFaYQsgARIgARIgARIgARIgARIgGLBGCABEiABEiABEiABEiABEjBNgGJhGiELIAESIAESIAESIAESIAESoFgwBkiABEiABEiABEiABEiABEwToFiYRsgCSIAESIAESIAESIAESIAEKBaMARIgARIgARIgARIgARIgAdMEKBamEbIAEiABEiABEiABEiABEiABigVjgARIgARIgARIgARIgARIwDQBioVphCyABEiABEiABEiABEiABEiAYsEYIAESIAESIAESIAESIAESME2AYmEaIQsgARIgARIgARIgARIgARKgWDAGSIAESIAESIAESIAESIAETBOgWJhGyAJIgARIgARIgARIgARIgAQoFowBEiABEiABEiABEiABEiAB0wQoFqYRsgASIAESIAESIAESIAESIAGKBWOABEiABEiABEiABEiABEjANAGKhWmELIAESIAESIAESIAESIAESIBiwRggARIgARIgARIgARIgARIwTYBiYRohCyABEiABEiABEiABEiABEqBYMAZIgARIgARIgARIgARIgARME6BYmEbIAkiABEiABEiABEiABEiABCgWjAESIAESIAESIAESIAESIAHTBCgWphGyABIgARIgARIgARIgARIgAYoFY4AESIAESIAESIAESIAESMA0AYqFaYQsgARIgARIgARIgARIgARIgGLBGCABEiABEiABEiABEiABEjBNgGJhGiELIAESIAESIAESIAESIAESoFgwBkiABEiABEiABEiABEiABEwToFiYRsgCSIAESIAESIAESIAESIAEKBaMARIgARIgARIgARIgARIgAdMEKBamEbIAEiABEiABEiABEiABEiABigVjgARIgARIgARIgARIgARIwDQBioVphCyABEiABEiABEiABEiABEiAYsEYIAESIAESIAESIAESIAESME2AYmEaIQsgARIgARIgARIgARIgARKgWDAGSIAESIAESIAESIAESIAETBOgWJhGyAJIgARIgARIgARIgARIgAQoFowBEiABEiABEiABEiABEiAB0wQoFqYRsgASIAESIAESIAESIAESIAGKBWOABEiABEiABEiABEiABEjANAGKhWmELIAESIAESIAESIAESIAESIBiwRggARIgARIgARIgARIgARIwTYBiYRohCyABEiABEiABEiABEiABEqBYMAZIgARIgARIgARIgARIgARME6BYmEbIAkiABEiABEiABEiABEiABCgWjAESIAESIAESIAESIAESIAHTBCgWphGyABIgARIgARIgARIgARIgAYoFY4AESIAESIAESIAESIAESMA0AYqFaYQsgARIgARIgARIgARIgARIgGLBGCABEiABEiABEiABEiABEjBNgGJhGiELIAESIAESIAESIAESIAESoFgwBkiABEiABEiABEiABEiABEwToFiYRsgCSIAESIAESIAESIAESIAEKBaMARIgARIgARIgARIgARIgAdMEKBamEbIAEiABEiABEiABEiABEiABigVjgARIgARIgARIgARIgARIwDQBioVphCyABEiABEiABEiABEiABEiAYsEYIAESIAESIAESIAESIAESME2AYmEaIQsgARIgARIgARIgARIgARKgWDAGSIAESIAESIAESIAESIAETBOgWJhGyAJIgARIgARIgARIgARIgAQoFowBEiABEiABEiABEiABEiAB0wQoFqYRsgASIAESIAESIAESIAESIAGKBWOABEiABEiABEiABEiABEjANAGKhWmELIAE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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "max_depth = 3\n", - "min_segments = 3\n", - "\n", - "sf = wp.explain_levels(\n", - " df=df_eff_by_seg,\n", - " dims=segments,\n", - " total_name='CATE',\n", - " size_name='size',\n", - " max_depth=max_depth,\n", - " min_segments=min_segments,\n", - ")\n", - "sf.plot(plot_is_static=False)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "causality", - "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.9.16" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} From add72482ea74dd5bc71a3e1748e9211d42349a1b Mon Sep 17 00:00:00 2001 From: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:48:33 +0100 Subject: [PATCH 2/6] Add files via upload Signed-off-by: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> --- notebooks/AB testing.ipynb | 1288 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1288 insertions(+) create mode 100644 notebooks/AB testing.ipynb diff --git a/notebooks/AB testing.ipynb b/notebooks/AB testing.ipynb new file mode 100644 index 00000000..b9485371 --- /dev/null +++ b/notebooks/AB testing.ipynb @@ -0,0 +1,1288 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AB Testing with CausalTune" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: seaborn in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (0.13.2)\n", + "\u001b[31mERROR: Could not find a version that satisfies the requirement as (from versions: none)\u001b[0m\u001b[31m\n", + "\u001b[0m\u001b[31mERROR: No matching distribution found for as\u001b[0m\u001b[31m\n", + "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", + "Requirement already satisfied: plotly in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (5.24.0)\n", + "Requirement already satisfied: tenacity>=6.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from plotly) (8.5.0)\n", + "Requirement already satisfied: packaging in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from plotly) (23.2)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import pandas as pd\n", + "import numpy as np\n", + "import warnings\n", + "\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "import gc\n", + "\n", + "root_path = root_path = os.path.realpath('../..')\n", + "try:\n", + " import causaltune\n", + "except ModuleNotFoundError:\n", + " sys.path.append(os.path.join(root_path, \"causaltune\"))\n", + "\n", + "from causaltune import CausalTune\n", + "from causaltune.data_utils import CausalityDataset\n", + "from causaltune.datasets import generate_synth_data_with_categories\n", + "\n", + "from flaml import AutoML\n", + "import matplotlib.pyplot as plt\n", + "%pip install seaborn as sns\n", + "import seaborn as sns\n", + "%matplotlib inline\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "%pip install plotly\n", + "import plotly.io as pio\n", + "pio.renderers.default = \"png\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Note*: This notebook uses the the package *wise-pizza* which is not listed as a requirement to run CausalTune. It is merely used to showcase what is possible as an AB testing workflow.\n", + "\n", + "Install via\n", + "`pip install wise-pizza`" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: wise_pizza in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (0.2.7)\n", + "Requirement already satisfied: ipython in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (8.26.0)\n", + "Requirement already satisfied: kaleido in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (0.2.1)\n", + "Requirement already satisfied: numpy in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.23.5)\n", + "Requirement already satisfied: pandas in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.5.3)\n", + "Requirement already satisfied: pytest in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (8.3.2)\n", + "Requirement already satisfied: plotly in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (5.24.0)\n", + "Requirement already satisfied: scikit-learn in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.1.3)\n", + "Requirement already satisfied: scipy>=1.8.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.12.0)\n", + "Requirement already satisfied: tqdm in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (4.66.5)\n", + "Requirement already satisfied: cloudpickle in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (3.0.0)\n", + "Requirement already satisfied: pivottablejs in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (0.9.0)\n", + "Requirement already satisfied: streamlit==1.32.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.32.0)\n", + "Requirement already satisfied: altair<6,>=4.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (5.4.1)\n", + "Requirement already satisfied: blinker<2,>=1.0.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (1.8.2)\n", + "Requirement already satisfied: cachetools<6,>=4.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (5.5.0)\n", + "Requirement already satisfied: click<9,>=7.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (8.1.7)\n", + "Requirement already satisfied: packaging<24,>=16.8 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (23.2)\n", + "Requirement already satisfied: pillow<11,>=7.1.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (10.4.0)\n", + "Requirement already satisfied: protobuf<5,>=3.20 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (4.25.4)\n", + "Requirement already satisfied: pyarrow>=7.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (17.0.0)\n", + "Requirement already satisfied: requests<3,>=2.27 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (2.32.3)\n", + "Requirement already satisfied: rich<14,>=10.14.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (13.8.0)\n", + "Requirement already satisfied: tenacity<9,>=8.1.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (8.5.0)\n", + "Requirement already satisfied: toml<2,>=0.10.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (0.10.2)\n", + "Requirement already satisfied: typing-extensions<5,>=4.3.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (4.11.0)\n", + "Requirement already satisfied: gitpython!=3.1.19,<4,>=3.0.7 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (3.1.43)\n", + "Requirement already satisfied: pydeck<1,>=0.8.0b4 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (0.9.1)\n", + "Requirement already satisfied: tornado<7,>=6.0.3 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (6.4.1)\n", + "Requirement already satisfied: python-dateutil>=2.8.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pandas->wise_pizza) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pandas->wise_pizza) (2024.1)\n", + "Requirement already satisfied: decorator in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (5.1.1)\n", + "Requirement already satisfied: jedi>=0.16 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (0.19.1)\n", + "Requirement already satisfied: matplotlib-inline in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (0.1.7)\n", + "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (3.0.47)\n", + "Requirement already satisfied: pygments>=2.4.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (2.18.0)\n", + "Requirement already satisfied: stack-data in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (0.6.3)\n", + "Requirement already satisfied: traitlets>=5.13.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (5.14.3)\n", + "Requirement already satisfied: exceptiongroup in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (1.2.2)\n", + "Requirement already satisfied: pexpect>4.3 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (4.9.0)\n", + "Requirement already satisfied: iniconfig in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pytest->wise_pizza) (2.0.0)\n", + "Requirement already satisfied: pluggy<2,>=1.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pytest->wise_pizza) (1.5.0)\n", + "Requirement already satisfied: tomli>=1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pytest->wise_pizza) (2.0.1)\n", + "Requirement already satisfied: joblib>=1.0.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from scikit-learn->wise_pizza) (1.4.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from scikit-learn->wise_pizza) (3.5.0)\n", + "Requirement already satisfied: jinja2 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (3.1.4)\n", + "Requirement already satisfied: jsonschema>=3.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (4.23.0)\n", + "Requirement already satisfied: narwhals>=1.5.2 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (1.5.5)\n", + "Requirement already satisfied: gitdb<5,>=4.0.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from gitpython!=3.1.19,<4,>=3.0.7->streamlit==1.32.0->wise_pizza) (4.0.11)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jedi>=0.16->ipython->wise_pizza) (0.8.4)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pexpect>4.3->ipython->wise_pizza) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython->wise_pizza) (0.2.13)\n", + "Requirement already satisfied: six>=1.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from python-dateutil>=2.8.1->pandas->wise_pizza) (1.16.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (3.8)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (2.2.2)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (2024.7.4)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from rich<14,>=10.14.0->streamlit==1.32.0->wise_pizza) (3.0.0)\n", + "Requirement already satisfied: executing>=1.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from stack-data->ipython->wise_pizza) (2.0.1)\n", + "Requirement already satisfied: asttokens>=2.1.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from stack-data->ipython->wise_pizza) (2.4.1)\n", + "Requirement already satisfied: pure-eval in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from stack-data->ipython->wise_pizza) (0.2.3)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->gitpython!=3.1.19,<4,>=3.0.7->streamlit==1.32.0->wise_pizza) (5.0.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jinja2->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (2.1.5)\n", + "Requirement already satisfied: attrs>=22.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (24.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (2023.12.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (0.20.0)\n", + "Requirement already satisfied: mdurl~=0.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from markdown-it-py>=2.2.0->rich<14,>=10.14.0->streamlit==1.32.0->wise_pizza) (0.1.2)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install wise_pizza" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import wise_pizza as wp" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CausalTune for AB Testing \n", + "\n", + "CausalTune can be used for AB Testing in two ways:\n", + "1. Variance Reduction\n", + "2. Segmentation analysis\n", + "\n", + "#### 1. Variance Reduction\n", + "A standard variance reduction technique is to control for natural variation in the experiment's outcome metric. The simplest way to do so is by running a simple regression with a selection of controls. A potentially more powerful and automated approach is to run CausalTune. \n", + "\n", + "#### 2. Segmentation Analysis\n", + "\n", + "We use the heterogeneous treatment effect estimates from CausalTune to feed them into the segmentation analytics tool Wise-Pizza." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Data Generating Process" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first create synthetic data from a DGP with perfect randomisation of the treatment as we are replicating an AB test environment" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is substantial variation within the outcome metric per variant which can be seen from the cdf per variant:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "TRUE_EFFECT = 0.1\n", + "cd = generate_synth_data_with_categories(n_samples=8000, n_x=3, true_effect=TRUE_EFFECT)\n", + "cd.preprocess_dataset()\n", + "sns.ecdfplot(data=cd.data, x=cd.outcomes[0], hue=cd.treatment)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. ATE estimation: Running CausalTune\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# CausalTune configuration\n", + "num_samples = 5\n", + "components_time_budget = 10\n", + "train_size = 0.7\n", + "\n", + "target = cd.outcomes[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if outcome_model=\"auto\" in the CausalTune constructor, we search over a simultaneous search space for the EconML estimators and for FLAML wrappers for common regressors. The old behavior is now achieved by outcome_model=\"nested\" (the default for now)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_model:Causal Graph not provided. DoWhy will construct a graph based on data inputs.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Error instantiating catboost: No module named 'catboost'\n", + "Error instantiating catboost: No module named 'catboost'\n", + "[flaml.tune.tune: 08-29 21:46:48] {540} WARNING - Using CFO for search. To use BlendSearch, run: pip install flaml[blendsearch]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:flaml.tune.searcher.blendsearch:No low-cost partial config given to the search algorithm. For cost-frugal search, consider providing low-cost values for cost-related hps via 'low_cost_partial_config'. More info can be found at https://microsoft.github.io/FLAML/docs/FAQ#about-low_cost_partial_config-in-tune\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:48] {811} INFO - trial 1 config: {'estimator': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy'}, 'outcome_estimator': {'n_estimators': 547, 'max_depth': 2, 'min_child_weight': 0.07127593264582609, 'learning_rate': 0.012574061220730454, 'subsample': 0.7799382082329364, 'colsample_bylevel': 0.27372849622649437, 'colsample_bytree': 0.7586485757795598, 'reg_alpha': 0.001179369359230076, 'reg_lambda': 40.6823897252797, 'estimator_name': 'xgboost_limit_depth'}}\n", + "[flaml.tune.tune: 08-29 21:46:49] {202} INFO - result: {'energy_distance': 0.01178114739897218, 'estimator_name': 'backdoor.causaltune.models.NaiveDummy', 'scores': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.827246686895258, 'prob_erupt': 0.040429780475488536, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -5.684380868285524, 'auc': 0.4399285906935892, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.981599\n", + "1 1 2.208769 0.504643 True False 1.981599\n", + "2 0 2.349724 0.504643 True True 0.000000\n", + "3 1 2.126777 0.504643 True True 1.981599\n", + "4 0 3.615650 0.504643 True False 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 True True 1.981599\n", + "5597 1 0.531444 0.504643 True False 1.981599\n", + "5598 0 1.748540 0.504643 True True 0.000000\n", + "5599 1 1.148288 0.504643 True False 1.981599\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.07407473754132139, 'ate_std': 7.519703414089599e-06, 'energy_distance': 0.006356368423362291, 'psw_energy_distance': 0.006356364714663609, 'codec': inf}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8285033072963655, 'prob_erupt': 0.0663247694730707, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -7.076018585182319, 'auc': 0.45270698461428893, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.915403\n", + "1 1 0.456353 0.504643 True True 1.915403\n", + "2 0 2.826911 0.504643 True True 0.000000\n", + "3 0 2.420919 0.504643 True True 0.000000\n", + "4 1 3.184911 0.504643 True True 1.915403\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 True True 0.000000\n", + "2396 1 1.987323 0.504643 True True 1.915403\n", + "2397 0 1.531595 0.504643 True True 0.000000\n", + "2398 1 1.895474 0.504643 True True 1.915403\n", + "2399 0 2.632751 0.504643 True True 0.000000\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.12187383722280293, 'ate_std': 1.1892256875195286e-05, 'energy_distance': 0.01178114739897218, 'psw_energy_distance': 0.011781114715468277, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy'}, 'outcome_estimator': {'n_estimators': 547, 'max_depth': 2, 'min_child_weight': 0.07127593264582609, 'learning_rate': 0.012574061220730454, 'subsample': 0.7799382082329364, 'colsample_bylevel': 0.27372849622649437, 'colsample_bytree': 0.7586485757795598, 'reg_alpha': 0.001179369359230076, 'reg_lambda': 40.6823897252797, 'estimator_name': 'xgboost_limit_depth'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy'}, 'config/outcome_estimator': {'n_estimators': 547, 'max_depth': 2, 'min_child_weight': 0.07127593264582609, 'learning_rate': 0.012574061220730454, 'subsample': 0.7799382082329364, 'colsample_bylevel': 0.27372849622649437, 'colsample_bytree': 0.7586485757795598, 'reg_alpha': 0.001179369359230076, 'reg_lambda': 40.6823897252797, 'estimator_name': 'xgboost_limit_depth'}, 'experiment_tag': 'exp', 'time_total_s': 1.0666389465332031}\n", + "[flaml.tune.tune: 08-29 21:46:49] {811} INFO - trial 2 config: {'estimator': {'estimator_name': 'backdoor.causaltune.models.Dummy'}, 'outcome_estimator': {'alpha': 0.0023836674367948983, 'l1_ratio': 0.07478461832495154, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}\n", + "[flaml.tune.tune: 08-29 21:46:50] {202} INFO - result: {'energy_distance': 0.011781128343663294, 'estimator_name': 'backdoor.causaltune.models.Dummy', 'scores': {'estimator_name': 'backdoor.causaltune.models.Dummy', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.8471717191611419, 'prob_erupt': 0.0404297785296667, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': 3.8109728274960677, 'auc': 0.5326662349888922, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.981599\n", + "1 1 2.208769 0.504643 True True 1.981599\n", + "2 0 2.349724 0.504643 True False 0.000000\n", + "3 1 2.126777 0.504643 True False 1.981599\n", + "4 0 3.615650 0.504643 True False 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True False 0.000000\n", + "5596 1 1.457613 0.504643 True False 1.981599\n", + "5597 1 0.531444 0.504643 True True 1.981599\n", + "5598 0 1.748540 0.504643 True True 0.000000\n", + "5599 1 1.148288 0.504643 True False 1.981599\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.07407473124911097, 'ate_std': 7.335269535792448e-06, 'energy_distance': 0.006356361533432775, 'psw_energy_distance': 0.0063563659692920105, 'codec': inf}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8119857216793858, 'prob_erupt': 0.06632480251301, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -9.049384243473757, 'auc': 0.4253220616195626, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True True 1.915403\n", + "1 1 0.456353 0.504643 True True 1.915403\n", + "2 0 2.826911 0.504643 True True 0.000000\n", + "3 0 2.420919 0.504643 True True 0.000000\n", + "4 1 3.184911 0.504643 True True 1.915403\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 True True 0.000000\n", + "2396 1 1.987323 0.504643 True False 1.915403\n", + "2397 0 1.531595 0.504643 True True 0.000000\n", + "2398 1 1.895474 0.504643 True True 1.915403\n", + "2399 0 2.632751 0.504643 True False 0.000000\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.12187390105544248, 'ate_std': 1.2019446318880245e-05, 'energy_distance': 0.011781128343663294, 'psw_energy_distance': 0.011781137478164005, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.causaltune.models.Dummy'}, 'outcome_estimator': {'alpha': 0.0023836674367948983, 'l1_ratio': 0.07478461832495154, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.causaltune.models.Dummy'}, 'config/outcome_estimator': {'alpha': 0.0023836674367948983, 'l1_ratio': 0.07478461832495154, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}, 'experiment_tag': 'exp', 'time_total_s': 0.9152491092681885}\n", + "[flaml.tune.tune: 08-29 21:46:50] {811} INFO - trial 3 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'lgbm'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, SLearner. EconML metalearners accept a single X argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:51] {202} INFO - result: {'energy_distance': 0.015154507115999749, 'estimator_name': 'backdoor.econml.metalearners.SLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.SLearner', 'train': {'erupt': 1.8321824668499638, 'norm_erupt': 1.8321824668499638, 'prob_erupt': -2.423826326717233e-16, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -14.959762031023702, 'auc': 0.45728931226852987, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 False False 0.000000\n", + "1 1 2.208769 0.504643 False False 0.000000\n", + "2 0 2.349724 0.504643 False False 2.018745\n", + "3 1 2.126777 0.504643 False False 0.000000\n", + "4 0 3.615650 0.504643 False False 2.018745\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 False False 2.018745\n", + "5596 1 1.457613 0.504643 False False 0.000000\n", + "5597 1 0.531444 0.504643 False False 0.000000\n", + "5598 0 1.748540 0.504643 False False 2.018745\n", + "5599 1 1.148288 0.504643 False False 0.000000\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.0, 'ate_std': 0.0, 'energy_distance': 0.0068736152018216146, 'psw_energy_distance': 0.006873615201732797, 'codec': inf}, 'validation': {'erupt': 1.8375308421693648, 'norm_erupt': 1.8375308421693648, 'prob_erupt': -3.6251571918578925e-16, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -7.6775733687346435, 'auc': 0.4550101918996407, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 False False 0.000000\n", + "1 1 0.456353 0.504643 False False 0.000000\n", + "2 0 2.826911 0.504643 False False 2.092415\n", + "3 0 2.420919 0.504643 False False 2.092415\n", + "4 1 3.184911 0.504643 False False 0.000000\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 False False 2.092415\n", + "2396 1 1.987323 0.504643 False False 0.000000\n", + "2397 0 1.531595 0.504643 False False 2.092415\n", + "2398 1 1.895474 0.504643 False False 0.000000\n", + "2399 0 2.632751 0.504643 False False 2.092415\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.0, 'ate_std': 0.0, 'energy_distance': 0.015154507115999749, 'psw_energy_distance': 0.015154507115982874, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'lgbm'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'config/outcome_estimator': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'lgbm'}, 'experiment_tag': 'exp', 'time_total_s': 1.2199647426605225}\n", + "[flaml.tune.tune: 08-29 21:46:51] {811} INFO - trial 4 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_neighbors': 5, 'estimator_name': 'knn'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, SLearner. EconML metalearners accept a single X argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:53] {202} INFO - result: {'energy_distance': 0.007571183883996024, 'estimator_name': 'backdoor.econml.metalearners.SLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.SLearner', 'train': {'erupt': 1.990038970501367, 'norm_erupt': 1.9282427425856992, 'prob_erupt': 0.1149441173922305, 'frobenius_norm': 0.6215365639720993, 'policy_risk': 0.37775401048623847, 'qini': 229.8266937604852, 'auc': 1.5778389432560949, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.922180\n", + "1 1 2.208769 0.504643 False False 0.000000\n", + "2 0 2.349724 0.504643 False False 1.958212\n", + "3 1 2.126777 0.504643 True True 1.922180\n", + "4 0 3.615650 0.504643 True False 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 False False 0.000000\n", + "5597 1 0.531444 0.504643 True True 1.922180\n", + "5598 0 1.748540 0.504643 False False 1.958212\n", + "5599 1 1.148288 0.504643 True True 1.922180\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.08877632135428, 'ate_std': 0.2855804742258309, 'energy_distance': 0.002295850512915365, 'psw_energy_distance': 0.0022958505128234385, 'codec': -0.011680266977530916}, 'validation': {'erupt': 2.029623852369111, 'norm_erupt': 1.9448896135685978, 'prob_erupt': 0.11353866487779433, 'frobenius_norm': 0.6202759036351181, 'policy_risk': 0.33794671946784405, 'qini': 103.02652352544624, 'auc': 1.1658812415831805, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.927036\n", + "1 1 0.456353 0.504643 False False 0.000000\n", + "2 0 2.826911 0.504643 False False 1.963159\n", + "3 0 2.420919 0.504643 True False 0.000000\n", + "4 1 3.184911 0.504643 True False 1.927036\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 False False 1.963159\n", + "2396 1 1.987323 0.504643 True False 1.927036\n", + "2397 0 1.531595 0.504643 True False 0.000000\n", + "2398 1 1.895474 0.504643 True False 1.927036\n", + "2399 0 2.632751 0.504643 False False 1.963159\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.0889300032900231, 'ate_std': 0.2821626862806024, 'energy_distance': 0.007571183883996024, 'psw_energy_distance': 0.007571183883984478, 'codec': -0.03142875928726412}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_neighbors': 5, 'estimator_name': 'knn'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'config/outcome_estimator': {'n_neighbors': 5, 'estimator_name': 'knn'}, 'experiment_tag': 'exp', 'time_total_s': 1.6983869075775146}\n", + "[flaml.tune.tune: 08-29 21:46:53] {811} INFO - trial 5 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 10, 'max_depth': 6, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.29999999999999993, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'xgboost_limit_depth'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, SLearner. EconML metalearners accept a single X argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:54] {202} INFO - result: {'energy_distance': 0.009499014542320161, 'estimator': , 'estimator_name': 'backdoor.econml.metalearners.SLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.SLearner', 'train': {'erupt': 1.9835242638307409, 'norm_erupt': 1.9191205775246483, 'prob_erupt': 0.062220006977996546, 'frobenius_norm': 0.6210366993793562, 'policy_risk': 0.3967556746953316, 'qini': 205.73899676519733, 'auc': 1.4886076561337334, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.936655\n", + "1 1 2.208769 0.504643 False False 0.000000\n", + "2 0 2.349724 0.504643 False False 1.972958\n", + "3 1 2.126777 0.504643 True False 1.936655\n", + "4 0 3.615650 0.504643 False False 1.972958\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 False False 0.000000\n", + "5597 1 0.531444 0.504643 True True 1.936655\n", + "5598 0 1.748540 0.504643 False False 1.972958\n", + "5599 1 1.148288 0.504643 True True 1.936655\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.06316475133677678, 'ate_std': 0.13894576586166096, 'energy_distance': 0.0031207210938908325, 'psw_energy_distance': 0.003120721093797574, 'codec': -0.007809316854542985}, 'validation': {'erupt': 2.0273410279724917, 'norm_erupt': 1.9533617172389612, 'prob_erupt': 0.060077854767759675, 'frobenius_norm': 0.6203686921366824, 'policy_risk': 0.3605904733897548, 'qini': 107.62266689806987, 'auc': 1.1951199698622845, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.907849\n", + "1 1 0.456353 0.504643 False False 0.000000\n", + "2 0 2.826911 0.504643 False False 1.943613\n", + "3 0 2.420919 0.504643 True False 0.000000\n", + "4 1 3.184911 0.504643 False False 0.000000\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 False False 1.943613\n", + "2396 1 1.987323 0.504643 True False 1.907849\n", + "2397 0 1.531595 0.504643 True False 0.000000\n", + "2398 1 1.895474 0.504643 True False 1.907849\n", + "2399 0 2.632751 0.504643 False False 1.943613\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.06003390231790642, 'ate_std': 0.13574010010578175, 'energy_distance': 0.009499014542320161, 'psw_energy_distance': 0.009499014542305062, 'codec': -0.022126792342965284}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 10, 'max_depth': 6, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.29999999999999993, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'xgboost_limit_depth'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'config/outcome_estimator': {'n_estimators': 10, 'max_depth': 6, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.29999999999999993, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'xgboost_limit_depth'}, 'experiment_tag': 'exp', 'time_total_s': 1.1325089931488037}\n", + "[flaml.tune.tune: 08-29 21:46:54] {811} INFO - trial 6 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'fit_intercept': True, 'eps': 2.220446049250313e-16, 'estimator_name': 'lasso_lars'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, DomainAdaptationLearner. EconML metalearners accept a single X argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:55] {202} INFO - result: {'energy_distance': 0.010839801195992926, 'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.8321824668499638, 'prob_erupt': 0.040429757605700646, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -6.666439696668824, 'auc': 0.45728931226852987, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.981599\n", + "1 1 2.208769 0.504643 True False 1.981599\n", + "2 0 2.349724 0.504643 True False 0.000000\n", + "3 1 2.126777 0.504643 True False 1.981599\n", + "4 0 3.615650 0.504643 True False 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True False 0.000000\n", + "5596 1 1.457613 0.504643 True False 1.981599\n", + "5597 1 0.531444 0.504643 True False 1.981599\n", + "5598 0 1.748540 0.504643 True False 0.000000\n", + "5599 1 1.148288 0.504643 True False 1.981599\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.07407469302415848, 'ate_std': 0.0, 'energy_distance': 0.0046082570463408246, 'psw_energy_distance': 0.004608257046253783, 'codec': inf}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8375308421693648, 'prob_erupt': 0.04031208147598027, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -5.560894293566197, 'auc': 0.4550101918996407, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.915403\n", + "1 1 0.456353 0.504643 True False 1.915403\n", + "2 0 2.826911 0.504643 True False 0.000000\n", + "3 0 2.420919 0.504643 True False 0.000000\n", + "4 1 3.184911 0.504643 True False 1.915403\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 True False 0.000000\n", + "2396 1 1.987323 0.504643 True False 1.915403\n", + "2397 0 1.531595 0.504643 True False 0.000000\n", + "2398 1 1.895474 0.504643 True False 1.915403\n", + "2399 0 2.632751 0.504643 True False 0.000000\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.07407469302415848, 'ate_std': 0.0, 'energy_distance': 0.010839801195992926, 'psw_energy_distance': 0.01083980119597694, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'fit_intercept': True, 'eps': 2.220446049250313e-16, 'estimator_name': 'lasso_lars'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'config/outcome_estimator': {'alpha': 0.09999999999999991, 'fit_intercept': True, 'eps': 2.220446049250313e-16, 'estimator_name': 'lasso_lars'}, 'experiment_tag': 'exp', 'time_total_s': 0.9906589984893799}\n", + "[flaml.tune.tune: 08-29 21:46:55] {811} INFO - trial 7 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'extra_trees'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, DomainAdaptationLearner. EconML metalearners accept a single X argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:56] {202} INFO - result: {'energy_distance': 0.009336123303534283, 'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'train': {'erupt': 1.939013175306148, 'norm_erupt': 1.919090820643322, 'prob_erupt': 0.05695999738198798, 'frobenius_norm': 0.6204567840019323, 'policy_risk': 0.22228283447739627, 'qini': 213.63376755471728, 'auc': 1.527831526984752, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.956111\n", + "1 1 2.208769 0.504643 False False 0.000000\n", + "2 0 2.349724 0.504643 True False 0.000000\n", + "3 1 2.126777 0.504643 True True 1.956111\n", + "4 0 3.615650 0.504643 True False 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 True False 1.956111\n", + "5597 1 0.531444 0.504643 True True 1.956111\n", + "5598 0 1.748540 0.504643 False False 1.992779\n", + "5599 1 1.148288 0.504643 True True 1.956111\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.08465927726747133, 'ate_std': 0.09121982513249718, 'energy_distance': 0.0035303911141593147, 'psw_energy_distance': 0.003530391114071385, 'codec': 0.0}, 'validation': {'erupt': 1.9910267913620905, 'norm_erupt': 1.9618018013436025, 'prob_erupt': 0.05597323564087899, 'frobenius_norm': 0.6201138184067148, 'policy_risk': 0.1608809199383363, 'qini': 109.76284704861612, 'auc': 1.1926154978630246, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.894576\n", + "1 1 0.456353 0.504643 False False 0.000000\n", + "2 0 2.826911 0.504643 True False 0.000000\n", + "3 0 2.420919 0.504643 True False 0.000000\n", + "4 1 3.184911 0.504643 True False 1.894576\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 False False 1.930091\n", + "2396 1 1.987323 0.504643 True False 1.894576\n", + "2397 0 1.531595 0.504643 True False 0.000000\n", + "2398 1 1.895474 0.504643 True False 1.894576\n", + "2399 0 2.632751 0.504643 False False 1.930091\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.0841628836227576, 'ate_std': 0.08904636359841733, 'energy_distance': 0.009336123303534283, 'psw_energy_distance': 0.009336123303519184, 'codec': -0.01643372753801259}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'extra_trees'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'config/outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'extra_trees'}, 'experiment_tag': 'exp', 'time_total_s': 1.0738990306854248}\n", + "[flaml.tune.tune: 08-29 21:46:56] {811} INFO - trial 8 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'l1_ratio': 0.5, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, DomainAdaptationLearner. EconML metalearners accept a single X argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.tune.tune: 08-29 21:46:57] {202} INFO - result: {'energy_distance': 0.010023136194746485, 'estimator': , 'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.919090820643322, 'prob_erupt': 0.05040862691452446, 'frobenius_norm': 0.6219501175254194, 'policy_risk': 0.04687138103434385, 'qini': 64.47307008614447, 'auc': 0.7830414531613435, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True False 1.981599\n", + "1 1 2.208769 0.504643 True False 1.981599\n", + "2 0 2.349724 0.504643 True False 0.000000\n", + "3 1 2.126777 0.504643 True True 1.981599\n", + "4 0 3.615650 0.504643 True False 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 True False 1.981599\n", + "5597 1 0.531444 0.504643 True True 1.981599\n", + "5598 0 1.748540 0.504643 True False 0.000000\n", + "5599 1 1.148288 0.504643 True True 1.981599\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.0907094513811171, 'ate_std': 0.04335250457975112, 'energy_distance': 0.0043815819532162514, 'psw_energy_distance': 0.004381581953130098, 'codec': -0.004007679385649148}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8218538307681225, 'prob_erupt': 0.04980759540850268, 'frobenius_norm': 0.6218190171437235, 'policy_risk': -0.013889249000879733, 'qini': 33.44124892982546, 'auc': 0.7381518120274893, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True True 1.915403\n", + "1 1 0.456353 0.504643 True False 1.915403\n", + "2 0 2.826911 0.504643 True False 0.000000\n", + "3 0 2.420919 0.504643 True False 0.000000\n", + "4 1 3.184911 0.504643 True False 1.915403\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 True False 0.000000\n", + "2396 1 1.987323 0.504643 True False 1.915403\n", + "2397 0 1.531595 0.504643 True False 0.000000\n", + "2398 1 1.895474 0.504643 True True 1.915403\n", + "2399 0 2.632751 0.504643 True False 0.000000\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.0897886262461543, 'ate_std': 0.043750552277535555, 'energy_distance': 0.010023136194746485, 'psw_energy_distance': 0.01002313619473627, 'codec': -0.02600285397177739}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'l1_ratio': 0.5, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'config/outcome_estimator': {'alpha': 0.09999999999999991, 'l1_ratio': 0.5, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}, 'experiment_tag': 'exp', 'time_total_s': 1.0965139865875244}\n", + "[flaml.tune.tune: 08-29 21:46:57] {811} INFO - trial 9 config: {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'random_forest'}}\n", + "[flaml.tune.tune: 08-29 21:46:59] {202} INFO - result: {'energy_distance': 0.007551496607561159, 'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'scores': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'train': {'erupt': 2.0331317286000155, 'norm_erupt': 2.0016609203627946, 'prob_erupt': 0.12089617365609993, 'frobenius_norm': 0.6605179740311135, 'policy_risk': 0.42886387748645793, 'qini': 314.7303817449756, 'auc': 1.995934551269853, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True True 1.923844\n", + "1 1 2.208769 0.504643 False False 0.000000\n", + "2 0 2.349724 0.504643 False False 1.959907\n", + "3 1 2.126777 0.504643 True True 1.923844\n", + "4 0 3.615650 0.504643 True True 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 False False 0.000000\n", + "5597 1 0.531444 0.504643 False False 0.000000\n", + "5598 0 1.748540 0.504643 False False 1.959907\n", + "5599 1 1.148288 0.504643 True True 1.923844\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.0843427979294397, 'ate_std': 0.3090224676485376, 'energy_distance': 0.002539474790569596, 'psw_energy_distance': 0.0025394747904843307, 'codec': -0.0037140820082572}, 'validation': {'erupt': 2.0250770575928803, 'norm_erupt': 1.9747226860738842, 'prob_erupt': 0.11981428508029066, 'frobenius_norm': 0.6608195412559066, 'policy_risk': 0.4124374969841177, 'qini': 115.00068135619115, 'auc': 1.2335971430016452, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.916142\n", + "1 1 0.456353 0.504643 False False 0.000000\n", + "2 0 2.826911 0.504643 False False 1.952061\n", + "3 0 2.420919 0.504643 True True 0.000000\n", + "4 1 3.184911 0.504643 False False 0.000000\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 False False 1.952061\n", + "2396 1 1.987323 0.504643 True True 1.916142\n", + "2397 0 1.531595 0.504643 True True 0.000000\n", + "2398 1 1.895474 0.504643 True False 1.916142\n", + "2399 0 2.632751 0.504643 False False 1.952061\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.0860942389988756, 'ate_std': 0.30500020556549406, 'energy_distance': 0.007551496607561159, 'psw_energy_distance': 0.007551496607551389, 'codec': -0.02202892001807501}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'random_forest'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'config/outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'random_forest'}, 'experiment_tag': 'exp', 'time_total_s': 1.5322060585021973}\n", + "[flaml.tune.tune: 08-29 21:46:59] {811} INFO - trial 10 config: {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'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, 'estimator_name': 'xgboost'}}\n", + "[flaml.tune.tune: 08-29 21:47:00] {202} INFO - result: {'energy_distance': 0.008459219578528021, 'estimator': , 'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'scores': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'train': {'erupt': 2.012799892375053, 'norm_erupt': 1.9758662713129778, 'prob_erupt': 0.14196593928050988, 'frobenius_norm': 0.6625471750344744, 'policy_risk': 0.4159281005585356, 'qini': 357.17542404186725, 'auc': 1.9385975925569965, 'values': variant Y p policy norm_policy weights\n", + "0 1 2.603153 0.504643 True True 1.783567\n", + "1 1 2.208769 0.504643 False False 0.000000\n", + "2 0 2.349724 0.504643 False False 1.817001\n", + "3 1 2.126777 0.504643 True True 1.783567\n", + "4 0 3.615650 0.504643 True True 0.000000\n", + "... ... ... ... ... ... ...\n", + "5595 0 2.107339 0.504643 True True 0.000000\n", + "5596 1 1.457613 0.504643 False False 0.000000\n", + "5597 1 0.531444 0.504643 False False 0.000000\n", + "5598 0 1.748540 0.504643 False False 1.817001\n", + "5599 1 1.148288 0.504643 False False 0.000000\n", + "\n", + "[5600 rows x 6 columns], 'ate': 0.0718459407391199, 'ate_std': 0.39246232393521807, 'energy_distance': 0.004731652049054791, 'psw_energy_distance': 0.004731652048978852, 'codec': -0.00524087365105592}, 'validation': {'erupt': 2.03414253131937, 'norm_erupt': 1.970688625062738, 'prob_erupt': 0.14574042051582634, 'frobenius_norm': 0.663727400912166, 'policy_risk': 0.443266980589179, 'qini': 101.42381450852616, 'auc': 1.1801372568456459, 'values': variant Y p policy norm_policy weights\n", + "0 1 0.828126 0.504643 True False 1.952890\n", + "1 1 0.456353 0.504643 False False 0.000000\n", + "2 0 2.826911 0.504643 False False 1.989498\n", + "3 0 2.420919 0.504643 True False 0.000000\n", + "4 1 3.184911 0.504643 False False 0.000000\n", + "... ... ... ... ... ... ...\n", + "2395 0 2.180190 0.504643 False False 1.989498\n", + "2396 1 1.987323 0.504643 True True 1.952890\n", + "2397 0 1.531595 0.504643 True True 0.000000\n", + "2398 1 1.895474 0.504643 False False 0.000000\n", + "2399 0 2.632751 0.504643 False False 1.989498\n", + "\n", + "[2400 rows x 6 columns], 'ate': 0.0847635089620462, 'ate_std': 0.39318837737458046, 'energy_distance': 0.008459219578528021, 'psw_energy_distance': 0.00845921957851914, 'codec': -0.032122559920929085}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'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, 'estimator_name': 'xgboost'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'config/outcome_estimator': {'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, 'estimator_name': 'xgboost'}, 'experiment_tag': 'exp', 'time_total_s': 1.4891297817230225}\n" + ] + } + ], + "source": [ + "ct_ab = CausalTune(\n", + " num_samples=num_samples,\n", + " components_time_budget=components_time_budget,\n", + " metric=\"energy_distance\",\n", + " verbose=3,\n", + " components_verbose=3,\n", + " train_size=train_size,\n", + " outcome_model=\"auto\"\n", + ") \n", + "ct_ab.fit(data=cd, outcome=target)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The point estimates compare as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Difference in means estimate (naive ATE): 0.121874\n", + "CausalTune ATE estimate:: 0.086094\n", + "True ATE: 0.1\n" + ] + } + ], + "source": [ + "print(f'Difference in means estimate (naive ATE): {ct_ab.scorer.naive_ate(ct_ab.test_df[cd.treatment], ct_ab.test_df[target])[0]:5f}')\n", + "print(f'CausalTune ATE estimate:: {ct_ab.effect(ct_ab.test_df).mean():5f}')\n", + "print(f'True ATE: {TRUE_EFFECT}')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Explainable variation\n", + "\n", + "As a first performance check of this approach we test how much of the variation in the outcome metric remains unexplained with our outcome model prediction approach. \n", + "\n", + "For this, we use AutoML to predict outcomes as is done under the hood of CausalTune.\n", + "The lower the unexplained variation, the more promising it is to use CausalTune for AB Testing." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[flaml.automl.logger: 08-29 21:34:17] {1680} INFO - task = regression\n", + "[flaml.automl.logger: 08-29 21:34:17] {1691} INFO - Evaluation method: cv\n", + "[flaml.automl.logger: 08-29 21:34:17] {1789} INFO - Minimizing error metric: 1-r2\n", + "[flaml.automl.logger: 08-29 21:34:17] {1901} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'xgboost', 'extra_tree', 'xgb_limitdepth']\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 0, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2345} INFO - Estimated sufficient time budget=644s. Estimated necessary time budget=5s.\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.1s,\testimator lgbm's best error=0.6636,\tbest estimator lgbm's best error=0.6636\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 1, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.1s,\testimator lgbm's best error=0.6636,\tbest estimator lgbm's best error=0.6636\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 2, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.2s,\testimator lgbm's best error=0.3294,\tbest estimator lgbm's best error=0.3294\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 3, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.2s,\testimator lgbm's best error=0.0511,\tbest estimator lgbm's best error=0.0511\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 4, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.2s,\testimator lgbm's best error=0.0511,\tbest estimator lgbm's best error=0.0511\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 5, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.3s,\testimator lgbm's best error=0.0212,\tbest estimator lgbm's best error=0.0212\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 6, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.3s,\testimator lgbm's best error=0.0212,\tbest estimator lgbm's best error=0.0212\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 7, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.3s,\testimator lgbm's best error=0.0212,\tbest estimator lgbm's best error=0.0212\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 8, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.4s,\testimator lgbm's best error=0.0168,\tbest estimator lgbm's best error=0.0168\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 9, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.4s,\testimator xgboost's best error=1.9577,\tbest estimator lgbm's best error=0.0168\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 10, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.5s,\testimator lgbm's best error=0.0168,\tbest estimator lgbm's best error=0.0168\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 11, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.6s,\testimator xgboost's best error=1.9577,\tbest estimator lgbm's best error=0.0168\n", + "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 12, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 0.9s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 13, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.1s,\testimator extra_tree's best error=0.3712,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 14, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.3s,\testimator rf's best error=0.3977,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 15, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.3s,\testimator xgboost's best error=0.6103,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 16, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.5s,\testimator rf's best error=0.1653,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 17, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 1.7s,\testimator extra_tree's best error=0.1320,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 18, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 1.9s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 19, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.0s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 20, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.1s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 21, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.1s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 22, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.3s,\testimator rf's best error=0.1653,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 23, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.5s,\testimator rf's best error=0.0705,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 24, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 2.7s,\testimator extra_tree's best error=0.1320,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 25, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 2.9s,\testimator extra_tree's best error=0.0583,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 26, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.1s,\testimator rf's best error=0.0305,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 27, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.1s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 28, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.3s,\testimator extra_tree's best error=0.0219,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 29, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.5s,\testimator extra_tree's best error=0.0219,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 30, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 3.6s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 31, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 3.8s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 32, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.0s,\testimator rf's best error=0.0305,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 33, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.2s,\testimator extra_tree's best error=0.0169,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 34, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.4s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 35, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.5s,\testimator xgboost's best error=0.0348,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 36, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 4.7s,\testimator extra_tree's best error=0.0169,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 37, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 4.8s,\testimator rf's best error=0.0172,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 38, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 4.9s,\testimator xgboost's best error=0.0348,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 39, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 5.4s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 40, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 5.5s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 41, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 5.6s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 42, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 5.9s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 43, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.0s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 44, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.1s,\testimator extra_tree's best error=0.0077,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 45, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.2s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 46, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.2s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 47, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.4s,\testimator extra_tree's best error=0.0077,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 48, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 6.6s,\testimator rf's best error=0.0172,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 49, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 6.7s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 50, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 6.9s,\testimator extra_tree's best error=0.0074,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 51, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 7.1s,\testimator rf's best error=0.0097,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 52, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 7.3s,\testimator rf's best error=0.0097,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 53, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:25] {2392} INFO - at 8.2s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:25] {2219} INFO - iteration 54, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 8.6s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 55, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 8.7s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 56, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 8.9s,\testimator rf's best error=0.0087,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 57, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.0s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 58, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.0s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 59, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.2s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 60, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.4s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 61, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:27] {2392} INFO - at 10.1s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:27] {2219} INFO - iteration 62, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:27] {2392} INFO - at 10.1s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:27] {2219} INFO - iteration 63, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:27] {2392} INFO - at 10.4s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0024\n", + "[flaml.automl.logger: 08-29 21:34:27] {2219} INFO - iteration 64, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 10.7s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 65, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 10.9s,\testimator rf's best error=0.0087,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 66, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.0s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 67, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.2s,\testimator rf's best error=0.0057,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 68, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.4s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 69, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.6s,\testimator rf's best error=0.0057,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 70, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:29] {2392} INFO - at 11.8s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:29] {2219} INFO - iteration 71, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:29] {2392} INFO - at 12.0s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:29] {2219} INFO - iteration 72, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:29] {2392} INFO - at 12.2s,\testimator extra_tree's best error=0.0074,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:29] {2219} INFO - iteration 73, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 12.6s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 74, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 12.7s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 75, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 13.0s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 76, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 13.4s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 77, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 13.5s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 78, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:31] {2392} INFO - at 13.9s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:31] {2219} INFO - iteration 79, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:31] {2392} INFO - at 14.3s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:31] {2219} INFO - iteration 80, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 14.6s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 81, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 14.8s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 82, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 14.9s,\testimator xgb_limitdepth's best error=0.0163,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 83, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.0s,\testimator xgb_limitdepth's best error=0.0163,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 84, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.1s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 85, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.2s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 86, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.3s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 87, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.3s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 88, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.6s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 89, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 15.8s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 90, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 15.9s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 91, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 16.2s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 92, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 16.4s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 93, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 16.5s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 94, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:34] {2392} INFO - at 16.8s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", + "[flaml.automl.logger: 08-29 21:34:34] {2219} INFO - iteration 95, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:34] {2392} INFO - at 17.1s,\testimator lgbm's best error=0.0018,\tbest estimator lgbm's best error=0.0018\n", + "[flaml.automl.logger: 08-29 21:34:34] {2219} INFO - iteration 96, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:34] {2392} INFO - at 17.3s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0018\n", + "[flaml.automl.logger: 08-29 21:34:34] {2219} INFO - iteration 97, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:35] {2392} INFO - at 17.7s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0018\n", + "[flaml.automl.logger: 08-29 21:34:35] {2219} INFO - iteration 98, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:35] {2392} INFO - at 18.0s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0018\n", + "[flaml.automl.logger: 08-29 21:34:35] {2219} INFO - iteration 99, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:35] {2392} INFO - at 18.2s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0018\n", + "[flaml.automl.logger: 08-29 21:34:35] {2219} INFO - iteration 100, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 18.7s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 101, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 18.9s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 102, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 19.3s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 103, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 19.5s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 104, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:38] {2392} INFO - at 20.8s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:38] {2219} INFO - iteration 105, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:38] {2392} INFO - at 21.2s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:38] {2219} INFO - iteration 106, current learner xgboost\n", + "[flaml.automl.logger: 08-29 21:34:38] {2392} INFO - at 21.3s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:38] {2219} INFO - iteration 107, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:39] {2392} INFO - at 21.7s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0017\n", + "[flaml.automl.logger: 08-29 21:34:39] {2219} INFO - iteration 108, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:39] {2392} INFO - at 22.5s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:39] {2219} INFO - iteration 109, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:40] {2392} INFO - at 22.7s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:40] {2219} INFO - iteration 110, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:40] {2392} INFO - at 22.9s,\testimator extra_tree's best error=0.0035,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:40] {2219} INFO - iteration 111, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 23.7s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 112, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 24.1s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 113, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 24.3s,\testimator extra_tree's best error=0.0035,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 114, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 24.4s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 115, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:42] {2392} INFO - at 24.7s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:42] {2219} INFO - iteration 116, current learner rf\n", + "[flaml.automl.logger: 08-29 21:34:42] {2392} INFO - at 25.1s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:42] {2219} INFO - iteration 117, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:42] {2392} INFO - at 25.5s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:42] {2219} INFO - iteration 118, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:43] {2392} INFO - at 25.8s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:43] {2219} INFO - iteration 119, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 26.9s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 120, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 27.1s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 121, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 27.4s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 122, current learner xgb_limitdepth\n", + "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 27.6s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 123, current learner extra_tree\n", + "[flaml.automl.logger: 08-29 21:34:45] {2392} INFO - at 27.9s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:45] {2219} INFO - iteration 124, current learner lgbm\n", + "[flaml.automl.logger: 08-29 21:34:47] {2392} INFO - at 30.3s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", + "[flaml.automl.logger: 08-29 21:34:47] {2628} INFO - retrain lgbm for 0.2s\n", + "[flaml.automl.logger: 08-29 21:34:47] {2631} INFO - retrained model: LGBMRegressor(colsample_bytree=0.7217481836714627,\n", + " learning_rate=0.5411643761858483, max_bin=255,\n", + " min_child_samples=6, n_estimators=1, n_jobs=-1, num_leaves=4,\n", + " reg_alpha=0.01604019858602816, reg_lambda=0.01519018741037757,\n", + " verbose=-1)\n", + "[flaml.automl.logger: 08-29 21:34:47] {1931} INFO - fit succeeded\n", + "[flaml.automl.logger: 08-29 21:34:47] {1932} INFO - Time taken to find the best model: 22.469991207122803\n" + ] + } + ], + "source": [ + "automl = AutoML()\n", + "automl.fit(ct_ab.train_df[ct_ab.train_df.columns.drop([target])], ct_ab.train_df[target], task='regression', time_budget=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variation unexplained: 0.15%\n" + ] + } + ], + "source": [ + "# Fraction of variation unexplained\n", + "mse = mean_squared_error(automl.predict(ct_ab.test_df[ct_ab.test_df.columns.drop([target])]), ct_ab.test_df[target])\n", + "var_y = ct_ab.test_df[target].var()\n", + "fvu = mse / var_y\n", + "print(f'Variation unexplained: {100*fvu:.2f}%')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bootstrapping with simple component models for inference\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# bootstrap configuration\n", + "\n", + "n_samples = 30\n", + "n_sample_size = cd.data.shape[0]\n", + "\n", + "components_time_budget = 5\n", + "train_size = .7\n", + "num_samples= 10\n", + "\n", + "ct_ate = []\n", + "scores = []\n", + "naive_ate = []" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n", + "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", + "Propensity Model Fitted Successfully\n" + ] + } + ], + "source": [ + "for _ in range(n_samples):\n", + " cd_bt = generate_synth_data_with_categories(n_samples=5000, n_x=3, true_effect=TRUE_EFFECT)\n", + " cd_bt.preprocess_dataset()\n", + " outcome_regressor = RandomForestRegressor()\n", + " \n", + " ct = CausalTune(\n", + " num_samples=num_samples,\n", + " components_time_budget=components_time_budget,\n", + " metric=\"energy_distance\",\n", + " train_size=train_size,\n", + " propensity_model='dummy',\n", + " outcome_model=outcome_regressor\n", + " ) \n", + "\n", + " ct.fit(data=cd, outcome=target)\n", + "\n", + " ct_ate.append(ct.effect(ct.test_df).mean())\n", + " scores.append(ct.best_score)\n", + " naive_ate.append(ct.scorer.naive_ate(cd_bt.data[cd_bt.treatment], cd_bt.data[target])[0])\n", + " del ct, cd_bt, outcome_regressor\n", + " gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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f33gRtaTddtms+mVV15xrFe33XabY936u7/7Oz333HOS2tfFEydO6NChQ/rHf/xHx/3nn39eNptNY8aM6bYXm82mhIQEHT16VJJ04sQJFRcXa/jw4Ro0aJDnFhrGI7CgV1pbW2Wz2a74FFZaWurYqJ0/f14vvPCCtmzZooiICEnS4MGD9ZOf/ESbNm3ShAkTlJCQoOnTp6ulpUWSlJSU5PjUdPDgQWVlZTnGfv3115WUlKQxY8Y4prsa57PPPtPdd98tSSovL9ddd93l1Ker1/nhD3+oZcuWafLkyRo1apRsNpskqaqqStOnT1dycrLuvfde1dXVeeYPCRimJ+u21B4kOtYrX19fPf/889q1a5ck6YEHHtDhw4d15MgR3X///bLZbLrtttsc9ydNmuQYoyOwuFr3bDabHn74YUdgeemll/Tggw86XtvVuulq2+DqdbravsAsBBb0ytGjR/XNN99o6NChjmnFxcU6deqUY6O2Y8cOTZs2zammw/3336+SkhIdPnxYQ4cO1b59+/Ttt9+qvr7e8anp8OHDSkhIkNQeftauXau//OUvstlsWr9+vctxpPaQ0rEhvHzDKqnb17HZbPr+97+vjz76SE8//bTeeecdtbS06KmnntL69etltVr16KOPasOGDR78awLm6Mm63dbWpqqqKt1xxx2OmsDAQDU2Nurbb79VZWWlYmNjFR8fr0ceeUQFBQX68ssvHfcPHjzoGCM2NlZS1+teW1ubqqur9aMf/UiVlZX6/PPP9fnnn2vIkCEaM2ZMt+umq21DV6/javsCsxBY0CtlZWWSpNdee01VVVV6//33lZ2dLUm6ePGipPYNw3d3K0vtG7vXX39d48eP19ixY/WnP/1JQUFBOnbsmEaPHu2ou/zTl7+/v86fP6+f//znKi8v18CBA12O09zcLEkKDg6W5BxeJLl8nYaGBvn4+OiJJ56QJF26dEkDBw5UYWGhysvL9aMf/UiJiYl69dVXNWDAAA/9JQGz9GTdPn78uIYMGeK0HlRXV2vEiBFqbm5WUFCQ47nDhw871r/L73eMERAQ4HLdO378uKKjoxUXF6e//vWveumll/TLX/7S8SHD1brpatvg6nW62r7APAQW9EpZWZkyMjL0+eefKyEhQc8//7xefPFFhYWF6be//a0k6ZZbbpHdbr9i3jfffFOVlZX68MMP9emnn2rQoEGKj4+/4nj2J5984tjzERoa6ghADz/8sAoLC7sd5/I9Kl097up1bDabxo8f75h++PBh3XXXXTp8+LBWrVrlOFZfUVGhX/ziF577YwIG6cm6/d11SpI2btyomTNnXnEItqqqyvEB4fL7l6+Hrta9jpqOvTenTp3S1KlTHdNdrZvdbRu6ep2uti8wD4EFvfLpp58qJSVFu3bt0jfffKPS0lI9+uijqq+v1x/+8AdJ7btkN2/erL/97W+SpIaGBm3atEnl5eWaPHmygoODtXbtWjU1Nel73/uevvzyS8cnm48++kjl5eUaNWqUpPYNXWhoqObMmaO0tDS1tLS4HOfy81eam5t1/vx5DR8+3NG7q9ex2WxOV0F0fIqLiorSBx984Jj+2WefXbO/K+BtPVm3bTab4uPjJbXvMf2v//ovFRYWasmSJU6HWM+dO6eBAwfKz8/P6X7HGJcHlq7WvctrlixZotWrV0uSjhw5ovj4eJfrpqttg6vX6Wr7AvMQWNArn376qWOj5MqkSZOUm5uradOmKSEhQffcc48uXbqkOXPm6Ne//rV+8IMf6Pjx445x7r//fm3btk3Z2dnavXu34uLi5OPjI0n6t3/7N915550aN26cfHx8NGvWLJfjXB5YKioqHMfIO7h6HZvN5pjv22+/1VdffaXBgwdr3rx5+uqrrxQbG6uxY8dq06ZNHv1bAibpybpts9m0ceNGJScnKzk5WXv37tXevXt12223uTwEdPn9jjEuDyxdrXuX12RlZWnMmDGqq6tTaGiogoODXa6brrYNrl6nq+0LzMOPH8JtNTU1GjJkiMrLyx2fsgDc+Fi3YTICCwAAMB6HhAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAw3v8DwILJt/yOfgAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "ax.boxplot([ct_ate, naive_ate])\n", + "ax.set_xticklabels(['$\\hat{\\mu}_{CausalTune}$', '$\\hat{\\mu}_{DiffInMeans}$'])\n", + "plt.axhline(y = TRUE_EFFECT, color = 'b', linestyle = '--')\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Segmentation with Wise Pizza" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The underlying estimators of CausalTune provide heterogeneous treatment effect estimates. Apart from simply predicting treatment effects for customers with certain characteristics, one can also perform an automatic segmentation of customers by treatment impact via [wise-pizza](https://github.com/transferwise/wise-pizza/tree/main) as we demonstrate here.\n", + "\n", + "In the synthetic dataset at hand, there are heterogeneous treatment effects by category, e.g. $.5*$TRUE_EFFECT if $X_1=1$ or $-.5*$TRUE_EFFECT if $X_1=2$\n", + "\n", + "The plot below displays an automated selection of relevant segments by CATE." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "segments = list(set(cd.data.columns) - set([cd.treatment]) - set(cd.outcomes) - set(['random']) - set(['X_continuous']))\n", + "\n", + "df_effects = ct_ab.test_df[segments + [cd.treatment]]\n", + "df_effects['CATE'] = ct_ab.effect(ct_ab.test_df)\n", + "df_eff_by_seg = df_effects.groupby(by=segments, as_index=False).agg({'CATE':'sum', 'variant': len}).rename(columns={'variant': 'size'})" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:min_segments parameter is deprecated, please use max_segments instead.\n", + "WARNING:root:min_segments parameter is deprecated, please use max_segments instead.\n" + ] + }, + { + "data": { + "image/png": "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IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1Av8flvxAw6CXgQQAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "max_depth = 3\n", + "min_segments = 3\n", + "\n", + "sf = wp.explain_levels(\n", + " df=df_eff_by_seg,\n", + " dims=segments,\n", + " total_name='CATE',\n", + " size_name='size',\n", + " max_depth=max_depth,\n", + " min_segments=min_segments,\n", + ")\n", + "sf.plot(plot_is_static=False)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 0979e32399eccbdd47c56c5585114bdb1cc35a11 Mon Sep 17 00:00:00 2001 From: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:49:38 +0100 Subject: [PATCH 3/6] Delete notebooks/AB testing.ipynb Signed-off-by: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> --- notebooks/AB testing.ipynb | 1288 ------------------------------------ 1 file changed, 1288 deletions(-) delete mode 100644 notebooks/AB testing.ipynb diff --git a/notebooks/AB testing.ipynb b/notebooks/AB testing.ipynb deleted file mode 100644 index b9485371..00000000 --- a/notebooks/AB testing.ipynb +++ /dev/null @@ -1,1288 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# AB Testing with CausalTune" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: seaborn in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (0.13.2)\n", - "\u001b[31mERROR: Could not find a version that satisfies the requirement as (from versions: none)\u001b[0m\u001b[31m\n", - "\u001b[0m\u001b[31mERROR: No matching distribution found for as\u001b[0m\u001b[31m\n", - "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", - "Requirement already satisfied: plotly in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (5.24.0)\n", - "Requirement already satisfied: tenacity>=6.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from plotly) (8.5.0)\n", - "Requirement already satisfied: packaging in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from plotly) (23.2)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "import os\n", - "import sys\n", - "import pandas as pd\n", - "import numpy as np\n", - "import warnings\n", - "\n", - "from sklearn.ensemble import RandomForestRegressor\n", - "from sklearn.metrics import mean_squared_error\n", - "\n", - "import gc\n", - "\n", - "root_path = root_path = os.path.realpath('../..')\n", - "try:\n", - " import causaltune\n", - "except ModuleNotFoundError:\n", - " sys.path.append(os.path.join(root_path, \"causaltune\"))\n", - "\n", - "from causaltune import CausalTune\n", - "from causaltune.data_utils import CausalityDataset\n", - "from causaltune.datasets import generate_synth_data_with_categories\n", - "\n", - "from flaml import AutoML\n", - "import matplotlib.pyplot as plt\n", - "%pip install seaborn as sns\n", - "import seaborn as sns\n", - "%matplotlib inline\n", - "\n", - "warnings.filterwarnings(\"ignore\")\n", - "\n", - "%pip install plotly\n", - "import plotly.io as pio\n", - "pio.renderers.default = \"png\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*Note*: This notebook uses the the package *wise-pizza* which is not listed as a requirement to run CausalTune. It is merely used to showcase what is possible as an AB testing workflow.\n", - "\n", - "Install via\n", - "`pip install wise-pizza`" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: wise_pizza in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (0.2.7)\n", - "Requirement already satisfied: ipython in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (8.26.0)\n", - "Requirement already satisfied: kaleido in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (0.2.1)\n", - "Requirement already satisfied: numpy in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.23.5)\n", - "Requirement already satisfied: pandas in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.5.3)\n", - "Requirement already satisfied: pytest in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (8.3.2)\n", - "Requirement already satisfied: plotly in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (5.24.0)\n", - "Requirement already satisfied: scikit-learn in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.1.3)\n", - "Requirement already satisfied: scipy>=1.8.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.12.0)\n", - "Requirement already satisfied: tqdm in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (4.66.5)\n", - "Requirement already satisfied: cloudpickle in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (3.0.0)\n", - "Requirement already satisfied: pivottablejs in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (0.9.0)\n", - "Requirement already satisfied: streamlit==1.32.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from wise_pizza) (1.32.0)\n", - "Requirement already satisfied: altair<6,>=4.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (5.4.1)\n", - "Requirement already satisfied: blinker<2,>=1.0.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (1.8.2)\n", - "Requirement already satisfied: cachetools<6,>=4.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (5.5.0)\n", - "Requirement already satisfied: click<9,>=7.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (8.1.7)\n", - "Requirement already satisfied: packaging<24,>=16.8 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (23.2)\n", - "Requirement already satisfied: pillow<11,>=7.1.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (10.4.0)\n", - "Requirement already satisfied: protobuf<5,>=3.20 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (4.25.4)\n", - "Requirement already satisfied: pyarrow>=7.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (17.0.0)\n", - "Requirement already satisfied: requests<3,>=2.27 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (2.32.3)\n", - "Requirement already satisfied: rich<14,>=10.14.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (13.8.0)\n", - "Requirement already satisfied: tenacity<9,>=8.1.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (8.5.0)\n", - "Requirement already satisfied: toml<2,>=0.10.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (0.10.2)\n", - "Requirement already satisfied: typing-extensions<5,>=4.3.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (4.11.0)\n", - "Requirement already satisfied: gitpython!=3.1.19,<4,>=3.0.7 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (3.1.43)\n", - "Requirement already satisfied: pydeck<1,>=0.8.0b4 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (0.9.1)\n", - "Requirement already satisfied: tornado<7,>=6.0.3 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from streamlit==1.32.0->wise_pizza) (6.4.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pandas->wise_pizza) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pandas->wise_pizza) (2024.1)\n", - "Requirement already satisfied: decorator in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (5.1.1)\n", - "Requirement already satisfied: jedi>=0.16 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (0.19.1)\n", - "Requirement already satisfied: matplotlib-inline in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (0.1.7)\n", - "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (3.0.47)\n", - "Requirement already satisfied: pygments>=2.4.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (2.18.0)\n", - "Requirement already satisfied: stack-data in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (0.6.3)\n", - "Requirement already satisfied: traitlets>=5.13.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (5.14.3)\n", - "Requirement already satisfied: exceptiongroup in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (1.2.2)\n", - "Requirement already satisfied: pexpect>4.3 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from ipython->wise_pizza) (4.9.0)\n", - "Requirement already satisfied: iniconfig in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pytest->wise_pizza) (2.0.0)\n", - "Requirement already satisfied: pluggy<2,>=1.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pytest->wise_pizza) (1.5.0)\n", - "Requirement already satisfied: tomli>=1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pytest->wise_pizza) (2.0.1)\n", - "Requirement already satisfied: joblib>=1.0.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from scikit-learn->wise_pizza) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from scikit-learn->wise_pizza) (3.5.0)\n", - "Requirement already satisfied: jinja2 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (3.1.4)\n", - "Requirement already satisfied: jsonschema>=3.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (4.23.0)\n", - "Requirement already satisfied: narwhals>=1.5.2 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (1.5.5)\n", - "Requirement already satisfied: gitdb<5,>=4.0.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from gitpython!=3.1.19,<4,>=3.0.7->streamlit==1.32.0->wise_pizza) (4.0.11)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jedi>=0.16->ipython->wise_pizza) (0.8.4)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from pexpect>4.3->ipython->wise_pizza) (0.7.0)\n", - "Requirement already satisfied: wcwidth in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython->wise_pizza) (0.2.13)\n", - "Requirement already satisfied: six>=1.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from python-dateutil>=2.8.1->pandas->wise_pizza) (1.16.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (3.8)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (2.2.2)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from requests<3,>=2.27->streamlit==1.32.0->wise_pizza) (2024.7.4)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from rich<14,>=10.14.0->streamlit==1.32.0->wise_pizza) (3.0.0)\n", - "Requirement already satisfied: executing>=1.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from stack-data->ipython->wise_pizza) (2.0.1)\n", - "Requirement already satisfied: asttokens>=2.1.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from stack-data->ipython->wise_pizza) (2.4.1)\n", - "Requirement already satisfied: pure-eval in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from stack-data->ipython->wise_pizza) (0.2.3)\n", - "Requirement already satisfied: smmap<6,>=3.0.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->gitpython!=3.1.19,<4,>=3.0.7->streamlit==1.32.0->wise_pizza) (5.0.1)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jinja2->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (2.1.5)\n", - "Requirement already satisfied: attrs>=22.2.0 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (24.2.0)\n", - "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (2023.12.1)\n", - "Requirement already satisfied: referencing>=0.28.4 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (0.35.1)\n", - "Requirement already satisfied: rpds-py>=0.7.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit==1.32.0->wise_pizza) (0.20.0)\n", - "Requirement already satisfied: mdurl~=0.1 in /Users/alexander.polyakov/opt/anaconda3/envs/causaltune310/lib/python3.10/site-packages (from markdown-it-py>=2.2.0->rich<14,>=10.14.0->streamlit==1.32.0->wise_pizza) (0.1.2)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "%pip install wise_pizza" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import wise_pizza as wp" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CausalTune for AB Testing \n", - "\n", - "CausalTune can be used for AB Testing in two ways:\n", - "1. Variance Reduction\n", - "2. Segmentation analysis\n", - "\n", - "#### 1. Variance Reduction\n", - "A standard variance reduction technique is to control for natural variation in the experiment's outcome metric. The simplest way to do so is by running a simple regression with a selection of controls. A potentially more powerful and automated approach is to run CausalTune. \n", - "\n", - "#### 2. Segmentation Analysis\n", - "\n", - "We use the heterogeneous treatment effect estimates from CausalTune to feed them into the segmentation analytics tool Wise-Pizza." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Data Generating Process" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first create synthetic data from a DGP with perfect randomisation of the treatment as we are replicating an AB test environment" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is substantial variation within the outcome metric per variant which can be seen from the cdf per variant:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "TRUE_EFFECT = 0.1\n", - "cd = generate_synth_data_with_categories(n_samples=8000, n_x=3, true_effect=TRUE_EFFECT)\n", - "cd.preprocess_dataset()\n", - "sns.ecdfplot(data=cd.data, x=cd.outcomes[0], hue=cd.treatment)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1. ATE estimation: Running CausalTune\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# CausalTune configuration\n", - "num_samples = 5\n", - "components_time_budget = 10\n", - "train_size = 0.7\n", - "\n", - "target = cd.outcomes[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if outcome_model=\"auto\" in the CausalTune constructor, we search over a simultaneous search space for the EconML estimators and for FLAML wrappers for common regressors. The old behavior is now achieved by outcome_model=\"nested\" (the default for now)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_model:Causal Graph not provided. DoWhy will construct a graph based on data inputs.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Error instantiating catboost: No module named 'catboost'\n", - "Error instantiating catboost: No module named 'catboost'\n", - "[flaml.tune.tune: 08-29 21:46:48] {540} WARNING - Using CFO for search. To use BlendSearch, run: pip install flaml[blendsearch]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:flaml.tune.searcher.blendsearch:No low-cost partial config given to the search algorithm. For cost-frugal search, consider providing low-cost values for cost-related hps via 'low_cost_partial_config'. More info can be found at https://microsoft.github.io/FLAML/docs/FAQ#about-low_cost_partial_config-in-tune\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:48] {811} INFO - trial 1 config: {'estimator': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy'}, 'outcome_estimator': {'n_estimators': 547, 'max_depth': 2, 'min_child_weight': 0.07127593264582609, 'learning_rate': 0.012574061220730454, 'subsample': 0.7799382082329364, 'colsample_bylevel': 0.27372849622649437, 'colsample_bytree': 0.7586485757795598, 'reg_alpha': 0.001179369359230076, 'reg_lambda': 40.6823897252797, 'estimator_name': 'xgboost_limit_depth'}}\n", - "[flaml.tune.tune: 08-29 21:46:49] {202} INFO - result: {'energy_distance': 0.01178114739897218, 'estimator_name': 'backdoor.causaltune.models.NaiveDummy', 'scores': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.827246686895258, 'prob_erupt': 0.040429780475488536, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -5.684380868285524, 'auc': 0.4399285906935892, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.981599\n", - "1 1 2.208769 0.504643 True False 1.981599\n", - "2 0 2.349724 0.504643 True True 0.000000\n", - "3 1 2.126777 0.504643 True True 1.981599\n", - "4 0 3.615650 0.504643 True False 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 True True 1.981599\n", - "5597 1 0.531444 0.504643 True False 1.981599\n", - "5598 0 1.748540 0.504643 True True 0.000000\n", - "5599 1 1.148288 0.504643 True False 1.981599\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.07407473754132139, 'ate_std': 7.519703414089599e-06, 'energy_distance': 0.006356368423362291, 'psw_energy_distance': 0.006356364714663609, 'codec': inf}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8285033072963655, 'prob_erupt': 0.0663247694730707, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -7.076018585182319, 'auc': 0.45270698461428893, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.915403\n", - "1 1 0.456353 0.504643 True True 1.915403\n", - "2 0 2.826911 0.504643 True True 0.000000\n", - "3 0 2.420919 0.504643 True True 0.000000\n", - "4 1 3.184911 0.504643 True True 1.915403\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 True True 0.000000\n", - "2396 1 1.987323 0.504643 True True 1.915403\n", - "2397 0 1.531595 0.504643 True True 0.000000\n", - "2398 1 1.895474 0.504643 True True 1.915403\n", - "2399 0 2.632751 0.504643 True True 0.000000\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.12187383722280293, 'ate_std': 1.1892256875195286e-05, 'energy_distance': 0.01178114739897218, 'psw_energy_distance': 0.011781114715468277, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy'}, 'outcome_estimator': {'n_estimators': 547, 'max_depth': 2, 'min_child_weight': 0.07127593264582609, 'learning_rate': 0.012574061220730454, 'subsample': 0.7799382082329364, 'colsample_bylevel': 0.27372849622649437, 'colsample_bytree': 0.7586485757795598, 'reg_alpha': 0.001179369359230076, 'reg_lambda': 40.6823897252797, 'estimator_name': 'xgboost_limit_depth'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.causaltune.models.NaiveDummy'}, 'config/outcome_estimator': {'n_estimators': 547, 'max_depth': 2, 'min_child_weight': 0.07127593264582609, 'learning_rate': 0.012574061220730454, 'subsample': 0.7799382082329364, 'colsample_bylevel': 0.27372849622649437, 'colsample_bytree': 0.7586485757795598, 'reg_alpha': 0.001179369359230076, 'reg_lambda': 40.6823897252797, 'estimator_name': 'xgboost_limit_depth'}, 'experiment_tag': 'exp', 'time_total_s': 1.0666389465332031}\n", - "[flaml.tune.tune: 08-29 21:46:49] {811} INFO - trial 2 config: {'estimator': {'estimator_name': 'backdoor.causaltune.models.Dummy'}, 'outcome_estimator': {'alpha': 0.0023836674367948983, 'l1_ratio': 0.07478461832495154, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}\n", - "[flaml.tune.tune: 08-29 21:46:50] {202} INFO - result: {'energy_distance': 0.011781128343663294, 'estimator_name': 'backdoor.causaltune.models.Dummy', 'scores': {'estimator_name': 'backdoor.causaltune.models.Dummy', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.8471717191611419, 'prob_erupt': 0.0404297785296667, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': 3.8109728274960677, 'auc': 0.5326662349888922, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.981599\n", - "1 1 2.208769 0.504643 True True 1.981599\n", - "2 0 2.349724 0.504643 True False 0.000000\n", - "3 1 2.126777 0.504643 True False 1.981599\n", - "4 0 3.615650 0.504643 True False 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True False 0.000000\n", - "5596 1 1.457613 0.504643 True False 1.981599\n", - "5597 1 0.531444 0.504643 True True 1.981599\n", - "5598 0 1.748540 0.504643 True True 0.000000\n", - "5599 1 1.148288 0.504643 True False 1.981599\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.07407473124911097, 'ate_std': 7.335269535792448e-06, 'energy_distance': 0.006356361533432775, 'psw_energy_distance': 0.0063563659692920105, 'codec': inf}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8119857216793858, 'prob_erupt': 0.06632480251301, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -9.049384243473757, 'auc': 0.4253220616195626, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True True 1.915403\n", - "1 1 0.456353 0.504643 True True 1.915403\n", - "2 0 2.826911 0.504643 True True 0.000000\n", - "3 0 2.420919 0.504643 True True 0.000000\n", - "4 1 3.184911 0.504643 True True 1.915403\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 True True 0.000000\n", - "2396 1 1.987323 0.504643 True False 1.915403\n", - "2397 0 1.531595 0.504643 True True 0.000000\n", - "2398 1 1.895474 0.504643 True True 1.915403\n", - "2399 0 2.632751 0.504643 True False 0.000000\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.12187390105544248, 'ate_std': 1.2019446318880245e-05, 'energy_distance': 0.011781128343663294, 'psw_energy_distance': 0.011781137478164005, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.causaltune.models.Dummy'}, 'outcome_estimator': {'alpha': 0.0023836674367948983, 'l1_ratio': 0.07478461832495154, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.causaltune.models.Dummy'}, 'config/outcome_estimator': {'alpha': 0.0023836674367948983, 'l1_ratio': 0.07478461832495154, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}, 'experiment_tag': 'exp', 'time_total_s': 0.9152491092681885}\n", - "[flaml.tune.tune: 08-29 21:46:50] {811} INFO - trial 3 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'lgbm'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, SLearner. EconML metalearners accept a single X argument.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:51] {202} INFO - result: {'energy_distance': 0.015154507115999749, 'estimator_name': 'backdoor.econml.metalearners.SLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.SLearner', 'train': {'erupt': 1.8321824668499638, 'norm_erupt': 1.8321824668499638, 'prob_erupt': -2.423826326717233e-16, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -14.959762031023702, 'auc': 0.45728931226852987, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 False False 0.000000\n", - "1 1 2.208769 0.504643 False False 0.000000\n", - "2 0 2.349724 0.504643 False False 2.018745\n", - "3 1 2.126777 0.504643 False False 0.000000\n", - "4 0 3.615650 0.504643 False False 2.018745\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 False False 2.018745\n", - "5596 1 1.457613 0.504643 False False 0.000000\n", - "5597 1 0.531444 0.504643 False False 0.000000\n", - "5598 0 1.748540 0.504643 False False 2.018745\n", - "5599 1 1.148288 0.504643 False False 0.000000\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.0, 'ate_std': 0.0, 'energy_distance': 0.0068736152018216146, 'psw_energy_distance': 0.006873615201732797, 'codec': inf}, 'validation': {'erupt': 1.8375308421693648, 'norm_erupt': 1.8375308421693648, 'prob_erupt': -3.6251571918578925e-16, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -7.6775733687346435, 'auc': 0.4550101918996407, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 False False 0.000000\n", - "1 1 0.456353 0.504643 False False 0.000000\n", - "2 0 2.826911 0.504643 False False 2.092415\n", - "3 0 2.420919 0.504643 False False 2.092415\n", - "4 1 3.184911 0.504643 False False 0.000000\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 False False 2.092415\n", - "2396 1 1.987323 0.504643 False False 0.000000\n", - "2397 0 1.531595 0.504643 False False 2.092415\n", - "2398 1 1.895474 0.504643 False False 0.000000\n", - "2399 0 2.632751 0.504643 False False 2.092415\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.0, 'ate_std': 0.0, 'energy_distance': 0.015154507115999749, 'psw_energy_distance': 0.015154507115982874, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'lgbm'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'config/outcome_estimator': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'lgbm'}, 'experiment_tag': 'exp', 'time_total_s': 1.2199647426605225}\n", - "[flaml.tune.tune: 08-29 21:46:51] {811} INFO - trial 4 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_neighbors': 5, 'estimator_name': 'knn'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, SLearner. EconML metalearners accept a single X argument.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:53] {202} INFO - result: {'energy_distance': 0.007571183883996024, 'estimator_name': 'backdoor.econml.metalearners.SLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.SLearner', 'train': {'erupt': 1.990038970501367, 'norm_erupt': 1.9282427425856992, 'prob_erupt': 0.1149441173922305, 'frobenius_norm': 0.6215365639720993, 'policy_risk': 0.37775401048623847, 'qini': 229.8266937604852, 'auc': 1.5778389432560949, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.922180\n", - "1 1 2.208769 0.504643 False False 0.000000\n", - "2 0 2.349724 0.504643 False False 1.958212\n", - "3 1 2.126777 0.504643 True True 1.922180\n", - "4 0 3.615650 0.504643 True False 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 False False 0.000000\n", - "5597 1 0.531444 0.504643 True True 1.922180\n", - "5598 0 1.748540 0.504643 False False 1.958212\n", - "5599 1 1.148288 0.504643 True True 1.922180\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.08877632135428, 'ate_std': 0.2855804742258309, 'energy_distance': 0.002295850512915365, 'psw_energy_distance': 0.0022958505128234385, 'codec': -0.011680266977530916}, 'validation': {'erupt': 2.029623852369111, 'norm_erupt': 1.9448896135685978, 'prob_erupt': 0.11353866487779433, 'frobenius_norm': 0.6202759036351181, 'policy_risk': 0.33794671946784405, 'qini': 103.02652352544624, 'auc': 1.1658812415831805, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.927036\n", - "1 1 0.456353 0.504643 False False 0.000000\n", - "2 0 2.826911 0.504643 False False 1.963159\n", - "3 0 2.420919 0.504643 True False 0.000000\n", - "4 1 3.184911 0.504643 True False 1.927036\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 False False 1.963159\n", - "2396 1 1.987323 0.504643 True False 1.927036\n", - "2397 0 1.531595 0.504643 True False 0.000000\n", - "2398 1 1.895474 0.504643 True False 1.927036\n", - "2399 0 2.632751 0.504643 False False 1.963159\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.0889300032900231, 'ate_std': 0.2821626862806024, 'energy_distance': 0.007571183883996024, 'psw_energy_distance': 0.007571183883984478, 'codec': -0.03142875928726412}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_neighbors': 5, 'estimator_name': 'knn'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'config/outcome_estimator': {'n_neighbors': 5, 'estimator_name': 'knn'}, 'experiment_tag': 'exp', 'time_total_s': 1.6983869075775146}\n", - "[flaml.tune.tune: 08-29 21:46:53] {811} INFO - trial 5 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 10, 'max_depth': 6, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.29999999999999993, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'xgboost_limit_depth'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, SLearner. EconML metalearners accept a single X argument.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:54] {202} INFO - result: {'energy_distance': 0.009499014542320161, 'estimator': , 'estimator_name': 'backdoor.econml.metalearners.SLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.SLearner', 'train': {'erupt': 1.9835242638307409, 'norm_erupt': 1.9191205775246483, 'prob_erupt': 0.062220006977996546, 'frobenius_norm': 0.6210366993793562, 'policy_risk': 0.3967556746953316, 'qini': 205.73899676519733, 'auc': 1.4886076561337334, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.936655\n", - "1 1 2.208769 0.504643 False False 0.000000\n", - "2 0 2.349724 0.504643 False False 1.972958\n", - "3 1 2.126777 0.504643 True False 1.936655\n", - "4 0 3.615650 0.504643 False False 1.972958\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 False False 0.000000\n", - "5597 1 0.531444 0.504643 True True 1.936655\n", - "5598 0 1.748540 0.504643 False False 1.972958\n", - "5599 1 1.148288 0.504643 True True 1.936655\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.06316475133677678, 'ate_std': 0.13894576586166096, 'energy_distance': 0.0031207210938908325, 'psw_energy_distance': 0.003120721093797574, 'codec': -0.007809316854542985}, 'validation': {'erupt': 2.0273410279724917, 'norm_erupt': 1.9533617172389612, 'prob_erupt': 0.060077854767759675, 'frobenius_norm': 0.6203686921366824, 'policy_risk': 0.3605904733897548, 'qini': 107.62266689806987, 'auc': 1.1951199698622845, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.907849\n", - "1 1 0.456353 0.504643 False False 0.000000\n", - "2 0 2.826911 0.504643 False False 1.943613\n", - "3 0 2.420919 0.504643 True False 0.000000\n", - "4 1 3.184911 0.504643 False False 0.000000\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 False False 1.943613\n", - "2396 1 1.987323 0.504643 True False 1.907849\n", - "2397 0 1.531595 0.504643 True False 0.000000\n", - "2398 1 1.895474 0.504643 True False 1.907849\n", - "2399 0 2.632751 0.504643 False False 1.943613\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.06003390231790642, 'ate_std': 0.13574010010578175, 'energy_distance': 0.009499014542320161, 'psw_energy_distance': 0.009499014542305062, 'codec': -0.022126792342965284}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'outcome_estimator': {'n_estimators': 10, 'max_depth': 6, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.29999999999999993, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'xgboost_limit_depth'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.SLearner'}, 'config/outcome_estimator': {'n_estimators': 10, 'max_depth': 6, 'min_child_weight': 0.9999999999999993, 'learning_rate': 0.29999999999999993, 'subsample': 1.0, 'colsample_bylevel': 1.0, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0, 'estimator_name': 'xgboost_limit_depth'}, 'experiment_tag': 'exp', 'time_total_s': 1.1325089931488037}\n", - "[flaml.tune.tune: 08-29 21:46:54] {811} INFO - trial 6 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'fit_intercept': True, 'eps': 2.220446049250313e-16, 'estimator_name': 'lasso_lars'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, DomainAdaptationLearner. EconML metalearners accept a single X argument.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:55] {202} INFO - result: {'energy_distance': 0.010839801195992926, 'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.8321824668499638, 'prob_erupt': 0.040429757605700646, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -6.666439696668824, 'auc': 0.45728931226852987, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.981599\n", - "1 1 2.208769 0.504643 True False 1.981599\n", - "2 0 2.349724 0.504643 True False 0.000000\n", - "3 1 2.126777 0.504643 True False 1.981599\n", - "4 0 3.615650 0.504643 True False 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True False 0.000000\n", - "5596 1 1.457613 0.504643 True False 1.981599\n", - "5597 1 0.531444 0.504643 True False 1.981599\n", - "5598 0 1.748540 0.504643 True False 0.000000\n", - "5599 1 1.148288 0.504643 True False 1.981599\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.07407469302415848, 'ate_std': 0.0, 'energy_distance': 0.0046082570463408246, 'psw_energy_distance': 0.004608257046253783, 'codec': inf}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8375308421693648, 'prob_erupt': 0.04031208147598027, 'frobenius_norm': inf, 'policy_risk': 0, 'qini': -5.560894293566197, 'auc': 0.4550101918996407, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.915403\n", - "1 1 0.456353 0.504643 True False 1.915403\n", - "2 0 2.826911 0.504643 True False 0.000000\n", - "3 0 2.420919 0.504643 True False 0.000000\n", - "4 1 3.184911 0.504643 True False 1.915403\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 True False 0.000000\n", - "2396 1 1.987323 0.504643 True False 1.915403\n", - "2397 0 1.531595 0.504643 True False 0.000000\n", - "2398 1 1.895474 0.504643 True False 1.915403\n", - "2399 0 2.632751 0.504643 True False 0.000000\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.07407469302415848, 'ate_std': 0.0, 'energy_distance': 0.010839801195992926, 'psw_energy_distance': 0.01083980119597694, 'codec': inf}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'fit_intercept': True, 'eps': 2.220446049250313e-16, 'estimator_name': 'lasso_lars'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'config/outcome_estimator': {'alpha': 0.09999999999999991, 'fit_intercept': True, 'eps': 2.220446049250313e-16, 'estimator_name': 'lasso_lars'}, 'experiment_tag': 'exp', 'time_total_s': 0.9906589984893799}\n", - "[flaml.tune.tune: 08-29 21:46:55] {811} INFO - trial 7 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'extra_trees'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, DomainAdaptationLearner. EconML metalearners accept a single X argument.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:56] {202} INFO - result: {'energy_distance': 0.009336123303534283, 'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'train': {'erupt': 1.939013175306148, 'norm_erupt': 1.919090820643322, 'prob_erupt': 0.05695999738198798, 'frobenius_norm': 0.6204567840019323, 'policy_risk': 0.22228283447739627, 'qini': 213.63376755471728, 'auc': 1.527831526984752, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.956111\n", - "1 1 2.208769 0.504643 False False 0.000000\n", - "2 0 2.349724 0.504643 True False 0.000000\n", - "3 1 2.126777 0.504643 True True 1.956111\n", - "4 0 3.615650 0.504643 True False 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 True False 1.956111\n", - "5597 1 0.531444 0.504643 True True 1.956111\n", - "5598 0 1.748540 0.504643 False False 1.992779\n", - "5599 1 1.148288 0.504643 True True 1.956111\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.08465927726747133, 'ate_std': 0.09121982513249718, 'energy_distance': 0.0035303911141593147, 'psw_energy_distance': 0.003530391114071385, 'codec': 0.0}, 'validation': {'erupt': 1.9910267913620905, 'norm_erupt': 1.9618018013436025, 'prob_erupt': 0.05597323564087899, 'frobenius_norm': 0.6201138184067148, 'policy_risk': 0.1608809199383363, 'qini': 109.76284704861612, 'auc': 1.1926154978630246, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.894576\n", - "1 1 0.456353 0.504643 False False 0.000000\n", - "2 0 2.826911 0.504643 True False 0.000000\n", - "3 0 2.420919 0.504643 True False 0.000000\n", - "4 1 3.184911 0.504643 True False 1.894576\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 False False 1.930091\n", - "2396 1 1.987323 0.504643 True False 1.894576\n", - "2397 0 1.531595 0.504643 True False 0.000000\n", - "2398 1 1.895474 0.504643 True False 1.894576\n", - "2399 0 2.632751 0.504643 False False 1.930091\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.0841628836227576, 'ate_std': 0.08904636359841733, 'energy_distance': 0.009336123303534283, 'psw_energy_distance': 0.009336123303519184, 'codec': -0.01643372753801259}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'extra_trees'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'config/outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'extra_trees'}, 'experiment_tag': 'exp', 'time_total_s': 1.0738990306854248}\n", - "[flaml.tune.tune: 08-29 21:46:56] {811} INFO - trial 8 config: {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'l1_ratio': 0.5, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:dowhy.causal_estimator:Concatenating common_causes and effect_modifiers and providing a single list of variables to metalearner estimator method, DomainAdaptationLearner. EconML metalearners accept a single X argument.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.tune.tune: 08-29 21:46:57] {202} INFO - result: {'energy_distance': 0.010023136194746485, 'estimator': , 'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'scores': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner', 'train': {'erupt': 1.9062572379313383, 'norm_erupt': 1.919090820643322, 'prob_erupt': 0.05040862691452446, 'frobenius_norm': 0.6219501175254194, 'policy_risk': 0.04687138103434385, 'qini': 64.47307008614447, 'auc': 0.7830414531613435, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True False 1.981599\n", - "1 1 2.208769 0.504643 True False 1.981599\n", - "2 0 2.349724 0.504643 True False 0.000000\n", - "3 1 2.126777 0.504643 True True 1.981599\n", - "4 0 3.615650 0.504643 True False 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 True False 1.981599\n", - "5597 1 0.531444 0.504643 True True 1.981599\n", - "5598 0 1.748540 0.504643 True False 0.000000\n", - "5599 1 1.148288 0.504643 True True 1.981599\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.0907094513811171, 'ate_std': 0.04335250457975112, 'energy_distance': 0.0043815819532162514, 'psw_energy_distance': 0.004381581953130098, 'codec': -0.004007679385649148}, 'validation': {'erupt': 1.9594045594152263, 'norm_erupt': 1.8218538307681225, 'prob_erupt': 0.04980759540850268, 'frobenius_norm': 0.6218190171437235, 'policy_risk': -0.013889249000879733, 'qini': 33.44124892982546, 'auc': 0.7381518120274893, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True True 1.915403\n", - "1 1 0.456353 0.504643 True False 1.915403\n", - "2 0 2.826911 0.504643 True False 0.000000\n", - "3 0 2.420919 0.504643 True False 0.000000\n", - "4 1 3.184911 0.504643 True False 1.915403\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 True False 0.000000\n", - "2396 1 1.987323 0.504643 True False 1.915403\n", - "2397 0 1.531595 0.504643 True False 0.000000\n", - "2398 1 1.895474 0.504643 True True 1.915403\n", - "2399 0 2.632751 0.504643 True False 0.000000\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.0897886262461543, 'ate_std': 0.043750552277535555, 'energy_distance': 0.010023136194746485, 'psw_energy_distance': 0.01002313619473627, 'codec': -0.02600285397177739}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'outcome_estimator': {'alpha': 0.09999999999999991, 'l1_ratio': 0.5, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.metalearners.DomainAdaptationLearner'}, 'config/outcome_estimator': {'alpha': 0.09999999999999991, 'l1_ratio': 0.5, 'selection': 'cyclic', 'estimator_name': 'elastic_net'}, 'experiment_tag': 'exp', 'time_total_s': 1.0965139865875244}\n", - "[flaml.tune.tune: 08-29 21:46:57] {811} INFO - trial 9 config: {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'random_forest'}}\n", - "[flaml.tune.tune: 08-29 21:46:59] {202} INFO - result: {'energy_distance': 0.007551496607561159, 'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'scores': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'train': {'erupt': 2.0331317286000155, 'norm_erupt': 2.0016609203627946, 'prob_erupt': 0.12089617365609993, 'frobenius_norm': 0.6605179740311135, 'policy_risk': 0.42886387748645793, 'qini': 314.7303817449756, 'auc': 1.995934551269853, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True True 1.923844\n", - "1 1 2.208769 0.504643 False False 0.000000\n", - "2 0 2.349724 0.504643 False False 1.959907\n", - "3 1 2.126777 0.504643 True True 1.923844\n", - "4 0 3.615650 0.504643 True True 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 False False 0.000000\n", - "5597 1 0.531444 0.504643 False False 0.000000\n", - "5598 0 1.748540 0.504643 False False 1.959907\n", - "5599 1 1.148288 0.504643 True True 1.923844\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.0843427979294397, 'ate_std': 0.3090224676485376, 'energy_distance': 0.002539474790569596, 'psw_energy_distance': 0.0025394747904843307, 'codec': -0.0037140820082572}, 'validation': {'erupt': 2.0250770575928803, 'norm_erupt': 1.9747226860738842, 'prob_erupt': 0.11981428508029066, 'frobenius_norm': 0.6608195412559066, 'policy_risk': 0.4124374969841177, 'qini': 115.00068135619115, 'auc': 1.2335971430016452, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.916142\n", - "1 1 0.456353 0.504643 False False 0.000000\n", - "2 0 2.826911 0.504643 False False 1.952061\n", - "3 0 2.420919 0.504643 True True 0.000000\n", - "4 1 3.184911 0.504643 False False 0.000000\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 False False 1.952061\n", - "2396 1 1.987323 0.504643 True True 1.916142\n", - "2397 0 1.531595 0.504643 True True 0.000000\n", - "2398 1 1.895474 0.504643 True False 1.916142\n", - "2399 0 2.632751 0.504643 False False 1.952061\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.0860942389988756, 'ate_std': 0.30500020556549406, 'energy_distance': 0.007551496607561159, 'psw_energy_distance': 0.007551496607551389, 'codec': -0.02202892001807501}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'random_forest'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'config/outcome_estimator': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4, 'estimator_name': 'random_forest'}, 'experiment_tag': 'exp', 'time_total_s': 1.5322060585021973}\n", - "[flaml.tune.tune: 08-29 21:46:59] {811} INFO - trial 10 config: {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'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, 'estimator_name': 'xgboost'}}\n", - "[flaml.tune.tune: 08-29 21:47:00] {202} INFO - result: {'energy_distance': 0.008459219578528021, 'estimator': , 'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'scores': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'train': {'erupt': 2.012799892375053, 'norm_erupt': 1.9758662713129778, 'prob_erupt': 0.14196593928050988, 'frobenius_norm': 0.6625471750344744, 'policy_risk': 0.4159281005585356, 'qini': 357.17542404186725, 'auc': 1.9385975925569965, 'values': variant Y p policy norm_policy weights\n", - "0 1 2.603153 0.504643 True True 1.783567\n", - "1 1 2.208769 0.504643 False False 0.000000\n", - "2 0 2.349724 0.504643 False False 1.817001\n", - "3 1 2.126777 0.504643 True True 1.783567\n", - "4 0 3.615650 0.504643 True True 0.000000\n", - "... ... ... ... ... ... ...\n", - "5595 0 2.107339 0.504643 True True 0.000000\n", - "5596 1 1.457613 0.504643 False False 0.000000\n", - "5597 1 0.531444 0.504643 False False 0.000000\n", - "5598 0 1.748540 0.504643 False False 1.817001\n", - "5599 1 1.148288 0.504643 False False 0.000000\n", - "\n", - "[5600 rows x 6 columns], 'ate': 0.0718459407391199, 'ate_std': 0.39246232393521807, 'energy_distance': 0.004731652049054791, 'psw_energy_distance': 0.004731652048978852, 'codec': -0.00524087365105592}, 'validation': {'erupt': 2.03414253131937, 'norm_erupt': 1.970688625062738, 'prob_erupt': 0.14574042051582634, 'frobenius_norm': 0.663727400912166, 'policy_risk': 0.443266980589179, 'qini': 101.42381450852616, 'auc': 1.1801372568456459, 'values': variant Y p policy norm_policy weights\n", - "0 1 0.828126 0.504643 True False 1.952890\n", - "1 1 0.456353 0.504643 False False 0.000000\n", - "2 0 2.826911 0.504643 False False 1.989498\n", - "3 0 2.420919 0.504643 True False 0.000000\n", - "4 1 3.184911 0.504643 False False 0.000000\n", - "... ... ... ... ... ... ...\n", - "2395 0 2.180190 0.504643 False False 1.989498\n", - "2396 1 1.987323 0.504643 True True 1.952890\n", - "2397 0 1.531595 0.504643 True True 0.000000\n", - "2398 1 1.895474 0.504643 False False 0.000000\n", - "2399 0 2.632751 0.504643 False False 1.989498\n", - "\n", - "[2400 rows x 6 columns], 'ate': 0.0847635089620462, 'ate_std': 0.39318837737458046, 'energy_distance': 0.008459219578528021, 'psw_energy_distance': 0.00845921957851914, 'codec': -0.032122559920929085}}, 'config': {'estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'outcome_estimator': {'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, 'estimator_name': 'xgboost'}}, 'training_iteration': 0, 'config/estimator': {'estimator_name': 'backdoor.econml.dr.ForestDRLearner', 'min_propensity': 1e-06, 'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'subforest_size': 4}, 'config/outcome_estimator': {'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, 'estimator_name': 'xgboost'}, 'experiment_tag': 'exp', 'time_total_s': 1.4891297817230225}\n" - ] - } - ], - "source": [ - "ct_ab = CausalTune(\n", - " num_samples=num_samples,\n", - " components_time_budget=components_time_budget,\n", - " metric=\"energy_distance\",\n", - " verbose=3,\n", - " components_verbose=3,\n", - " train_size=train_size,\n", - " outcome_model=\"auto\"\n", - ") \n", - "ct_ab.fit(data=cd, outcome=target)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The point estimates compare as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Difference in means estimate (naive ATE): 0.121874\n", - "CausalTune ATE estimate:: 0.086094\n", - "True ATE: 0.1\n" - ] - } - ], - "source": [ - "print(f'Difference in means estimate (naive ATE): {ct_ab.scorer.naive_ate(ct_ab.test_df[cd.treatment], ct_ab.test_df[target])[0]:5f}')\n", - "print(f'CausalTune ATE estimate:: {ct_ab.effect(ct_ab.test_df).mean():5f}')\n", - "print(f'True ATE: {TRUE_EFFECT}')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Explainable variation\n", - "\n", - "As a first performance check of this approach we test how much of the variation in the outcome metric remains unexplained with our outcome model prediction approach. \n", - "\n", - "For this, we use AutoML to predict outcomes as is done under the hood of CausalTune.\n", - "The lower the unexplained variation, the more promising it is to use CausalTune for AB Testing." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[flaml.automl.logger: 08-29 21:34:17] {1680} INFO - task = regression\n", - "[flaml.automl.logger: 08-29 21:34:17] {1691} INFO - Evaluation method: cv\n", - "[flaml.automl.logger: 08-29 21:34:17] {1789} INFO - Minimizing error metric: 1-r2\n", - "[flaml.automl.logger: 08-29 21:34:17] {1901} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'xgboost', 'extra_tree', 'xgb_limitdepth']\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 0, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2345} INFO - Estimated sufficient time budget=644s. Estimated necessary time budget=5s.\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.1s,\testimator lgbm's best error=0.6636,\tbest estimator lgbm's best error=0.6636\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 1, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.1s,\testimator lgbm's best error=0.6636,\tbest estimator lgbm's best error=0.6636\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 2, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.2s,\testimator lgbm's best error=0.3294,\tbest estimator lgbm's best error=0.3294\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 3, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.2s,\testimator lgbm's best error=0.0511,\tbest estimator lgbm's best error=0.0511\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 4, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.2s,\testimator lgbm's best error=0.0511,\tbest estimator lgbm's best error=0.0511\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 5, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.3s,\testimator lgbm's best error=0.0212,\tbest estimator lgbm's best error=0.0212\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 6, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.3s,\testimator lgbm's best error=0.0212,\tbest estimator lgbm's best error=0.0212\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 7, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.3s,\testimator lgbm's best error=0.0212,\tbest estimator lgbm's best error=0.0212\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 8, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.4s,\testimator lgbm's best error=0.0168,\tbest estimator lgbm's best error=0.0168\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 9, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.4s,\testimator xgboost's best error=1.9577,\tbest estimator lgbm's best error=0.0168\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 10, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.5s,\testimator lgbm's best error=0.0168,\tbest estimator lgbm's best error=0.0168\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 11, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:17] {2392} INFO - at 0.6s,\testimator xgboost's best error=1.9577,\tbest estimator lgbm's best error=0.0168\n", - "[flaml.automl.logger: 08-29 21:34:17] {2219} INFO - iteration 12, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 0.9s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 13, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.1s,\testimator extra_tree's best error=0.3712,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 14, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.3s,\testimator rf's best error=0.3977,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 15, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.3s,\testimator xgboost's best error=0.6103,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 16, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:18] {2392} INFO - at 1.5s,\testimator rf's best error=0.1653,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:18] {2219} INFO - iteration 17, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 1.7s,\testimator extra_tree's best error=0.1320,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 18, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 1.9s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 19, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.0s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 20, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.1s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 21, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.1s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 22, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.3s,\testimator rf's best error=0.1653,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 23, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:19] {2392} INFO - at 2.5s,\testimator rf's best error=0.0705,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:19] {2219} INFO - iteration 24, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 2.7s,\testimator extra_tree's best error=0.1320,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 25, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 2.9s,\testimator extra_tree's best error=0.0583,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 26, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.1s,\testimator rf's best error=0.0305,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 27, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.1s,\testimator xgboost's best error=0.0475,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 28, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.3s,\testimator extra_tree's best error=0.0219,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 29, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:20] {2392} INFO - at 3.5s,\testimator extra_tree's best error=0.0219,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:20] {2219} INFO - iteration 30, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 3.6s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 31, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 3.8s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 32, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.0s,\testimator rf's best error=0.0305,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 33, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.2s,\testimator extra_tree's best error=0.0169,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 34, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.4s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 35, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:21] {2392} INFO - at 4.5s,\testimator xgboost's best error=0.0348,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:21] {2219} INFO - iteration 36, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 4.7s,\testimator extra_tree's best error=0.0169,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 37, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 4.8s,\testimator rf's best error=0.0172,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 38, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 4.9s,\testimator xgboost's best error=0.0348,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 39, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 5.4s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 40, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 5.5s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 41, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:22] {2392} INFO - at 5.6s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:22] {2219} INFO - iteration 42, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 5.9s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 43, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.0s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 44, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.1s,\testimator extra_tree's best error=0.0077,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 45, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.2s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 46, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.2s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 47, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:23] {2392} INFO - at 6.4s,\testimator extra_tree's best error=0.0077,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:23] {2219} INFO - iteration 48, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 6.6s,\testimator rf's best error=0.0172,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 49, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 6.7s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 50, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 6.9s,\testimator extra_tree's best error=0.0074,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 51, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 7.1s,\testimator rf's best error=0.0097,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 52, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:24] {2392} INFO - at 7.3s,\testimator rf's best error=0.0097,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:24] {2219} INFO - iteration 53, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:25] {2392} INFO - at 8.2s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:25] {2219} INFO - iteration 54, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 8.6s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 55, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 8.7s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 56, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 8.9s,\testimator rf's best error=0.0087,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 57, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.0s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 58, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.0s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 59, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.2s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 60, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:26] {2392} INFO - at 9.4s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:26] {2219} INFO - iteration 61, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:27] {2392} INFO - at 10.1s,\testimator lgbm's best error=0.0024,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:27] {2219} INFO - iteration 62, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:27] {2392} INFO - at 10.1s,\testimator xgboost's best error=0.0046,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:27] {2219} INFO - iteration 63, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:27] {2392} INFO - at 10.4s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0024\n", - "[flaml.automl.logger: 08-29 21:34:27] {2219} INFO - iteration 64, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 10.7s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 65, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 10.9s,\testimator rf's best error=0.0087,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 66, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.0s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 67, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.2s,\testimator rf's best error=0.0057,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 68, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.4s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 69, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:28] {2392} INFO - at 11.6s,\testimator rf's best error=0.0057,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:28] {2219} INFO - iteration 70, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:29] {2392} INFO - at 11.8s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:29] {2219} INFO - iteration 71, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:29] {2392} INFO - at 12.0s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:29] {2219} INFO - iteration 72, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:29] {2392} INFO - at 12.2s,\testimator extra_tree's best error=0.0074,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:29] {2219} INFO - iteration 73, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 12.6s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 74, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 12.7s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 75, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 13.0s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 76, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 13.4s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 77, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:30] {2392} INFO - at 13.5s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:30] {2219} INFO - iteration 78, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:31] {2392} INFO - at 13.9s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:31] {2219} INFO - iteration 79, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:31] {2392} INFO - at 14.3s,\testimator lgbm's best error=0.0020,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:31] {2219} INFO - iteration 80, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 14.6s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 81, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 14.8s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 82, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 14.9s,\testimator xgb_limitdepth's best error=0.0163,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 83, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.0s,\testimator xgb_limitdepth's best error=0.0163,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 84, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.1s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 85, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.2s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 86, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.3s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 87, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.3s,\testimator xgb_limitdepth's best error=0.0037,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 88, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:32] {2392} INFO - at 15.6s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:32] {2219} INFO - iteration 89, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 15.8s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 90, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 15.9s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 91, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 16.2s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 92, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 16.4s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 93, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:33] {2392} INFO - at 16.5s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:33] {2219} INFO - iteration 94, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:34] {2392} INFO - at 16.8s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0020\n", - "[flaml.automl.logger: 08-29 21:34:34] {2219} INFO - iteration 95, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:34] {2392} INFO - at 17.1s,\testimator lgbm's best error=0.0018,\tbest estimator lgbm's best error=0.0018\n", - "[flaml.automl.logger: 08-29 21:34:34] {2219} INFO - iteration 96, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:34] {2392} INFO - at 17.3s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0018\n", - "[flaml.automl.logger: 08-29 21:34:34] {2219} INFO - iteration 97, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:35] {2392} INFO - at 17.7s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0018\n", - "[flaml.automl.logger: 08-29 21:34:35] {2219} INFO - iteration 98, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:35] {2392} INFO - at 18.0s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0018\n", - "[flaml.automl.logger: 08-29 21:34:35] {2219} INFO - iteration 99, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:35] {2392} INFO - at 18.2s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0018\n", - "[flaml.automl.logger: 08-29 21:34:35] {2219} INFO - iteration 100, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 18.7s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 101, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 18.9s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 102, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 19.3s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 103, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:36] {2392} INFO - at 19.5s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:36] {2219} INFO - iteration 104, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:38] {2392} INFO - at 20.8s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:38] {2219} INFO - iteration 105, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:38] {2392} INFO - at 21.2s,\testimator lgbm's best error=0.0017,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:38] {2219} INFO - iteration 106, current learner xgboost\n", - "[flaml.automl.logger: 08-29 21:34:38] {2392} INFO - at 21.3s,\testimator xgboost's best error=0.0036,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:38] {2219} INFO - iteration 107, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:39] {2392} INFO - at 21.7s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0017\n", - "[flaml.automl.logger: 08-29 21:34:39] {2219} INFO - iteration 108, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:39] {2392} INFO - at 22.5s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:39] {2219} INFO - iteration 109, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:40] {2392} INFO - at 22.7s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:40] {2219} INFO - iteration 110, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:40] {2392} INFO - at 22.9s,\testimator extra_tree's best error=0.0035,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:40] {2219} INFO - iteration 111, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 23.7s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 112, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 24.1s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 113, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 24.3s,\testimator extra_tree's best error=0.0035,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 114, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:41] {2392} INFO - at 24.4s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:41] {2219} INFO - iteration 115, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:42] {2392} INFO - at 24.7s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:42] {2219} INFO - iteration 116, current learner rf\n", - "[flaml.automl.logger: 08-29 21:34:42] {2392} INFO - at 25.1s,\testimator rf's best error=0.0041,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:42] {2219} INFO - iteration 117, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:42] {2392} INFO - at 25.5s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:42] {2219} INFO - iteration 118, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:43] {2392} INFO - at 25.8s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:43] {2219} INFO - iteration 119, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 26.9s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 120, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 27.1s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 121, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 27.4s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 122, current learner xgb_limitdepth\n", - "[flaml.automl.logger: 08-29 21:34:44] {2392} INFO - at 27.6s,\testimator xgb_limitdepth's best error=0.0022,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:44] {2219} INFO - iteration 123, current learner extra_tree\n", - "[flaml.automl.logger: 08-29 21:34:45] {2392} INFO - at 27.9s,\testimator extra_tree's best error=0.0021,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:45] {2219} INFO - iteration 124, current learner lgbm\n", - "[flaml.automl.logger: 08-29 21:34:47] {2392} INFO - at 30.3s,\testimator lgbm's best error=0.0015,\tbest estimator lgbm's best error=0.0015\n", - "[flaml.automl.logger: 08-29 21:34:47] {2628} INFO - retrain lgbm for 0.2s\n", - "[flaml.automl.logger: 08-29 21:34:47] {2631} INFO - retrained model: LGBMRegressor(colsample_bytree=0.7217481836714627,\n", - " learning_rate=0.5411643761858483, max_bin=255,\n", - " min_child_samples=6, n_estimators=1, n_jobs=-1, num_leaves=4,\n", - " reg_alpha=0.01604019858602816, reg_lambda=0.01519018741037757,\n", - " verbose=-1)\n", - "[flaml.automl.logger: 08-29 21:34:47] {1931} INFO - fit succeeded\n", - "[flaml.automl.logger: 08-29 21:34:47] {1932} INFO - Time taken to find the best model: 22.469991207122803\n" - ] - } - ], - "source": [ - "automl = AutoML()\n", - "automl.fit(ct_ab.train_df[ct_ab.train_df.columns.drop([target])], ct_ab.train_df[target], task='regression', time_budget=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Variation unexplained: 0.15%\n" - ] - } - ], - "source": [ - "# Fraction of variation unexplained\n", - "mse = mean_squared_error(automl.predict(ct_ab.test_df[ct_ab.test_df.columns.drop([target])]), ct_ab.test_df[target])\n", - "var_y = ct_ab.test_df[target].var()\n", - "fvu = mse / var_y\n", - "print(f'Variation unexplained: {100*fvu:.2f}%')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bootstrapping with simple component models for inference\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# bootstrap configuration\n", - "\n", - "n_samples = 30\n", - "n_sample_size = cd.data.shape[0]\n", - "\n", - "components_time_budget = 5\n", - "train_size = .7\n", - "num_samples= 10\n", - "\n", - "ct_ate = []\n", - "scores = []\n", - "naive_ate = []" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n", - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Propensity Model Fitted Successfully\n" - ] - } - ], - "source": [ - "for _ in range(n_samples):\n", - " cd_bt = generate_synth_data_with_categories(n_samples=5000, n_x=3, true_effect=TRUE_EFFECT)\n", - " cd_bt.preprocess_dataset()\n", - " outcome_regressor = RandomForestRegressor()\n", - " \n", - " ct = CausalTune(\n", - " num_samples=num_samples,\n", - " components_time_budget=components_time_budget,\n", - " metric=\"energy_distance\",\n", - " train_size=train_size,\n", - " propensity_model='dummy',\n", - " outcome_model=outcome_regressor\n", - " ) \n", - "\n", - " ct.fit(data=cd, outcome=target)\n", - "\n", - " ct_ate.append(ct.effect(ct.test_df).mean())\n", - " scores.append(ct.best_score)\n", - " naive_ate.append(ct.scorer.naive_ate(cd_bt.data[cd_bt.treatment], cd_bt.data[target])[0])\n", - " del ct, cd_bt, outcome_regressor\n", - " gc.collect()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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f33gRtaTddtms+mVV15xrFe33XabY936u7/7Oz333HOS2tfFEydO6NChQ/rHf/xHx/3nn39eNptNY8aM6bYXm82mhIQEHT16VJJ04sQJFRcXa/jw4Ro0aJDnFhrGI7CgV1pbW2Wz2a74FFZaWurYqJ0/f14vvPCCtmzZooiICEnS4MGD9ZOf/ESbNm3ShAkTlJCQoOnTp6ulpUWSlJSU5PjUdPDgQWVlZTnGfv3115WUlKQxY8Y4prsa57PPPtPdd98tSSovL9ddd93l1Ker1/nhD3+oZcuWafLkyRo1apRsNpskqaqqStOnT1dycrLuvfde1dXVeeYPCRimJ+u21B4kOtYrX19fPf/889q1a5ck6YEHHtDhw4d15MgR3X///bLZbLrtttsc9ydNmuQYoyOwuFr3bDabHn74YUdgeemll/Tggw86XtvVuulq2+DqdbravsAsBBb0ytGjR/XNN99o6NChjmnFxcU6deqUY6O2Y8cOTZs2zammw/3336+SkhIdPnxYQ4cO1b59+/Ttt9+qvr7e8anp8OHDSkhIkNQeftauXau//OUvstlsWr9+vctxpPaQ0rEhvHzDKqnb17HZbPr+97+vjz76SE8//bTeeecdtbS06KmnntL69etltVr16KOPasOGDR78awLm6Mm63dbWpqqqKt1xxx2OmsDAQDU2Nurbb79VZWWlYmNjFR8fr0ceeUQFBQX68ssvHfcPHjzoGCM2NlZS1+teW1ubqqur9aMf/UiVlZX6/PPP9fnnn2vIkCEaM2ZMt+umq21DV6/javsCsxBY0CtlZWWSpNdee01VVVV6//33lZ2dLUm6ePGipPYNw3d3K0vtG7vXX39d48eP19ixY/WnP/1JQUFBOnbsmEaPHu2ou/zTl7+/v86fP6+f//znKi8v18CBA12O09zcLEkKDg6W5BxeJLl8nYaGBvn4+OiJJ56QJF26dEkDBw5UYWGhysvL9aMf/UiJiYl69dVXNWDAAA/9JQGz9GTdPn78uIYMGeK0HlRXV2vEiBFqbm5WUFCQ47nDhw871r/L73eMERAQ4HLdO378uKKjoxUXF6e//vWveumll/TLX/7S8SHD1brpatvg6nW62r7APAQW9EpZWZkyMjL0+eefKyEhQc8//7xefPFFhYWF6be//a0k6ZZbbpHdbr9i3jfffFOVlZX68MMP9emnn2rQoEGKj4+/4nj2J5984tjzERoa6ghADz/8sAoLC7sd5/I9Kl097up1bDabxo8f75h++PBh3XXXXTp8+LBWrVrlOFZfUVGhX/ziF577YwIG6cm6/d11SpI2btyomTNnXnEItqqqyvEB4fL7l6+Hrta9jpqOvTenTp3S1KlTHdNdrZvdbRu6ep2uti8wD4EFvfLpp58qJSVFu3bt0jfffKPS0lI9+uijqq+v1x/+8AdJ7btkN2/erL/97W+SpIaGBm3atEnl5eWaPHmygoODtXbtWjU1Nel73/uevvzyS8cnm48++kjl5eUaNWqUpPYNXWhoqObMmaO0tDS1tLS4HOfy81eam5t1/vx5DR8+3NG7q9ex2WxOV0F0fIqLiorSBx984Jj+2WefXbO/K+BtPVm3bTab4uPjJbXvMf2v//ovFRYWasmSJU6HWM+dO6eBAwfKz8/P6X7HGJcHlq7WvctrlixZotWrV0uSjhw5ovj4eJfrpqttg6vX6Wr7AvMQWNArn376qWOj5MqkSZOUm5uradOmKSEhQffcc48uXbqkOXPm6Ne//rV+8IMf6Pjx445x7r//fm3btk3Z2dnavXu34uLi5OPjI0n6t3/7N915550aN26cfHx8NGvWLJfjXB5YKioqHMfIO7h6HZvN5pjv22+/1VdffaXBgwdr3rx5+uqrrxQbG6uxY8dq06ZNHv1bAibpybpts9m0ceNGJScnKzk5WXv37tXevXt12223uTwEdPn9jjEuDyxdrXuX12RlZWnMmDGqq6tTaGiogoODXa6brrYNrl6nq+0LzMOPH8JtNTU1GjJkiMrLyx2fsgDc+Fi3YTICCwAAMB6HhAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAw3v8DwILJt/yOfgAAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "\n", - "ax.boxplot([ct_ate, naive_ate])\n", - "ax.set_xticklabels(['$\\hat{\\mu}_{CausalTune}$', '$\\hat{\\mu}_{DiffInMeans}$'])\n", - "plt.axhline(y = TRUE_EFFECT, color = 'b', linestyle = '--')\n", - "plt.show()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2. Segmentation with Wise Pizza" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The underlying estimators of CausalTune provide heterogeneous treatment effect estimates. Apart from simply predicting treatment effects for customers with certain characteristics, one can also perform an automatic segmentation of customers by treatment impact via [wise-pizza](https://github.com/transferwise/wise-pizza/tree/main) as we demonstrate here.\n", - "\n", - "In the synthetic dataset at hand, there are heterogeneous treatment effects by category, e.g. $.5*$TRUE_EFFECT if $X_1=1$ or $-.5*$TRUE_EFFECT if $X_1=2$\n", - "\n", - "The plot below displays an automated selection of relevant segments by CATE." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "segments = list(set(cd.data.columns) - set([cd.treatment]) - set(cd.outcomes) - set(['random']) - set(['X_continuous']))\n", - "\n", - "df_effects = ct_ab.test_df[segments + [cd.treatment]]\n", - "df_effects['CATE'] = ct_ab.effect(ct_ab.test_df)\n", - "df_eff_by_seg = df_effects.groupby(by=segments, as_index=False).agg({'CATE':'sum', 'variant': len}).rename(columns={'variant': 'size'})" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:min_segments parameter is deprecated, please use max_segments instead.\n", - "WARNING:root:min_segments parameter is deprecated, please use max_segments instead.\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAACCoAAAJOCAYAAAB7+nR7AAAgAElEQVR4XuzdCZxP1f/H8fcYxp5ddklaREVJ6keikiLRihQSslSERIr8VJaQbClLSpStxRISUZZoVbShtCj7vsxi/o9z5v+d3wzGfL9fd+6935nXfTx+j19m7j3n3OfnqjN33t9zohITExPFgQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIuCAQRVDBBWW6QAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAErQFCBBwEBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXBMgqOAaNR0hgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAEEFngEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcE2AoIJr1HSEAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgQVeAYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwDUBggquUdMRAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCBBU4BlAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAdcECCq4Rk1HCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIEBQgWcAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwTIKjgGjUdIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggABBBZ4BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHBNgKCCa9R0hAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIEFXgGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMA1AYIKrlHTEQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggQVOAZQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAHXBAgquEZNRwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBAUIFnAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcEyCo4Bo1HSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAQQWeAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwTYCggmvUdIQAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBBV4BhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDANQGCCq5R0xECCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIEFTgGUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB1wQIKrhGTUcIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggQFCBZwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXBMgqOAaNR0hgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAEEFngEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcE2AoIJr1HSEAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgQVeAYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwDUBggquUdMRAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCBBU4BlAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAdcECCq4Rk1HCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIEBQgWcAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwTIKjgGjUdIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggABBBZ4BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHBNgKCCa9R0hAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIEFXgGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMA1AYIKrlHTEQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggQVOAZQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAHXBAgquEZNRwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBAUIFnAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcEyCo4Bo1HSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAQQWeAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwTYCggmvUdIQAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBBV4BhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDANQGCCq5R0xECCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIEFTgGUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB1wQIKrhGTUcIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggQFCBZwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXBMgqOAaNR0hgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAEEFngEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcE2AoIJr1HSEAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgQVeAYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwDUBggquUdMRAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCBBU4BlAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAdcECCq4Rk1HCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIEBQgWcAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBFwTIKjgGjUdIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggABBBZ4BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEHBNgKCCa9R0hAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIEFXgGEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQMA1AYIKrlHTEQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggQVOAZQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAHXBAgquEZNRwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBAUIFnAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRcEyCo4Bo1HSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAQQWeAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBwTYCggmvUdIQAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBBV4BhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDANQGCCq5R0xECCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIEFTgGUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB1wQIKrhGTUcIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggQFCBZwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEXBMgqOAaNR0hgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAEEFngEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQcE2AoIJr1HSEAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgQVeAYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwDUBggquUdMRAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCBBU4BlAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAdcECCq4Rk1HCCCAQGQLrF7/g3LmjFH1qpXsjfyzc482/vSbqle9UAUL5PPtzW365Xdt37FHN1x7haKionw7TgaGAAIIIIAAAukLJCScUHR0tvRP5AwEEEAAAQQQQAABBDJAgPloBqDSJAIIIIBAlhUgqJBlS8+NI5C2QHxCglp2+q8STpxIPqlalQvU97FWEcf2x987tO6bH/Wfqy9T8aIFI278fhpwg+Y9VfLcIpoysrcd1oKla9Vz4Di98fJTuuryi9Ic6tnW4GyvHzD8Db37wTJ9u3SiskdH+4mUsSCAAAIIIIBAEAImdPjatHl2Trdn30HlyZ1L5cucq2uurKzGN12riyqWDaKVyD5l0fJ1ypUzRtfXujyyb4TRI4AAAggggAACESjAfFRyej7ab8gkfb5ug2ZOGKAihc6JwKeCISOAAAIIOCFAUMEJRdpAIJMJnDiRqNGT52jdNz/pqw0/q0mD61TjiovVtGHtiLvTRcu/UPf+YzVxeC9dU71yxI3fTwMON6hwtjU42+sJKvjpKWIsCCCAAAIIhCZgAou3tOhlLzKrOJnw7N//7taGTVv05/aduqvR9RrQo01ojUbg2bfe/6QKFzxHb43uG4GjZ8gIIIAAAggggEDkCjAfTaqd0/PRIWOm68vvftb4Id1VqED+yH1AGDkCCCCAwFkJEFQ4Kz4uRiBzC0ycvkDDX31XM8Y/q6oXV4jImz3bX3JH5E1n0KAJKmQQLM0igAACCCCAQJoCj/QeoRVrvtXo5x/TDddWSz7PBGvf+2iltv21Q48/fFfYgomJiRGxNZTTL4bDBnPpwkipi0scdIMAAggggAACHgowH03Cz2rzUQ8fObpGAAEEspQAQYUsVW5uFoHQBNIKKvQaOF7nFiusSueX1rTZH+v7n7baT7j1eORelS5RVKMnzdWKtd/q3517dVOdq/RM9wdVuGBSMnb1+h80ccYCNW9SX0tWrtfnX2zQseNxuvn6q/RU15bKlze3Pc+8dH5+1Jvauu0f+2k5s8TvlZdVUtv7btPV1S5OdSObf/9bYya/px9+2qojR4+pUoUyali/ps4vV0r9hkzU73/+qwvPL6MihQvY6x5t20yXVa6YJsbf/+zSsPHv2OWFzdhMSOOxh+/S5SmuCRhcUqm83p77sb7+/heVKVlMXds2U6ObaqULffRYrEZPmqOPV35p76/KRRV03x31klet+GnzHxo6boZuqXu1/aRgymPuwpWav3SN+jx6v84vV9J+y7Qz5Z2P7DiMda0rL1X3jveoRLHCqdx7dWqurdv+1qerv9WefQdsG1JUUNbhBBVMMvpMNUjP4UzXV73kfD0xYJx+/PV37dy939be1OO+JvVSmbGiQrqPIycggAACCCDgW4EaDTva/8Zv+GSysmWLSnecP2/5Uy+/PktffP2jPffSi85Tt/Z3p5rHHTseq/FTP9DCT9baeZiZJ5o5xI7d+/TSM51U4Jy82rVnv3o/P8HOxf7ducfOvcx8o9ZVldX/iTb6Z8dujZnynu0nV84cdg73aLs7U20zld5YAn00vKGmdu7epwVL18jMa8089enHWtmxm+PpwRNl5n/mqHXVpfb/y5c+V/26PXBaD/NL/vTmSG7ONc18/vW35+u3P7bbrTvMXLXONZerQ6vGKlf63FPmudPmfCyzvLI57/paV+ifnXvU4f7GdoU3c5ht6ibPWGi9jLGZgzesV1MdWt2u3Lli7Dlx8Ql2jv7h4lX2Z4H8+XKrysUV7M8gAcN0HyZOQAABBBBAAAEEJDEfDX0+ah6cTz7/Wm/NWqwNP2618+WK55XWLTdcbd/bmeONmYu0cu13enXwE3ae/3DPYad93rJHZ9P4wU8kfy+9d6DMA/lriwACCESWAEGFyKoXo0XAVYG0ggr17u5mQwjmqHddNRUskF9zFqywYQJzmMln3Wur6a/tO7X2603q0rapHnmgif2eeVloXvqaw+wtXK1KJS3+dL19AW1eWI57sZv9nvmF+6NPj7IvJ0uXLKrDR47p/Y8+sy835076r32hbI6vNvyiVl0H2b7vbnS9skVn04rV39qXvDMn9NeQsTNs4KB2zaoqeW5Re03zO+onX38yqLmvRg88ZcfTrsVtyp0rp979cJm935TbR6Q0MOMuUbyw5i1Zba9bO39ccuDidAVLSDihFp0G2oCHeal9fvmSWvb5N3abjYCVeQF7w52PK0eO7Fo8Y1jyS2/z6cGGLZOWP144bYidyJuAggk1GM8mDf6jLdv+tmM5t1ghLXhrsN3POOBuXvgGXhCbNsYN7q64uPigrMMJKmz8+bc0a1CxfKl0Hc50faUKpVXlhjaqX7u6LqxQ1losWbHevrA2S0AHAh4EFVz91wadIYAAAggg4KhA3xdf13sffaaene7TvbfXS/5F9Ok6MfPH+7skzQvvaVzXnvLB4s/t3OeDKYPsy1Ezl2rbfbCdH5p5UbNb69jvf7TsCzuPWzZrpIoXLWgDDGbuYw7T3k11rtTBQ0fsC9fAfMrMR6+oUklrv9pofxk+ZWTv5F+mBzOWk/u44dorbH8mFGHCCtPH9rN/HjvlPRuKMOMIBGJLFi+s9vc3Pq21CSqkN0dyc65pgspmLnrNlZVVtHAB/f3Pbs2ctzzVXNXe5xvva8zkufaezAvsmJgcMqujmXn48P6d1KDu1fZ7gU811qx2ia67uqpWf/mDDUMbm8F9O9hzRkyYacMRZp5evWol7di119bYhHmH9Ovo6DNKYwgggAACCCCQuQWYj4Y+HzUBhI5PDrfvX2+6voaOHTuuVet/sHPmdQvH2wcm5fu66GzZ9N+RbyoxxaP027bt9r2yed9p3m+aI5h3oMwDM/ffR+4OAQQynwBBhcxXU+4IAccEzhRUyJE9u14b1lPlShe3/b05a7FeHP227rn9BvXu0kI5Y3LIvCRt9lA/xeTIoXdefdaeF/iFeY+O9+rBe26xv1w2n6pv33OY/UV94CWy+WV+VFRUqk/Ofbdxs5p3GqhenZvrwbsb2PbMsmNmkrto+lD7aSpzmGsXf7rOfrIq1K0fApNk82I4sOrCvv2HdNN9PWReCH/wxvO2DxNUMAYThvawE2ZzBCbhIwZ0sStEpHUsWLpWPQeOkzFoc1/D5DE/3GOonYAHXpC/+uaHGjVxtk0Nm6CFOcyn9tp0ezHZYMeufbrhrsd1XY0qdiyB490Pl2vAS1M0tN8jurV+zWR38wmylCsxBLyCsQ4nqGDaT6sGwTqcqYbmJXv26Ojk+zafkKx9x6N21Y0xzz9uv05QwbF/JdAQAggggAACrguY+d9DTwy1IQJzmFW8zEoDV11+kd0KIjo6W/KYmrZ9Wn9u36Xls0cqb56kAO3m3/7S7a372jnqs90f1KLl69S9/xgbaDQrEgTmEYEwwMlBBRPKfaFP++QQate+L9uwwn+ffCh5Jazdew+oTtNH9XDLRsnbUAQzlkBQoe61V9g+zsmXx4458HLV3EexIgXt10JdajeYOZJbc82Tx2Lux6yIYFYwMz8jmJXFtu/Yoxvv6S4TZH17bL9k7zVfbdRD3YckBxU++ewrdX16lLp3uEcPNb81ufY9nhtnV8j4+N3hds5u5uomjLt89svJz8jx2Dj7PFS+MGmlCg4EEEAAAQQQQCAYAeajoc9H+w2ZZD/U9uHUF5JXgzXvib/54Vf7oTVznOl93ZGjx9Wy80D7YaRAG8G+A2UeGMxTzTkIIICAfwQIKvinFowEAd8JnCmocH75Unp9WNKnzMxhPsXUrsdQ+ymmlFsf9HnhNb2/6HN9u3SifREcCCq8Nbpv8sTUXB/oa3j/zmpQt4Ztc/u/u7V4xXq79OuOnXvtErxmpQTzUtK8nDRL5Na98/FUnzg7GTHUoIJ5CWxCFmbVhpRHYPK86sMxKpA/r335ebKBGd/1zR5T2/tu1RMd70mznoNeflNvz12qVR+MsUsLB47AL+7HvtBN19e6XIEJuFkxYNTAR+1pTw561a6W8Nn7r6hQgfx2y4fH+r2ixjdfq+r/P9E35/27a69d0rhz6zvUqfUdaboH+k7P2pzndFAhWIcz1dCstGFCKd9t2qLt/+7Srj0H7PNilm+e9dqAdH/w8d1fOgaEAAIIIIAAAqcIHDp8VLPmfap5H6+2/50PHOaX2gOffMhu6xAIC5hfet95W51T5nHmhaiZfw4eM11TZy7S5BG9U20nllZQ4fGH77IBhMBhtjgbN/V9LZkxTKVKJK3WZY7ad3S1249NGvFk0GMJBBVO7sOsNtbt2dEKzAlN+6EGFYKZI7k51/zhp9/06epv9Otvf9s5/F//7LQrJYwf3F21a16mpSu/0qP9Rqlzm6bq9GDSSmzmODmoYILRJiBtzMyc/H/nbbLh2MAKaIFASet7btHNdWvY2uTJnZO/XQgggAACCCCAQFgCzEdDm49Om7NEz4+aJhPIva9JfRs0DmwLHChAWkGFwDZmZm6Xcj4c7DtQ5oFhPeJchAACCHgmQFDBM3o6RsD/AqEEFcxqCK26Pn9KUKH/sCl2adf0ggrLVn2tLn1e1rNPtLZL9QZWJzBKZhWACmVL2G0YzJgCQYVvN262WweYbSXMlgmnO0IJKgSWyT15dQLTbuCl9PuTB+mCCqVPG1QwywFf06iTzAtRszxxWkfHJ1/SyrUbTtlrORD2eKbbA7r3//drM5/4M5/8M5/ui8mRXdc16aI7bvmPBvVuZ5sPLHlmtnnIlyf3KV02ueU/1iutgIi5IBhrc57TQYVgHdKq4ba//tXDPYbZpZlNMMH8zyzVPHXmYrvKBUEF//87hhEigAACCCAQqoDZc3bL739r9vxPNW3Ox8mrSm3YtEX3PfKc3R7BfKL+5OO8ciVs8LNzn5Favuobrf9oQqptJIINKkx460O9/PrsU4IKKedJwY4lraBCYG42+vnH7KoR5gglqBDsHMm068ZcM7Clg6nNNdUvUbnS59oVFMwcLxBUMOEREyIxQWgz9w8cJwcVAts+mJDK6Y4+j92va6pXtuHmQSPftKuVBQ4zhzYB3tIpAiahPn+cjwACCCCAAAIIMB/tm+5DsP/gYQ0e/bb98FrgMCujdWt/t92WyxxpBRVemzZPI1+bZYOpKQPDwb4DZR6Ybnk4AQEEEPCVAEEFX5WDwSDgLwEnggonTzrT+oV54AVmICl7b4cB+v6nrVo4bUjy9hJmkntt487JQYWUy+UGlvk/WTDwS+6TX3qmJW0+DXfseJzWzBubainhwC/VP53zst1b93QrKgQbVHh68ETNXbhScyYO1EUVyyYPZdKMBXpp/LtKuXXEmi836qEnhtiJvAlqPD/qLbscrvnkoDkCnim3hzjdvZ0pqBCMtWnzbIMKJ9cgWIe0amh+aDE/vKTcs9iM866Hk7YZIajgr3+fMBoEEEAAAQScFrj9wT72F9ImdLBn3wHdfF+PVNsvnK6/QIjWzBNMyDFwOBlU+OufXUGNJaOCCsHOkcy9Z/Rc88ChI6rVqJNdSW3ci92U//+3t/h09bfq9NSI5KDC/KVr1GvgeLtFWctmNybX5eSgQmAZ4bXzxyVvD3Gm5+rXrX/ph59/09LPvrSrNpitPF4Z9JjTjyLtIYAAAggggEAWFWA+eubCm3Dq9z9usXPOGe9/YkPFn7//imJicpw2qBAI7Daoe7VeevYRuy1w4Aj2HWjgfOaBWfQvJbeNAAIRJ0BQIeJKxoARcE/AraCCWcng7vb97VK+n8wcYffirVqvjS48v0yqLRh+//Nf+2mywIoKCQkn7AoGZs/idQvH28lu4DCfJDOf1gq8BB32zCNqWK9munhmyVnzEjOwX6654OixWF11S3u7RNmKuaPsJPlsggrm038mcNCrc3M9eHeD5DG17TbYfupr3tQXVKFcSfv1EycS1bBlL8XFxytXzphTtqUwe7WZPZBP99LVjNuEJ8wqA2kFFUz7wVibsYQbVEirBsE6pHV9IDwS2I7DjNHsPWx+SDQvwQkqpPu4cwICCCCAAAK+FoiNjbMvMDs+cLvKliqeaqxm/tfogacUFxevle+9osC8MFfOHJr35ouptgUwc+0DiXQAACAASURBVM0//t5pw6/vfrDMtmnmYI+2u9POr/btP6Tez79qV7wyq1iZuVNaIYJgVlQIdiyhBBVMENPM6xZNH5puzYKdI7kx1wysgNbmvobq0fHe5LGb0K4JrQZWVDAvkpu06SvzSbuRz3VRkULnyHxacdwb7+nVNz9MDqaaF9wDR0zVk52b64EU82jTsNlSIl/ePHaljF+2/mm3e0h5GEPz88YPy6eka8gJCCCAAAIIIICAEWA++r8VvkKZj27+7S9VKFdK2bL9L2hgPpxlPqQ1Y/yzqnpxhVOCClu3bdc9HQaoTMmimjam3ynbdgX7DpR5IH93EUAAgcgSIKgQWfVitAi4ImBe5i7+dJ0WLV9vl2Q12ypcWfWi5H18T/dL+rS2fkhrRQWzvcJN11+lmBw59NGyL7RizbfJAQRzk/d3GaSvv/9Fre66WZdeeJ592WiCE+YIBBXMPwdeNpv9iB+85xblyhVjtzIwXzcvIf/4e4duadFLZnnYjg800eGjR+0L0LSWizUvL83E22wdYFYxyJUzp6bNWWxfXA/s1VbNbk3a8/hsggpHjh5Xg+Y9tGffQZltHs4rV9IuQWyWvG1887V6sU/7VHU2+/Ca/XjN8VzPtqfsu/zssMl232azTG6zhnWUI0e0fvr1D73zwSf2HsyYz7SiQrDW4QYV0qpByeJFgnJI6/qFS9faPaLNfnc31r5Su/bstw6BrSAIKrjyrws6QQABBBBAIMMEAmFR08Ft9a9R5QvPs7/ANp+QX/b51/a/+SnnZ/OWrNaTg15VmZLF9FCL23Ru0ULa/PtfWrRsnSqUL2nnWKbN21o9qX937rUhV7Nf7rpvfky+ByeCCqaxYMYSSlAhsJJAh1aNdfEF5W1o4c7bkualJx+BLcvSmyMFrsvIuWZgRTRj/XDL22wg2XgHlgEOBBXMWMyKCmZlBXPUrHaJnf+b+bI5AitomVCqCemaALPZKu26q6rY0PJ3mzbr7blLkwO/l9ZtrQZ1a9itM0yfZqW2ERNmptpCLcMeXBpGAAEEEEAAgUwjwHz0f0GFUOajZrsuEyK9u9H1Kl+2hLb/u1vDX33XfrDIrDBrwsIp3xnHxyeo2UP97Byv7X232veyKY/bbqxlw6jBvANlHphp/vpxIwggkEUECCpkkUJzmwiEIhCfkKDL6z+U6hITLJgwtIf9mvkl/QXnlU7+s/naVxt+UauugzSkX0f7IjlwpBVUMBNOM/kMHOaTco882ETZo6Ptl8wyvkPHTrcBAXOYl5ut7rrJfqKqXYvb7C/gzWFWBJg1/1MNHTvDvqQMHOaX8+bFtTneef8TvTFzUXJ/5j7M/aR1mKBDnxdeS34xas7r82hLtWh6Y/KSY6czOHT4qGre9ohO/sTY6foxKeHegybYl6Ypx/xU1xapVoYw3zOf8ruuSRd72skrR5ivmRe2JuQw4a15qQzMEru9u7aQCXGcKagQrLUJKpg9fSeNeNKOZcHSteo5cJymjuqjKy+78IyPWFo1CNbhdNdXq3KB3cvYhBMCxz2336BPV3+jYoUL2lUxzJHWnndnHDDfRAABBBBAAAHPBczKBDPeX6oPFq1KNWcyAzNzycfa3WV/GZ3yWPzper04epoNIgQOE1zo0qapDYSaw/zye8zkufr+x63Knz+Pal15qQ08mvnUuoWv2k9vBbZvMHNOM/cMHIE9cz9+5yWVPLdI8tdPnieZb6Q3lrT6CCx5a7Y2M2EDc5hzzafQTIjYHJdVrqjpY/udtkZmThzMHClwcUbPNc3qWCNfmynzKThzmHpcW6OKDRanDCqYFRQmz1hg5/8mOF31kvNVqUJpmZfiKefvplYmdPDeR5+lun/zLDzbvbUKnJPXrtZgVm1I+QzU+091uzpHgfx5PX+2GQACCCCAAAIIRIYA89Hw5qPT31sqs7VaIHRq3uvWr11dbe5tmLwNbsr3dXv3HVTdOx9P86FYPnukDZ8G8w6UeWBk/N1ilAgggEBAgKACzwICCLgqkPIX5heeX1YHDh5WsaIFkwMKJw/mn517dPjwUbvcr9m/7EzHjl37dDw2ViWKF1GO7EmBh5SH2RfNvHgO5uWkCUD8/e8uOwE2L8IDAQqnsXbvPWATxmabCjO2sznMC13z4vboseMqVqSQTRqHcoRiHUq7wdQgWIfT1dAERMwnEk2IIrDvcbjj4zoEEEAAAQQQ8KeAmZOZOdOxY2auV1j58uY+40DNJ/n37D2gwoXOCWru177nMLstgNlGwukj1LGcqX8TQth/4Mzz58D1Ts+RznauacKxObJnV9lSxVLtN3ym+w1sRZdya7TA+SZcHQiknFus0CnzdfOLhZ179sl8Qs+EIzgQQAABBBBAAIGzEWA+mqQXynzUBBX2HTik8qXPVXR0trPhT3VtevNS5oGOUdMQAgggkOECBBUynJgOEEAgpcCZPtmPFAIIIIAAAggggAACGS1gViYoXbKozitbwv7CPLAFV6cHm6hzm6YZ3T3tpyEwe/4K7dl3QBdfUE558+TWDz9ttdufmVXC3nylT9DhBoARQAABBBBAAAG/CzAf9XuFGB8CCCCAgFsCBBXckqYfBBCwAgQVeBAQQAABBBBAAAEEvBS46+Fn7eoJKY+7G9VVr87Nz3qFKy/vK9L7NvsWmxUUUh7Vq16oQb3bqVzp4pF+e4wfAQQQQAABBBBIFmA+ysOAAAIIIIBAkgBBBZ4EBBBwVcAsVWu2VChfpgQvgl2VpzMEEEAAAQQQQAABIxAXF6/f/vxHe/cdsltlmS3GChbIB47HAmYJ3z/+3qlde/bZkZQqUVTnFi3ESgoe14XuEUAAAQQQQMB5AeajzpvSIgIIIIBAZAoQVIjMujFqBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIlKAoEJElo1BI4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggEJkCBBUis26ejnr/4TjlyRmtHNmzeToOOj+9wJ6DsSqYN4eyZYuCyGcCR44n6MixePv3J0+u7D4bHcNJTJT2HDyuIufkBMOHAvEJiTp0NE4F88X4cHQMCQEEIkkgNu6EjsUl6Jw8OSJp2Iw1SIGjsQk6fDReuWKilS83860g2SLqtMPH4pUtKkq5c0ZH1LgZbHACJ04kat/hOBXOz5wvODHOQiCNd0MHjutEolT4nJzi9dDZPyVxCYk6cjROBfh59OwxJfH+xRHGVI3s2n9cRQrkFG+DnbHdeyhW+XPnUPZoRJ0QPXgkTjE5opUzB79PcsLT/I7B/IuU3y84oUkbfhAgqOCHKkTYGAgq+LtgBBX8Wx+CCv6tjRkZPyj7uz4EFfxdH0aHQCQJEFSIpGqFPlaCCqGbRdoVBBUirWKhjZegQmhenI1AWgJ7CCo4+nAQVHCUk/cvznLa1ggqOItKUMFZT4IKznoSVHDWk9a8FyCo4H0NIm4EBBX8XTKCCv6tD0EF/9aGoIK/a2NGR1DB/zVihAhEigBBhUipVHjjJKgQnlskXUVQIZKqFfpYCSqEbsYVCJxOgKCCs88FQQVnPfmgiLOeBBWc9ySo4KwpQQVnPQkqOOtJa94LEFTwvgYRNwKCCv4uGUEF/9aHoIJ/a0NQwd+1Iajg//owQgQiSYCgQiRVK/SxElQI3SzSriCoEGkVC228BBVC8+JsBNISIKjg7LNBUMFZT4IKznoSVHDek6CCs6YEFZz1JKjgrCeteS9AUMH7GkTcCAgq+LtkBBX8Wx+CCv6tDUEFf9eGoIL/68MIEYgkAYIKkVSt0Mea1YIKR4/F6uChIypcKL+yR0cng3353c8qkD+vLqhQOl3ERcu/0NXVLlGhAvnTPTflCVu3bdeO3ftUs9olIV13ticTVDhbQX9fT1DB3/VhdJEjQFDB2VoRVHDWk6CCs56mNbZ+cNaUoIKzngQVnPUkqOCsJ615L0BQwfsaRNwICCr4u2QEFfxbH4IK/q2NGRk/KPu7Pmz94O/6MDoEIkmAoEIkVSv0sWa6oML990vTpiVBmP9v0cL+owkXDH91pv7cvjMZqXbNqur04B26rHJFde4zUpddUlEdWjVOF/HSuq311ui+qlalUrrnpjxh6sxFWr7qG00a8WRI153tyQQVzlbQ39cTVPB3fRhd5AgQVHC2VgQVnPXk/YuznqY1ggrOmhJUcNaToIKzngQVnPWkNe8FCCp4X4OIGwFBBX+XjKCCf+tDUMG/tTEj4wdlf9eHoIK/68PoEIgkAYIKkVSt0MeaFYIKb89dqkEvv6n+PVrr5jo1lCd3Tv36218yXy9bqpja39+YoELojw5X+ESAoIJPCsEwIl6AoIKzJSSo4Kwn71+c9SSo4LwnQQVnTQkqOOtJUMFZT1rzXoCggvc1iLgREFTwd8kIKvi3PgQV/Fsbggr+ro0ZHUEF/9eIESIQKQIEFSKlUuGNM7MHFQ7cfodqNeqk3l1aqNVdN5+CZLaCyJ0rJlVQISHhhCbNWKDp7y3VwUNHVb92dT3VpaUKnJPXXm9WVDBtrf1qo37e8qca33ytnu3e2rbz5qzFmvzOQv27c68KF8yv5nfU1yMPNlFUVJTSW1HhyUGvatW677Vn30FVLF9Knds0VYO6NbT26016ZeIcvTasp+3DHCvXfqfJMxbq9Zd6KSpKeveDZXpj5iK7rUWzW+uoedP6KlGssD5cvErrvvvZrhaxePlaVapQRg+3bKRHnhqhX7f+lXQ/F52np7q21EUVyya3PXTsDG3+/W9Vr3qhYmPj9GLf9qpQrqSM18uvz9L8j1fbrS/ubXKDmt16ffK4wnsKuepsBAgqnI0e1yLwPwGCCs4+DQQVnPUkqOCsp2mNFRWcNSWo4KwnQQVnPQkqOOtJa94LEFTwvgYRNwKCCv4uGUEF/9aHoIJ/a2NGxg/K/q4PQQV/14fRIRBJAgQVIqlaoY81swcVvr6shu7vMkgr5o5SkULnpAmUcuuHmfOWa8iYGerZ6T6VLF5YL78+W6VKFNGogY/a601QocpFFdS2+a3atWe/Rr42S890e8AGFhZ/ul7Zs0fblRr++GuHuj49SmNf6Kbra12eblBh2pwluqBCGRUpeI6Wr/5GIybM1KoPxigmJofqNH1Uz/Vso4b1atoxmPGWLVXcBjDmL12j/sOmaECPNqpQroTGTX1fBfLn08BebTXlnY80dNwMVbmkom6uc6VKFi+i666uorkLV6p6lUq27UnTF2jLtu2a9doA+/+NH3hK9zappzsaXKc/t+9Sz4Hj7PcuqVTe9rPpl9/VrcPdNnwx4KUpeuSBJvbeObwRIKjgjTu9Zj4BggrO1pSggrOevH9x1tO0RlDBWVOCCs56ElRw1pOggnOeu2JjlWD+oxTEkU1SoZgYZTfJeg5HBQgqOMqZNRojqODvOhNU8G99CCr4tzZmZPyg7O/6EFTwd30YHQKRJEBQIZKqFfpYM3tQYVGpC9S9/1h9v2yy/cX6ocNHNWri7GSo2jUvk/lfyqBC804DdfEF5fRs9wfteR+v/FKP9XvFhgbMqgomqPDW6L6qVqWS/f7zo97S4SPHNKh3O/vnzb/9pY0//66de/bZVQ/atWykB+9ukG5Qwazk8NPmbfrx123asWufXpk0R++8+qwNRTw/app++2O7JgztoZ2796nunY9rzsSBdhUEE8QoX+Zc3X/nTbZ/EyR44ZW3tXreGL01a4kWLvtCk0b0Ud7c2ZPv26yM8N2mzfpt23Zt+HGrDS78sHyKxr7xvqbP/Vgr33vFnhsXF68rbmpngwrnlS2pq25pr76PtVK1KhfY789ZsEL/7tqbHOII/QnkirMVIKhwtoJcj0CSAEEFZ58EggrOevL+xVlP0xpBBWdNCSo460lQwVlPggrOea7cvVtbDh8OqsEiMTG6qXhx5cxmIgv+OxYtX6erLr/ojB9o8N+ok0ZEUMGvlfHxuAgq+Lg45ofRg7EqmDeHsmUj2eW3ShFU8FtFUo+HH5T9XR+CCv6uD6NDIJIECCpEUrVCH2tmDyp8e0VNteg0UMtmjVTxogVtoGD81A8s1HsfrdT9d96sDq0apwoq1L6jq7p3uEdNG9a2523/d7duvPeJ5GDAyUGFGe9/YgMJi6YP1Yuj37bbP9S7rprKly2hBUvXqNWdN6vNfQ3PGFQw4+r45HAbUqj3n2p25YPXps3T9LH9dFnlijZ8cNfDz2rJjGFasvJLfbTsC/s9c5jx5smdS8WKFEz1AIx8rovmLVmtT9d+p7EvPKHcOaPt982WD226vaj8+fKoxhUX63hsnN0iwgQVnh48UXHx8Rrct4M9N2VQIVfOGDV64Cm7soL558BhXIf37xz6w8cVjggQVHCEkUYQIKjg8DNAUMFZUN6/OOtpWiOo4KwpQQVnPQkqOOtJUME5TzeDCmZrxHYtbrPbFwZzhHq++bl+6qg+uvKyC4Np3lfnEFTwVTkiYzAEFfxdJ4IK/q0PQQX/1saMjB+U/V0fggr+rg+jQyCSBAgqRFK1Qh9rZg8qHLj9DtVq1EmPtbtT7e9vnAqobbfBqlm98ilBhaZtn9Z1V1dVj4732vNXr/9B7XoMTQ47nBxUGDD8DfvLfxMMMFs0TBrxpGpWu8Re2/HJl1SzWuV0gwpLV36lR/uN0qoPx6hA/rz2WtNPIKhg/myCCjfVuUrvL/pMD7dslBykMF9v0uA6tbrr5lMeALP1w8lBhcFjptvgw8SXeik6Opu+3bjZhjlMUOHdD5fr3Q+W2RUUzJEyqFCqRFFd27izZk7or8oXnhf6w8YVGSJAUCFDWGk0CwqwooKzRSeo4Kwn71+c9TStEVRw1pSggrOeBBWc9SSo4Jynm0EF8/Pw5BG9dXW1i4O6gXDOJ6gQFC0nZQYBggr+riJBBf/Wh6CCf2tjRsYPyv6uD0EFf9eH0SEQSQIEFSKpWqGPNbMHFdSihcwv64eOm6Gene5ToxtrqWCBfPpr+y517fuybrux1ilBhdGT5mrOwhUaOaCLzi1WWP8dOVXbd+yxv6A320eYFyAv9mmvW+tfoy++3qRe/x1vgwN3NKxtQxH/ffIh3Xx9Da3/9if1eG6cOj3YJN2gwpovN+qhJ4bYVRtKFCus+UvXaNDLb6YKKsyev0LPDJ1ki7xu4Xi7ioI5Jrz1oV3FYewL3WyA4K9/dmnWvOV2VYjTBRXGTJ6rZau+0bgXuyk+PkFjpryXvPXDtr92qGHLXmrZ7Ea72sLCT77QouVf2OCCWUnBhDvi4hM0pF9HFS1cwG5V8eV3P9utLTi8ESCo4I07vWY+AYIKztaUoIKznrx/cdbTtEZQwVlTggrOehJUcNaToIJznm4FFYa/+q4mTl+gMiWLqeA5+dT01tq6r0k9LVv1tUa8OlObf/9b1ateqH7dHtCF55fR6c6/pe7VeuSpEfZDBea49KLz9FTXlnb7RPtnVlRw7sGgJf8LEFTwd40IKvi3PmYScTQ+QVHZo5Q9mq05/FipY3EJypUjaRlhDn8JmBcZsfEnlDOHv/YBM3+T82f/3x7Z/lJjNAggcDoBggqZ+7kwQYWEAweVM+6ockT7678ZYcl36iTNnpN06bixUrNmSkg4oQ9WfKVX3l2sf3fvT2627pWXqOOd9VX1grLqOuQN+//tm9XTkWPH1WfMTC1Zu8GeW75kUb3So5Uqli2R9ELjnieVJ1dOe545GtWupoEd7lRMTA5NfP9TDZ+2wH69YpniOh4br+YNaql14zp6c/5nWrZ+oyY92/6UWzO/bO4+Ylpyn/WuqqxP1m/UjEFdVLVS0ouUQ0eOqWbrZ9Xillrq2/aO5DZiY+M0YvoiTZ2/MvlrNS49X1Oe7aAp81bo829+1vinHlL0/8+nt+/ap65Dp2rT/7+wqV3tIq38+if98O5ge/27H6/Vu0vWKjpblOpedYlGv7NEH454QueXLm79+r82Ryu++jG5rw7N6unR+wgqhPW8OnTR8Tj/zfkcurXTN2O2HilQKEO7oPGsJ2CDCjkOKOZ/O9tkPQQH79j8PBoXf0IxPvt51MFbdL2pY7EnlCsmE8zVXJc7fYd4OlsIMxeJyZ5NUby+dQQ2Lj7RzsWzZaG/8jmz5VHOqKSV5Zw+CCo4J+pWUOGXrX/qjjZPq1fn5qpcqbxKFC+s48fj1KRNX/shgTrXXKa3Zi/Rum9+1KLpw/TXPztPOf+c/HltIL96lUr2Z/VJ0xdoy7btyasHElRw7rmgpQgQIKjg7yIRVPBvfcwkYk/ccX2+b49/B8nIEEAgJIFCMTGqW7SoYrLST1shCXEyAv4TIKjgv5o4OSITVIjeulkxU8ZJ8fFONu3Ltg7Gn9ChBKlYTJSyp/MmdX/8CR1LkM7NeeobwsTERP0bl6hcUVLBk34JczghUQfiE1XyNNelh7Ir9oRMnqBQGL/YiU9M1O7YRJ2TPUq5gwj5/n0swY49z0nnmnYCNl8dTFCrH49offV8qdo8lpCo/fGJKhKEY3r3zPcRCFngnpZSjWtCvowLEDiTgAkq/Jj4obbFfgMUAggggAACCLgoEKVo3VCwtYrnqJAhvRJUcI7VraCCGfHJWzmMmjhb8z9eo0XTh9ob2r33gN16cfTzj+mGa6udcr455+ixWH23abN+27ZdG37cmrySYKB9tn5w7tmgJZ8LEFTwd4EIKvi3PmYSsTvuuD7Zs8u/g2RkCCAQkkCRmBjdXLw4QYWQ1DgZAW8FCCp465/RvdugwpZfFTNmmBQfl9Hd0X4ECNT4UaqWJ1E5o6RPDkWpa9FEdSzGx+MioHRZZ4gPPixdc13WuV/u1BUBE1T4/sRsbTm+zpX+6AQBBBBAAAEEkgSyKVoNCnfSuTnOzxASggrOsXoZVOj9/AR7I2YbxsBR7+5udoWF5nfUPyWoYLZ8aNPtReXPl8dua3g8Nk4fLl6lH5ZPsZezooJzzwUtRYAAQQV/F4mggn/rQ1DBv7VhZAiEK0BQIVw5rkPAOwGCCt7Zu9EzQQU3lCOrj88PSX/GJq2qcHEu6dLckTV+RpsFBAgqZIEiu3+LBBXcN6dHBBBAAAEEjABBhch5DtwOKkwc3kvXVK9sgYaOnaFV67/X3En/tX8+fOSYrr61o4b376QGda+2wYOU5w8eM12bfvldE1/qpejobPp242a16DSQoELkPG6M1EkBggpOajrfFkEF502dapGgglOStIOAfwQIKvinFowEgWAFCCoEKxWZ5xFUiMy6MWoEsrQAQYUsXf6MunmCChklS7sIIIAAAgicWYCgQuQ8IW4GFdp2G6wa1S5WuxaNdOTIMW38+Te16zHUBhOuvaqKps5cpLFvvK/ls0eqWJGCOvn8t2Yv1rJV32jci90UH5+gMVPeY+uHyHnUGKnTAgQVnBZ1tj2CCs56OtkaQQUnNWkLAX8IEFTwRx0YBQKhCBBUCEUr8s4lqBB5NWPECGR5AYIKWf4RyAgAggoZoUqbCCCAAAIIpC9AUCF9I7+c4WZQYenKr9T/pcnas++gHnmgibq0bapxU9/X6ElzLUee3LnsNhD1a1e3fz75/DsbXa+ufV+2qyqYo3bNqlq5dkOqFRXefKWPqle90C+8QY8jKjExMTHoszkRAUkEFfz9GBBU8G99CCr4tzaMDIFwBQgqhCvHdQh4J0BQwTt7N3omqOCGMn0ggICjAgQVHOWksSQBggo8CQgggAACCHgjQFDBG/dwenUzqGDGl5BwQnv3H1SRQucoKirKDvnY8Vjt2rNfJYoXVvbo6FS3cbrz//5nlwoWyK88uXOGc8u+vIaggi/L4u9BEVTwd30IKvi3PgQV/FsbRoZAuAIEFcKV4zoEvBMgqOCdvRs9E1RwQ5k+EEDAUQGCCo5y0liSAEEFngQEEEAAAQS8ESCo4I17OL3uio1VQpCf5c8mqVBMjLL/f8AgnP645vQCBBV4MkIWIKgQMpmrFxBUcJU7pM4IKoTExckIRIQAQYWIKBODRCCVAEGFzP1AEFTI3PXl7hDIlAIEFTJlWb2+KYIKXleA/hFAAAEEsqoAQYWsWnnuO1wBggrhymXh6wgq+Lv4BBX8Wx+CCv6tDSNDIFwBggrhynEdAt4JEFTwzt6NngkquKFMHwgg4KgAQQVHOWksSYCgAk8CAggggAAC3ggQVPDGnV4jV4CgQuTWzrORE1TwjD6ojgkqBMXkyUkEFTxhp1MEMlSAoEKG8tI4AhkiQFAhQ1h902imCyosXSn9siXJt34dqVIF31gzEAQQcEiAoIJDkDSTUoCgAs8DAggggAAC3ggQVPDGnV4jV4CgQuTWzrORE1TwjD6ojgkqBMXkyUkEFTxhp1MEMlSAoEKG8tI4AhkiQFAhQ1h90yhBBd+UgoEggECwAgQVgpXivBAECCqEgMWpCCCAAAIIOChAUMFBTJrKEgIEFbJEmZ29SYIKzno63RpBBadFnWuPoIJzlrSEgF8ECCr4pRKMA4HgBQgqBG8ViWcSVIjEqjFmBLK4AEGFLP4AZMztE1TIGFdaRQABBBBAID0BggrpCfF9BFILEFTgiQhZgKBCyGSuXkBQwVXukDojqBASFycjEBECBBUiokwMEoFUAgQVMvcDQVAhc9eXu0MgUwoQVMiUZfX6pggqeF0B+kcAAQQQyKoCBBWyauW573AFCCqEK5eFryOo4O/iE1Twb30IKvi3NowMgXAFCCqEK8d1CHgnQFDBO3s3eiao4IYyfSCAgKMCBBUc5aSxJAGCCjwJCCCAAAIIeCNAUMEb97B6/X2LFBsb3KXR2aUyZaWYnMGdz1lBCxBUCJqKEwMCBBX8/SwQVPBvfQgq+Lc2jAyBcAUIKoQrx3UIeCdAUME7ezd6JqjghjJ9IICAowIEFRzlpLEkAYIKPAkIIIAAAgh4I0BQwRv3sHqdMkFauyq4S8udJz3aQ8qbL7jzOStoAYIKQVNx+ZU17QAAIABJREFUYkCAoIK/nwWCCv6tD0EF/9aGkSEQrgBBhXDluA4B7wQIKnhn70bPBBXcUKYPBBBwVICggqOcNJYkQFCBJwEBBBBAAAFvBAgqeOMeVq8EFcJic/oiggpOi2aB9ggq+LvIBBX8Wx+CCv6tDSNDIFwBggrhynEdAt4JEFTwzt6NngkquKFMHwgg4KgAQQVHOWksSYCgAk8CAggggAAC3ggQVPDGPaxeCSqExeb0RQQVnBbNAu0RVPB3kQkq+Lc+BBX8WxtGhkC4AgQVwpXjOgS8EyCo4J29Gz0TVHBDmT4QQMBRAYIKjnLSWJIAQQWeBAQQQAABBLwRIKjgjXtYvboYVHhy0Ktate577dl3UBXLl1LnNk3VoG4Nrf16k16ZOEevDeup3Lli7G2sXPudJs9YqNdf6qWoKOndD5bpjZmLdPDQETW7tY6aN62vEsUK68PFq/TND7/q8ksrat6S1apUoYwebtlIjzw1Qr9u/cu2delF5+mpri11UcWy9s9bt23XoFFvafX6H1S+zLkqXrSQ7r39BjWsV1NHj8Xq5ddnaf7Hq1WoQH7d2+QGNbv1ejuuP/7eoRdHv60vvv5RuXLmUK0rL9V/n3xIMTE5wqJPeRFBhbMmzHoNEFTwd80JKvi3PgQV/FsbRoZAuAIEFcKV4zoEvBMgqOCdvRs9Z7qgghto9IEAAt4KEFTw1j+T9k5QIZMWlttCAAEEEPC9AEEF35fofwN0Magwbc4SXVChjIoUPEfLV3+jERNmatUHY+wv+us0fVTP9WxjwwLm6NxnpMqWKq7eXVpo/tI16j9sigb0aKMK5Upo3NT3VSB/Pg3s1VZT3vlIQ8fN0GWVK+rG2leqZPEiuu7qKpq7cKWqV6lk2540fYG2bNuuWa8N0PHYON3+YB+VLlHUBhrM0Xfw63qo+W1q2exG28+mX35Xtw53KyoqSgNemqJHHmiixjdfq/Y9hyk6OlqPP3yXDhw8rFnzP9Uz3R5U3jy5zrrgBBXOmjDrNUBQwd81J6jg3/oQVPBvbRgZAuEKEFQIV47rEPBOgKCCd/Zu9ExQwQ1l+kAAAUcFCCo4ykljSQIEFXgSEEAAAQQQ8EaAoII37mH16mJQISHhhH7avE0//rpNO3bt0yuT5uidV59VlYsq6PlR0/TbH9s1YWgP7dy9T3XvfFxzJg60qyDc32WQXfng/jtvsrdoggQvvPK2Vs8bo7dmLdGiT9dp2uinlS1bVDKBWRnhu02b9du27drw41YbXPhh+RS7ekPbboO1cNoQlStd3J7fquvzuuWGq+1KDVfd0l59H2ulalUusN+bs2CF/t21V6MGPmrHUbRwAfV59H4VL1owLO60LiKo4Chn1miMoIK/60xQwb/1Iajg39owMgTCFSCoEK4c1yHgnQBBBe/s3eiZoIIbyvSBAAKOChBUcJSTxpIECCrwJCCAAAIIIOCNAEEFb9zD6tWloMLhI8fU8cnhNqRQ7z/V7MoHr02bp+lj+9nVEEz44K6Hn9WSGcO0ZOWX+mjZF/Z75qh9R1flyZ1LxYqkDgeMfK6L3e7hs3Ub9Pqwnsm3b7Z8aNPtReXPl0c1rrjYrqJgtogwQYUPFn+ugSPe1LqF45PPDwQVrr3qUjV64CldUqm8cuVM2oLCHCaUMLx/Z7vlQ+/nX9W/O/eqTMliatfyNt3dqG5Y7CdfRFDBEcas1QhBBX/Xm6CCf+tDUMG/tWFkCIQrQFAhXDmuQ8A7AYIK3tm70TNBBTeU6QMBBBwVIKjgKCeNJQkQVOBJQAABBBBAwBsBggreuIfVq0tBhaUrv9Kj/UZp1YdjVCB/XjvUS+u2Tg4qmD+boMJNda7S+4s+s9syNG1Y255nvt6kwXVqddfNp9yi2frh5KDC4DHTbfBh4ku9FB2dTd9u3KwWnQbaoMLm3/7S7a37phpHIKjQ6KZaurZxZ82c0F+VLzzvtJxmVYit27Zrycr1Gj1pruZNfUEVypUMiz7lRQQVzpow6zVAUMHfNSeo4N/6EFTwb20YGQLhChBUCFeO6xDwToCggnf2bvRMUMENZfpAAAFHBQgqOMpJY0kCBBV4EhBAAAEEEPBGgKCCN+5h9epSUGHNlxv10BND7HYOJYoV1vylazTo5TdTBRVmz1+hZ4ZOsrdhVjwwqyiYY8JbH+rNWYs19oVuNkDw1z+7NGvecnXvcI9OF1QYM3mulq36RuNe7Kb4+ASNmfJe8tYPiYmJqtP0UV160Xlq2rCOfvhpqyZOX2C3c2jZ7Ea7LURcfIKG9Otot3kwW1V8+d3PevDuBnpp/Lu6q9H1dssIszKECVDMem2AXYHhbA+CCmcrmAWvJ6jg76ITVPBvfQgq+Lc2jAyBcAUIKoQrx3UIeCdAUME7ezd6JqjghjJ9IICAowIEFRzlpLEkAYIKPAkIIIAAAgh4I0BQwRv3sHp1Kahw4kSiuvcfoyUr1tth1ruumj75/GvNGPeMql5yvv3aocNHVfO2R9SiaX31faxV8u3ExsZpxGuzNHXmouSvmS0dpozsrSnvfqRV677XhKE9kr+3fccede37sl1VwRy1a1bVyrUb7IoK5vhqwy8aNXG2duzaq/9cXVWffbFBbe+71YYQzLYO/V+aohVrvk1ur0Orxnr0oTttm2bM5ji3WCG1aHqj2rW4LSz2ky8iqOAIY9ZqhKCCv+tNUMG/9SGo4N/aMDIEwhUgqBCuHNch4J0AQQXv7N3omaCCG8r0gQACjgoQVHCUk8aSBAgq8CQggAACCCDgjQBBBW/cw+rVpaBCYGy79uy32zEUKpA/5OHGJyRo954DOid/XuXOFZPu9X//s0sFC+RXntw5U51r2skeHW2/dvDQEdW7u7vGPP+4rq52cfJ5x47Hav+BwypS+Jzkc803zdcPHDyi4kULptt/KCcQVAhFi3OtAEEFfz8IBBX8Wx+CCv6tDSNDIFwBggrhynEdAt4JEFTwzt6NngkquKFMHwgg4KgAQQVHOWksSYCgAk8CAggggAAC3ggQVPDGPaxef9sixcUGd2l0dqlMWSkm9S/+g7vYP2c90nuEDSiYsMG6b37URReU04QhPZQtW5RngySo4Bl95HZMUMHftSOo4N/6EFTwb20YGQLhChBUCFeO6xDwToCggnf2bvRMUMENZfpAAAFHBQgqOMpJY0kCBBV4EhBAAAEEEPBGgKCCN+70GpzAj79u08aff1NsXLzKliqua6pXtqs8eHkQVPBSP0L7Jqjg78IRVPBvfQgq+Lc2jAyBcAUIKoQrx3UIeCdAUME7ezd6znRBhaUrpV+2JNHVryNVquAGI30ggICbAgQV3NTOMn0RVMgypeZGEUAAAQR8JkBQwWcFYTi+FyCo4PsS+W+ABBX8V5OUIyKo4N/6EFTwb20YGQLhChBUCFeO6xDwToCggnf2bvRMUMENZfpAAAFHBQgqOMpJY0kCBBV4EhBAAAEEEPBGgKCCN+70GrkCBBUit3aejZyggmf0QXVMUCEoJk9OIqjgCTudIpChAgQVMpSXxhHIEAGCChnC6ptGCSr4phQMBAEEghUgqBCsFOeFIEBQIQQsTkUAAQQQQMBBAYIKDmLSVJYQIKiQJcrs7E0SVHDW0+nWCCo4LepcewQVnLOkJQT8IkBQwS+VYBwIBC9AUCF4q0g8k6BCJFaNMSOQxQUIKmTxByBjbp+gQsa40ioCCCCAAALpCRBUSE+I7yOQWoCgAk9EyAIEFUImc/UCggqucofUGUGFkLg4GYGIECCoEBFlYpAIpBIgqJC5HwiCCpm7vtwdAplSgKBCpiyr1zdFUMHrCtA/AggggEBWFSCokFUrz32HK0BQIVy5LHwdQQV/F5+ggn/rQ1DBv7VhZAiEK0BQIVw5rkPAOwGCCt7Zu9EzQQU3lOkDAQQcFSCo4CgnjSUJEFTgSUAAAQQQQMAbAYIK3riH0+uuuG2KV1xQl5q6Fs5eStmjYoI6n5OCFyCoELwVZ/6/AEEFfz8KBBX8Wx+CCv6tDSNDIFwBggrhynEdAt4JEFTwzt6NngkquKFMHwgg4KgAQQVHOWksSYCgAk8CAggggAAC3ggQVPDGPZxeV+yfpi3H1gd1aZHsZXRzoUeUM1ueoM4P9qRjx2MVnS2bcuTIHuwlme48ggqZrqQZf0MEFTLe+Gx6IKhwNnoZey1BhYz1pXUEvBAgqOCFOn0icHYCBBXOzs/vVxNU8HuFGB8CCJwiQFCBhyIDBAgqZAAqTSKAAAIIIBCEAEGFIJB8coofggr3dxmkyy45X706N/eJivvDIKjgvnnE90hQwd8lJKjg3/oQVPBvbRgZAuEKEFQIV47rEPBOgKCCd/Zu9ExQwQ1l+kAAAUcFCCo4ykljSQIEFXgSEEAAAQQQ8EaAoII37uH06oegwtZt25U7d06VKFY4nFvIFNcQVMgUZXT3JggquOsdam8EFUIVc+98ggruWdMTAm4JEFRwS5p+EHBOgKCCc5Z+bCnTBRX8iMyYEEDAWQGCCs560poVIKjAg4AAAggggIA3AgQVvHEPp1c3gwpvz12qt2Yv1s7d+1W+zLnq0qap6l57hYaMma4LKpRWs1vraMSEmVrz5cZUt9L01tq6r0k9/f3PLr3wyjSt+WqTLr+0ou5uVFcN6taw56bVdjgmXlxDUMEL9Qjvk6CCvwtIUMG/9SGo4N/aMDIEwhUgqBCuHNch4J0AQQXv7N3omaCCG8r0gQACjgoQVHCUk8aSBAgq8CQggAACCCDgjQBBBW/cw+nVraDC19//IrPFw/D+nXR++VL6+vtfFR+foBZN66tzn5G67JKK6tCqsTb/9pf2HThsb2Xt15s0ZvJcTR3VR5dVrqgmrfvoiksvUKu7btbWbf+o58BxWjxjmHbs2ptm2+GYeHENQQUv1CO8T4IK/i4gQQX/1oeggn9rw8gQCFeAoEK4clyHgHcCBBW8s3ejZ4IKbijTBwIIOCpAUMFRThpLEiCowJOAAAIIIICANwIEFbxxD6dXt4IKq9f/oHY9hmr84CdU66rKyh4dnTzclEGFwBd37t6nZg/100PNb1Pre2/Rmq826qHuQ/TGy08pb55c9rT+w6aoyS3/UYWyJdJsOxwTL64hqOCFeoT3SVDB3wUkqODf+hBU8G9tGBkC4QoQVAhXjusQ8E6AoIJ39m70TFDBDWX6QAABRwUIKjjKSWNJAgQVeBIQQAABBBDwRoCggjfu4fTqVlAhLi5eL4x+W++8/4kdZoO6V6t7h7tVpmSxVCsqmO/FJySozeODVaTQORoxoLOioqI0Z8EK9RsySdWqVEp1mzdcV00P3HVzmm2HY+LFNQQVvFCP8D4JKvi7gAQV/Fsfggr+rQ0jQyBcAYIK4cpxHQLeCRBU8M7ejZ4JKrihTB8IIOCoAEEFRzlpLEmAoAJPAgIIIIAAAt4IEFTwxj2cXt0KKgTGtv/AYX23abOGv/quLrqgnF7s0/6UoMJL49/V4k/XadZrA5Q/Xx576aerv1WP58Zp9bwxqVZjSHnPp2s7HBMvriGo4IV6hPdJUMHfBSSo4N/6EFTwb20YGQLhChBUCFeO6xDwToCggnf2bvRMUMENZfpAAAFHBQgqOMpJY0kCBBV4EhBAAAEEEPBGgKCCN+7h9OpWUGHl2u904NAR1buuuqKzRenpwROVL18ePdPtgVRBhSUr1uvxZ0brzVf66IIKZewt5cieXbFxcbrxnifUtGFtPf7wnfbr6775SXHx8coZkyPNtsMx8eIaggpeqEd4nwQV/F1Aggr+rQ9BBf/WhpEhEK4AQYVw5bgOAe8ECCp4Z+9GzwQV3FCmDwQQcFSAoIKjnDSWJEBQgScBAQQQQAABbwQIKnjjHk6vbgUV1ny5UV2fHqUjR4/ZYV5Xo4r6P9FapUoUVde+L6vqJeer/f2N1frxF7Xumx9T3UqzW+toYK+2+vr7X9T3xdf1+5//2u/nyZ3LrsiQN0+uNNsOx8SLawgqeKEe4X0SVPB3AQkq+Lc+BBX8WxtGhkC4AgQVwpXjOgS8EyCo4J29Gz0TVHBDmT4QQMBRAYIKjnLSWJIAQQWeBAQQQAABBLwRIKjgjXs4vboVVDBjS0xM1O69B2zAIE/unOEM116z/+BhxcXFq0ihcxQVFWW/5lTbYQ/qLC8kqHCWgFnxcoIK/q46QQX/1oeggn9rw8gQCFeAoEK4clyHgHcCBBW8s3ejZ4IKbijTBwIIOCpAUMFRThpLEiCowJOAAAIIIICANwIEFbxxD6fXXXHbFK+4oC41dS2cvZSyR8UEdT4nBS9AUCF4K878fwGCCv5+FAgq+Lc+BBX8WxtGhkC4AgQVwpXjOgS8EyCo4J29Gz1nuqDC0pXSL1uS6OrXkSpVcIORPhBAwE0BggpuameZvggqZJlSc6MIIIAAAj4TIKjgs4IwHN8LEFTwfYn8N0CCCv6rScoREVTwb30IKvi3NowMgXAFCCqEK8d1CHgnQFDBO3s3eiao4IYyfSCAgKMCBBUc5aSxJAGCCjwJCCCAAAIIeCNAUMEbd3qNXAGCCpFbO89GTlDBM/qgOiaoEBSTJycRVPCEnU4RyFABggoZykvjCGSIAEGFDGH1TaMEFXxTCgaCAALBChBUCFaK80IQIKgQAhanIoAAAggg4KAAQQUHMWkqSwgQVMgSZXb2JgkqOOvpdGsEFZwWda49ggrOWdISAn4RIKjgl0owDgSCFyCoELxVJJ5JUCESq8aYEcjiAgQVsvgDkDG3T1AhY1xpFQEEEEAAgfQECCqkJ8T3EUgtcNZBhV179uurDb/ossrnq0Sxwlq59jsVK1JQF19QLiTr+IQEZYvKpmzZopKv2/jzb9q7/5Cuq1El6LbS6t+0nz06Oqh2YmPjbL/FixZUVNT/xpOy7a3btmvrH//oyssuVIH8eYNqN7OcRFDB35UkqODf+hBU8G9tGBkC4QoQVAhXjusQ8E6AoIJ39m70TFDBDWX6QAABRwUIKjjKSWNJAgQVeBIQQAABBBDwRoCggjfu9Bq5AmcVVHh77lKNe+M93VjnKrVseqMuqFBazTsNVJ1rLtPDLRvpvo7PqVzp4hrev3Oy0NKVX+nRfqO04K3BKl/mXPv1o8didW+H/mp/f2M1uqlW8rmjJs62IYgpI3sHLRzo/5EHmiRfs+2vHWrYspeWzBimUiWKptlWYmKixk39QGMmz7XnFC6YX6Off1yXV65o/5yybTOu2fM/1eJP12vw0x1U77pqQY8x0k8kqODvChJU8G99CCr4tzaMDIFwBQgqhCvHdQh4J0BQwTt7N3omqOCGMn0ggICjAgQVHOWksSQBggo8CQgggAACCHgjQFDBG3d6jVyBsIMK5pf6t7TopSc7N1e9/1RPFujcZ6T+c3VVNb+jvn7a/IeaPdRPIwZ00c3XX6W9+w/q5vt6qlv7u9WiaX17zbDx72jyjIX2nwf37ZAqqPDGzEX69odfUwUd0qNO2b8514QLvtu42V6WXlDh6+9/0f1dBunNV/qo6sXna9TEOZq/dLU+fme4Xenh5LZNm1NnLtJnX2zQhKE90htapvk+QQV/l5Kggn/rQ1DBv7VhZAiEK0BQIVw5rkPAOwGCCt7Zu9EzQQU3lOkDAQQcFSCo4CgnjSUJEFTgSUAAAQQQQMAbAYIK3rjTa+QKhB1UOHY8Vlc2aK+F0warXOmklRHM0ffF13Vdjaq6tX5N++dX3/xQr78934YEnhsxVQcOHdaEIT2St3jYt/+QjsXGqkWngere/p5UQYW5C1fqu01b9Gz3B21bGzZt0X9HvqnnerXVRRXLnlb95P537Nqnf3bstoGF9IIKL41/V5t+/V2vD+tp2zbX3nDX45r12gBdUqn8Kfdmzlnz5Ub1HDhOK997JXKfghBHTlAhRDCXTyeo4DJ4CN0RVAgBi1MRiBABggoRUiiGiUAKAYIKmftxIKiQuevL3SGQKQUIKmTKsnp9UwQVvK4A/SOAAAIIZFUBggpZtfLcd7gCYQcVzNYHrboO0tr545Qvb+7k/nft2a88uXMqT+5c9mtx8Qlq/shzOnL0mHbu3q8P3nheJYsXPmW8DZr3VNe2zVIFFQ4fOabjsXF2CwZzmFDAQ08M0dtj+yVvx3ByQyf3b77/7869qnd3t3SDCj2eG6dCBfKp72Otkpu9tG5rjX2hm66vdblO1/aWbdvV+IGntHTmcJUodup9hVsYP19HUMHP1ZEIKvi3PgQV/FsbRoZAuAIEFcKV4zoEvBMgqOCdvRs9E1RwQ5k+EEDAUQGCCo5y0liSAEEFngQEEEAAAQS8ESCo4I07vUauQMhBhfiEBH3z/a8aO+U9nVeupJ7p9kC6d79kxXo9/sxou91DyhBAygtPF1Q4ueETJxIVFx+vmBzZFRUVlW6/gROCDSq07zlMF1Uspyc63pPcdo2GHdW/R2vdVv+aNPtr12OozsmXV+1a3KqLLyifvFpE0AOMsBMJKvi7YAQV/Fsfggr+rQ0jQyBcAYIK4cpxHQLeCRBU8M7ejZ4zXVDBDTT6QAABbwUIKnjrn0l7J6iQSQvLbSGAAAII+F6AoILvS8QAfSYQclDh83Xfy/xCv3rVCzV55JPKHh19xluKjY3TvR0HKCZHDn3/01bNm/qCKpQreco1wQQVwrULNqhgVlQwqzf0efT+5K5SrqiQVv+HDh/Vne2e0Z/bd6Z5f+GO3Y/XEVTwY1X+NyaCCv6tD0EF/9aGkSEQrgBBhXDluA4B7wQIKnhn70bPBBXcUKYPBBBwVICggqOcNJYkQFCBJwEBBBBAAAFvBAgqeONOr5ErEHJQwdzqz1v+1Muvz1Le3Lk0pF/HM979qImz9dGyLzT79YHqNXCc9u4/pCkv9z4l4OCHoMJL49/VT5u3acLQHvaeduzapxvuelyzXhugSyqVT/M+73r4WV160Xlq1+I2lS1VPHKfhiBHTlAhSCiPTiOo4BF8EN0SVAgCiVMQiDABggoRVjCGi4AkggqZ+zEgqJC568vdIZApBQgqZMqyen1TBBW8rgD9I4AAAghkVQGCClm18tx3uAJhBRVMZxs2bdF9jzynVR+OUYH8eU/b/7cbN6tFp4F6e2w/XV65ov3F/22teqtzmzvU+p5b7DVmK4nEE4lq9MBT6vjA7Wp0Yy3lyJH9tO19t3GznhsxVYN6t9NFFcsGdc9x8Qn6Z8du3dKilxa8NVilShRVjuxJq0Cs++ZHDR4zXS8920nly5yrr7//Rfd3GaQ3X+mrqpecb8MYC5au0cfvDE9zOwcT2mja9ml9OudlFS1cIKgxRfpJBBX8XUGCCv6tD0EF/9aGkSEQrgBBhXDluA4B7wQIKnhn70bPBBXcUKYPBBBwVICggqOcNJYkQFCBJwEBBBBAAAFvBAgqeONOr5ErEHZQ4XhsnKrf/LAWThuscqXPPUXg2PFYNWndVw3q1lD3Dvckf3/uwpV6evBEGxow4YDu/cdq0fIvUl2f1vYQa77cqIeeGJIcfAiGvUbDjjpy9FjyqWZrh5XvvWL/vGzV1+rS52XNmTjQBh8SExM1evJcjZ/6gf1+nty5NGHoE6pWpVKaXa1e/4N6/Xd8cpvBjCnSzyGo4O8KElTwb30IKvi3NowMgXAFCCqEK8d1CHgnQFDBO3s3eiao4IYyfSCAgKMCBBUc5aSxJAGCCjwJCCCAAAIIeCNAUMEbd3qNXIGwgwrmlm9/sI8eebCJGtarGbkCpxm5CVns2XtAJYoXSXMlhcBlr02bp8/Xfa8pI3tnKoMz3QxBBX+XmqCCf+tDUMG/tWFkCIQrQFAhXDmuQ8A7AYIK3tm70TNBBTeU6QMBBBwVIKjgKCeNJQkQVOBJQAABBBBAwBsBggreuNNr5AqcVVDhw8Wr7FYMV1e7WJ1b36HKF54XuRIhjtyEEya/s1Df/rBZowZ2Va2rLg2xhcg9naCCv2tHUMG/9SGo4N/aMDIEwhUgqBCuHNch4J0AQQXv7N3omaCCG8r0gQACjgoQVHCUk8aSBAgq8CQggAACCCDgjQBBBW/c6TVyBc4qqGBu++ixWG3YtEUVzyulIoXOiVyJEEf+9z+79M/Ovap6cQXlyJE9xKsj+3SCCv6uH0EF/9aHoIJ/a8PIEAhXgKBCuHJch4B3AgQVvLN3o2eCCm4o0wcCCDgqQFDBUU4aSxIgqMCTgAACCCCAgDcCBBW8cafXyBU466BC5N46Iw9XgKBCuHLuXEdQwR3ncHohqBCOGtcg4G8Bggr+rs//sXfncXtedYHGT/amTXcWFS1gZQc7sqh8dFBAcUMFx0GJERnZ12EXQRRawSn7XoblAxTDiKwDIgPYUaYjouAClDJsxUEdGeh0TZvlTfLO53ljY9K8D3nOe5/7vn/n3N/+MVVzn3N+57oO2ibXJKZDYDUCQoW234VQoW2/bodAkwSECk1qHftSQoWxDTgfAQQQQGCqBIQKUzXv3mslIFRYK7kJrxMqxJYvVIjrR6gQ143JEFgrAaHCWslZh8B4BIQK47Ef4uTmQoWLLk7pS5cdQnffe6V0m1sPgdEZCCAwJAGhwpC0J3OWUGEyql0UAQQQQCAYAaFCMCHGCU9AqBBeUbwBhQrxnBw5kVAhrh+hQlw3JkNgrQSECmslZx0C4xEQKozHfoiThQpDUHYGAggUJSBUKIrTZocICBW8BAQQQAABBMYhIFQYh7tT6yUgVKjX3WiTCxVGQ7/QwUKFhTCN8pFQYRTsDkWgVwJChV7x2hyBXggIFXrBGmZToUIYFQZBAIFFCQgVFiXluwwCQoUMWD5FAAEEEECgIAGhQkGYtpoEAaHCJDSXvaRQoSzP0rsJFUoTLbefUKEcSzshEIWAUCGKCXMgsDgBocLirGr8UqhQozUzIzBxAkKFiT+Afq4vVOiHq10RQAABBBA4HgGhwvEI+XEEjiYgVPAisgkIFbKRDbpAqDDjYpoJAAAgAElEQVQo7qzDhApZuHyMQBUEhApVaDIkAkcRECq0/SCECm37dTsEmiQgVGhS69iXEiqMbcD5CCCAAAJTJSBUmKp5914rAaHCWslNeJ1QIbZ8oUJcP0KFuG5MhsBaCQgV1krOOgTGIyBUGI/9ECcLFYag7AwEEChKQKhQFKfNDhEQKngJCCCAAAIIjENAqDAOd6fWS0CoUK+70SYXKoyGfqGDhQoLYRrlI6HCKNgdikCvBIQKveK1OQK9EBAq9II1zKZChTAqDIIAAosSECosSsp3GQSEChmwfIoAAggggEBBAkKFgjBtNQkCQoVJaC57SaFCWZ6ldxMqlCZabj+hQjmWdkIgCgGhQhQT5kBgcQJChcVZ1filUKFGa2ZGYOIEhAoTfwD9XF+o0A9XuyKAAAIIIHA8AkKF4xHy4wgcTUCo4EVkExAqZCMbdIFQYVDcWYcJFbJw+RiBKggIFarQZEgEjiIgVGj7QQgV2vbrdgg0SUCo0KTWsS8lVBjbgPMRQAABBKZKQKgwVfPuvVYCQoW1kpvwOqFCbPlChbh+hApx3ZgMgbUSECqslZx1CIxHQKgwHvshTm4uVBgCmjMQQGBcAkKFcfk3erpQoVGxroUAAgggEJ6AUCG8IgMGIyBUCCakhnGECrEtCRXi+hEqxHVjMgTWSkCosFZy1iEwHgGhwnjshzhZqDAEZWcggEBRAkKFojhtdoiAUMFLQAABBBBAYBwCQoVxuDu1XgJChXrdjTa5UGE09AsdLFRYCNMoHwkVRsHuUAR6JSBU6BWvzRHohYBQoResYTYVKoRRYRAEEFiUgFBhUVK+yyAgVMiA5VMEEEAAAQQKEhAqFIRpq0kQECpMQnPZSwoVyvIsvZtQoTTRcvsJFcqxtBMCUQgIFaKYMAcCixMQKizOqsYvhQo1WjMzAhMnIFSY+APo5/pChX642hUBBBBAAIHjERAqHI+QH0fgaAJCBS8im4BQIRvZoAuECoPizjpMqJCFy8cIVEFAqFCFJkMicBQBoULbD0Ko0LZft0OgSQJChSa1jn0pocLYBpyPAAIIIDBVAkKFqZp377USECqsldyE1wkVYssXKsT1I1SI68ZkCKyVgFBhreSsQ2A8AkKF8dgPcbJQYQjKzkAAgaIEhApFcdrsEAGhgpeAAAIIIIDAOASECuNwd2q9BIQK9bobbXKhwmjoFzpYqLAQplE+EiqMgt2hCPRKQKjQK16bI9ALAaFCL1jDbCpUCKPCIAggsCgBocKipHyXQUCokAHLpwgggAACCBQkIFQoCNNWkyAgVJiE5rKXFCqU5Vl6N6FCaaLl9hMqlGNpJwSiEBAqRDFhDgQWJyBUWJxVjV8KFWq0ZmYEJk5AqDDxB9DP9YUK/XC1KwIIIIAAAscjIFQ4HiE/jsDRBIQKXkQ2AaFCNrJBFwgVBsWddZhQIQuXjxGogoBQoQpNhkTgKAJChbYfhFChbb9uh0CTBIQKTWod+1JChbENOB8BBBBAYKoEhApTNe/eayUgVFgruQmvEyrEli9UiOtHqBDXjckQWCsBocJayVmHwHgEhArjsR/i5OZChYsuTulLlx1Cd997pXSbWw+B0RkIIDAkAaHCkLQnc5ZQYTKqXRQBBBBAIBgBoUIwIcYJT0CoEF5RvAGFCvGcHDmRUCGuH6FCXDcmQ2CtBIQKayVnHQLjERAqjMd+iJOFCkNQdgYCCBQlIFQoitNmhwgIFbwEBBBAAAEExiEgVBiHu1PrJSBUqNfdaJMLFUZDv9DBQoWFMI3ykVBhFOwORaBXAkKFXvHaHIFeCAgVesEaZlOhQhgVBkEAgUUJCBUWJeW7DAJChQxYPkUAAQQQQKAgAaFCQZi2mgQBocIkNJe9pFChLM/SuwkVShMtt59QoRxLOyEQhYBQIYoJcyCwOAGhwuKsavxSqFCjNTMjMHECQoWJP4B+ri9U6IerXRFAAAEEEDgeAaHC8Qj5cQSOJiBU8CKyCQgVspENukCoMCjurMOEClm4fIxAFQSEClVoMiQCRxEQKrT9IIQKbft1OwSaJCBUaFLr2JcSKoxtwPkIIIAAAlMlIFSYqnn3XisBocJayU14nVAhtnyhQlw/QoW4bkyGwFoJCBXWSs46BMYjIFQYj/0QJwsVhqDsDAQQKEpAqFAUp80OERAqeAkIIIAAAgiMQ0CoMA53p9ZLQKhQr7vRJhcqjIZ+oYOFCgthGuUjocIo2B2KQK8EhAq94rU5Ar0QECr0gjXMpkKFMCoMggACixIQKixKyncZBIQKGbB8igACCCCAQEECQoWCMG01CQJChUloLntJoUJZnqV3EyqUJlpuP6FCOZZ2QiAKAaFCFBPmQGBxAkKFxVnV+KVQoUZrZkZg4gSEChN/AP1cX6jQD1e7IoAAAgggcDwCQoXjEfLjCBxNQKjgRWQTECpkIxt0gVBhUNxZhwkVsnD5GIEqCAgVqtBkSASOIiBUaPtBCBXa9ut2CDRJQKjQpNaxLyVUGNuA8xFAAAEEpkpAqDBV8+69VgJChbWSm/A6oUJs+UKFuH6ECnHdmAyBtRIQKqyVnHUIjEdAqDAe+yFObi5UGAKaMxBAYFwCQoVx+Td6ulChUbGuhQACCCAQnoBQIbwiAwYjIFQIJqSGcYQKsS0JFeL6ESrEdWMyBNZKQKiwVnLWITAeAaHCeOyHOFmoMARlZyCAQFECQoWiOG12iIBQwUtAAAEEEEBgHAJChXG4O7VeAkKFet2NNrlQYTT0Cx0sVFgI0ygfCRVGwe5QBHolIFToFa/NEeiFgFChF6xhNhUqhFFhEAQQWJSAUGFRUr7LICBUyIDlUwQQQAABBAoSECoUhGmrSRAQKkxCc9lLChXK8iy9m1ChNNFy+wkVyrG0EwJRCAgVopgwBwKLExAqLM6qxi+FCjVaMzMCEycgVJj4A+jn+kKFfrjaFQEEEEAAgeMRECocj5AfR+BoAkIFLyKbgFAhG9mgC4QKg+LOOkyokIXLxwhUQUCoUIUmQyJwFAGhQtsPQqjQtl+3Q6BJAkKFJrWOfSmhwtgGnI8AAgggMFUCQoWpmnfvtRIQKqyV3ITXCRViyxcqxPUjVIjrxmQIrJWAUGGt5KxDYDwCQoXx2A9xslBhCMrOQACBogSECkVx2uwQAaGCl4AAAggggMA4BIQK43B3ar0EhAr1uhttcqHCaOgXOliosBCmUT4SKoyC3aEI9EpAqNArXpsj0AsBoUIvWMNsKlQIo8IgCCCwKAGhwqKkfJdBQKiQAcunCCCAAAIIFCQgVCgI01aTICBUmITmspcUKpTlWXo3oUJpouX2EyqUY2knBKIQECpEMWEOBBYnIFRYnFWNXwoVarRmZgQmTkCoMPEH0M/1hQr9cLUrAggggAACxyMgVDgeIT+OwNEEhApeRDYBoUI2skEXCBUGxZ11mFAhC5ePEaiCgFChCk2GROAoAkKFth+EUKFtv26HQJMEhApNah37UkKFsQ04HwEEEEBgqgSEClM1795rJSBUWCu5Ca8TKsSWL1SI60eoENeNyRBYKwGhwlrJWYfAeASECuOxH+Lk5kKFiy5O6UuXHUJ333uldJtbD4HRGQggMCQBocKQtCdzllBhMqpdFAEEEEAgGAGhQjAhxglPQKgQXlG8AYUK8ZwcOZFQIa4foUJcNyZDYK0EhAprJWcdAuMRECqMx36Ik4UKQ1B2BgIIFCUgVCiK02aHCAgVvAQEEEAAAQTGISBUGIe7U+slIFSo191okwsVRkO/0MFChYUwjfKRUGEU7A5FoFcCQoVe8docgV4ICBV6wRpmU6FCGBUGQQCBRQkIFRYl5bsMAkKFDFg+RQABBBBAoCABoUJBmLaaBAGhwiQ0l72kUKEsz9K7CRVKEy23n1ChHEs7IRCFgFAhiglzILA4AaHC4qxq/FKoUKM1MyMwcQJChYk/gH6uL1Toh6tdEUAAAQQQOB4BocLxCPlxBI4mIFTwIrIJCBWykQ26QKgwKO6sw4QKWbh8jEAVBIQKVWgyJAJHERAqtP0ghApt+3U7BJokIFRoUuvYlxIqjG3A+QgggAACUyUgVJiqefdeKwGhwlrJTXidUCG2fKFCXD9ChbhuTIbAWgkIFdZKzjoExiMgVBiP/RAnCxWGoOwMBBAoSkCoUBSnzQ4RECp4CQgggAACCIxDQKgwDnen1ktAqFCvu9EmFyqMhn6hg4UKC2Ea5SOhwijYHYpArwSECr3itTkCvRAQKvSCNcymQoUwKgyCAAKLEhAqLErKdxkEhAoZsHyKAAIIIIBAQQJChYIwbTUJAkKFSWgue0mhQlmepXcTKpQmWm4/oUI5lnZCIAoBoUIUE+ZAYHECQoXFWdX4pVChRmtmRmDiBIQKE38A/VxfqNAPV7sigAACCCBwPAJCheMR8uMIHE1AqOBFZBMQKmQjG3SBUGFQ3FmHCRWycPkYgSoICBWq0GRIBI4iIFRo+0EIFdr263YINElAqNCk1rEvJVQY24DzEUAAAQSmSkCoMFXz7r1WAkKFtZKb8DqhQmz5QoW4fmahwtUH9qXP7Lo27pAmQwCBLAKnbNyY7nbaaWnz+vVZ63yMAALjERAqjMd+iJNnocLGr/192vTB96R04MAQRzoDAQQQ6EbgvvdL6Zy7dtvDagRuRGAWKnxt/cfS15e+iA0CCCCAAAIIDEhgXVqf7rbt/ukmm87q5dTZrzGk5eV04gkbe9nfpggMTUCoMDTxBs4TKsSWKFSI62f2DxF79x1IJ27ZkLZs3hB30IlOtryc0rW7l9IpJ26aKIHY1z5wcDnt3nsgbdvqH8JjmzIdAvEJCBXiO+oy4SxUmP3fi62bN6StW/zzVheWUdfu2XcgrVu3Lm3ZJBKM6qjLXMvLy2nX7gPp5BP9M18XjtYiMAsVNmxYv/Lvt+vW4dGVwP6Dy2nv3gPpJP8+2hXlyno//1IE41GbzH6+/pSTNiX/cS/D9trd+1d+/nbDekRLEL1+7/60acOGtGkjnmV4ChVKcLRHHAJChTguqplEqBBblVAhrp9ZqHD9nkP/oKt4jOdp9i/KV1y7N515ypZ4w5ko7T8w+0nrpXTats1oIIAAAp0ICBU64Qu/eBYqXLd7fzph8wZxW3hbaxvwuj370/p164Qoa8MXftXBg8vpquuW0hkn+2e+8LIMGJrALFQ4uJzSGadsSX6drbuqpQPL6frdS+lU/z7aHea/hAp+/qUIysObXH713nTmqVuECoWwXrlrXzp566a0cYNfWC+B9Nrrl9LmTRuExiVgppT8jgqFQNomDAGhQhgV9QwiVIjtSqgQ149QIa6b2WRChdh+hAqx/ZgOgZoICBVqspU/q1Ahn1ltK4QKtRnLm1eokMfL1wjMIyBUKPs2hAplefr5l7I8Z7sJFcoyFSqU5SlUKMtTqFCWp93GJyBUGN9BdRMIFWIrEyrE9SNUiOtGqBDbzWw6oUJ8RyZEoBYCQoVaTK1tTqHC2rjVtEqoUJOt/FmFCvnMrEBgNQJChbLvQqhQlqdQoSxPoUJ5nkKFskyFCmV5ChXK8rTb+ASECuM7qG4CoUJsZUKFuH6ECnHdCBViuxEqxPdjQgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUKHs2xAqlOUpVCjLU6hQnqdQoSxToUJZnkKFsjztNj4BocL4DqqbQKgQW5lQIa4foUJcN0KF2G6ECvH9mBCBmggIFWqylT+rUCGfWW0rhAq1GcubV6iQx8vXCAgVhnkDQoWynIUKZXkKFcrzFCqUZSpUKMtTqFCWp93GJyBUGN9BdRMIFWIrEyrE9SNUiOtGqBDbjVAhvh8TIlATAaFCTbbyZxUq5DOrbYVQoTZjefMKFfJ4+RoBocIwb0CoUJazUKEsT6FCeZ5ChbJMhQpleQoVyvK02/gEhArjO6huAqFCbGVChbh+hApx3QgVYrsRKsT3Y0IEaiIgVKjJVv6sQoV8ZrWtECrUZixvXqFCHi9fIyBUGOYNCBXKchYqlOUpVCjPU6hQlqlQoSxPoUJZnnYbn4BQYXwH1U0gVIitTKgQ149QIa4boUJsN0KF+H5MiEBNBIQKNdnKn7W5UGHHjpR27jwEYvb37dvzoTS2QqjQmNAbXUeo0LZftxuOwBXX7E0Hl1M645Qtaf264c5t9SShQlmzQoWyPGe7XX713nTmqVuS/7iXYStUKMPxhl2ECmV5ChXK8rTb+ASECuM7qG4CoUJsZUKFuH6ECnHdzCbzL8qx/ew/sJx27V5Kp23bHHtQ0yGAQHgCQoXwijoNKFTohK+KxUKFKjSteUihwprRWYjAUQSECmUfhFChLE8//1KW52w3oUJZpkKFsjyFCmV5ChXK8rTb+ASECuM7qG4CoUJsZUKFuH6ECnHdCBViu5lNJ1SI78iECNRCQKhQi6m1zSlUWBu3mlYJFWqylT+rUCGfmRUIrEZAqFD2XQgVyvIUKpTlKVQoz1OoUJapUKEsT6FCWZ52G5+AUGF8B9VNIFSIrUyoENePUCGuG6FCbDdChfh+TIhATQSECjXZyp9VqJDPrLYVQoXajOXNK1TI4+VrBOYRECqUfRtChbI8hQpleQoVyvMUKpRlKlQoy1OoUJan3cYnIFQY30F1EwgVYisTKsT1I1SI60aoENuNUCG+HxMiUBMBoUJNtvJnFSrkM6tthVChNmN58woV8nj5GgGhwjBvQKhQlrNQoSxPoUJ5nkKFskyFCmV5ChXK8rTb+ASECuM7qG4CoUJsZUKFuH6ECnHdCBViuxEqxPdjQgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jIFQY5g0IFcpyFiqU5SlUKM9TqFCWqVChLE+hQlmedhufgFBhfAfVTSBUiK1MqBDXj1AhrhuhQmw3QoX4fkyIQE0EhAo12cqfVaiQz6y2FUKF2ozlzStUyOPlawSECsO8AaFCWc5ChbI8hQrleQoVyjIVKpTlKVQoy9Nu4xMQKozvoLoJhAqxlQkV4voRKsR1I1SI7UaoEN+PCRGoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNgFBhmDcgVCjLWahQlqdQoTxPoUJZpkKFsjyFCmV52m18AkKF8R1UN4FQIbYyoUJcP0KFuG6ECrHdCBXi+zEhAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxEQKgzzBoQKZTkLFcryFCqU5ylUKMtUqFCWp1ChLE+7jU9AqDC+g+omECrEViZUiOtHqBDXjVAhthuhQnw/JkSgJgJChZps5c/aXKiQj6D5FUKFthULFdr263bDEbjimr3p4HJKZ5yyJa1fN9y5rZ4kVChrVqhQlqdQoTxPoUJZpkKFsjyFCmV52m18AkKF8R1UN4FQIbYyoUJcP0KFuG6ECrHdCBXi+zEhAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0CoUPZtCBXK8hQqlOUpVCjPU6hQlqlQoSxPoUJZnnYbn4BQYXwH1U0gVIitTKgQ149QIa4boUJsN0KF+H5MiEBNBIQKNdnKn1WokM+sthVChdqM5c0rVMjj5WsEhArDvAGhQlnOQoWyPIUK5XkKFcoyFSqU5SlUKMvTbuMTECqM76C6CYQKsZUJFeL6ESrEdSNUiO1GqBDfjwkRqImAUKEmW/mzChXymdW2QqhQm7G8eYUKebx8jYBQYZg3IFQoy1moUJanUKE8T6FCWaZChbI8hQpledptfAJChfEdVDeBUCG2MqFCXD9ChbhuhAqx3QgV4vsxIQI1ERAq1GQrf1ahQj6z2lYIFWozljevUCGPl68RECoM8waECmU5CxXK8hQqlOcpVCjLVKhQlqdQoSxPu41PQKgwvoPqJhAqxFYmVIjrR6gQ141QIbYboUJ8PyZEoCYCQoWabOXPKlTIZ1bbCqFCbcby5hUq5PHyNQJChWHegFChLGehQlmeQoXyPIUKZZkKFcryFCqU5Wm38QkIFcZ3UN0EQoXYyoQKcf0IFeK6ESrEdiNUiO/HhAjURECoUJOt/FmFCvnMalshVKjNWN68QoU8Xr5GQKgwzBsQKpTlLFQoy1OoUJ6nUKEsU6FCWZ5ChbI87TY+AaHC+A6qm0CoEFuZUCGuH6FCXDdChdhuhArx/ZgQgZoICBVqspU/q1Ahn1ltK4QKtRnLm1eokMfL1wgIFYZ5A0KFspyFCmV5ChXK8xQqlGUqVCjLU6hQlqfdxicgVBjfQXUTCBViKxMqxPUjVIjrRqgQ241QIb4fEyJQEwGhQk228mcVKuQzq22FUKE2Y3nzChXyePkaAaHCMG9AqFCWs1ChLE+hQnmeQoWyTIUKZXkKFcrytNv4BIQK4zuoboJrrl9KWzdvSJs2rq9u9ikMfNWupXTKiRvT+vXrpnDdqu44+4nz6/fsX/nPz4knbKxq9ikM61+UY1vef2A57dq9lE7btjn2oKZDAIHwBJaWDqY9+w+kk7duCj+rAfMJ7Fk6kK7bvT9t2bQhbdvawD9v7diR0s6dh0DM/r59ez6UxlYIFRoTeqPrCBXa9ut2wxG44pq9KaV16bSTNyc/PdSd+yxU2L1nfzrlJP/82J1mSrOff7lq1750+sn+/b4Ez9keV1yzL51+yubkZ4PLEL3quqW07YSNaeMGREsQnf183uaNG9LmTX49qQRPoUIJivaIRECoEMnGGma57sCB9E+7d6cDs3/CG+ivAweXV/4lZ906/4d6IORZxxzysy7Rk4VtkI8PLi+n0zdsTqdt2ChUGIR43iFChTxeQ38tVBiauPMmReALn0/pn/5hMldeXl5e+clRUWebymd+l77zVmnfWWcLFdpUnIQKjYr9l2sJFdr263bDEZiFClds/Fzam671C5cFsM9+1nX2zxizn2/zVxkCs5+/3KCiKQMzpYRnMZQrG81+Dnf2ax/+E1+G68Hl2a8lzfI5f80jsHn9ielWW/5N2rju+EGcUME7ao2AUKFyo9fu358++o1vpNnf/YUAAvEJ3PuMm6SbbNwsVAioSqgQUMoRIwkVYvsxXeUEPn5xSm97U+WXMD4C/0pg6RFPSHvvcI5QodFHIVRoVOy/XEuo0LZftxuOwCxUuOTgu9Nlez853KFOQgABBBBAAIE1Ebjpplul+53+mLRp3fF/pxmhwpoQWxSYgFAhsJxFRhMqLELJNwjEISBUiOPixpMIFeK6mU0mVIjtx3SVExAqVC7Q+DcmIFRo+00IFdr2K1Ro26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2V5KK7+Tgt9RoXKJxp8UAaFCXN1ChbhuhAqx3ZiuAQJChQYkusKRBIQKbb8HoULbfoUKbft1u+EICBWGY+0kBBBAAAEEuhIQKnQlaH3NBIQKNdsTKlRuz/hTJCBUiGtdqBDXjVAhthvTNUBAqNCARFcQKkznDQgV2nYtVGjbr9sNR0CoMBxrJyGAAAIIINCVgFChK0HrayYgVKjZnlChcnvGnyIBoUJc60KFuG6ECrHdmK4BAkKFBiS6glBhOm9AqNC2a6FC237dbjgCQoXhWDsJAQQQQACBrgSECl0JWl8zAaFCzfaECpXbM/4UCQgV4loXKsR1I1SI7cZ0DRAQKjQg0RWECtN5A0KFtl0LFdr263bDERAqDMfaSQgggAACCHQlIFToStD6mgkIFWq2J1So3J7xp0hAqBDXulAhrhuhQmw3pmuAgFChAYmuIFSYzhsQKrTtWqjQtl+3G46AUGE41k5CAAEEEECgKwGhQleC1tdMQKhQsz2hQuX2jD9FAkKFuNaFCnHdCBViuzFdAwSECg1IdIVmQwVqjyEgVGj7UQgV2vbrdsMRECoMx9pJCCCAAAIIdCUgVOhK0PqaCQgVarYnVKjcnvGnSECoENe6UCGuG6FCbDema4CAUKEBia4gVJjOGxAqtO1aqNC2X7cbjoBQYTjWTkIAAQQQQKArAaFCV4LW10xAqFCzPaFC5faMP0UCQoW41oUKcd0IFWK7MV0DBIQKDUh0BaHCdN6AUKFt10KFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAkKFmu0JFSq3Z/wpEhAqxLUuVIjrRqgQ243pGiAgVGhAoisIFabzBoQKbbsWKrTt1+2GIyBUGI61kxBAAAEEEOhKQKjQlaD1NRMQKtRsT6hQuT3jT5GAUCGudaFCXDdChdhuTNcAAaFCAxJdQagwnTcgVGjbtVChbb9uNxwBocJwrJ2EAAIIIIBAVwJCha4Era+ZgFChZntChcrtGX+KBIQKca0LFeK6ESrEdmO6BggIFRqQ6ApChem8AaFC266FCm37dbvhCAgVhmPtJAQQQAABBLoSECp0JWh9zQSECjXbEypUbs/4UyQgVIhrXagQ141QIbYb0zVAQKjQgERXECpM5w0IFdp2LVRo26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2Z5QoXJ7xp8iAaFCXOtChbhuhAqx3ZiuAQJChQYkuoJQYTpvQKjQtmuhQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfMwGhQs32hAqV2zP+FAkIFeJaFyrEdSNUiO3GdA0QECo0INEVhArTeQNChbZdCxXa9ut2wxEQKgzH2kkIIIAAAgh0JSBU6ErQ+poJCBVqtidUqNye8adIQKgQ17pQIa4boUJsN6ZrgIBQoQGJrtBsqLBjR0o7dx663uzv27dPXrZQoe0nIFRo26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2Z5QoXJ7xp8iAaFCXOtChbhuhAqx3ZiuAQJChQYkuoJQYTpvQKjQtmuhQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfMwGhQs32hAqV2zP+FAkIFeJaFyrEdSNUiO3GdA0QECo0INEVhArTeQNChbZdC7BW8DEAACAASURBVBXa9ut2wxEQKgzH2kkIIIAAAgh0JSBU6ErQ+poJCBVqtidUqNye8adIQKgQ17pQIa4boUJsN6ZrgIBQoQGJriBUmM4bECq07Vqo0LZftxuOgFBhONZOQgABBBBAoCsBoUJXgtbXTECoULM9oULl9ow/RQJChbjWhQpx3QgVYrsxXQMEhAoNSHQFocJ03oBQoW3XQoW2/brdcASECsOxdhICCCCAAAJdCQgVuhK0vmYCQoWa7QkVKrdn/CkSECrEtS5UiOtGqBDbjekaICBUaECiKwgVpvMGhAptuxYqtO3X7YYjIFQYjrWTEEAAAQQQ6EpAqNCVoPU1ExAq1GxPqFC5PeNPkYBQIa51oUJcN0KF2G5M1wABoUIDEl1BqDCdNyBUaNu1UKFtv243HAGhwnCsnYQAAggggEBXAkKFrgStr5mAUKFme0KFyu0Zf4oEhApxrQsV4roRKsR2Y7oGCAgVGpDoCkKF6bwBoULbroUKbft1u+EICBWGY+0kBBBAAAEEuhIQKnQlaH3NBIQKNdsTKlRuz/hTJCBUiGtdqBDXjVAhthvTNUBAqNCARFcQKkznDQgV2nYtVGjbr9sNR0CoMBxrJyGAAAIIINCVgFChK0HrayYgVKjZnlChcnvGnyIBoUJc60KFuG6ECrHdmK4BAkKFBiS6QrOhArXHEBAqtP0ohApt+3W74QgIFYZj7SQEEEAAAQS6EhAqdCVofc0EhAo12xMqVG7P+FMkIFSIa12oENeNUCG2G9M1QECo0IBEVxAqTOcNCBXadi1UaNuv2w1HQKgwHGsnIYAAAggg0JWAUKErQetrJiBUqNmeUKFye8afIgGhQlzrQoW4boQKsd2YrgECQoUGJLqCUGE6b0Co0LZroULbft1uOAJCheFYOwkBBBBAAIGuBIQKXQlaXzMBoULN9oQKldsz/hQJCBXiWhcqxHUjVIjtxnQNEBAqNCDRFYQK03kDQoW2XQsV2vbrdsMRECoMx9pJCCCAAAIIdCUgVOhK0PqaCQgVarYnVKjcnvGnSECoENe6UCGuG6FCbDema4CAUKEBia4gVJjOGxAqtO1aqNC2X7cbjoBQYTjWTkIAAQQQQKArAaFCV4LW10xAqFCzPaFC5faMP0UCQoW41oUKcd0IFWK7MV0DBIQKDUh0BaHCdN6AUKFt10KFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAkKFmu0JFSq3Z/wpEhAqxLUuVIjrRqgQ243pGiAgVGhAoisIFabzBoQKbbsWKrTt1+2GIyBUGI61kxBAAAEEEOhKQKjQlaD1NRMQKtRsT6hQuT3jT5GAUCGudaFCXDdChdhuTNcAAaFCAxJdQagwnTcgVGjbtVChbb9uNxwBocJwrJ2EAAIIIIBAVwJCha4Era+ZgFChZntChcrtGX+KBIQKca0LFeK6ESrEdmO6BggIFRqQ6ApChem8AaFC266FCm37dbvhCAgVhmPtJAQQQAABBLoSECp0JWh9zQSECjXbEypUbs/4UyQgVIhrXagQ141QIbYb0zVAQKjQgERXaDZU2LEjpZ07D11v9vft2ycvW6jQ9hMQKrTt1+2GIyBUGI61kxBAAAEEEOhKQKjQlaD1NRMQKtRsT6hQuT3jT5GAUCGudaFCXDdChdhuTNcAAaFCAxJdQagwnTcgVGjbtVChbb9uNxwBocJwrJ2EAAIIIIBAVwJCha4Era+ZgFChZntChcrtGX+KBIQKca0LFeK6ESrEdmO6BggIFRqQ6ApChem8AaFC266FCm37dbvhCAgVhmPtJAQQQAABBLoSECp0JWh9zQSECjXbEypUbs/4UyQgVIhrXagQ141QIbYb0zVAQKjQgERXECpM5w0IFdp2LVRo26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2Z5QoXJ7xp8iAaFCXOtChbhuhAqx3ZiuAQJChQYkuoJQYTpvQKjQtmuhQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfMwGhQs32hAqV2zP+FAkIFeJaFyrEdSNUiO3GdA0QECo0INEVhArTeQNChbZdCxXa9ut2wxEQKgzH2kkIIIAAAgh0JSBU6ErQ+poJCBVqtidUqNye8adIQKgQ17pQIa4boUJsN6ZrgIBQoQGJriBUmM4bECq07Vqo0LZftxuOgFBhONZOQgABBBBAoCsBoUJXgtbXTECoULM9oULl9ow/RQJChbjWhQpx3QgVYrsxXQMEhAoNSHQFocJ03oBQoW3XQoW2/brdcASECsOxdhICCCCAAAJdCQgVuhK0vmYCQoWa7QkVKrdn/CkSECrEtS5UiOtGqBDbjekaICBUaECiKwgVpvMGhAptuxYqtO3X7YYjIFQYjrWTEEAAAQQQ6EpAqNCVoPU1ExAq1GxPqFC5PeNPkYBQIa51oUJcN0KF2G5M1wABoUIDEl2h2VCB2mMICBXafhRChbb9ut1wBIQKw7F2EgIIIIAAAl0JCBW6ErS+ZgJChZrtCRUqt2f8KRIQKsS1LlSI60aoENuN6RogIFRoQKIrCBWm8waECm27Fiq07dfthiMgVBiOtZMQQAABBBDoSkCo0JWg9TUTECrUbE+oULk940+RgFAhrnWhQlw3QoXYbkzXAAGhQgMSXUGoMJ03IFRo27VQoW2/bjccAaHCcKydhAACCCCAQFcCQoWuBK2vmYBQoWZ7QoXK7Rl/igSECnGtCxXiuhEqxHZjugYICBUakOgKQoXpvAGhQtuuhQpt+3W74QgIFYZj7SQEEEAAAQS6EhAqdCVofc0EhAo12xMqVG7P+FMkIFSIa12oENeNUCG2G9M1QECo0IBEVxAqTOcNCBXadi1UaNuv2w1HQKgwHGsnIYAAAggg0JWAUKErQetrJtA5VLj8iqvT33z2S+l77/jd6dtueka6+C8/k2565mnp9t9zVhaX/QcOpPXr1qf169cdXnfpF/8+XXn1rvRD97jzwnvd+PzZv+RecdU1adOmjenUk09aaJ99+5ZWzr3ZTU5L69b96zxH7v3Vr/1z+uo/fD3d7Xtvu/C+Cx2e+dG1+/enj37jG2n2d38hgEB8AkKFuI6ECnHdzCbbf2A57dq9lE7btjn2oKZDoEYCQoUarZn5WxBYesQT0t47nJO2bd2IU4MEhAoNSj3iSkKFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAp1Chbe/96J0wVvfl37sXndPv/LAH0vfc+tbpAc/9rx0rx/83vSIX7l/+uVHn5vOusXN0kuf+7jDjC66+G/SE5/zyvTHv39+uuV33nzlf757z770S496bnrkjp9N9//xex7+9pVvevdKBPGWlz9zYcY3nP+Yh/x8+otPfS498TmvStfv3rOy/h7/5vbpaY/5pXTn29161f2Wl5fTBRe+P73mze9d+fEzTjs5vfoFT0rn3PHslf/+yL1nc737gx9LH/nYp9L5v/WodJ8f+r6FZyz5oVChJE17IdA/AaFC/4zXeoJQYa3khlknVBiGs1MmSkCoMFHx7V5bqNCu29nNhApt+xUqtO3X7YYjIFQYjrWTEEAAAQQQ6EpAqNCVoPU1E1hzqDD7Rf2f3P6M9BuPe3C6zw/f9TCDxz3r5emHv/8u6cEPuG/6wlf+If3Cw56TXva8x6f7/cjd05VXX5vu98tPT09+5L9P2x9435U1L37dO9Kb/+BDK//1+c9+1FGhwlvf+eH06c99+ajQ4Xiwjzz/E39zafrm5Vele93znLRnz7507svemmb/0nvBf3ryqtv87SVfSjse//z0tlc9K93l9t+dXvmm96QPXvQX6U/e8dKV3+nhyL1v2ODCd344/c+/+mx6/YuedrzRevlxoUIvWG2KQG8EhAq9oe28sVChM8JeNxAq9IrX5lMnIFSY+gto7v5CheaUHnUhoULbfoUKbft1u+EICBWGY+0kBBBAAAEEuhIQKnQlaH3NBNYcKuzZuy/d7ScemT608/x01i0O/c4Is7+e/Z/emH7oHndJP33fH1j57//z2z6Q3vj2D6aP/sGL07kvuzBds+u69PoXPu3wH/Fw1dW70p59+9L2x56XnvLIBx0VKrz3Qxenz3z+svQ7T/m1lb0++/nL0u++/G3p3Gf8errd2d+1Kvcbn3/kRx/4yMfTM1/w+vTpi96UNm7YcMz6l7zuD9Pnv/y/0xtf/PSVH/vG5Vele//ik9K73vC8dIfb3PKYu82++cRfX5qeft4F6eL3vWqUdyBUGAW7QxFYMwGhwprR9b5QqNA74k4HCBU64bMYgW9NQKjghTRGQKjQmNAbXUeo0LZfoULbft1uOAJCheFYOwkBBBBAAIGuBIQKXQlaXzOBNYcKsz/64Fef8Pz0lx+8IG07aethBpdfcXU6ceuWdOLWE1b+Z0v7D6QHP+bclT9+4Zv/7+r0/re+IH37zc44htlPPPjp6Qm//gtHhQrXXb8n7d23tPJHMMz+mkUBD3vqC9PbX/ucw38cw403uvH5R/74LFL48lf/aSU8WO2vp517QTr91G3p2f/xVw//8J1+9KHptb/35PQj9zwnrbb3ZV/75/SzD/nNdNE7X5q+7abH3qvvxyFU6Juw/REoS0CoUJZnyd2ECiVplt9LqFCeqR0ROExAqOAxNEagqVBhx46Udu48ZGj29+3bG7OVfx2hQj6zmlYIFWqyZdbIBIQKke2YDQEEEEAAgaMJCBW8iCkTyA4V9h84kP7uki+n177lfelWZ317+u0nP+S4/D76Pz6VnvTbr1754x6OjACOXLhaqHDjjWf/wrq0f3/avGljWrdu3XHPPfKDG343hdnvlnDPu99p1bWPfPqL0+3OPis99dEPOvzj9/ipR6fnPu2h6Wfu+4Nzz3v4016UTtl2Unr49p9Ot/+eWx7+3SKyBlzjx0KFNYKzDIGRCAgVRgK/wLFChQUgjfiJUGFE+I5un4BQoX3HE7uhUKFt4UKFtv0KFdr263bDERAqDMfaSQgggAACCHQlIFToStD6mglkhwp//slL0uwX9O96l9umN7/8N1b9IxSOBLJv31L6pUc/L23etCld8oWvpj+68PfSrc/69mOYLRIqrBX0DTPP/giJB/3cveduM/sdFWa/e8Oznrjj8DdH/o4K8xbuum53+ncP/+30j//8zbn3W+vsx1snVDgeIT+OQCwCQoVYPo6cRqgQ181sMqFCbD+mq5yAUKFygca/MQGhQttvQqjQtl+hQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfM4HsUGF22S9e9o/pFW98Vzpp6wnphc959Le8/yvf9O703/70r9K733heesZ5F6Qrr96V3vKKZx4TOPQVKnz4z/4qPeW5r02/+xsPSw/8qX/7LWd9yev+MH3hK19Lr3/R01a++8blV6V7/+KTVv6oiDvc5pZz1/7iI34n3el2t0oP3/4z6bu+42aDvgehwqC4HYZAZwJChc4Ie9tAqNAb2iIbCxWKYLQJAqsTECp4GY0RECo0JvRG1xEqtO1XqNC2X7cbjoBQYTjWTkIAAQQQQKArAaFCV4LW10xgTaHC7MKf/fxl6Zcfc276+Adek049+aRVGXz60q+k7Y89L739tc9J59zx7JVf+P+ZX31metx/eEB66IN+cmXN7I+SWD64nO7/kN9Mj37Iz6X7/9g906ZNG1fd7zOXfiWd+7IL0/Of+fB0u7O/67jc/+uH/zw96/fekJ75+O3pPj9818Pfn37qtnTi1hPSJ//uf6XzX/Nf0kt+57Hplt958/S3l3wp7Xj889PbXvXsdJc7fPdKjPHHF30i/ck7Xjr3j3OYRRsP/PXfSh97zyvSTc449bgzlf5AqFCaqP0Q6JeAUKFfvl12Fyp0odf/WqFC/4ydMGECQoUJy2/z6kKFNr3ecCuhQtt+hQpt+3W74QgIFYZj7SQEEEAAAQS6EhAqdCVofc0E1hwq7N23lO56v0ekD+08P511i5sfw2DP3n3p5x/67PQTP3qP9JRHPejwj7/3Qxen3zr/TemPf//8lThg9rsdzH7XgyP/mvfHQ3ziry9ND3vqCw+HD8cDP4sa3vFf//sxn93wuyv86cf/Nj3+Wa9I73nTeSvhw/Lycnr1m9+bXnfh+1fWzGKG17/oqen77nybuUf9xac+l57xu69LF7/vVccbp5cfFyr0gtWmCPRGQKjQG9rOGwsVOiPsdQOhQq94bT51AkKFqb+A5u4vVGhO6VEXEiq07Veo0LZftxuOgFBhONZOQgABBBBAoCsBoUJXgtbXTGDNocLs0j/3a89Kj/m1n08/dZ8fqJnBMbPPIosrrrwmfdvNzpz7OyncsOgNO/8o/fknL0lvefkzR2EgVBgFu0MRWDMBocKa0fW+UKjQO+JOBwgVOuGzGIFvTUCo4IU0RkCo0JjQG11HqNC2X6FC237dbjgCQoXhWDsJAQQQQACBrgSECl0JWl8zgU6hwgc+8vGVP4rh+7/v9ulxD31AuuNtb1Uzi6zZZ3HCm9/xofTpz30lvfK8J6R73v1OWetLfSxUKEXSPggMQ0CoMAzntZwiVFgLteHWCBWGY+2kCRIQKkxQettXFiq07Veo0LZfoULbft1uOAJCheFYOwkBBBBAAIGuBIQKXQlaXzOBTqHC7OK79+xLn/38ZensW31HOvP0U2pmkTX7//n65enr37wy3eX2t06bNm3MWlvyY6FCSZr2QqB/AkKF/hmv9QShwlrJDbNOqDAMZ6dMlIBQYaLi2722UKFdt7ObCRXa9itUaNuv2w1HQKgwHGsnIYAAAggg0JWAUKErQetrJtA5VKj58i3MLlRowaI7TImAUCGubaFCXDezyYQKsf2YrnICQoXKBRr/xgSaChXoPYaAUKHtRyFUaNuv2w1HQKgwHGsnIYAAAggg0JWAUKErQetrJiBUqNleSkmoULlA40+OgFAhrnKhQlw3QoXYbkzXAAGhQgMSXeFIAkKFtt+DUKFtv0KFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAkKFmu0JFSq3Z/wpEhAqxLUuVIjrRqgQ243pGiAgVGhAoisIFabzBoQKbbsWKrTt1+2GIyBUGI61kxBAAAEEEOhKQKjQlaD1NRMQKtRsT6hQuT3jT5GAUCGudaFCXDdChdhuTNcAAaFCAxJdQagwnTcgVGjbtVChbb9uNxwBocJwrJ2EAAIIIIBAVwJCha4Era+ZgFChZntChcrtGX+KBIQKca0LFeK6ESrEdmO6BggIFRqQ6ApChem8AaFC266FCm37dbvhCAgVhmPtJAQQQAABBLoSECp0JWh9zQSECjXbEypUbs/4UyQgVIhrXagQ141QIbYb0zVAQKjQgERXECpM5w0IFdp2LVRo26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2Z5QoXJ7xp8iAaFCXOtChbhuhAqx3ZiuAQJChQYkuoJQYTpvQKjQtmuhQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfMwGhQs32hAqV2zP+FAkIFeJaFyrEdSNUiO3GdA0QECo0INEVhArTeQNChbZdCxXa9ut2wxEQKgzH2kkIIIAAAgh0JSBU6ErQ+poJCBVqtidUqNye8adIQKgQ17pQIa4boUJsN6ZrgIBQoQGJriBUmM4bECq07Vqo0LZftxuOgFBhONZOQgABBBBAoCsBoUJXgtbXTECoULM9oULl9ow/RQJChbjWhQpx3QgVYrsxXQMEhAoNSHSFZkOFHTtS2rnz0PVmf9++ffKyhQptPwGhQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfMwGhQs32hAqV2zP+FAkIFeJaFyrEdSNUiO3GdA0QECo0INEVhArTeQNChbZdCxXa9ut2wxEQKgzH2kkIIIAAAgh0JSBU6ErQ+poJCBVqtidUqNye8adIQKgQ17pQIa4boUJsN6ZrgIBQoQGJriBUmM4bECq07Vqo0LZftxuOgFBhONZOQgABBBBAoCsBoUJXgtbXTECoULM9oULl9ow/RQJChbjWhQpx3QgVYrsxXQMEhAoNSHQFocJ03oBQoW3XQoW2/brdcASECsOxdhICCCCAAAJdCQgVuhK0vmYCQoWa7QkVKrdn/CkSECrEtS5UiOtGqBDbjekaICBUaECiKwgVpvMGhAptuxYqtO3X7YYjIFQYjrWTEEAAAQQQ6EpAqNCVoPU1ExAq1GxPqFC5PeNPkYBQIa51oUJcN0KF2G5M1wABoUIDEl1BqDCdNyBUaNu1UKFtv243HAGhwnCsnYQAAggggEBXAkKFrgStr5mAUKFme0KFyu0Zf4oEhApxrQsV4roRKsR2Y7oGCAgVGpDoCkKF6bwBoULbroUKbft1u+EICBWGY+0kBBBAAAEEuhIQKnQlaH3NBIQKNdsTKlRuz/hTJCBUiGtdqBDXjVAhthvTNUBAqNCARFcQKkznDQgV2nYtVGjbr9sNR0CoMBxrJyGAAAIIINCVgFChK0HrayYgVKjZnlChcnvGnyIBoUJc60KFuG6ECrHdmK4BAkKFBiS6glBhOm9AqNC2a6FC237dbjgCQoXhWDsJAQQQQACBrgSECl0JWl8zAaFCzfaECpXbM/4UCQgV4loXKsR1I1SI7cZ0DRAQKjQg0RWaDRWoPYaAUKHtRyFUaNuv2w1HQKgwHGsnIYAAAggg0JWAUKErQetrJiBUqNmeUKFye8afIgGhQlzrQoW4boQKsd2YrgECQoUGJLqCUGE6b0Co0LZroULbft1uOAJCheFYOwkBBBBAAIGuBIQKXQlaXzMBoULN9oQKldsz/hQJCBXiWhcqxHUjVIjtxnQNEBAqNCDRFYQK03kDQoW2XQsV2vbrdsMRECoMx9pJCCCAAAIIdCUgVOhK0PqaCQgVarYnVKjcnvGnSECoENe6UCGuG6FCbDema4CAUKEBia4gVJjOGxAqtO1aqNC2X7cbjoBQYTjWTkIAAQQQQKArAaFCV4LW10xAqFCzPaFC5faMP0UCQoW41oUKcd0IFWK7MV0DBIQKDUh0BaHCdN6AUKFt10KFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAkKFmu0JFSq3Z/wpEhAqxLUuVIjrRqgQ243pGiAgVGhAoisIFabzBoQKbbsWKrTt1+2GIyBUGI61kxBAAAEEEOhKQKjQlaD1NRMQKtRsT6hQuT3jT5GAUCGudaFCXDdChdhuTNcAAaFCAxJdQagwnTcgVGjbtVChbb9uNxwBocJwrJ2EAAIIIIBAVwJCha4Era+ZgFChZntChcrtGX+KBIQKca0LFeK6ESrEdmO6BggIFRqQ6ApChem8AaFC266FCm37dbvhCAgVhmPtJAQQQAABBLoSECp0JWh9zQSECjXbEypUbs/4UyQgVIhrXagQ141QIbYb0zVAQKjQgERXECpM5w0IFdp2LVRo26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2Z5QoXJ7xp8iAaFCXOtChbhuhAqx3ZiuAQJChQYkukKzocKOHSnt3HnoerO/b98+edlChbafgFChbb9uNxwBocJwrJ2EAAIIIIBAVwJCha4Era+ZgFChZntChcrtGX+KBIQKca0LFeK6ESrEdmO6BggIFRqQ6ApChem8AaFC266FCm37dbvhCAgVhmPtJAQQQAABBLoSECp0JWh9zQSECjXbEypUbs/4UyQgVIhrXagQ141QIbYb0zVAQKjQgERXECpM5w0IFdp2LVRo26/bDUdAqDAcaychgAACCCDQlYBQoStB62smIFSo2Z5QoXJ7xp8iAaFCXOtChbhuhAqx3ZiuAQJChQYkuoJQYTpvQKjQtmuhQtt+3W44AkKF4Vg7CQEEEEAAga4EhApdCVpfMwGhQs32hAqV2zP+FAkIFeJaFyrEdSNUiO3GdA0QECo0INEVhArTeQNChbZdCxXa9ut2wxEQKgzH2kkIIIAAAgh0JSBU6ErQ+poJCBVqtidUqNye8adIQKgQ17pQIa4boUJsN6ZrgIBQoQGJriBUmM4bECq07Vqo0LZftxuOgFBhONZOQgABBBBAoCsBoUJXgtbXTECoULM9oULl9ow/RQJChbjWhQpx3QgVYrsxXQMEhAoNSHQFocJ03oBQoW3XQoW2/brdcASECsOxdhICCCCAAAJdCQgVuhK0vmYCQoWa7QkVKrdn/CkSECrEtS5UiOtGqBDbjekaICBUaECiKwgVpvMGhAptuxYqtO3X7YYjIFQYjrWTEEAAAQQQ6EpAqNCVoPU1ExAq1GxPqFC5PeNPkYBQIa51oUJcN0KF2G5M1wABoUIDEl1BqDCdNyBUaNu1UKFtv243HAGhwnCsnYQAAggggEBXAkKFrgStr5mAUKFme0KFyu0Zf4oEhApxrQsV4roRKsR2Y7oGCAgVGpDoCs2GCtQeQ0Co0PajECq07dfthiMgVBiOtZMQQAABBBDoSkCo0JWg9TUTECrUbE+oULk940+RgFAhrnWhQlw3QoXYbkzXAAGhQgMSXUGoMJ03IFRo27VQoW2/bjccAaHCcKydhAACCCCAQFcCQoWuBK2vmYBQoWZ7QoXK7Rl/igSECnGtCxXiuhEqxHZjugYICBUakOgKQoXpvAGhQtuuhQpt+3W74QgIFYZj7SQEEEAAAQS6EhAqdCVofc0EhAo12xMqVG7P+FMkIFSIa12oENeNUCG2G9M1QECo0IBEVxAqTOcNCBXadi1UaNuv2w1HQKgwHGsnIYAAAggg0JWAUKErQetrJiBUqNmeUKFye8afIgGhQlzrQoW4boQKsd2YrgECQoUGJLqCUGE6b0Co0LZroULbft1uOAJCheFYOwkBBBBAAIGuBIQKXQlaXzMBoULN9oQKldsz/hQJCBXiWhcqxHUjVIjtxnQNRC8qJgAAIABJREFUEBAqNCDRFYQK03kDQoW2XQsV2vbrdsMRECoMx9pJCCCAAAIIdCUgVOhK0PqaCQgVarYnVKjcnvGnSECoENe6UCGuG6FCbDema4CAUKEBia4gVJjOGxAqtO1aqNC2X7cbjoBQYTjWTkIAAQQQQKArAaFCV4LW10xAqFCzPaFC5faMP0UCQoW41oUKcd0IFWK7MV0DBIQKDUh0BaHCdN6AUKFt10KFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAkKFmu0JFSq3Z/wpEhAqxLUuVIjrRqgQ243pGiAgVGhAoisIFabzBoQKbbsWKrTt1+2GIyBUGI61kxBAAAEEEOhKQKjQlaD1NRMQKtRsT6hQuT3jT5GAUCGudaFCXDdChdhuTNcAAaFCAxJdodlQYceOlHbuPHS92d+3b5+8bKFC209AqNC2X7cbjoBQYTjWTkIAAQQQQKArAaFCV4LW10xAqFCzPaFC5faMP0UCQoW41oUKcd0IFWK7MV0DBIQKDUh0BaHCdN6AUKFt10KFtv263XAEhArDsXYSAggggAACXQkIFboStL5mAkKFmu2llK47cCD90+7d6cDsV9gG+mv2Ewfr16WU1s3+H39FI3Dg4HLaMHNDTzQ16eDycjp9/eZ02saN6cQTNoabb+oDCRViv4D9B5bTrt1L6bRtm2MPajoEaiTwhUtT+j//VOPka5p5eXk5zf53/vqVf6D1V2sElg8up6XvvGXad9bZadvWBv55y++ocMwTFSq09p/ao+8jVGjbr9sNR2AWKly58XNp77pdfnqoAPbZPzvOfk5ng39+LEDz0BYHDiynDRv883gpoHiWIvkv73Pl1z/W+eWPQlgPHpz9WlI69GtK/lqVwOZ1W9Mtt/ybtHHdpuMSun7vgTT7SQ2/vnBcVD6ohIBQoRJRkca85vqltHXzhrRp4/pIY5nlXwhcuWspnXriRj/5HvBF7N53IF2/Z//Kf378g0Q8QUKFeE6OnEioENuP6RCoicDS0sG0Z/+BdPLW4/8EQE33MushAnuWDqTrdu9PWzZtECo0+iiECo2K/ZdrCRXa9ut2wxGYhQrLaV06/eTNfmGoAPalA8tp95796ZST/PNjAZwr0fBVu/atvE9/lSFwxTX70umnbBYmlcGZrrpuKW07YWPaKKYpQnT2//Fo88YNafMmv55UAqhQoQRFe0QiIFSIZKOSWa6+bimduEWoEFXXFdfuS6edtEmoEFDQ7B8iZqHC7D8/QoV4goQK8ZwcOZFQIbYf0yFQE4F9s1Bh6UA65UQ/0VyTt0VnnYWhs1DhhM1ChUWZ1fadUKE2Y3nzChXyePkagXkEZqHCweWUzjhli1ChwDOZhQrX715Kp/od/grQXPn/CJyuuHZvOvOULUX2s0lKl1+9N5156hahQqHHcOWufSthu1ChDNBrr19KmzdtSFuECkWAChWKYLRJIAJChUAyahlFqBDblFAhrh+hQlw3s8n8i3JsP0KF2H5Mh0BNBIQKNdnKn1WokM+sthVChdqM5c0rVMjj5WsEhArDvAGhQlnOfv6lLM/ZbkKFskyFCmV5ChXK8hQqlOVpt/EJCBXGd1DdBEKF2MqECnH9CBXiuhEqxHYzm06oEN+RCRGohYBQoRZTa5tTqLA2bjWtEirUZCt/VqFCPjMrEFiNgN9Roey7ECqU5SlUKMtTqFCep1ChLFOhQlmeQoWyPO02PgGhwvgOqptAqBBbmVAhrh+hQlw3QoXYboQK8f2YEIGaCAgVarKVP6tQIZ9ZbSuECrUZy5tXqJDHy9cIzCMgVCj7NoQKZXkKFcryFCqU5ylUKMtUqFCWp1ChLE+7jU9AqDC+g+omECrEViZUiOtHqBDXjVAhthuhQnw/JkSgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AkKFYd6AUKEsZ6FCWZ5ChfI8hQplmQoVyvIUKpTlabfxCQgVxndQ3QRChdjKhApx/QgV4roRKsR2I1SI78eECNREQKhQk638WZsLFfIRNL9CqNC2YqFC237dbjgCfkeFsqyFCmV5ChXK8hQqlOcpVCjLVKhQlqdQoSxPu41PQKgwvoPqJhAqxFYmVIjrR6gQ141QIbYboUJ8PyZEoCYCQoWabOXPKlTIZ1bbCqFCbcby5hUq5PHyNQLzCAgVyr4NoUJZnkKFsjyFCuV5ChXKMhUqlOUpVCjL027jExAqjO+gugmECrGVCRXi+hEqxHUjVIjtRqgQ348JEaiJgFChJlv5swoV8pnVtkKoUJuxvHmFCnm8fI2AUGGYNyBUKMtZqFCWp1ChPE+hQlmmQoWyPIUKZXnabXwCQoXxHVQ3gVAhtjKhQlw/QoW4boQKsd0IFeL7MSECNREQKtRkK39WoUI+s9pWCBVqM5Y3r1Ahj5evERAqDPMGhAplOQsVyvIUKpTnKVQoy1SoUJanUKEsT7uNT0CoML6D6iYQKsRWJlSI60eoENeNUCG2G6FCfD8mRKAmAkKFmmzlzypUyGdW2wqhQm3G8uYVKuTx8jUCQoVh3oBQoSxnoUJZnkKF8jyFCmWZChXK8hQqlOVpt/EJCBXGd1DdBEKF2MqECnH9CBXiuhEqxHYjVIjvx4QI1ERAqFCTrfxZhQr5zGpbIVSozVjevEKFPF6+RkCoMMwbECqU5SxUKMtTqFCep1ChLFOhQlmeQoWyPO02PgGhwvgOqptAqBBbmVAhrh+hQlw3QoXYboQK8f2YEIGaCAgVarKVP6tQIZ9ZbSuECrUZy5tXqJDHy9cICBWGeQNChbKchQpleQoVyvMUKpRlKlQoy1OoUJan3cYnIFQY30F1EwgVYisTKsT1I1SI60aoENuNUCG+HxMiUBMBoUJNtvJnFSrkM6tthVChNmN58woV8nj5GgGhwjBvQKhQlrNQoSxPoUJ5nkKFskyFCmV5ChXK8rTb+ASECuM7qG4CoUJsZUKFuH6ECnHdCBViuxEqxPdjQgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jIFQY5g0IFcpyFiqU5SlUKM9TqFCWqVChLE+hQlmedhufgFBhfAfVTSBUiK1MqBDXj1AhrhuhQmw3QoX4fkyIQE0EhAo12cqftblQYceOlHbuPARi9vft2/OhNLZCqNCY0BtdR6jQtl+3G47AFdfsTQeXUzrjlC1p/brhzm31JKFCWbNChbI8Z7tdfvXedOapW5L/uJdhK1Qow/GGXYQKZXkKFcrytNv4BIQK4zuobgKhQmxlQoW4foQKcd3MJvMvyrH97D+wnHbtXkqnbdsce1DTIYBAeAJChfCKOg0oVOiEr4rFQoUqNK15SKHCmtFZiMBRBIQKZR+EUKEsTz//UpbnbDehQlmmQoWyPIUKZXkKFcrytNv4BIQK4zuobgKhQmxlQoW4foQKcd0IFWK7mU0nVIjvyIQI1EJAqFCLqbXNKVRYG7eaVgkVarKVP6tQIZ+ZFQisRkCoUPZdCBXK8hQqlOUpVCjPU6hQlqlQoSxPoUJZnnYbn4BQYXwH1U0gVIitTKgQ149QIa4boUJsN0KF+H5MiEBNBIQKNdnKn1WokM+sthVChdqM5c0rVMjj5WsE5hEQKpR9G0KFsjyFCmV5ChXK8xQqlGUqVCjLU6hQlqfdxicgVBjfQXUTCBViKxMqxPUjVIjrRqgQ241QIb4fEyJQEwGhQk228mcVKuQzq22FUKE2Y3nzChXyePkaAaHCMG9AqFCWs1ChLE+hQnmeQoWyTIUKZXkKFcrytNv4BIQK4zuobgKhQmxlQoW4foQKcd0IFWK7ESrE92NCBGoiIFSoyVb+rEKFfGa1rRAq1GYsb16hQh4vXyMgVBjmDQgVynIWKpTlKVQoz1OoUJapUKEsT6FCWZ52G5+AUGF8B9VNIFSIrUyoENePUCGuG6FCbDdChfh+TIhATQSECjXZyp9VqJDPrLYVQoXajOXNK1TI4+VrBIQKw7wBoUJZzkKFsjyFCuV5ChXKMhUqlOUpVCjL027jExAqjO+gugmECrGVCRXi+hEqxHUjVIjtRqgQ348JEaiJgFChJlv5swoV8pnVtkKoUJuxvHmFCnm8fI2AUGGYNyBUKMtZqFCWp1ChPE+hQlmmQoWyPIUKZXnabXwCQoXxHVQ3gVAhtjKhQlw/QoW4boQKsd0IFeL7MSECNREQKtRkK39WoUI+s9pWCBVqM5Y3r1Ahj5evERAqDPMGhAplOQsVyvIUKpTnKVQoy1SoUJanUKEsT7uNT0CoML6D6iYQKsRWJlSI60eoENeNUCG2G6FCfD8mRKAmAkKFmmzlz9pcqJCPoPkVQoW2FQsV2vbrdsMRuOKavengckpnnLIlrV833LmtniRUKGtWqFCWp1ChPE+hQlmmQoWyPIUKZXnabXwCQoXxHVQ3gVAhtjKhQlw/QoW4boQKsd0IFeL7MSECNREQKtRkK39WoUI+s9pWCBVqM5Y3r1Ahj5evEZhHQKhQ9m0IFcryFCqU5SlUKM9TqFCWqVChLE+hQlmedhufgFBhfAfVTSBUiK1MqBDXz96lg+n6PfvTlk3r04knbIw76EQn8y/KscXvP7Ccdu1eSqdt2xx7UNMhgEB4AkKF8Io6DTgLFXbvPZC2bt6Qtm7Z0Gkvi2MSECrE9FJqKqFCKZL2mTqBWaiwYcP6dMqJm9I6v6NC5+ew/+By2rv3QDppq5/L6QwzpTT7+Zdrdy+tvE9/lSEw+/n6U07alPzHvQzPa3fvTydu2ZA2+C1pigC9fu/+tGnDhrRpoxdaAujs1xhm/4t0y2b/vluCpz3GJyBUGN9BdRMIFWIrEyr05+fyffvSX191VacD7rLt5HTa+k1ChU4U+1ksVOiHa6ldhQqlSNoHAQSECm2/gVmosPFrf582ffA9KR04EOOy939ASre9fYxZGphCqNCAxG9xBaFC237dbjgCs1Dha+s/lr6+9MXhDnUSAggggAACCAxO4MT1p6W7bvvptG3DGYOf7UAEShAQKpSgOLE9hAqxhQsV+vPzf/fuTR/+v/83LXc44t5n3CTdZONmoUIHhn0tFSr0RbbMvkKFMhztggACKQkV2n4Fs1Bhw2VfTptf8+KU9i/FuOzjnpzSnc+JMUsDUwgVGpD4La4gVGjbr9sNR2AWKlxy8N3psr2fHO5QJyGAAAIIIIDA4ARO2XDT9OOnPyqdvOHMwc92IAIlCAgVSlCc2B5ChdjChQr9+REq9Mc2ws5ChQgW5s8gVIjtx3QI1ERAqFCTrfxZhQr5zGpbIVSozVjevEKFPF6+RmAeAaGCt4EAAggggMA0CAgVpuG55VsKFVq229PdhAo9gS20rVChEMhVthEq9Mc2ws5ChQgW5s8gVIjtx3QI1ERAqFCTrfxZhQr5zGpbIVSozVjevEKFPF6+RmAeAaGCt4EAAggggMA0CAgVpuG55VsKFVq229PdhAo9gS20rVChEMhVthEq9Mc2ws5ChQgW5s8gVIjtx3QI1ERAqFCTrfxZhQr5zGpbIVSozVjevEKFPF6+RmAeAaGCt4EAAggggMA0CAgVpuG55VsKFVq229PdhAo9gS20rVChEMhVthEq9Mc2ws5ChQgW5s8gVIjtx3QI1ERAqFCTrfxZhQr5zGpbIVSozVjevEKFPF6+RmAeAaGCt4EAAggggMA0CAgVpuG55VsKFVq229PdhAo9gS20rVChEMhVthEq9Mc2ws5ChQgW5s8gVIjtx3QI1ERAqFCTrfxZmwsVduxIaefOQyBmf9++PR9KYyuECo0JvdF1hApt+3W74QgIFYZj7SQEEEAAAQTGJCBUGJO+s0sQECqUoDixPYQKsYULFfrzI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLtxQqtGy3p7sJFXoCW2hboUIhkKtsI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bM2FyrkI2h+hVChbcVChbb9ut1wBIQKw7F2EgIIIIAAAmMSECqMSd/ZJQgIFUpQnNgeQoXYwoUK/fkRKvTHNsLOQoUIFoQKsS2YDoE2CAgV2vA47xZChbb9zm4nVGjbsVChbb9uNxwBocJwrJ2EAAIIIIDAmASECmPSd3YJAkKFEhQntodQIbZwoUJ/foQK/bGNsLNQIYIFoUJsC6ZDoA0CQoU2PAoV2vb4rW4nVGjbvVChbb9uNxwBocJwrJ2EAAIIIIDAmASECmPSd3YJAkKFEhQntodQIbZwoUJ/foQK/bGNsLNQIYIFoUJsC6ZDoA0CQoU2PAoV2vYoVJiuX6HCdN27eVkCQoWyPO2GAAIIIIBAVAJChahmzLUoAaHCoqR8d5iAUCH2YxAq9OdHqNAf2wg7CxUiWBAqxLZgOgTaICBUaMOjUKFtj0KF6foVKkzXvZuXJSBUKMvTbggggAACCEQlIFSIasZcixIQKixKyndChUregFChP1FChf7YRthZqBDBglAhtgXTIdAGAaFCGx6FCm17FCpM169QYbru3bwsAaFCWZ52QwABBBBAICoBoUJUM+ZalIBQYVFSvhMqVPIGhAr9iRIq9Mc2ws5ChQgWhAqxLZgOgTYICBXa8ChUaNujUGG6foUK03Xv5mUJCBXK8rQbAggggAACUQkIFaKaMdeiBIQKi5LynVChkjcgVOhPlFChP7YRdhYqRLAgVIhtwXQItEFAqNCGR6FC2x6FCtP1K1SYrns3L0tAqFCWp90QQAABBBCISkCoENWMuRYlIFRYlJTvhAqVvAGhQn+ihAr9sY2ws1AhggWhQmwLpkOgDQJChTY8ChXa9ihUmK5focJ03bt5WQJChbI87YYAAggggEBUAkKFqGbMtSgBocKipHwnVKjkDQgV+hMlVOiPbYSdhQoRLAgVYlswHQJtEBAqtOFxMqHCjh0p7dx56Lqzv2/f3rbABW533Z79af26dWnrlg0LfO2T2ggIFWozZt6oBIQKUc2YCwEEEEAAgbIEhApledpteAJCheGZV3/i1dctpRO3bEibNq6v/i4tXkCo0J9VoUJ/bCPsLFSIYGH+DPsPLKddu5fSads2xx7UdAggEJ6AUCG8ok4D7t53IG247Mtp82tenNL+pU57FVv8uCendOdz1radUOEYbkKFtT2lWlYJFWoxZc7oBIQK0Q2ZDwEEEEAAgTIEhAplONplPAJChfHYV3uyUCG2OqFCf36ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/VqFCPrPaVggVajOWN69QIY+XrxGYR0Co4G0ggAACCCAwDQJChWl4bvmWQoWW7fZ0N6FCT2ALbStUKARylW2ECv2xjbCzUCGChfkzCBVi+zEdAjURECrUZCt/1uZChXwEza8QKrStWKjQtl+3G46AUGE41k5CAAEEEEBgTAJChTHpO7sEAaFCCYoT20OoEFu4UKE/P0KF/thG2FmoEMGCUCG2BdMh0AYBoUIbHufdQqjQtt/Z7YQKbTsWKrTt1+2GIyBUGI61kxBAAAEEEBiTgFBhTPrOLkFAqFCC4sT2ECrEFi5U6M+PUKE/thF2FipEsCBUiG3BdAi0QUCo0IZHoULbHr/V7YQKbbsXKrTt1+2GIyBUGI61kxBAAAEEEBiTgFBhTPrOLkFAqFCC4sT2ECrEFi5U6M+PUKE/thF2FipEsCBUiG3BdAi0QUCo0IZHoULbHoUK0/UrVJiuezcvS0CoUJan3RBAAAEEEIhKQKgQ1Yy5FiUgVFiUlO8OExAqxH4MQoX+/AgV+mMbYWehQgQLQoXYFkyHQBsEhApteBQqtO1RqDBdv0KF6bp387IEhApledoNAQQQQACBqASEClHNmGtRAkKFRUn5TqhQyRsQKvQnSqjQH9sIOwsVIlgQKsS2YDoE2iAgVGjDo1ChbY9Chen6FSpM172blyUgVCjL024IIIAAAghEJSBUiGrGXIsSECosSsp3QoVK3oBQoT9RQoX+2EbYWagQwYJQIbYF0yHQBgGhQhsehQptexQqTNevUGG67t28LAGhQlmedkMAAQQQQCAqAaFCVDPmWpSAUGFRUr4TKlTyBoQK/YkSKvTHNsLOQoUIFoQKsS2YDoE2CAgV2vAoVGjbo1Bhun6FCtN17+ZlCQgVyvK0GwIIIIAAAlEJCBWimjHXogSECouS8p1QoZI3IFToT5RQoT+2EXYWKkSwIFSIbcF0CLRBQKjQhkehQtsehQrT9StUmK57Ny9LQKhQlqfdEEAAAQQQiEpAqBDVjLkWJSBUWJSU74QKlbwBoUJ/ooQK/bGNsLNQIYIFoUJsC6ZDoA0CQoU2PE4mVNixI6WdOw9dd/b37dvbFrjA7a7bsz+tX7cubd2yYYGvfVIbAaFCbcbMG5WAUCGqGXMhgAACCCBQloBQoSxPuw1PQKgwPPPqT7z6uqV04pYNadPG9dXfpcULCBX6sypU6I9thJ2FChEszJ9h/4HltGv3Ujpt2+bYg5oOAQTCExAqhFfUacDd+w6kDZd9OW1+zYtT2r/Uaa9iix/35JTufM7athMqHMNNqLC2p1TLKqFCLabMGZ2AUCG6IfMhgAACCCBQhoBQoQxHu4xHQKgwHvtqTxYqxFYnVOjPj1ChP7YRdhYqRLAwfwahQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AvMICBW8DQQQQAABBKZBQKgwDc8t31Ko0LLdnu4mVOgJbKFthQqFQK6yjVChP7YRdhYqRLAwfwahQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AvMICBW8DQQQQAABBKZBQKgwDc8t31Ko0LLdnu4mVOgJbKFthQqFQK6yjVChP7YRdhYqRLAwfwahQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AvMICBW8DQQQQAABBKZBQKgwDc8t31Ko0LLdnu4mVOgJbKFthQqFQK6yjVChP7YRdhYqRLAwfwahQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AvMICBW8DQQQQAABBKZBQKgwDc8t31Ko0LLdnu4mVOgJbKFthQqFQK6yjVChP7YRdhYqRLAwfwahQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AvMICBW8DQQQQAABBKZBQKgwDc8t37JzqHD5FVenv/nsl9L33vG707fd9Ix08V9+Jt30zNPS7b/nrCxu+w8cSOvXrU/r1687vO7SL/59uvLqXemH7nHnhfe68fnLy8sre+y6bne6+U1PT1s2bzruXvv2La2sudlNTkvr1v3rPEfu/dVNv82XAAAgAElEQVSv/XP66j98Pd3te2+bTj35pOPu2dIHQoXYNoUK/fkRKvTHNsLOQoUIFubPIFSI7cd0CNREQKhQk638WYUK+cxqWyFUqM1Y3rxChTxevkZgHgGhgreBAAIIIIDANAgIFabhueVbdgoV3v7ei9IFb31f+rF73T39ygN/LH3PrW+RHvzY89K9fvB70yN+5f7plx99bjrrFjdLL33u4w4zvOjiv0lPfM4r0x///vnplt9585X/+e49+9IvPeq56ZE7fjbd/8fvefjbV77p3SsRxFte/syFHdxw/mMe8vPpM5d+JT3uWS9PV1x17cr6E7eekJ71xF9JD/ypf7vqfrOo4YIL359e8+b3rvz4GaednF79gielc+549sp/f+Tes7ne/cGPpY987FPp/N96VLrPD33fwjPW/qFQIbZBoUJ/foQK/bGNsLNQIYKF+TMIFWL7MR0CNREQKtRkK39WoUI+s9pWCBVqM5Y3r1Ahj5evEZhHQKjgbSCAAAIIIDANAkKFaXhu+ZZrDhVmv6j/k9ufkX7jcQ9O9/nhux5mNAsDfvj775Ie/ID7pi985R/SLzzsOellz3t8ut+P3D1defW16X6//PT05Ef++7T9gfddWfPi170jvfkPPrTyX5//7EcdFSq89Z0fTp/+3JePCh2OJ+PI8z996VfSly77x5X5Tt52Ynrdhf81ve7C96e/+cgbVv2dFf72ki+lHY9/fnrbq56V7nL7706vfNN70gcv+ov0J+946crv9HDk3jfMceE7P5z+5199Nr3+RU873mjN/LhQIbZKoUJ/foQK/bGNsLNQIYKF+TMIFWL7MR0CNREQKtRkK3/W5kKFfATNrxAqtK1YqNC2X7cbjoBQYTjWTkIAAQQQQGBMAkKFMek7uwSBNYcKe/buS3f7iUemD+08P511i0O/M8Lsr2f/pzemH7rHXdJP3/cHVv77//y2D6Q3vv2D6aN/8OJ07ssuTNfsui69/oVPO/xHPFx19a60Z9++tP2x56WnPPJBR4UK7/3Qxekzn78s/c5Tfm1lr89+/rL0uy9/Wzr3Gb+ebnf2d616/xuff+RHf/iBP0uvetO7039/18vTpo0bjln/ktf9Yfr8l/93euOLn77yY9+4/Kp07198UnrXG56X7nCbWx5zt9k3n/jrS9PTz7sgXfy+V5XwUcUeQoXYmoQK/fkRKvTHNsLOQoUIFubPIFSI7cd0CNREQKhQk638WYUK+cxqWyFUqM1Y3rxChTxevkZgHgGhgreBAAIIIIDANAgIFabhueVbrjlUmP3RB7/6hOenv/zgBWnbSVsPM7r8iqvTiVu3rPwxC7O/lvYfSA9+zLnp+t170jf/39Xp/W99Qfr2m51xDNOfePDT0xN+/ReOChWuu35P2rtvaeWPYJj9NYsCHvbUF6a3v/Y5h/84hhtvdOPzZz/+15/5Ynr/R/48XfyXn0lPffQvpZ+57w+u6vRp516QTj91W3r2f/zVwz9+px99aHrt7z05/cg9z0mr7X3Z1/45/exDfjNd9M6Xpm+76bH3avHxCBViWxUq9OdHqNAf2wg7CxUiWJg/g1Ahth/TIVATAaFCTbbyZxUq5DOrbYVQoTZjefMKFfJ4+RqBeQSECt4GAggggAAC0yAgVJiG55ZvmR0q7D9wIP3dJV9Or33L+9Ktzvr29NtPfshx+Xz0f3wqPem3X73yxz0cGQEcuXC1UOHGG8/+hXVp//60edPGtG7duuOee8MHf/TRv0gfvOgT6ZL/dVl69EN+Lv3KL/z4qmsf+fQXp9udfVZ66qMfdPjH7/FTj07PfdpD58YNsw8f/rQXpVO2nZQevv2n0+2/55aHf7eIhQes7EOhQmxhQoX+/AgV+mMbYWehQgQL82cQKsT2YzoEaiIgVKjJVv6sQoV8ZrWtECrUZixvXqFCHi9fIzCPgFDB20AAAQQQQGAaBIQK0/Dc8i2zQ4U//+QlafYL+ne9y23Tm1/+G2njhmP/CIUjge3bt5R+6dHPS5s3bUqXfOGr6Y8u/L1067O+/Rimi4QKXUXMfmeFhzzxBem/vf2F6bu+42bHbDf7HRVmv3vDs5644/CPHfk7Ksw7f9d1u9O/e/hvp3/852/OvV/X2SOtFypEsnHsLEKF/vwIFfpjG2FnoUIEC/NnECrE9mM6BGoiIFSoyVb+rEKFfGa1rRAq1GYsb16hQh4vXyMwj4BQwdtAAAEEEEBgGgSECtPw3PIts0OFGYwvXvaP6RVvfFc6aesJ6YXPefS35PPKN707/bc//av07jeel55x3gXpyqt3pbe84pnHBA5DhAqzP7rhR37hP6bff/Wz0/fd+TbHzP2S1/1h+sJXvpZe/6KnrfzYNy6/Kt37F5+U3vWG56U73OaWc+/5i4/4nXSn290qPXz7z6waQLT2gIQKsY0KFfrzI1Toj22EnYUKESzMn0GoENuP6RCoiYBQoSZb+bMKFfKZ1bZCqFCbsbx5hQp5vHyNwDwCQgVvAwEEEEAAgWkQECpMw3PLt1xTqDAD8tnPX5Z++THnpo9/4DXp1JNPWpXRpy/9Str+2PPS21/7nHTOHc9e+YX/n/nVZ6bH/YcHpIc+6CdX1sz+KInlg8vp/g/5zZU/luH+P3bPtGnTxlX3+8ylX0nnvuzC9PxnPjzd7uzvOq6X937o4pXZ7nbO7dL6devSy97wrvSBj3w8/fd3vjSdvO3E9Mm/+1/p/Nf8l/SS33lsuuV33jz97SVfSjse//z0tlc9O93lDt+9EmP88UWfSH/yjpfO/eMcZtHGA3/9t9LH3vOKdJMzTj3uTC18IFSIbVGo0J8foUJ/bCPsLFSIYGH+DEKF2H5Mh0BNBIQKNdnKn1WokM+sthVChdqM5c0rVMjj5WsE5hEQKngbCCCAAAIITIOAUGEanlu+5ZpDhb37ltJd7/eI9KGd56ezbnHzYxjt2bsv/fxDn51+4kfvkZ7yqAcd/vFZPPBb578p/fHvn78SBzzlua9NH/6zvzpq/bw/HuITf31pethTX3g4fDiemD/8wJ+l573kLYc/u/lNT08veOYj0g/e7Y4r/7M//fjfpsc/6xXpPW86byV8WF5eTq9+83vT6y58/8qPn7j1hPT6Fz111d994YZN/+JTn0vP+N3XpYvf96rjjdPMjwsVYqsUKvTnR6jQH9sIOwsVIliYP4NQIbYf0yFQEwGhQk228mcVKuQzq22FUKE2Y3nzChXyePkagXkEhAreBgIIIIAAAtMgIFSYhueWb7nmUGEG5ed+7VnpMb/28+mn7vMDYRnNfseG/3fFNWk5LaebnXn63N8Z4cgLzCKLK668Jn3bzc487vdv2PlH6c8/eUl6y8ufGZZB6cGECqWJlt1PqFCW55G7CRX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLTuFCrM/RmH2RzF8//fdPj3uoQ9Id7ztrVpmddTdZnHCm9/xofTpz30lvfK8J6R73v1Ok7m7UCG2aqFCf36ECv2xjbCzUCGCBaFCbAumQ6ANAkKFNjzOu0VzocKOHSnt3HnourO/b9/etsAFbidUWABSxZ8IFSqWZ/RQBIQKoXQYBgEEEEAAgd4ICBV6Q2vjgQh0ChVmM+7esy999vOXpbNv9R3pzNNPGWjs8Y/5P1+/PH39m1emu9z+1mnTpo3jDzTgBEKFAWGv4SihwhqgLbhEqLAgqEo/EyrEFud3VIjtx3QI1ERAqFCTrfxZhQr5zGpbIVSozVjevEKFPF6+RmAeAaGCt4EAAggggMA0CAgVpuG55Vt2DhVahuNuqxMQKsR+GUKF/vwIFfpjG2FnoUIEC/NnECrE9mM6BGoiIFSoyVb+rEKFfGa1rRAq1GYsb16hQh4vXyMgVPAGEEAAAQQQmDYBocK0/bdwe6FCCxYHvoNQYWDgmccJFTKBZXwuVMiAVeGnQoXY0oQKsf2YDoGaCAgVarKVP6tQIZ9ZbSuECrUZy5tXqJDHy9cICBW8AQQQQAABBKZNQKgwbf8t3F6o0ILFge8gVBgYeOZxQoVMYBmfCxUyYFX4qVAhtjShQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AkIFbwABBBBAAIFpExAqTNt/C7cXKrRgceA7CBUGBp55nFAhE1jG50KFDFgVfipUiC1NqBDbj+kQqImAUKEmW/mzChXymdW2QqhQm7G8eYUKebx8jYBQwRtAAAEEEEBg2gSECtP238LthQotWBz4DkKFgYFnHidUyASW8blQIQNWhZ8KFWJLEyrE9mM6BGoiIFSoyVb+rEKFfGa1rRAq1GYsb16hQh4vXyMgVPAGEEAAAQQQmDYBocK0/bdwe6FCCxYHvoNQYWDgmccJFTKBZXwuVMiAVeGnQoXY0oQKsf2YDoGaCAgVarKVP6tQIZ9ZbSuECrUZy5tXqJDHy9cICBW8AQQQQAABBKZNQKgwbf8t3F6o0ILFge8gVBgYeOZxQoVMYBmfCxUyYFX4qVAhtjShQmw/pkOgJgJChZps5c8qVMhnVtsKoUJtxvLmFSrk8fI1AkIFbwABBBBAAIFpExAqTNt/C7cXKrRgceA7CBUGBp55nFAhE1jG50KFDFgVfipUiC1NqBDbj+kQqImAUKEmW/mzNhcq5CNofoVQoW3FQoW2/brdcASuuGZvuuTgu9Nlez853KFOQgABBBBAAIHBCQgVBkfuwMIEhAqFgU5hO6FCbMtChf78CBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qxChXxmta0QKtRmLG9eoUIeL18jMI+AUMHbQAABBBBAYBoEhArT8NzyLYUKLdvt6W5ChZ7AFtpWqFAI5CrbCBX6YxthZ6FCBAvzZxAqxPZjOgRqIiBUqMlW/qzNhQo7dqS0c+chELO/b9+eD6WxFUKFxoTe6DpChbb9ut1wBIQKw7F2EgIIIIAAAmMSECqMSd/ZJQgIFUpQnNgeQoXYwoUK/fkRKvTHNsLOQoUIFubPIFSI7cd0CNREQKhQk638WYUK+cxqWyFUqM1Y3rxChTxevkZgHgGhgreBAAIIIIDANAgIFabhueVbChVattvT3YQKPYEttK1QoRDIVbYRKvTHNsLOQoUIFubPIFSI7cd0CNREQKhQk638WYUK+cxqWyFUqM1Y3rxChTxevkZgHgGhgreBAAIIIIDANAgIFabhueVbChVattvT3YQKPYEttK1QoRDIVbYRKvTHNsLOQoUIFubPIFSI7cd0CNREQKhQk638WYUK+cxqWyFUqM1Y3rxChTxevkZgHgGhgreBAAIIIIDANAgIFabhueVbChVattvT3YQKPYEttK1QoRDIVbYRKvTHNsLOQoUIFubPIFSI7cd0CNREQKhQk638WYUK+cxqWyFUqM1Y3rxChTxevkbg/7d333GWVAXagM9MT2ZgBmaIC6KyJlYWdT9zAFEBERBYwQVHkgpIlCRIHARElswojhIlfIIRBUVUFGVFXHcV/VzXAGtkQfIQJofvV6XdTtP33urqruo6VfX0P8rMrVPnPG9VzQ1v1+0moKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln2vjigr5CRq/haJCsyNWVGh2vlY3dgKKCmNnbU8ECBAgQKBKAUWFKvXtuwgBRYUiFFs2hqJC3IErKpSXj6JCebYxjKyoEEMKigpxp2B2BJohoKjQjBy7rUJRodn5JqtTVGh2xooKzc7X6sZOQFFh7KztiQABAgQIVCmgqFClvn0XIaCoUIRiy8ZQVIg7cEWF8vJRVCjPNoaRFRViSEFRIe4UzI5AMwQUFZqRo6JCs3PstTpFhWZnr6jQ7HytbuwEFBXGztqeCBAgQIBAlQKKClXq23cRAooKRSi2bAxFhbgDV1QoLx9FhfJsYxhZUSGGFBQV4k7B7Ag0Q0BRoRk5Kio0O0dFhfbmq6jQ3uytvFgBRYViPY1GgAABAgRiFVBUiDUZ8xqugKLCcKU8bkBAUSHug0FRobx8FBXKs41hZEWFGFJQVIg7BbMj0AwBRYVm5Kio0OwcFRXam6+iQnuzt/JiBRQVivU0GgECBAgQiFVAUSHWZMxruAKKCsOV8jhFhZocA4oK5QWlqFCebQwjKyrEkIKiQtwpmB2BZggoKjQjR0WFZueoqNDefBUV2pu9lRcroKhQrKfRCBAgQIBArAKKCrEmY17DFVBUGK6Uxykq1OQYUFQoLyhFhfJsYxhZUSGGFBQV4k7B7Ag0Q0BRoRk5Kio0O0dFhfbmq6jQ3uytvFgBRYViPY1GgAABAgRiFVBUiDUZ8xqugKLCcKU8TlGhJseAokJ5QSkqlGcbw8iKCjGkoKgQdwpmR6AZAooKzchRUaHZOSoqtDdfRYX2Zm/lxQooKhTraTQCBAgQIBCrgKJCrMmY13AFFBWGK+Vxigo1OQYUFcoLSlGhPNsYRlZUiCEFRYW4UzA7As0QUFRoRo6KCs3OUVGhvfkqKrQ3eysvVkBRoVhPoxEgQIAAgVgFFBViTca8hiugqDBcKY9TVKjJMaCoUF5Qigrl2cYwsqJCDCkoKsSdgtkRaIaAokIzcmxNUWHOnBCuu+4vy03+d6+9mh3gMFb39OLlYfy4cWHq5L5hPNpD6iagqFC3xMw3VgFFhViTMS8CBAgQIFCsgKJCsZ5GG3sBRYWxN6/9Hhc8vSxMm9wXJk4YX/u1NHEBigrlpaqoUJ5tDCMrKsSQQvc5LF+xKjy1aFmYOX1S3BM1OwIEohdQVIg+olFNcNHSFaHvf+4Jkz5+bgjLl41qrMI2PuTIEF685ciGU1QY4qaoMLJDqS5bKSrUJSnzjF1AUSH2hMyPAAECBAgUI6CoUIyjUaoTUFSozr62e1ZUiDs6RYXy8lFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln6uiQn6zum2hqFC3xPLNV1Ehn5dHE+gmoKjg2CBAgAABAu0QUFRoR85NXqWiQpPTLWltigolwRY0rKJCQZAdhlFUKM82hpEVFWJIofscFBXizsfsCNRJQFGhTmnln2vjigr5CRq/haJCsyNWVGh2vlY3dgKKCmNnbU8ECBAgQKBKAUWFKvXtuwgBRYUiFFs2hqJC3IErKpSXj6JCebYxjKyoEEMKigpxp2B2BJohoKjQjBy7rUJRodn5JqtTVGh2xooKzc7X6sZOQFFh7KztiQABAgQIVCmgqFClvn0XIaCoUIRiy8ZQVIg7cEWF8vJRVCjPNoaRFRViSEFRIe4UzI5AMwQUFZqRo6JCs3PstTpFhWZnr6jQ7HytbuwEFBXGztqeCBAgQIBAlQKKClXq23cRAooKRSi2bAxFhbgDV1QoL58HlywJtz/8cFg1il28ZubaYVbfpDBtyoRRjGLTMgQUFcpQLW5MX/1QnKWRCLRdQFGh2UdAekeF394bJl01P4Tly+JY7H4HhLD5FnHMpQGzUFRoQIg9lqCo0Ox8rW7sBJKiwq9W3Rx+v/TusdupPREgQIAAAQJjLrBm3+zwhhlzwpp9s8Z833ZIoAgBRYUiFFs2hqJC3IErKpSXz+KVK8PSlStHvIPkg9aVy1aGaRP6FBVGrFjehooK5dkWMbKiQhGKxiBAIBFQVGj2cZAUFZY/8WSYsnRRmDhhfByLnTIlhLVmxDGXBsxCUaEBIfZYgqJCs/O1urETSIoKKyY+ESZPGrt9NnlPK1eFsHz5yjBpYiTPLRqAvXjpijBlUl8DVhLHEhYtWRGmTuZZVBpLlq1MX0uMH1fUiO0eZ9nylWH8+PGhzyW0kAMheY80rFoVJgy83h0Xpo5fK0wc5x/9QoANMuYCigpjTl7/HSoqxJ2hokK8+SxcsiIsXLw8TJusqBBjSooKMabytzkpKsSdj9kRqJOAokKd0so/16So8PSi5ekb39OnuoNVfsH4t1BUiD+j0cxQUWE0erYl8DeBpKiQfLi+zlqTfdBWwIGxbMWqsHDRsjBjug+BCuBMPl8Ljz65JMxaa3IRwxkjhPDwgiVh1ozJwefqxRwOjz21NKw5dWKY0Ee0CNEnFy4Lkyb2hcnKXkVwhuQzhuRC6o7NhXAaJAIBRYUIQqjbFBQV4k5MUSHefBQV4s0mmZkXynHno6gQdz5mR6BOAooKdUor/1wVFfKb1W0LRYW6JZZvvooK+bw8mkA3AUWFYo8NRYViPb3/UqxnMpqiQrGmigrFeioqFOupqFCsp9GqF1BUqD6D2s1AUSHuyBQV4s1HUSHebBQV4s4mmZ2iQvwZmSGBuggoKtQlqZHNU1FhZG512kpRoU5p5Z+rokJ+M1sQ6CSgqFDscaGoUKynokKxnooKxXsqKhRrqqhQrKeiQrGeRqteQFGh+gxqNwNFhbgjU1SINx9FhXizUVSIOxtFhfjzMUMCdRJQVKhTWvnnqqiQ36xuWygq1C2xfPNVVMjn5dEEugkoKhR7bCgqFOupqFCsp6JC8Z6KCsWaKioU66moUKyn0aoXUFSoPoPazUBRIe7IFBXizUdRId5sFBXizkZRIf58zJBAnQQUFeqUVv65Nq6oMGdOCNdd9xeI5H/32is/SsO2UFRoWKDPWI6iQrPztbqxE1BUKNZaUaFYT0WFYj2T0Xz1Q7GmigrFeioqFOupqFCsp9GqF1BUqD6D2s1AUSHuyBQV4s1HUSHebJKZeaEcdz6++iHufMyOQJ0EFBXqlFb+uSoq5Der2xaKCnVLLN98FRXyeXk0gW4CigrFHhuKCsV6es620rgAAB/OSURBVP+lWE9FheI9FRWKNVVUKNZTUaFYT6NVL6CoUH0GtZuBokLckSkqxJuPokK82SgqxJ1NMjtFhfgzMkMCdRFQVKhLUiObp6LCyNzqtJWiQp3Syj9XRYX8ZrYg0ElAUaHY40JRoVhPRYViPRUVivdUVCjWVFGhWE9FhWI9jVa9gKJC9RnUbgaKCnFHpqgQbz6KCvFmo6gQdzaKCvHnY4YE6iSgqFCntPLPVVEhv1ndtlBUqFti+earqJDPy6MJdBNQVCj22FBUKNZTUaFYT0WF4j0VFYo1VVQo1lNRoVhPo1UvoKhQfQa1m4GiQtyRKSrEm4+iQrzZKCrEnY2iQvz5mCGBOgkoKtQprfxzVVTIb1a3LRQV6pZYvvkqKuTz8mgCigpjcwwoKhTrrKhQrKeiQvGeigrFmioqFOupqFCsp9GqF1BUqD6D2s1AUSHuyBQV4s1HUSHebBQV4s5GUSH+fMyQQJ0EFBXqlFb+uSoq5Der2xaKCnVLLN98FRXyeXk0AUWFsTkGFBWKdVZUKNZTUaF4T0WFYk0VFYr1VFQo1tNo1QsoKlSfQe1moKgQd2SKCvHmo6gQbzaKCnFno6gQfz5mSKBOAooKdUor/1wVFfKb1W0LRYW6JZZvvooK+bw8moCiwtgcA4oKxTorKhTrqahQvKeiQrGmigrFeioqFOtptOoFFBWqz6B2M1BUiDsyRYV481FUiDcbRYW4s1FUiD8fMyRQJwFFhTqllX+uigr5zeq2haJC3RLLN19FhXxeHk1AUWFsjgFFhWKdFRWK9VRUKN5TUaFYU0WFYj0VFYr1NFr1AooK1WdQuxkoKsQdmaJCvPkoKsSbjaJC3NkoKsSfjxkSqJOAokKd0so/V0WF/GZ120JRoW6J5ZuvokI+L48moKgwNseAokKxzooKxXoqKhTvqahQrKmiQrGeigrFehqtegFFheozMAMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINAaAUWF1kRtoQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoHoBRYXqMzADAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQGgFFhdZEPfKFLl+xIjz0yIKwzsw1w+RJE4cMlHyH5IOPPBZmrzMjTOjrG/L3S5cuC48teCqsN3tmGDdu3MgnYsuuAkkGq1atCn1943Pn8+RTC0OS8doz1iRcskDWuVLy7g0fQuh1rmRdq5wr5R5CC558OixZsiz9t6LTT1Y+Dz+6IKwxbWqYOmVSuRM1OgECtRbIcy3Peg5ca4gGT97zreaE63xtTpYjeW7X7NVbHYHyBfJcQ8ufTT32kDz3Gz9ufBg/fuh7l16P5stw0eKl4bHHnwgbrDdrRJ6O38HeS5YuCw898niYNnVK+v78M3+ynv/yzHf8Jo/u9R5T1vUg/96av0Uvz6zjt/k6nVfY77LG1ClhzenTBj2o1znNs61HTL3XrahQ7/xKn/2l190cLrz08wP72W7rl4dTj9o3zFhrjfTPvvuDn4ZjPvyJsHDR4vS/Tz1637DHTlun/z/54PwTV38lfPzKL6X/nTyR+thHPhC23Hyz0ufdph0kznPPuypd8mnH7Ddo6b3ySTI77oxPhm9//yfpNv+4+WZh3hmHp4UTP8UL9Mqi+L0ZsZNAt3Ml61rlXCn3eEperOx9+EfC7//053RHm226UXjfu3YMO237mmH9W/KH+/4cDjru/IHtd9vhDeGUo/YJEycMLc6VuxKjEyAQs0Dea3nWc+CY19rmuXm+1Yz0na/NyLHbKrKee/dafXKOH/yhC8IlZx0Ztnr1ls2GsjoCIxTIew0d4W4at1nywfo7D5wbDpizU9jxLa8eWF/WNcvr0aGHwmEnXjTwXmPyXvAu278+HH3QHsN6fe/4Hep50tmXhy/dcsfAX7xsi+en79/OnDE9/TPv/Y78cnTBpz4XLvu/Xw0/uPmSsNZfPwjudU5nXQ9GPpP6bvno40+G1+9y2JAFXH7+B8OrXrZ5yLpGev02NPukhHDmxdeGm75xZ/qXyedx5889JP3/WddInvU9l9o+c0WFth8BGev/3M23h002Wi9sufnfhz/+74PhPUedHd6z59vCvu/cPiRP4t+w6+Hh0P13De/a7c3h9jvvDkecPC/c+plzwsYbrht+8vPfhDmHnhmumXdC2OKFzw0XX/7F8NXbfhC+dcP5Hdu0osgvcOvt/x7OuPCakDwpeMeOWw0qKmTlkzwR+9xNt4dr5p2Y/gby+4+/IDznWRuG0z+4f/6J2KKnQFYW+MoX6HWuZF2rnCvl5vPgw4+HG79+R9h5u9eGpCV8zee/Ea684evhe1+6OL02ZeVzwLHnhulrTA1nHv++8MCDj4Q9DjwtnHLk3gNFh3Jnb3QCBOoikPda3us5cF3W3LZ5er7VnMSdr83JstNKsp7bdVv9r+79Y/r+QvIGraJCs48RqxudQN5r6Oj21oytz51/Q7jy+lvSxZx94oGDigpZ1yyvR4ceAx+74kth261fHp71d+uFu/7zF+GQEy4M13/ilLDFi56b+fre8TvU85PX3BRe94otwvM32yTc/+eHw7sOOSO8+x3bpqWarOe/PLtfo5LyR1ICSX5WLyr0OqezrgfNuCLmW8Ujjz2Rfj40/+yj03O+/2e92Wun7+n18sw6fvPNpBmPTu6GsMeBc0Pf+PFh/z3fGl7/yi3DU08vGrj7bK9zmmczjoG2rkJRoa3Jj3DdJ//rFeG++x8KV1xwXNrYTH6b4SffuDRM+utXQuww57i0tPCu3d4Szpv/2fDf9/w+XHbusenekg+j3viOD4TPX3paeNHzNh3hDGy2usDCRUvCE089HZIG6JTJkwYVFbLyecf7Tk0beclvLic/yQe5R829JPz8O1f6io6CD7OsLAreneE6CPQ6V7KuVc6VsT2k/nT/Q2G7PY9NS27Jbwr0ymejDWaH1+x0SLj2YyeGl774eelEz7zomvDAg4+GeWceMbYTtzcCBKIWGO21fPXnwFEvtMWT83yrOeE7X5uTZaeVZD337rRNcrvrdx50WjjqgD3Caed/Opx7yvvdUaHZh4nVjUJgtNfQUey6tps+vuCpsHjp0rDXwaen15nV76jg9ejoY91m9yPDv7x9m/SD9ax/Axy/vb2XLVseEs/D9t8t7LHzGzPfm+fZ2fNHd/8yHPyhC8OHj90vvVN0f1Eh+UrSXu8xZR2/oz9b6jdCf1Hh5qvPSn8BcvWfLE+v34bmndz5OrkrzdeuPTtsuvH6Qx7Q65z+3l0/6/lZXf2OLjNuk4CiQpvSHuValy1fEbbb85jwtje9Or1l12dvuj1cdcMt6YWz/ye5kD57kw3Tv0/+oV97xvRw4hHvHvj7f9h6X7/9MMocOm3+4QuuDitWrBhUVMjK5+VvPSiccdx70rJC8vOLX/8u7H7A3HDnTR8PM9b8y1d7+ClGICuLYvZilOEIdDpXsq5VzpXhyBb3mP5W+x03zku/MqhXPhtvODvsvO+J4fYvXBjWnTUznURyR4Yv3/r9tBTnhwABAv0Co7mWP/M5MNU4BTzfijOXkczK+ToStfpsk/Xc+5krSX47bN8jzgqvf+U/pndzTI4PRYX65G2mYy8wmmvo2M82rj0mhfnkA+DViwpej44uo+QrHpNfauu/E07WvwGO387eS5cuC1dcf0v47l0/DevOmhE+cvz70jtLZj3/5TnUMzkmkw97L/zwoWH92WuHt+934kBR4d7f3dfzPaas43d0Z0s9t+4vKmzz2peGGWtND89/7sbh7du/Lv1sIcsz6/itp8joZn32xz8TPn/zd8P2b3xFuOd396Xne3J38/6vUu91Tt96+496flY3upnZmkC5AooK5fpGO/r/PvBw+Optd3Wd35x/3ja9Pc/qP6eee2X42m0/DF+95qPp7WaSW818/Tv/PujDoOQf7OnTpoa5x+yb3trnBZs9a+B7yJKxkotp8ndve9OrorWJYWL/+bNfhx//v193nMraM9ZMv+Zh9Z9OH772yufUo/cJL37jfoNKI/1PHr51w3lhw/VnxcDQmDlknSuNWWgNFtLpXOl1rdphm1c6V8Yw19/89k9hr4PPCPvsvl36RnTy0yufjdafld4CePWCVfJCZ/7VXw7f/twFYzhzuyJAoCqB4TynnTJ54qiu5c98DlzVWu23t4DnW804QpLv/h3N6xTna/zHQZ73CZLb3ybvMSQ/STlh/PhxigrxR2yGFQqM9hpa4dSj2HWnooLXoyOP5umFi8OcQ88I09eYFq668PjQ1ze+5+t77790t05Keyd+9LLwy3t+H5Jb6p91wgFhw/XW6fnevPd+h3oueOLp9Lb6++yxfdhr1zeFe35736CiQv9XO3R7jynPc5iRnzn12jL5WoKLLvt8elw++dTCkPzy0ex1ZoQb5p8a/uvXv+v5np3Xb0OzPvzki8Ov7vlj+rXrSZEm+ewt+QwvuWPFszfZoOfrpORxvT6rq9eRZbZtE1BUaFvif11v0h68/svf7rr6w/bfNUybOmXg7y+56sbw8atuDNfPPzVs8cLnpH+e1XpL3lBIfhv2hMPnDIzjjgrDO+Du+OHPwp3/8V8dH5yY9n9dQ/8DRnpHhTOPf2/Ydqv/kw7jjgrDy2Ykj8o6V0Yypm1GJtDtjgq9rlVJwcq5MjLvPFvd98DD4d2HnRle/pIXpr8dkLyJkfz0+rek/44K3/3iRekLoeTHHRXyqHssgfoLDPc57Uiv5Z2eA9dfrZkr8HyrObk6X5uTZaeV5HmfoP/rI5Oi/hp/fX/i05+7NWz9mpeEnbd97cDdAZstZnUE8gmM9Bqaby/NfHS3Oyp0e7/A69Hux0HywfoRJ1+cfi3j1RefEGbOmJ75+n6rV2+ZltG8/9LdNSkjve/Yc8MG666T3iU36/kvz8GW/V97vPfu24VxIYRHFzwZbvrGneGdb98m7L7jVmHSxAnpHRW6vceU5zlMM6+S2av67R/uDzvu/aHwmUtODmtMm9LTM+v4zd5b8x6RFBX+boN1w3GH7JkubsWKlWHrfz4ivH+fXdJyTa9z2h0Vmnc8tGlFigptSnsEa01+g+G8+TekT3w+fdHxYfPnP3tglP7vEbr7m5eFiRMnpH+ePKnfe/dtw7t2e0v6vWO/uvcP4VPnHJP+Xf+bDMntuF/0vE1HMBubdBPo9OFrVj7Jba6S2wi9d6+3pcP2P1n7+XeuDOPGJU/X/BQlkJVFUfsxTrZAp3Ml61rlXMl2He0jkhb7fkd+NGzzupeFk4/cO0zo6xsYslc+G20we8j3B55+wdXhwYcfC/POPGK007I9AQINEsh7Le/1HLhBLI1aiudbzYnT+dqcLDutJOu59+rbLFy0OFz7hW8OGuaiy76Q3pZ9xze/Ov06CD8ECAwWyHsN5fc3gU5FBa9H8x8hTzy1MBx+0sVh0aIl4ZP/evRASSEZKevfAMdvtvdHLr42/M8f7g+XnXtsyHr+y3OwZ3I34dv+7ccDf/jwowvCdV/8Vjjw3Tuld3+ePWtmz/eYso7f7PSa/4jkTiqv2OGgcMUFx4UX/v2zenpmHb/N1xq6wuQY+81v/xjmn310+pdJUeFVOx4cDtlvl7DvHtunX1vS7fOc7931s3Dwhy4I3T6ra6OnNddHQFGhPllVMtOTzr48vWVPcnF87qYbDsxh/XXXDkuXLg8vf+uBacNrr93eHG6/8+5wxMnzwq2fOSdsvOG6of92SdfMOzFs8aLnprcB+tptd4Vv3XB+estGP6MXSP6xWrlyZTjjomvC8uUrwtyj9w19fX2p78JFS3rmc+l1N6ffeZTkM23q5HDQceeH5zxrw3D6B/cf/cSMMEggKwtc5Qv0OleyrlXOlXLz+dW9fwy7vefk9EXhYe/ZLYwf/5c7KSTXpeSrbrLyee8x54S1pq+R/tbFAw8+EvY48LRwypF7h522fU25Ezc6AQK1Esi6ll/12a+H2+74cbhm3gnpuno9B169TFUrhIZP1vOt5gScdb4eNfeSsNEGs8IxB73T+VrD2LOe2/3o7l+G5Pt5zzv14LDpxusPWWHym2TJ10Akv3nrhwCBoQJZ11BmQwWWr1gRVq1clf4W8EF775wWofp/ISvrmuX16GDP5PnYvxx0WkhMLzjt0DB9janpA5LX+clXFWR5On4Heya31f/UtTeFXd/6+rDxRuuld8N979HnpL90lny4nvX8l2fvK94zv/oheXSvczrr+G3j9TUpGyxesiS86p/+IUyc0BcuvPQL6WdJ3/rseWHGmmv09Mw6ftvo+dNf3Bv2Ovj09Bd/X/GSF4Ybb/23MPfcq9KvXk9+8bfXOc2zjUdMc9asqNCcLEtZSdIm/tP9Dw0Z+2vXnp2+afDt7/8kHHbiRQN/f9IH3h323OVN6X8nt6P62JVfCvOv/kr638lXSXzqnKPDS1/8vFLm2sZBP/uV74TTzv/0oKUnRYPddnhD+me98kkajsktq75310/Tx774Bc9JfwN5vdkz20hZ+pp7ZVH6zu0g9DpXsq5VzpVyD6Bbvv3Dge8eXn1PSdHgoycckPlvSXJbuaRo1f9v1S7bvy4tbfW/sVTu7I1OgEBdBLKu5edccn16B7Ef3TI/XVLWc+C6rLtt8/R8qxmJZ52vu+5/UlqwPn/uIc7XGkae9dz7O3f+JBx6wkXhi5efHl6w2SZDVqioUMPQTXlMBbKuoWM6mZrsLCnAJXcZXf0n+T7w5N+arGuW16ODQ/7zQ4+FbXY/ckjyyddn3HHjvExPx+9gusRjnyPOCv/9m98P/EXynscpR+0TJk+amP6Z935HfqHpVFTodU5nXQ9GPpP6bvnN7/1HOOGsy0JyF6zkJznXzzn5/eFV/7R5+t9Z10iv34Zmf+X1t4Rz598w8BfJ17wkZaXkJ+saybO+51LbZ66o0PYjoID1J7+p/MBDj4b1Zs3s+MHQ4iVLw6OPPRE2WG+WOykU4J13iKx8Fjz5dFi2bPnA97vnHd/jhy+QlcXwR/LIMgSyrlXOlTLUhz9mVj7JGyLJb2sk34HnhwABAt0EXMubf2x4vtWcjJ2vzcmy00qynts1e/VWR6B8AdfQYo2zrllej+bzzvJ0/A72TD6cfOSxBWH2OjPTu08+8yfr+S/PfMdn8uhe53TW8Zt/b/XeIrmDyiOPPpEuIvkFyE5fKd3LM+v4rbfOyGafHGMPPfJ4+nlacqeKZ/70Oqd5jszcVtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1Av8flvxAw6CXgQQAAAAASUVORK5CYII=" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "max_depth = 3\n", - "min_segments = 3\n", - "\n", - "sf = wp.explain_levels(\n", - " df=df_eff_by_seg,\n", - " dims=segments,\n", - " total_name='CATE',\n", - " size_name='size',\n", - " max_depth=max_depth,\n", - " min_segments=min_segments,\n", - ")\n", - "sf.plot(plot_is_static=False)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 1332d0071e85bcd6224aa03d4cfb668a1caefd6e Mon Sep 17 00:00:00 2001 From: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:49:54 +0100 Subject: [PATCH 4/6] Add files via upload Signed-off-by: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> --- notebooks/AB testing.ipynb | 461 +++++++++++++++++++++++++++++++++++++ 1 file changed, 461 insertions(+) create mode 100644 notebooks/AB testing.ipynb diff --git a/notebooks/AB testing.ipynb b/notebooks/AB testing.ipynb new file mode 100644 index 00000000..53080e1b --- /dev/null +++ b/notebooks/AB testing.ipynb @@ -0,0 +1,461 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AB Testing with CausalTune" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "import pandas as pd\n", + "import numpy as np\n", + "import warnings\n", + "\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "import gc\n", + "\n", + "root_path = root_path = os.path.realpath('../..')\n", + "try:\n", + " import causaltune\n", + "except ModuleNotFoundError:\n", + " sys.path.append(os.path.join(root_path, \"causaltune\"))\n", + "\n", + "from causaltune import CausalTune\n", + "from causaltune.data_utils import CausalityDataset\n", + "from causaltune.datasets import generate_synth_data_with_categories\n", + "\n", + "from flaml import AutoML\n", + "import matplotlib.pyplot as plt\n", + "%pip install seaborn as sns\n", + "import seaborn as sns\n", + "%matplotlib inline\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "%pip install plotly\n", + "import plotly.io as pio\n", + "pio.renderers.default = \"png\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Note*: This notebook uses the the package *wise-pizza* which is not listed as a requirement to run CausalTune. It is merely used to showcase what is possible as an AB testing workflow.\n", + "\n", + "Install via\n", + "`pip install wise-pizza`" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install wise_pizza" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import wise_pizza as wp" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CausalTune for AB Testing \n", + "\n", + "CausalTune can be used for AB Testing in two ways:\n", + "1. Variance Reduction\n", + "2. Segmentation analysis\n", + "\n", + "#### 1. Variance Reduction\n", + "A standard variance reduction technique is to control for natural variation in the experiment's outcome metric. The simplest way to do so is by running a simple regression with a selection of controls. A potentially more powerful and automated approach is to run CausalTune. \n", + "\n", + "#### 2. Segmentation Analysis\n", + "\n", + "We use the heterogeneous treatment effect estimates from CausalTune to feed them into the segmentation analytics tool Wise-Pizza." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Data Generating Process" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first create synthetic data from a DGP with perfect randomisation of the treatment as we are replicating an AB test environment" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is substantial variation within the outcome metric per variant which can be seen from the cdf per variant:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "TRUE_EFFECT = 0.1\n", + "cd = generate_synth_data_with_categories(n_samples=8000, n_x=3, true_effect=TRUE_EFFECT)\n", + "cd.preprocess_dataset()\n", + "sns.ecdfplot(data=cd.data, x=cd.outcomes[0], hue=cd.treatment)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. ATE estimation: Running CausalTune\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# CausalTune configuration\n", + "num_samples = 5\n", + "components_time_budget = 10\n", + "train_size = 0.7\n", + "\n", + "target = cd.outcomes[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if outcome_model=\"auto\" in the CausalTune constructor, we search over a simultaneous search space for the EconML estimators and for FLAML wrappers for common regressors. The old behavior is now achieved by outcome_model=\"nested\" (the default for now)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "ct_ab = CausalTune(\n", + " num_samples=num_samples,\n", + " components_time_budget=components_time_budget,\n", + " metric=\"energy_distance\",\n", + " verbose=3,\n", + " components_verbose=3,\n", + " train_size=train_size,\n", + " outcome_model=\"auto\"\n", + ") \n", + "ct_ab.fit(data=cd, outcome=target)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The point estimates compare as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Difference in means estimate (naive ATE): 0.121874\n", + "CausalTune ATE estimate:: 0.086094\n", + "True ATE: 0.1\n" + ] + } + ], + "source": [ + "print(f'Difference in means estimate (naive ATE): {ct_ab.scorer.naive_ate(ct_ab.test_df[cd.treatment], ct_ab.test_df[target])[0]:5f}')\n", + "print(f'CausalTune ATE estimate:: {ct_ab.effect(ct_ab.test_df).mean():5f}')\n", + "print(f'True ATE: {TRUE_EFFECT}')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Explainable variation\n", + "\n", + "As a first performance check of this approach we test how much of the variation in the outcome metric remains unexplained with our outcome model prediction approach. \n", + "\n", + "For this, we use AutoML to predict outcomes as is done under the hood of CausalTune.\n", + "The lower the unexplained variation, the more promising it is to use CausalTune for AB Testing." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "automl = AutoML()\n", + "automl.fit(ct_ab.train_df[ct_ab.train_df.columns.drop([target])], ct_ab.train_df[target], task='regression', time_budget=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variation unexplained: 0.15%\n" + ] + } + ], + "source": [ + "# Fraction of variation unexplained\n", + "mse = mean_squared_error(automl.predict(ct_ab.test_df[ct_ab.test_df.columns.drop([target])]), ct_ab.test_df[target])\n", + "var_y = ct_ab.test_df[target].var()\n", + "fvu = mse / var_y\n", + "print(f'Variation unexplained: {100*fvu:.2f}%')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bootstrapping with simple component models for inference\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# bootstrap configuration\n", + "\n", + "n_samples = 30\n", + "n_sample_size = cd.data.shape[0]\n", + "\n", + "components_time_budget = 5\n", + "train_size = .7\n", + "num_samples= 10\n", + "\n", + "ct_ate = []\n", + "scores = []\n", + "naive_ate = []" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "for _ in range(n_samples):\n", + " cd_bt = generate_synth_data_with_categories(n_samples=5000, n_x=3, true_effect=TRUE_EFFECT)\n", + " cd_bt.preprocess_dataset()\n", + " outcome_regressor = RandomForestRegressor()\n", + " \n", + " ct = CausalTune(\n", + " num_samples=num_samples,\n", + " components_time_budget=components_time_budget,\n", + " metric=\"energy_distance\",\n", + " train_size=train_size,\n", + " propensity_model='dummy',\n", + " outcome_model=outcome_regressor\n", + " ) \n", + "\n", + " ct.fit(data=cd, outcome=target)\n", + "\n", + " ct_ate.append(ct.effect(ct.test_df).mean())\n", + " scores.append(ct.best_score)\n", + " naive_ate.append(ct.scorer.naive_ate(cd_bt.data[cd_bt.treatment], cd_bt.data[target])[0])\n", + " del ct, cd_bt, outcome_regressor\n", + " gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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f33gRtaTddtms+mVV15xrFe33XabY936u7/7Oz333HOS2tfFEydO6NChQ/rHf/xHx/3nn39eNptNY8aM6bYXm82mhIQEHT16VJJ04sQJFRcXa/jw4Ro0aJDnFhrGI7CgV1pbW2Wz2a74FFZaWurYqJ0/f14vvPCCtmzZooiICEnS4MGD9ZOf/ESbNm3ShAkTlJCQoOnTp6ulpUWSlJSU5PjUdPDgQWVlZTnGfv3115WUlKQxY8Y4prsa57PPPtPdd98tSSovL9ddd93l1Ker1/nhD3+oZcuWafLkyRo1apRsNpskqaqqStOnT1dycrLuvfde1dXVeeYPCRimJ+u21B4kOtYrX19fPf/889q1a5ck6YEHHtDhw4d15MgR3X///bLZbLrtttsc9ydNmuQYoyOwuFr3bDabHn74YUdgeemll/Tggw86XtvVuulq2+DqdbravsAsBBb0ytGjR/XNN99o6NChjmnFxcU6deqUY6O2Y8cOTZs2zammw/3336+SkhIdPnxYQ4cO1b59+/Ttt9+qvr7e8anp8OHDSkhIkNQeftauXau//OUvstlsWr9+vctxpPaQ0rEhvHzDKqnb17HZbPr+97+vjz76SE8//bTeeecdtbS06KmnntL69etltVr16KOPasOGDR78awLm6Mm63dbWpqqqKt1xxx2OmsDAQDU2Nurbb79VZWWlYmNjFR8fr0ceeUQFBQX68ssvHfcPHjzoGCM2NlZS1+teW1ubqqur9aMf/UiVlZX6/PPP9fnnn2vIkCEaM2ZMt+umq21DV6/javsCsxBY0CtlZWWSpNdee01VVVV6//33lZ2dLUm6ePGipPYNw3d3K0vtG7vXX39d48eP19ixY/WnP/1JQUFBOnbsmEaPHu2ou/zTl7+/v86fP6+f//znKi8v18CBA12O09zcLEkKDg6W5BxeJLl8nYaGBvn4+OiJJ56QJF26dEkDBw5UYWGhysvL9aMf/UiJiYl69dVXNWDAAA/9JQGz9GTdPn78uIYMGeK0HlRXV2vEiBFqbm5WUFCQ47nDhw871r/L73eMERAQ4HLdO378uKKjoxUXF6e//vWveumll/TLX/7S8SHD1brpatvg6nW62r7APAQW9EpZWZkyMjL0+eefKyEhQc8//7xefPFFhYWF6be//a0k6ZZbbpHdbr9i3jfffFOVlZX68MMP9emnn2rQoEGKj4+/4nj2J5984tjzERoa6ghADz/8sAoLC7sd5/I9Kl097up1bDabxo8f75h++PBh3XXXXTp8+LBWrVrlOFZfUVGhX/ziF577YwIG6cm6/d11SpI2btyomTNnXnEItqqqyvEB4fL7l6+Hrta9jpqOvTenTp3S1KlTHdNdrZvdbRu6ep2uti8wD4EFvfLpp58qJSVFu3bt0jfffKPS0lI9+uijqq+v1x/+8AdJ7btkN2/erL/97W+SpIaGBm3atEnl5eWaPHmygoODtXbtWjU1Nel73/uevvzyS8cnm48++kjl5eUaNWqUpPYNXWhoqObMmaO0tDS1tLS4HOfy81eam5t1/vx5DR8+3NG7q9ex2WxOV0F0fIqLiorSBx984Jj+2WefXbO/K+BtPVm3bTab4uPjJbXvMf2v//ovFRYWasmSJU6HWM+dO6eBAwfKz8/P6X7HGJcHlq7WvctrlixZotWrV0uSjhw5ovj4eJfrpqttg6vX6Wr7AvMQWNArn376qWOj5MqkSZOUm5uradOmKSEhQffcc48uXbqkOXPm6Ne//rV+8IMf6Pjx445x7r//fm3btk3Z2dnavXu34uLi5OPjI0n6t3/7N915550aN26cfHx8NGvWLJfjXB5YKioqHMfIO7h6HZvN5pjv22+/1VdffaXBgwdr3rx5+uqrrxQbG6uxY8dq06ZNHv1bAibpybpts9m0ceNGJScnKzk5WXv37tXevXt12223uTwEdPn9jjEuDyxdrXuX12RlZWnMmDGqq6tTaGiogoODXa6brrYNrl6nq+0LzMOPH8JtNTU1GjJkiMrLyx2fsgDc+Fi3YTICCwAAMB6HhAAAgPEILAAAwHgEFgAAYDwCCwAAMB6BBQAAGI/AAgAAjEdgAQAAxiOwAAAA4xFYAACA8QgsAADAeAQWAABgPAILAAAw3v8DwILJt/yOfgAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "ax.boxplot([ct_ate, naive_ate])\n", + "ax.set_xticklabels(['$\\hat{\\mu}_{CausalTune}$', '$\\hat{\\mu}_{DiffInMeans}$'])\n", + "plt.axhline(y = TRUE_EFFECT, color = 'b', linestyle = '--')\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Segmentation with Wise Pizza" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The underlying estimators of CausalTune provide heterogeneous treatment effect estimates. Apart from simply predicting treatment effects for customers with certain characteristics, one can also perform an automatic segmentation of customers by treatment impact via [wise-pizza](https://github.com/transferwise/wise-pizza/tree/main) as we demonstrate here.\n", + "\n", + "In the synthetic dataset at hand, there are heterogeneous treatment effects by category, e.g. $.5*$TRUE_EFFECT if $X_1=1$ or $-.5*$TRUE_EFFECT if $X_1=2$\n", + "\n", + "The plot below displays an automated selection of relevant segments by CATE." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "segments = list(set(cd.data.columns) - set([cd.treatment]) - set(cd.outcomes) - set(['random']) - set(['X_continuous']))\n", + "\n", + "df_effects = ct_ab.test_df[segments + [cd.treatment]]\n", + "df_effects['CATE'] = ct_ab.effect(ct_ab.test_df)\n", + "df_eff_by_seg = df_effects.groupby(by=segments, as_index=False).agg({'CATE':'sum', 'variant': len}).rename(columns={'variant': 'size'})" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:min_segments parameter is deprecated, please use max_segments instead.\n", + "WARNING:root:min_segments parameter is deprecated, please use max_segments instead.\n" + ] + }, + { + "data": { + "image/png": "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IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1AooK1frbOwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaJWAokKr4rZYAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQrYCiQrX+9k6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBFoloKjQqrgtlgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCugqFCtv70TIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFWCSgqtCpuiyVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAtUKKCpU62/vBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgVQKKCq2K22IJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEC1Av8flvxAw6CXgQQAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "max_depth = 3\n", + "min_segments = 3\n", + "\n", + "sf = wp.explain_levels(\n", + " df=df_eff_by_seg,\n", + " dims=segments,\n", + " total_name='CATE',\n", + " size_name='size',\n", + " max_depth=max_depth,\n", + " min_segments=min_segments,\n", + ")\n", + "sf.plot(plot_is_static=False)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 26e06a460a68a80b68c10ea3772b85c6011b1703 Mon Sep 17 00:00:00 2001 From: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:58:20 +0100 Subject: [PATCH 5/6] Delete notebooks/ERUPT under simulated random assignment.ipynb Signed-off-by: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> --- ...PT under simulated random assignment.ipynb | 490 ------------------ 1 file changed, 490 deletions(-) delete mode 100644 notebooks/ERUPT under simulated random assignment.ipynb diff --git a/notebooks/ERUPT under simulated random assignment.ipynb b/notebooks/ERUPT under simulated random assignment.ipynb deleted file mode 100644 index 218f4817..00000000 --- a/notebooks/ERUPT under simulated random assignment.ipynb +++ /dev/null @@ -1,490 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "a34f30c6", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "# ERUPT under simulated random assignment" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c37a7a94", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import os, sys\n", - "import warnings\n", - "warnings.filterwarnings('ignore') # suppress sklearn deprecation warnings for now..\n", - "\n", - "import pandas as pd\n", - "import numpy as np\n", - "from sklearn.model_selection import train_test_split\n", - "\n", - "# the below checks for whether we run dowhy, causaltune, and FLAML from source\n", - "root_path = root_path = os.path.realpath('../..')\n", - "try:\n", - " import causaltune\n", - "except ModuleNotFoundError:\n", - " sys.path.append(os.path.join(root_path, \"causaltune\"))\n", - "\n", - "try:\n", - " import dowhy\n", - "except ModuleNotFoundError:\n", - " sys.path.append(os.path.join(root_path, \"dowhy\"))\n", - "\n", - "try:\n", - " import flaml\n", - "except ModuleNotFoundError:\n", - " sys.path.append(os.path.join(root_path, \"FLAML\"))\n", - "\n", - "from causaltune import CausalTune\n", - "from causaltune.datasets import generate_non_random_dataset\n", - "from causaltune.erupt import DummyPropensity, ERUPT\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "53241021", - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# this makes the notebook expand to full width of the browser window\n", - "from IPython.core.display import display, HTML\n", - "display(HTML(\"\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "5ed9b5f7", - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "application/javascript": "\n// turn off scrollable windows for large output\nIPython.OutputArea.prototype._should_scroll = function(lines) {\n return false;\n}\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%javascript\n", - "\n", - "// turn off scrollable windows for large output\n", - "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", - " return false;\n", - "}" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "af5333b0", - "metadata": {}, - "source": [ - "## Loading data and model training" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a0211b9a", - "metadata": {}, - "outputs": [], - "source": [ - "# load toy dataset with non-random assignment and apply standard pre-processing\n", - "cd = generate_non_random_dataset()\n", - "cd.preprocess_dataset()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "6cec1abf", - "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", - "
TYrandomX1X2X3X4X5propensity
000.0102201.0-0.085525-1.3674260.609410-0.964790-0.2431100.184196
10-0.6902950.0-0.4843822.1073270.3292360.9125510.1633310.819221
21-1.0761490.00.7313170.694923-1.4399570.7704290.8618600.805571
31-0.3569501.00.031283-0.1951620.5154630.2339550.0376950.437305
410.5339181.0-1.4123800.9341860.544307-0.697134-1.7805200.479135
\n", - "
" - ], - "text/plain": [ - " T Y random X1 X2 X3 X4 X5 \\\n", - "0 0 0.010220 1.0 -0.085525 -1.367426 0.609410 -0.964790 -0.243110 \n", - "1 0 -0.690295 0.0 -0.484382 2.107327 0.329236 0.912551 0.163331 \n", - "2 1 -1.076149 0.0 0.731317 0.694923 -1.439957 0.770429 0.861860 \n", - "3 1 -0.356950 1.0 0.031283 -0.195162 0.515463 0.233955 0.037695 \n", - "4 1 0.533918 1.0 -1.412380 0.934186 0.544307 -0.697134 -1.780520 \n", - "\n", - " propensity \n", - "0 0.184196 \n", - "1 0.819221 \n", - "2 0.805571 \n", - "3 0.437305 \n", - "4 0.479135 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(cd.data.head())" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "4b5d0795", - "metadata": {}, - "outputs": [], - "source": [ - "# training configs\n", - "\n", - "# set evaluation metric\n", - "metric = \"energy_distance\"\n", - "\n", - "# it's best to specify either time_budget or components_time_budget, \n", - "# and let the other one be inferred; time in seconds\n", - "time_budget = None\n", - "components_time_budget = 10\n", - "\n", - "# specify training set size\n", - "train_size = 0.7" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "a51c87f4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fitting a Propensity-Weighted scoring estimator to be used in scoring tasks\n", - "Initial configs: [{'estimator': {'estimator_name': 'backdoor.econml.metalearners.XLearner'}}, {'estimator': {'estimator_name': 'backdoor.econml.dml.CausalForestDML', 'drate': True, 'n_estimators': 100, 'criterion': 'mse', 'min_samples_split': 10, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': True, 'fit_intercept': True, 'subforest_size': 4}}]\n", - "---------------------\n", - "Best estimator: backdoor.econml.dml.CausalForestDML\n", - "Best config: {'estimator': {'estimator_name': 'backdoor.econml.dml.CausalForestDML', 'drate': 1, 'n_estimators': 100, 'criterion': 'mse', 'min_samples_split': 10, 'min_samples_leaf': 5, 'min_weight_fraction_leaf': 0.0, 'max_features': 'auto', 'min_impurity_decrease': 0.0, 'max_samples': 0.45, 'min_balancedness_tol': 0.45, 'honest': 1, 'fit_intercept': 1, 'subforest_size': 4}}\n", - "Best score: 0.20444383297534108\n" - ] - } - ], - "source": [ - "ct = CausalTune(\n", - " estimator_list=[\"CausalForestDML\", \"XLearner\"],\n", - " metric=metric,\n", - " verbose=0,\n", - " components_verbose=0,\n", - " time_budget=time_budget,\n", - " components_time_budget=components_time_budget,\n", - " train_size=train_size\n", - ")\n", - "\n", - "\n", - "# run causaltune\n", - "ct.fit(data=cd, outcome=cd.outcomes[0])\n", - "\n", - "print('---------------------')\n", - "# return best estimator\n", - "print(f\"Best estimator: {ct.best_estimator}\")\n", - "# config of best estimator:\n", - "print(f\"Best config: {ct.best_config}\")\n", - "# best score:\n", - "print(f\"Best score: {ct.best_score}\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "19bcfc2e", - "metadata": {}, - "source": [ - "## Random ERUPT" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "2bea4e38", - "metadata": {}, - "source": [ - "Below we demonstrate how to use Estimated Response Under Proposed Treatment (ERUPT) to estimate the average treatment effect had the treatment been assigned randomly. Recall that the dataset used in this example is constructed in a way that the treatment propensity is a function of a unit's covariates." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "db1b69a3", - "metadata": {}, - "outputs": [], - "source": [ - "use_df = ct.test_df" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "e8afee5a", - "metadata": {}, - "outputs": [], - "source": [ - "# computing mean ERUPT over 10 bootstrapped samples\n", - "\n", - "scores_list = []\n", - "\n", - "for i in range(10):\n", - "\n", - " bootstrap_df = use_df.sample(frac=1, replace=True)\n", - " propensities = bootstrap_df['propensity']\n", - " actual_treatment = bootstrap_df['T']\n", - " outcome = bootstrap_df['Y']\n", - "\n", - " # define the random assignment policy\n", - " random_policy = np.random.randint(0,2, size=len(bootstrap_df))\n", - "\n", - " # define a propensity model that will simply return the propensities when calling predict_proba\n", - " propensity_model = DummyPropensity(p=propensities, treatment=actual_treatment)\n", - "\n", - " # obtain ERUPT under random policy\n", - " e = ERUPT(treatment_name='T', propensity_model=propensity_model)\n", - " scores_list.append(e.score(df=use_df,outcome=outcome,policy=random_policy))\n", - "\n", - "erupt_mean = np.mean(scores_list)\n", - "erupt_sd = np.std(scores_list)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "438112f2", - "metadata": {}, - "outputs": [], - "source": [ - "# compute naive ate as difference in means\n", - "naive_ate, naive_sd, _ = ct.scorer.naive_ate(ct.test_df['T'], ct.test_df['Y'])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "a0f6d079", - "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", - "
estimated_effectsd
naive_ate0.2432120.122227
random_erupt-0.0154890.193977
\n", - "
" - ], - "text/plain": [ - " estimated_effect sd\n", - "naive_ate 0.243212 0.122227\n", - "random_erupt -0.015489 0.193977" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# comparison of naive ate to mean random erupt over 10 bootstrap runs\n", - "erupt_df = pd.DataFrame([[naive_ate,naive_sd],[erupt_mean,erupt_sd]], columns=['estimated_effect', 'sd'], index=['naive_ate','random_erupt'])\n", - "display(erupt_df)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "a54530bf", - "metadata": {}, - "source": [ - "For more details on the ERUPT implementation, consult [Hitsch and Misra (2018)](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3111957). Note also that we assume that treatment takes integer values from 0 to n." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "causality", - "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.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 89753588e23f9ff40ae969b9bfcb2a93faf384a6 Mon Sep 17 00:00:00 2001 From: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:58:39 +0100 Subject: [PATCH 6/6] Add files via upload Signed-off-by: AlxdrPolyakov <122611538+AlxdrPolyakov@users.noreply.github.com> --- ...PT under simulated random assignment.ipynb | 500 ++++++++++++++++++ 1 file changed, 500 insertions(+) create mode 100644 notebooks/ERUPT under simulated random assignment.ipynb diff --git a/notebooks/ERUPT under simulated random assignment.ipynb b/notebooks/ERUPT under simulated random assignment.ipynb new file mode 100644 index 00000000..6ac2b20b --- /dev/null +++ b/notebooks/ERUPT under simulated random assignment.ipynb @@ -0,0 +1,500 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "a34f30c6", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# ERUPT under simulated random assignment" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c37a7a94", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "import os, sys\n", + "import warnings\n", + "warnings.filterwarnings('ignore') # suppress sklearn deprecation warnings for now..\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# the below checks for whether we run dowhy, causaltune, and FLAML from source\n", + "root_path = root_path = os.path.realpath('../..')\n", + "try:\n", + " import causaltune\n", + "except ModuleNotFoundError:\n", + " sys.path.append(os.path.join(root_path, \"causaltune\"))\n", + "\n", + "try:\n", + " import dowhy\n", + "except ModuleNotFoundError:\n", + " sys.path.append(os.path.join(root_path, \"dowhy\"))\n", + "\n", + "try:\n", + " import flaml\n", + "except ModuleNotFoundError:\n", + " sys.path.append(os.path.join(root_path, \"FLAML\"))\n", + "\n", + "from causaltune import CausalTune\n", + "from causaltune.datasets import generate_non_random_dataset\n", + "from causaltune.erupt import DummyPropensity, ERUPT\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "53241021", + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# this makes the notebook expand to full width of the browser window\n", + "from IPython.core.display import display, HTML\n", + "display(HTML(\"\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5ed9b5f7", + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "\n", + "// turn off scrollable windows for large output\n", + "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", + " return false;\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + "\n", + "// turn off scrollable windows for large output\n", + "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", + " return false;\n", + "}" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "af5333b0", + "metadata": {}, + "source": [ + "## Loading data and model training" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a0211b9a", + "metadata": {}, + "outputs": [], + "source": [ + "# load toy dataset with non-random assignment and apply standard pre-processing\n", + "cd = generate_non_random_dataset()\n", + "cd.preprocess_dataset()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6cec1abf", + "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", + "
TYrandomX1X2X3X4X5propensity
001.2393081.0-0.847134-0.3985630.1765390.9573601.1224570.328241
100.1084420.0-0.583898-0.8992651.177333-0.563962-0.6147370.195308
21-0.8973100.0-2.2375900.061438-0.4625190.777278-1.3790220.345805
310.7574751.0-0.0473190.354603-1.9764290.0819450.4240410.695707
400.8534781.0-0.2568320.0487481.536085-1.0274150.6897330.304767
\n", + "
" + ], + "text/plain": [ + " T Y random X1 X2 X3 X4 X5 \\\n", + "0 0 1.239308 1.0 -0.847134 -0.398563 0.176539 0.957360 1.122457 \n", + "1 0 0.108442 0.0 -0.583898 -0.899265 1.177333 -0.563962 -0.614737 \n", + "2 1 -0.897310 0.0 -2.237590 0.061438 -0.462519 0.777278 -1.379022 \n", + "3 1 0.757475 1.0 -0.047319 0.354603 -1.976429 0.081945 0.424041 \n", + "4 0 0.853478 1.0 -0.256832 0.048748 1.536085 -1.027415 0.689733 \n", + "\n", + " propensity \n", + "0 0.328241 \n", + "1 0.195308 \n", + "2 0.345805 \n", + "3 0.695707 \n", + "4 0.304767 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(cd.data.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4b5d0795", + "metadata": {}, + "outputs": [], + "source": [ + "# training configs\n", + "\n", + "# set evaluation metric\n", + "metric = \"energy_distance\"\n", + "\n", + "# it's best to specify either time_budget or components_time_budget, \n", + "# and let the other one be inferred; time in seconds\n", + "time_budget = None\n", + "components_time_budget = 10\n", + "\n", + "# specify training set size\n", + "train_size = 0.7" + ] + }, + { + "cell_type": "markdown", + "id": "33681e65-6dd4-4c7d-a62d-925572b39e81", + "metadata": {}, + "source": [ + "Now if outcome_model=\"auto\" in the CausalTune constructor, we search over a simultaneous search space for the EconML estimators and for FLAML wrappers for common regressors. The old behavior is now achieved by outcome_model=\"nested\" (the default for now)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "a51c87f4", + "metadata": {}, + "outputs": [], + "source": [ + "ct = CausalTune(\n", + " estimator_list=[\"CausalForestDML\", \"XLearner\"],\n", + " metric=metric,\n", + " verbose=0,\n", + " components_verbose=0,\n", + " time_budget=time_budget,\n", + " components_time_budget=components_time_budget,\n", + " train_size=train_size,\n", + " outcome_model=\"auto\"\n", + ")\n", + "\n", + "\n", + "# run causaltune\n", + "ct.fit(data=cd, outcome=cd.outcomes[0])\n", + "\n", + "print('---------------------')\n", + "# return best estimator\n", + "print(f\"Best estimator: {ct.best_estimator}\")\n", + "# config of best estimator:\n", + "print(f\"Best config: {ct.best_config}\")\n", + "# best score:\n", + "print(f\"Best score: {ct.best_score}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "19bcfc2e", + "metadata": {}, + "source": [ + "## Random ERUPT" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "2bea4e38", + "metadata": {}, + "source": [ + "Below we demonstrate how to use Estimated Response Under Proposed Treatment (ERUPT) to estimate the average treatment effect had the treatment been assigned randomly. Recall that the dataset used in this example is constructed in a way that the treatment propensity is a function of a unit's covariates." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "db1b69a3", + "metadata": {}, + "outputs": [], + "source": [ + "use_df = ct.test_df" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e8afee5a", + "metadata": {}, + "outputs": [], + "source": [ + "# computing mean ERUPT over 10 bootstrapped samples\n", + "\n", + "scores_list = []\n", + "\n", + "for i in range(10):\n", + "\n", + " bootstrap_df = use_df.sample(frac=1, replace=True)\n", + " propensities = bootstrap_df['propensity']\n", + " actual_treatment = bootstrap_df['T']\n", + " outcome = bootstrap_df['Y']\n", + "\n", + " # define the random assignment policy\n", + " random_policy = np.random.randint(0,2, size=len(bootstrap_df))\n", + "\n", + " # define a propensity model that will simply return the propensities when calling predict_proba\n", + " propensity_model = DummyPropensity(p=propensities, treatment=actual_treatment)\n", + "\n", + " # obtain ERUPT under random policy\n", + " e = ERUPT(treatment_name='T', propensity_model=propensity_model)\n", + " scores_list.append(e.score(df=use_df,outcome=outcome,policy=random_policy))\n", + "\n", + "erupt_mean = np.mean(scores_list)\n", + "erupt_sd = np.std(scores_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "438112f2", + "metadata": {}, + "outputs": [], + "source": [ + "# compute naive ate as difference in means\n", + "naive_ate, naive_sd, _ = ct.scorer.naive_ate(ct.test_df['T'], ct.test_df['Y'])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a0f6d079", + "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", + "
estimated_effectsd
naive_ate0.2181510.124848
random_erupt0.0231410.216845
\n", + "
" + ], + "text/plain": [ + " estimated_effect sd\n", + "naive_ate 0.218151 0.124848\n", + "random_erupt 0.023141 0.216845" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# comparison of naive ate to mean random erupt over 10 bootstrap runs\n", + "erupt_df = pd.DataFrame([[naive_ate,naive_sd],[erupt_mean,erupt_sd]], columns=['estimated_effect', 'sd'], index=['naive_ate','random_erupt'])\n", + "display(erupt_df)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a54530bf", + "metadata": {}, + "source": [ + "For more details on the ERUPT implementation, consult [Hitsch and Misra (2018)](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3111957). Note also that we assume that treatment takes integer values from 0 to n." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}