Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save fullflu/5a5bc7776aaba024469b7a58b63133ee to your computer and use it in GitHub Desktop.
Save fullflu/5a5bc7776aaba024469b7a58b63133ee to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Summary\" data-toc-modified-id=\"Summary-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Summary</a></span></li><li><span><a href=\"#Load-data\" data-toc-modified-id=\"Load-data-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>Load data</a></span></li><li><span><a href=\"#Preprocess-data\" data-toc-modified-id=\"Preprocess-data-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Preprocess data</a></span></li><li><span><a href=\"#Train-models-and-get-predictions\" data-toc-modified-id=\"Train-models-and-get-predictions-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>Train models and get predictions</a></span></li><li><span><a href=\"#Problems-when-we-handle-the-binary-outcome-via-metalearners\" data-toc-modified-id=\"Problems-when-we-handle-the-binary-outcome-via-metalearners-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>Problems when we handle the binary outcome via metalearners</a></span></li><li><span><a href=\"#Proposition\" data-toc-modified-id=\"Proposition-6\"><span class=\"toc-item-num\">6&nbsp;&nbsp;</span>Proposition</a></span><ul class=\"toc-item\"><li><span><a href=\"#Create-wrappers-of-sklearn-models\" data-toc-modified-id=\"Create-wrappers-of-sklearn-models-6.1\"><span class=\"toc-item-num\">6.1&nbsp;&nbsp;</span>Create wrappers of sklearn models</a></span></li><li><span><a href=\"#Override-predict-methods-after-the-initialization-of-TLearner\" data-toc-modified-id=\"Override-predict-methods-after-the-initialization-of-TLearner-6.2\"><span class=\"toc-item-num\">6.2&nbsp;&nbsp;</span>Override predict methods after the initialization of TLearner</a></span></li></ul></li></ul></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Summary"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* metalearners in EconML seem to focus on the continuous outcome\n",
"* When we use the ordinary classification models provided by sklearn, we get poor results because metalearners call predict methods that return `0` or `1`\n",
"* We propose two types of modification:\n",
" - create wrappers of sklearn models\n",
" - override predict methods after the initialization of metalearners"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"download data from https://blog.minethatdata.com/2008/03/minethatdata-e-mail-analytics-and-data.html"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.utils import shuffle\n",
"\n",
"csv_path = '~/downloads/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv'\n",
"df = pd.read_csv(csv_path)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(64000, 12)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 64000 entries, 0 to 63999\n",
"Data columns (total 12 columns):\n",
"recency 64000 non-null int64\n",
"history_segment 64000 non-null object\n",
"history 64000 non-null float64\n",
"mens 64000 non-null int64\n",
"womens 64000 non-null int64\n",
"zip_code 64000 non-null object\n",
"newbie 64000 non-null int64\n",
"channel 64000 non-null object\n",
"segment 64000 non-null object\n",
"visit 64000 non-null int64\n",
"conversion 64000 non-null int64\n",
"spend 64000 non-null float64\n",
"dtypes: float64(2), int64(6), object(4)\n",
"memory usage: 5.9+ MB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>recency</th>\n",
" <th>history_segment</th>\n",
" <th>history</th>\n",
" <th>mens</th>\n",
" <th>womens</th>\n",
" <th>zip_code</th>\n",
" <th>newbie</th>\n",
" <th>channel</th>\n",
" <th>segment</th>\n",
" <th>visit</th>\n",
" <th>conversion</th>\n",
" <th>spend</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>64000.000000</td>\n",
" <td>64000</td>\n",
" <td>64000.000000</td>\n",
" <td>64000.000000</td>\n",
" <td>64000.000000</td>\n",
" <td>64000</td>\n",
" <td>64000.000000</td>\n",
" <td>64000</td>\n",
" <td>64000</td>\n",
" <td>64000.000000</td>\n",
" <td>64000.000000</td>\n",
" <td>64000.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>unique</th>\n",
" <td>NaN</td>\n",
" <td>7</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3</td>\n",
" <td>NaN</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>top</th>\n",
" <td>NaN</td>\n",
" <td>1) $0 - $100</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Surburban</td>\n",
" <td>NaN</td>\n",
" <td>Web</td>\n",
" <td>Womens E-Mail</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>freq</th>\n",
" <td>NaN</td>\n",
" <td>22970</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>28776</td>\n",
" <td>NaN</td>\n",
" <td>28217</td>\n",
" <td>21387</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>5.763734</td>\n",
" <td>NaN</td>\n",
" <td>242.085656</td>\n",
" <td>0.551031</td>\n",
" <td>0.549719</td>\n",
" <td>NaN</td>\n",
" <td>0.502250</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.146781</td>\n",
" <td>0.009031</td>\n",
" <td>1.050908</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>3.507592</td>\n",
" <td>NaN</td>\n",
" <td>256.158608</td>\n",
" <td>0.497393</td>\n",
" <td>0.497526</td>\n",
" <td>NaN</td>\n",
" <td>0.499999</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.353890</td>\n",
" <td>0.094604</td>\n",
" <td>15.036448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>29.990000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>NaN</td>\n",
" <td>0.000000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>2.000000</td>\n",
" <td>NaN</td>\n",
" <td>64.660000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>NaN</td>\n",
" <td>0.000000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>6.000000</td>\n",
" <td>NaN</td>\n",
" <td>158.110000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>9.000000</td>\n",
" <td>NaN</td>\n",
" <td>325.657500</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>12.000000</td>\n",
" <td>NaN</td>\n",
" <td>3345.930000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>1.000000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>499.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" recency history_segment history mens \\\n",
"count 64000.000000 64000 64000.000000 64000.000000 \n",
"unique NaN 7 NaN NaN \n",
"top NaN 1) $0 - $100 NaN NaN \n",
"freq NaN 22970 NaN NaN \n",
"mean 5.763734 NaN 242.085656 0.551031 \n",
"std 3.507592 NaN 256.158608 0.497393 \n",
"min 1.000000 NaN 29.990000 0.000000 \n",
"25% 2.000000 NaN 64.660000 0.000000 \n",
"50% 6.000000 NaN 158.110000 1.000000 \n",
"75% 9.000000 NaN 325.657500 1.000000 \n",
"max 12.000000 NaN 3345.930000 1.000000 \n",
"\n",
" womens zip_code newbie channel segment \\\n",
"count 64000.000000 64000 64000.000000 64000 64000 \n",
"unique NaN 3 NaN 3 3 \n",
"top NaN Surburban NaN Web Womens E-Mail \n",
"freq NaN 28776 NaN 28217 21387 \n",
"mean 0.549719 NaN 0.502250 NaN NaN \n",
"std 0.497526 NaN 0.499999 NaN NaN \n",
"min 0.000000 NaN 0.000000 NaN NaN \n",
"25% 0.000000 NaN 0.000000 NaN NaN \n",
"50% 1.000000 NaN 1.000000 NaN NaN \n",
"75% 1.000000 NaN 1.000000 NaN NaN \n",
"max 1.000000 NaN 1.000000 NaN NaN \n",
"\n",
" visit conversion spend \n",
"count 64000.000000 64000.000000 64000.000000 \n",
"unique NaN NaN NaN \n",
"top NaN NaN NaN \n",
"freq NaN NaN NaN \n",
"mean 0.146781 0.009031 1.050908 \n",
"std 0.353890 0.094604 15.036448 \n",
"min 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 \n",
"50% 0.000000 0.000000 0.000000 \n",
"75% 0.000000 0.000000 0.000000 \n",
"max 1.000000 1.000000 499.000000 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe(include=\"all\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"numeric_columns = [\"recency\", \"history\", \"spend\"]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1111573c8>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x103c000f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.pairplot(df[numeric_columns])\n",
"plt.title(\"pairplot of numerical variables\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"binary_columns = df.describe().columns.drop(numeric_columns)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>mens</th>\n",
" <th>womens</th>\n",
" <th>newbie</th>\n",
" <th>visit</th>\n",
" <th>conversion</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.448969</td>\n",
" <td>0.450281</td>\n",
" <td>0.49775</td>\n",
" <td>0.853219</td>\n",
" <td>0.990969</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.551031</td>\n",
" <td>0.549719</td>\n",
" <td>0.50225</td>\n",
" <td>0.146781</td>\n",
" <td>0.009031</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" mens womens newbie visit conversion\n",
"0 0.448969 0.450281 0.49775 0.853219 0.990969\n",
"1 0.551031 0.549719 0.50225 0.146781 0.009031"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[binary_columns].apply(pd.Series.value_counts, normalize=\"index\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"df_binary_melt = pd.melt(df, value_vars=binary_columns)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>variable</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>mens</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>mens</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>mens</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>mens</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>mens</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" variable value\n",
"0 mens 1\n",
"1 mens 1\n",
"2 mens 0\n",
"3 mens 1\n",
"4 mens 1"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_binary_melt.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/****/.pyenv/versions/3.6.1/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n",
" return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11166e630>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEXCAYAAACtTzM+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAF4xJREFUeJzt3Xu0nXV95/H3h4S7AaKJREAIN0UtiHAUUGe8lqm6lNap\nVlu1VGlqHe1lVGovK51qiy1qZ2ZpKwPOFKiCqKMLqS2L8W69YUAd0VHkIkIkEAxIGsQE8p0/nl/M\nzsk+V85zdi7v11pnnd/e+/c8z/f5nX32Zz+X/exUFZIk7THqAiRJOwYDQZIEGAiSpMZAkCQBBoIk\nqTEQJEmAgaAmyROTvGUelrMgycP6Xs5sJXl6kteNuo4d1VTjk2T/JHvOZ02aOwaCtvgW8OQ+F5Bk\nIXAB8Kt9LmeCZb8gyYokFyd5+CRdvwo8c5L5XJjkt+a8wBGbwXpNOD5JDgU+BRw6h6VpHi0cdQHa\nMVTV5iTre17GA0kuBpZPd5okr62q8+Zg8b9SVWclWQTsM0mNm5LcN8l8/hL48RzUs6OZ1npNNj5V\ntTrJlXNemeaNWwiatbb7Z+8h92eO5n8K8DtzMS9gAUBVvauqfvQQ5nMrcP/gHTNd3yQLR7FbZYrl\nbrde2v24haBB+yV5A907+Gur6gMASd4MbAAeCVxcVTe1/mcAz0lyHXAW8GrgXuBDSd4PLAHWVdV/\nnWyhSX4ROAl4EPhGVX2yPXQUsD7JK4DvVNW1U8znN4DF7efjVfXNJAcALwKObvP5QlXdMsU4HNzG\n4QnAh6vqU23+jwAuAt4JfLbd9xLgBUm+CzwKuGJL/UnOAW4CjgTeWVV3t/n/HrBvkvuB1wDPAl5O\nF34vpBvrjwLnVNUVE6zr64A/BE4HAlwK/EFVfXkmy62qO4at1xT1Dx2fiSR5LbB3G58LqurGdv9/\nbut6ILC5qt452Xw0D6rKH3+oKoAPAGntfwEObO0vA3sCjwDePm6ab7X7TwQWtfsuAvZs7QuBIwf6\nPxM4c+D23sAnBm5fAew9cPvCada+DHh/ay8A/mXc49OaT+t7ycB8Pr9lTNp9ZwLPHLgd4KqB9gWt\nvQj4TGufDPzOwDTLgU/T7bo6DVjY7v8YsFdr/+E06rwSWNDavzvb5U6wXpPNZ7Lx+S/A8oHbhwD/\no7UP2DJtu/2R9nsP4DdH/fz3p9xC0DY2VfsPBa6jewf4JboX8ZfSvQAsGzfNNVX1Y7bd/1xVtam1\nvwGMATdPsMzHj3vsh8Dj2nQzcdqWaarqwSSbkxxUVffMcD4AGwfmcwfdO9uhu5mqqpL8aKC9Z2uv\nT3JGO1C7mO4FdtDnq+p+urDd4mPAGUm+BnxvGnV+FnhWkruBqx/Ccoet12Tzmfb4AKcCeyd5Wbt9\n28Bjn0jyPuC9VXXRFOuqeeAxBE1kIbA5yV50uyO+VFUX070Lnon96HYLTKTodhUNWjDDZczlfMZb\nCGye6URtN8w/AP9Et/tnOuP2IbozsJ4N/J9p9n8JcGJVXfMQlrudGcxnqvHZDHyvqj7Yfs5u898L\n+CDwB8Bzk7xxNnVqbhkImsjjgW+236ur6uYk+wNM53MESR6eZA+6d4ifm6Trd9n2rKMj6XZDjZ/f\n0VMs8mrghNZ3Id3ukId0NlCr/6CqWjOLyf8dXYiuBaY1bu2d+2rgkQNbWJP1vwl4NNu+IM94ubOt\nf5rj82XgGQPTPL81DwF+u6r+rar+Bjh+FjVqjrnLSIPWJTmL7p/1wqr6aZLvAYuT/DndbqED6A5k\nfjTJS4EnJTm62oHCAc+i29XwJ1W1AbqzkujeAT8qyUer6t6quj/J37cD1wuA86pq48B8rkvyd8BV\nwPhl/FxV/SjJp5P8J+BgYOWWx5I8G3hmkpO3vJOewgNtV8njgLcOzOdA4JeAtUm+VFUbk7wQODHJ\nYW3cnp7ksXQvhL+WZCVwO10wnkwXji9t/ZYNeTH9ON3WznR9Chg82D7j5Q5brynmM9H4LKN78d8E\n/BVAdQet35/k3XS7iy4fqPWEJK+me5780wzWWT3ZcgBRmjNJLqyqM0ddx84kydOBhwFHAOeX/5ga\nAXcZaU4leTQwluTXR13LTmZ/4GXAnYaBRsUtBEkS4BaCJKkxECRJgIEgSWp2qtNOlyxZUsuXLx91\nGZK0U7nmmmvuqqqlU/XbqQJh+fLlrFq1atRlSNJOJclUF3QE3GUkSWoMBEkSYCBIkhoDQZIEGAiS\npMZAkCQBBoIkqTEQJEnATvbBtB3B2WefzZo1a1i2bBnnnnvuqMsZKcdC2rUYCDO0Zs0aVq9ePeoy\ndgiOhbRr2WUC4eQ3Xzwvy1l013oWAD+8a/28LPOad7xqxtP88K3z8/W0D6x7OLCQB9bdMi/LPHzl\ndl+1LGkOeQxBkgTsQlsI82XzXvtv81uSdhUGwgxtOPb0UZeww1iyz2bggfZb0s7OQNCsvemEe0Zd\ngqQ55DEESRJgIEiSGgNBkgQYCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEmAgSJIaA0GSBPR8LaMk\nZwIbgT2r6qIhjy8H/hdwJ/BvVXVWn/VIffHb47Qr6C0QkiwGDqmqc5KcnWRJVd01pOtbq+qzfdUh\nzQe/PU67gj63EMaAG1r7euA04Ioh/Z6S5FhgdVX9c4/1aDf0tHc/bV6Ws9c9e7EHe3DrPbf2vswv\nvuGLvc5fu68+jyEsATa09vp2e7y7gSur6gLgRUmWje+QZEWSVUlWrV27tr9qJWk312cgrAf2be39\n2u1tVNVPqur/tptfBx47pM/5VTVWVWNLly7trVhJ2t31GQhXA49p7eOAr4zvkOQ3kry63TwauKnH\neqTe1H7F5v03U/vVqEuRZq23QKiqO4F17Uyj+4Dbk6xMctBAt08CByd5BfCDqrq1r3qkPm162iY2\n/uJGNj1t06hLkWat19NOq+q8Le0ki4AVwOXAPe3xO4C391mDJGl65u07latqPXDYfC1PkjQzflJZ\nkgQYCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEmAgSJIaA0GSBBgIkqTGQJAkAQaCJKkxECRJgIEg\nSWoMBEkSYCBIkhoDQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQYCJKkxkCQ\nJAEGgiSpMRAkSUDPgZDkzCS/nuQ3p+h3WpJL+qxFkjS53gIhyWLgkKq6BDg4yZIJ+u0NHN9nLZKk\nqfX5IjwG3NDa1wOnTdDvFcAHJppJkhVJViVZtXbt2jkuUZK0RZ+BsATY0Nrr2+1tJDkeuLGqNox/\nbIuqOr+qxqpqbOnSpf1UKkliYY/zXg/s29r7tdvjPRvYN8mpwOOSvLiqPtpjTZKkCfQZCFcDZ7X2\nccCl4ztU1X/f0k5yomEgSaPT2y6jqroTWJfkTOA+4PYkK5McNL5vkl8DTkjymL7qkSRNrs8tBKrq\nvC3tJIuAFcDlwD3j+l0GXNZnLZKkyfUaCIOqaj1w2HwtT5I0M577L0kCDARJUmMgSJIAA0GS1BgI\nkiTAQJAkNQaCJAkwECRJjYEgSQIMBElSYyBIkgADQZLUGAiSJMBAkCQ1BoIkCTAQJEmNgSBJAgwE\nSVJjIEiSAANBktQYCJIkwECQJDUGgiQJMBAkSc20AyHJgiRHt/bD+ytJkjQKM9lCeBPwS629OMlL\ne6hHkjQiMwmEbwPfB6iqG4GDe6lIkjQSC2fQdx/geUlOAE4Eru2nJEnSKEw7EKrqI0n+FTgCuLiq\n7pxqmiRnAhuBPavqoiGPP5xuV9Q3gVOAs6vqgenWJEmaO9PaZZRkUZLDgb2A24F9krxsimkWA4dU\n1SXAwUmWDOn2IHBVVV0G7A0cNKPqJUlzZrpbCL8MLAI2tNsLgCcm+VBVbZ5gmjHghta+HjgNuGKw\nQ1X9JMkNSf4G+EZV3TWj6iVJc2ZagVBV/zj+viRnTBIGAEuAe1t7PXD4BPO+DfijJG9NckRV3TJu\nOSuAFQCHHz50FpKkOTCtQEhyKvAfgGp3FVu3FiayHti3tfdrt8fPd39gUVWtoTtIfSqwTSBU1fnA\n+QBjY2M1fh6SpLkx3V1GG4F3VNV9M5j31cBZrX0ccOmQPv8RWAq8C1jeppEkjcC0DipX1bUzDAPa\nWUjr2plG9wG3J1mZZPDA8eXAw9oB6gOq6kszWYYkae7M5HMI2xi2v3+8qjpvoP8iumMBlwP3tMd/\nAvzFbGuQJM2dCQMhyQLgY8CwM39CdxbR8dNdUFWtBw6baYGSpPkxYSBU1YNJ/ryqvj7s8SS/0F9Z\nkqT5NukxhInCoD123dyXI0kalVl/H0KSZ81lIZKk0Zr2QeUkLwKeBBxA94GzQ4HP9FSXJGmezWQL\nYVFV/QXwpfb7az3VJEkagZkEwvFJXgUcmuTlwFN7qkmSNAIz+RzCd4D/Tfchs+cB5/RSkSRpJGYS\nCEfRXc9oM/D1qT6UJknaucwkEN7WPptwJHBOkrur6vV9FSZJml8zCYSPJ1lD9x0HK9v3KkuSdhEz\nCYSL2zebSZJ2QdM+y8gwkKRd26w/qSxJ2rUYCJIkwECQJDUGgiQJMBAkSY2BIEkCDARJUmMgSJIA\nA0GS1BgIkiTAQJAkNQaCJAkwECRJjYEgSQIMBElSYyBIkoCZfWPajCU5E9gI7FlVFw15fA/gzcAP\ngDHgT6tqY581SZKG620LIcli4JCqugQ4OMmSId1Oan0uA35EFwqSpBHoc5fRGHBDa18PnDakzzeA\nd7T2scB3e6xHkjSJPgNhCbChtde329uoqgeq6rYkTwW+WlXrxvdJsiLJqiSr1q5d22O5krR76zMQ\n1gP7tvZ+7fZ2khwEPGXYMQaAqjq/qsaqamzp0qX9VCpJ6jUQrgYe09rHAV+ZoN8rgfcAJHl6j/VI\nkibRWyBU1Z3Aunam0X3A7UlWti0CAJKcDjwfeF+SK4Fj+qpHkjS5Xk87rarztrSTLAJWAJcD97TH\nrwKu6rMGSdL09BoIg6pqPXDYfC1PkjQzflJZkgQYCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEmAg\nSJIaA0GSBBgIkqTGQJAkAQaCJKmZt4vbSdo9nH322axZs4Zly5Zx7rnnjroczYCBIGlOrVmzhtWr\nV4+6DM2CgSDtJj73758xL8v56cIFkPDT227rfZnP+Pznep3/7sZjCJIkwC0ESXPsoKptfmvnYSBI\nmlOveHDzqEvQLLnLSJIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQYCJKkZuSB\nkOSUJH816jokaXfX67WMkpwJbAT2rKqLJuj2NeDP+qxDkjS13rYQkiwGDqmqS4CDkywZ1q+qNgMb\n+qpDkjQ9fe4yGgNuaO3rgdNmM5MkK5KsSrJq7dq1c1acJGlbfQbCEra+81/fbs9YVZ1fVWNVNbZ0\n6dI5K06StK0+A2E9sG9r79duS5J2UH0GwtXAY1r7OOArPS5LkvQQ9RYIVXUnsK6daXQfcHuSlUkO\nGuyX5GTgyUme21ctkqSp9XraaVWdt6WdZBGwArgcuGegzzXA0X3WIUma2rx9p3JVrQcOm6/lSZJm\nZuSfVJYk7RgMBEkSYCBIkhoDQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQY\nCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEmAgSJIaA0GSBBgIkqTGQJAkAQaCJKkxECRJgIEgSWoM\nBEkSYCBIkpqFoy5Akubbe954xahLmHOvf9cLH/I8eg2EJGcCG4E9q+qi2faRJPWvt11GSRYDh1TV\nJcDBSZbMpo8kaX70eQxhDLihta8HTptlH0nSPEhV9TPj5OXAvVX1iSTPAQ6vqn+YRZ8VwIp287HA\n93opeGaWAHeNuogdhGOxlWOxlWOx1Y4wFkdU1dKpOvV5DGE9sG9r79duz7hPVZ0PnN9HgbOVZFVV\njY26jh2BY7GVY7GVY7HVzjQWfe4yuhp4TGsfB3xlln0kSfOgt0CoqjuBde0sovuA25OsTHLQRH2q\n6ra+6pEkTa7X006r6rwt7SSL6I4FXA7cM6zPTmSH2oU1Yo7FVo7FVo7FVjvNWPR2UFmStHPx0hXS\nHEni/5N2aj6BpTmQ5LnAn426DumhMBCkOVBVn2SC/6ckq+a5nHkx3fUa3y/JwiQv7qeqnVuSz7Tj\nrSNhIEj9e/qoC+jJdNdrfL83AQfMcS07rCR7zmB34vOqathntuaFVzsdkOTtwN3AcuBnwAeAx9Od\nFXVsVb0rySvpLrnxfeBhVfXXSRYCbwFuAp5eVa8bRf2zleRi4ALgj4E3Aq+jW5fbgEOr6r8NG5uq\nWpXkVexC45PkGcBr6D4jc0hV/UmSlwD3A08A3gX8T8aNV1W9AXhikt8GjqmqP2rzezTdeP7xwDK2\nmV9VbZqv9ZuNJC8DXgWcQbdb7LvAv7L9er0ZuBV4QVW9st23zfon2R9YB5yU5Maq+sI8rspQSX6L\n7u9xAvBW4LVs+9wf9pzYbkyq6tIhz5XNwN8DX01yKnBlVX0kye/S/T89F3hLVd2V5BHAnwO/N1Db\nWXQf2D0C+Fu6qzWsBD5P97+4sqp+Oldj4RbCtr4HfJjuCftu4AXAMbSrsbaL8X0B+E5VvQfYq023\nH93H0z8IXDbfRc+By4AC7qVb99uATVX1YeCBJCez/dg8Ickp7GLjU1WfA1a3+m9O8ijgWcAmYAPd\nP+H48fp4m/ybVXUBcFuSp7b53QocsmX+E8xvh1ZVHwTuaMH1raq6dPx6NccCHwPeNzDtNv2qagNw\nFXDtDhIGjwQeX1WXAt8GHse45/6Q58SyYWMy7G9bVQ8CX2yLez3wz639uNZ+L12AUFU/Bg4cV9sx\nVXUZ8B3gjKr6NnBTVf0d3Tg+cS7Hw0DYXgEP0CX7z4DrqurKqvrrqrq79flZ+70HQFXdS/eu8Vy6\nF76dzdXAqXQv+q+hC4Rb2mM/pPtHh23HJsCR7Jrjs6X+TXTvzH7Q1vHdVfV9th+va8dNfwtw+MDt\nwXO7h81vZ3BDkqPo/vZbjD9n/Ry6d6/Hjbt/Rz63/Si6rRqq6v10V04Y9twffE7s09rjx2Syv+0N\nVXV/Vd3Xbr8N+H26LYT7BvoNjtVRwOpp1jInDITJbaLb/UGSJydZMKxTktOADVX1JuD5g5/G3hlU\n1VrgdLoX7WfQ7e45tD18BHDjBJN+n11/fAo4ESDJMUmWjB+v9s5u0FF0u8eGuXn8/Pope85dBvwl\n8PVhDyY5jO4Can8KPCrJL0wyrwL2SLJ3ksx9qTPyA+Bo6A52Az9ies992H5MZvK3Pb2q3gbcATx/\ngj63AMumWcucMBC2dRxwEvAU4GS6d7MPJnktcHDb/HsKcGqSvYAT226TvYGXJ/kV4E7gJyOp/qH5\nYlX9EPhkVV0NHJDkDGCPqvoa24/NY6vqGnax8UnyFLq69wFOodulc22S3wfGqmrLVSt/Pl4Dkx+S\n5JeBfdsYkmQZcHySYwCq6o4J5rdDq6obgHuq6mbYfr3ojke+uD1n9qF7cRzWD2AN3a6Vs+ar/olU\n1Rrgxvb3OBP4MuOe+0OeE6e0abcZk0n+tk9tP4Oe35ZxLG0LM8mBwLFJxtr8bgdWt/+b44CPJTka\nOK3tnv15LXPFTypLkgC3ECRJjYEgSQIMBElSYyBIkgADQZLUGAhSjya6hk07513aoRgIUk+SvBp4\n5ZD7T6K7xIO0QzEQpFmaxuWfP013iY9tVNW1wPhPN0sjZyBIU2ifuh5mV72stXZT7sfUbmvIJYxv\norvc+XXAvVV1efuykvcnuRB4BXBuVX11yGWd96a7dPLPp22LeVqSfYHFVXXOJLXsVJfE1q7JLQTt\ntsZfwhj4KPD/quofgSe1PuvpLl62nu5aN9e2+8df/nmv8dM2X6yq9wKLkxzKEDvjJbG1a3ILQbu7\nwUsYbwAOTPKrDFyXfku/Id9kNXghsMmmhe4Sy49m6+WMB/38ssnAlbNYB2lOuIWg3d3gJYyfB9xV\nVR9h5ldknWra5XSXWh5mZ70ktnYxBoJ2a+MuYfx94PQkK4DDkjynXfL4JMZdvnjIZZ23m7bdf0z7\nQvmb26WWSXI88OQkR7YadspLYmvX4+WvJUmAWwiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiS\nmv8PhzJu67dfEpUAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1104ebb00>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.barplot(data=df_binary_melt, x=\"variable\", y=\"value\")\n",
"plt.title(\"barplot of binary variables\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"categorical_columns = df.describe(include=\"O\").columns"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>history_segment</th>\n",
" <th>zip_code</th>\n",
" <th>channel</th>\n",
" <th>segment</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1) $0 - $100</th>\n",
" <td>0.358906</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2) $100 - $200</th>\n",
" <td>0.222719</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3) $200 - $350</th>\n",
" <td>0.192016</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4) $350 - $500</th>\n",
" <td>0.100141</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5) $500 - $750</th>\n",
" <td>0.076734</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6) $750 - $1,000</th>\n",
" <td>0.029047</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7) $1,000 +</th>\n",
" <td>0.020438</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Mens E-Mail</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.332922</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Multichannel</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.121281</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>No E-Mail</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.332906</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Phone</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.437828</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Rural</th>\n",
" <td>NaN</td>\n",
" <td>0.149422</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Surburban</th>\n",
" <td>NaN</td>\n",
" <td>0.449625</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Urban</th>\n",
" <td>NaN</td>\n",
" <td>0.400953</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Web</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.440891</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Womens E-Mail</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0.334172</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" history_segment zip_code channel segment\n",
"1) $0 - $100 0.358906 NaN NaN NaN\n",
"2) $100 - $200 0.222719 NaN NaN NaN\n",
"3) $200 - $350 0.192016 NaN NaN NaN\n",
"4) $350 - $500 0.100141 NaN NaN NaN\n",
"5) $500 - $750 0.076734 NaN NaN NaN\n",
"6) $750 - $1,000 0.029047 NaN NaN NaN\n",
"7) $1,000 + 0.020438 NaN NaN NaN\n",
"Mens E-Mail NaN NaN NaN 0.332922\n",
"Multichannel NaN NaN 0.121281 NaN\n",
"No E-Mail NaN NaN NaN 0.332906\n",
"Phone NaN NaN 0.437828 NaN\n",
"Rural NaN 0.149422 NaN NaN\n",
"Surburban NaN 0.449625 NaN NaN\n",
"Urban NaN 0.400953 NaN NaN\n",
"Web NaN NaN 0.440891 NaN\n",
"Womens E-Mail NaN NaN NaN 0.334172"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[categorical_columns].apply(pd.Series.value_counts, normalize=\"index\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Preprocess data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"create data for ML"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# Exclude rows whose segment is 'No E-mail'\n",
"mailed_df = df.query(\"segment != 'No E-Mail'\").reset_index(drop=True).copy()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(42694, 12)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mailed_df.shape"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# create dummy variables for all data (note that we ignore the problem of unknown category in a test set)\n",
"categorical_columns = [\"zip_code\", \"channel\"]\n",
"dummies = pd.get_dummies(mailed_df[categorical_columns], drop_first=True)\n",
"\n",
"# extract and merge feature \n",
"numerical_columns = ['recency', 'history', 'mens', 'womens', 'newbie']\n",
"X = pd.concat([mailed_df[numerical_columns], dummies], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>recency</th>\n",
" <th>history</th>\n",
" <th>mens</th>\n",
" <th>womens</th>\n",
" <th>newbie</th>\n",
" <th>zip_code_Surburban</th>\n",
" <th>zip_code_Urban</th>\n",
" <th>channel_Phone</th>\n",
" <th>channel_Web</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>142.44</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>7</td>\n",
" <td>180.65</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9</td>\n",
" <td>675.83</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>45.34</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6</td>\n",
" <td>134.83</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" recency history mens womens newbie zip_code_Surburban zip_code_Urban \\\n",
"0 10 142.44 1 0 0 1 0 \n",
"1 7 180.65 0 1 1 1 0 \n",
"2 9 675.83 1 0 1 0 0 \n",
"3 2 45.34 1 0 0 0 1 \n",
"4 6 134.83 0 1 0 1 0 \n",
"\n",
" channel_Phone channel_Web \n",
"0 1 0 \n",
"1 0 1 \n",
"2 0 1 \n",
"3 0 1 \n",
"4 1 0 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X.head()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# set treatment: Mens: 1, Women: 0\n",
"w = np.array(mailed_df.segment == \"Mens E-Mail\").astype(int)\n",
"y = np.array(mailed_df.visit == 1).astype(int)\n",
"\n",
"# train-test splot\n",
"X_train, X_test, w_train, w_test, y_train, y_test = train_test_split(X, w, y, test_size=0.5, random_state=42)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Train models and get predictions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We focus on the two model approach for simplicity"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"training"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, l1_ratio=None, max_iter=1000,\n",
" multi_class='warn', n_jobs=None, penalty='l2',\n",
" random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n",
" warm_start=False)"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_treat = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"lr_treat.fit(X_train[w_train == 1], y_train[w_train == 1])\n",
"lr_control = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"lr_control.fit(X_train[w_train == 0], y_train[w_train == 0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"prediction"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"proba_treat, proba_control = lr_treat.predict_proba(X_test)[:, 1], lr_control.predict_proba(X_test)[:, 1]\n",
"two_model_uplift_ratio = proba_treat / proba_control\n",
"two_model_uplift_diff = proba_treat - proba_control"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11a490cc0>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEJCAYAAAB11IfBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFCNJREFUeJzt3X+0ZXVZx/H3AzPiAPJD7w0cF3ALGQbSVuEFhKjIXKSi\n1sqWomINZFOa/dBCUUqBlYHLWkWZ0og/0OUkZa4USVIrylKYhhGjVIhwjMl0BgfxMjRMxNMf53v1\nzOXee77n3nPuuTPf92uts2bv5+yz97P37POZPXvvc05kJpKk/dsBo25AkjR8hr0kNcCwl6QGGPaS\n1ADDXpIaYNiL6Dh81H3sSyLi0CVazg9FxC/V1vdHEXHgUm3v/ZlhL4DLgVcvdiYR8d0R8fqIuCoi\nzuxVH7aIuCAi3juE+f4w8OeDnu8cbgF+tKYeEZdFxKW1M46I90bEBYtrb7giYgXwTuCnR93Lvs6w\nF8C7BjSfVwB/AnwSOKii3peIeFZETPTxko/Q+YdsUSLiF7vHM/MfgK8vdr41MnMP8EBlfUN57GVm\n/11+G/jLxfY4TJn5MPC+UfexPzDs90ER8ZSI+JUy/N0RccmoeyrGM3NnZn4sM/+uol4tIp4IvLnP\nl90HfGPGfKLP5a4BLu5zuaPydWCquxARpwO/MMf09wC7h92UlocVo25AHRFxDPAa4EvAsZl5Samv\nA54ArAT+NjM3AV8ALgP+ENgKTHbN50zgGcC9wI9k5otL/dnAqcA3gbsz82ML7HMt8HN0guKBzHx3\nqb8AOD4izgfuLH3OV59rPocDbwLuAE4ALsnMh4CTgK8APxkRd2TmxyvavYJOmF1a5v19wBUR8XFg\nHPhmZv5+j3mcCPxn6f8rmfnpUj8kIi4CHg98ITPfX5ZxFvDjdI66/63Xdi7z2AV8F/C+zLy71F8A\nPA24Gzi8a/q56o8F3gH8PfDerkV8DzBV+v9CZm4p0z8BuBb4XeCmUnslndN55wAB/Cnwa5n52Yj4\nqbItHgvcMP33OM96XQgcTCdjvisz31Dq/ezn882/r+0sIDN9LIMHsBE4ugx/CnhcGf4I8CQ6/wu7\numv6984x/IfA6jJ8QVf97cCpZXjDjGVPAJdW9nkdcEgZfj9w5Gx9zHjNo+pzzQd4K3BKV/3Ertdc\nCkz0sU0ftV7AXwCHleFrKuczW/8fA1bMnA/wUSC6hg/oMe/P0gm4JwBXlNpBdAJveppr56t3jZ8N\nrKvpv9TXAWfPqN0IHFiGX1H+fCzwoTJ8APDRim32513D3fthX/v5XOvV73b2kR7ZLyMTmfk1gMx8\nZlf9p4CfBA6lcxTZy1XAH0TEDXTCkjLPV5Zz3hfSeVMt1EnA88rZkHvohNR9A5zPmZl5Uen5ZYvo\ncy5TmfmtMryY/f/e7JxP/vZ8IuLxwNHAi8p63Q08Drh/nvmcDbwQOLC8Fjrb5ktd02SP+iDdBPxo\nRNwHTB9dnwysiojzyvg9FfN5T0R8AHhXZr6nq77o/XyB27l5hv3yMdcb933A72XmloiY7a6Mme7N\nzBdGxI8BGyPiZZn5UET8PnBjZr673E2yUP+TmR8swx+cd8qlmc9y8ghwX+16RcRj6Jwq+fXM/HJE\nPKM8dSDw8Cwvmas+SH8GvA7YlJnTF+4fAbb1+ff1T3SO3H8mIp6Vma8t9UHs531tZ3V4gXb52B4R\nxwFExJMj4piIOILOKYct5Ra0g7ruN36k67Xd98j/VkREZv4N8I90jsqgcwrnr8vwIYu4b3lbRHxP\n6fOHIuJxA57Ploj4wVI/IiJ+oOs1DwMrIuKoiDhkgctdiIcjYkW5GD7nBd7M/Cadv6PDoXOdpMcF\n4ZOB/ypBf0h5zaF0rlc8tYwfQOc0CvPUq0TE8b2myc41g2PYe//6InByRKws83lOxeLelJl7MvMa\nOtcjpvW7n8/WY7/bWRj2y8lrgEsj4vV0LqzeU3bqr0XE5cCvAv8HTP9X+kMRcVFEvBB4TLmABp03\n6asj4uV0To3cXuqfjojfiYjX0blI+6quZZ9H57/uT6zo89XAG0ufT8zMKei8cYHTIuKl3RPPVZ9r\nPnTOy18QEW8Afhb4fNdrbqJzR875mbmrotfzgB+JiNWllxOBsyLi9Ih4EnBKRDy3Yj6fBK6hc347\nyx0uZ0XE2nKh+ayIOLVM+6vAVWU7P5LlpPIc7gCOjIg3ARcAhwHnZOYDwDUR8UfArwEnRMRJc9XL\nuq2kcyrk2SU8u/1rRPwx8JTpQgnKZwEvKP/D6PY3wJbpkexcIL8MeHtEvBbYWbHNjouI9RHxKjrX\nJab1tZ9HxIF07rF/XkQc1jWffraz+M4FDu3DIuIgYI87/P4pIlZ0XR/oWZdmY9hLUgM8jSNJDTDs\nJakBhr0kNcCwl6QGGPaS1IBl8wnasbGxnJiYGHUbkrRPufXWW+/NzPFe0y2bsJ+YmGDz5s2jbkOS\n9ikR8ZWa6TyNI0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWpA1Yeqyq/5jANnAG8A\nngvsAVZm5rVlmnU1NUnS0usZ9uXnzr43M98SETfT+dHj1Zn5OxHx2ogYo/MzYj1rmXnvUNdG+7WJ\ni28Y2bK3XnnuyJYtDULNkf3pwMqI+Bk6R+nfAO4qz91J52h/d2Xt+sG0LUnqR805+9XANzPzfcCJ\nwNOB6R97ngLGyqOmtpfyg8SbI2Lzjh07FrwSkqT51YT9/wLTp18+B/wnsKqMH0wnyKcqa3vJzA2Z\nOZmZk+PjPb+0TZK0QDVhvwU4pQwfB3wJWFPG1wI3A5sqa5KkEeh5zj4zvxIRX42IFwOHZOYtEfED\n5U6bBzNzG0BE7KypSZKWXtWtl5n5BzPGr55lmqqaJGnp+aEqSWqAYS9JDTDsJakBhr0kNcCwl6QG\nGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBh\nL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDVjRa4KImADeDWwHHsjMl0fE\nq4CdwO7M/HCZrqomSVp6tUf2l2fmeSXoTwIezMyNwGRErKitDWkdJEk91AbwaRFxAvBfwJOAz5f6\nduAk4OmVtdsH0LMkqU81R/b3ATdm5juB5wNjwK7y3FQZr63tJSLWR8TmiNi8Y8eOBa+EJGl+PcM+\nM+/PzH8po58DHgOsKuMH0wnyqcrazHlvyMzJzJwcHx9f8EpIkubXM+wj4qURcWEZPR64CTi5jB9D\n59TMZyprkqQRqDmN8yngqIg4H9iamX9fxi8Abs/MhzJzS01taGshSZpXzwu0mfl14IoZtbfOMl1V\nTZK09PxQlSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QG+IMikh5l\n4uIbRrbsrVeeO7Jl7888spekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY\n9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakB1d9nHxFnAL+cmS+JiHXAHmBlZl5bnq+qSZKWXtWR\nfUQcBDwVOCAijgRWZ+ZG4KiIGKutDWslJEnzqz2Ncz7wgTI8CdxVhu8EzuijJkkagZ5hHxFPBf4j\nM3eV0hgwPTxVxmtrkqQRqDln/wxgVUQ8HTgJ+CtgVXnuYDpBvruytpeIWA+sBzj22GMXtgaSpJ56\nHtln5lWZeWVmXgl8EbgRWFOeXgvcDGyqrM2c94bMnMzMyfHx8UWtiCRpbv3cjfMi4PuAI4Cd5U6b\nBzNzW3m+qiZJWnrVYZ+Z1wHXldE7Z3n+6pqaJGnp+aEqSWqAYS9JDTDsJakBhr0kNaD6Aq2kpTdx\n8Q2jbkH7CY/sJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJek\nBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhqwotcEEfF44DeA\nzwOnA68Fzgf2ACsz89oy3bqamiRp6dUc2f8f8InMvA44CDgSWJ2ZG4GjImIsIqpqw1oJSdL8eh7Z\nZ+b9EXFXRLwFuA34fuCu8vSdwBnA7sra9YNrXZJUq+qcfWZuy8zXAccAq4Fd5akpYKw8amqSpBHo\nGfYRcUhEHF1Gt5Q/V5U/D6YT5FOVtZnzXh8RmyNi844dOxa2BpKknmqO7F8AvLQMTwBfBtaU8bXA\nzcCmytpeMnNDZk5m5uT4+PhC+pckVagJ+48Ah0bEecBhmfkPwM5yp82D5RTP9pracFZBktRL1QVa\n4LIZtatnma6qJklaen6oSpIaYNhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBvS8z16aaeLiG0bd\ngqQ+eWQvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCX\npAYY9pLUAMNekhrgVxxLWlZG9RXaW688dyTLXSoe2UtSAwx7SWqAYS9JDeh5zj4iDgAuArYCk8Al\nwEuAPcDKzLy2TLeupiZJWno1R/anAKsz8zrgq8CpZXwjcFREjEXEkTW1Ya2EJGl+NXfj3AZ8rQyf\nQCfw7yrjdwJnALsra9cvvmVJUr96Htln5sOZuS0izgRuKa/ZVZ6eAsbKo6YmSRqBqgu0EXEEcFo5\n7z4FrCpPHVzGa2sz57s+IjZHxOYdO3YseCUkSfOrvRvnZcDbyvC3gDVleC1wM7CpsraXzNyQmZOZ\nOTk+Pt5/95KkKjV345wDPAd4WkQcDXwQ2FnutHkwM7eV6apqkqSl1zPsM/MTwCcqpru6piZJWnp+\nqEqSGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAH+DVqowqt9FlQbFI3tJaoBhL0kN\nMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QGGPaS1ADD\nXpIaYNhLUgOqwj4iTo+INw+7GUnScNT+UtU/A785PRIR64A9wMrMvLafmiRp6VUd2WfmI8AugIg4\nElidmRuBoyJirLY2pHWQJPWwkN+gnQTuKsN3AmcAuytr1y+4U0nSgi3kAu0Y5SgfmCrjtTVJ0ggs\nJOyngFVl+OAyXlvbS0Ssj4jNEbF5x44dC2hFklRjIWG/CVhThtcCN/dR20tmbsjMycycHB8fX0Ar\nkqQatbdePg04NSKemZnbgZ3lTpsHM3NbbW04qyBJ6qXqAm1m3goc3zV+9SzTVNUkSUvPT9BKUgMM\ne0lqgGEvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCX\npAYY9pLUAMNekhpg2EtSAwx7SWpA1c8SStL+buLiG0a27K1Xnjv0ZXhkL0kNMOwlqQGGvSQ1wLCX\npAYY9pLUAMNekhpg2EtSA4Z+n31ErAP2ACsz89phL0+S9GhDPbKPiCOB1Zm5ETgqIsaGuTxJ0uyG\nfWQ/CdxVhu8EzgCuH/IymzDKT/tJ2vcM+5z9GLCrDE+VcUnSEhv2kf0UsKoMH1zGvy0i1gPry+gD\nEXHHIpc3Bty7yHkMmz0Ohj0Ohj0OxqJ6jLcsatnH1Uw07LDfBLy8DK8F/rT7yczcAGwY1MIiYnNm\nTg5qfsNgj4Nhj4Nhj4OxL/Q41NM4mbkd2FnuyHkwM7cNc3mSpNkN/dbLzLx62MuQJM1vf/tQ1cBO\nCQ2RPQ6GPQ6GPQ7Gsu8xMnPUPUiShmx/O7KXJM3CsJekBYqI0yPizaPuo8Y+cRqn9vt1Zk4XEWcD\nVwB3AIcCN2TmeyLiFuDLQAIXZub/jLDHCeDdwHbggcx8eZnuVcBOYHdmfnix/Q2gzwOAi4CtdD4Z\nfQmwerbeh9nbbNPU1gZhIT0uxbYbQI8Ts/Uzyv1wlO/nPno8APhIZj5vvtcth+8IW/ZH9rXfrzPP\ndD+RmeuADwEfKLV3ZOZ5mfniAQX9Ynu8vPQz/QY7ic6tqhuByYgYyF1Ti+zzlFK7DvgqndB6VO/D\n7G22aWpri+ltsT0y5G03oB4f1c8o98NRvp9rewTIzEf4zrcEVO+jg+ixX8s+7Jn9+3Vqp7s5M7dH\nxIHA4Zm5pzx/ckT8XES8eBn0CHBaRPx8RDynjJ8F/GsZ3g6ctAz6vA14a6mdAHypDM/sfZi9zTZN\nbW0QFtrjsLfdIHqcrZ9R7oejfD/X9lj7umHtj33ZF8K+9vt1HjVdZu4u488GPts17fWZ+S7gyRHx\ntFH2CNwH3JiZ7wSeHxFH9zG/JeszMx/OzG0RcSZwS2bunKP3YfY22zS1tUFYUI9LsO0W3eMc/Sy3\n7bhU7+faHmtftyy+I2zZhX1E/HRE3DT9AJ7APN+v02W+7+H5cb5zhEJmfroMbgKeMsoeM/P+zPyX\nUvsccGKPdRlJn2V+RwCnTZ9znKP3hapZ59mmqa0NwkJ7HPa2W3SPw9wPB9Vj13MDfT8vosfa1w1r\nO/Zl2YV9Zn4oM8+efgB/BqwpT68Fbp7jpZvmme6Ycm6NiPjBiLi81NcA/z7KHiPipRFxYakdD9wN\nfAY4ebp34PZ+exx0n2X4ZcDbACLirDl6X6j5/v7mm6a2NggL7RGGu+0W3eMw98NB9dj13EDfz4vo\nsfZ1w9of+7Lswn6m2b5fJyIOjIg3lqOlOafrms2uruHbgN3l/N4hmfmZEff4KToXbc4HtmbmPZm5\npdQuAG7PzIcW2+Ni+4yIc4DnANdExI3Ak2frfVC9Af9d01dtbaF9DaLHYW+7QfQ4Wz9LtR/20eO0\nob6fa3sEKKeNTo2IZ87V97D2x37tE7dezhQRjwO+CJybmZ8fdT+z2Rd6hOXb53Ltq5s9DoY9Lo19\nMuwlSf1Z9qdxJEmLZ9hLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBvw/kB8Ho7HZb/AAAAAASUVO\nRK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11a3c3a58>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(two_model_uplift_diff)\n",
"plt.title(\"causal effect in the additive scale\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11a232c18>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEJCAYAAAB11IfBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE8tJREFUeJzt3X+0pVV93/H3BwYIg/JD5wYclYxRcVChDVx+Fisal0nF\nNlm6qohQB2tI2ibN0hQltTXqiool1mKzEjKxRkyD0FjXMkpCNT9M0hUJjqi1VWEhYh2tMjiIAwQI\n8O0fZ0+48+ue59655565d79fa91197PPc/az93PO/Zx9nuc556aqkCStbgdNuwOSpMkz7CWpA4a9\nJHXAsJekDhj2ktQBw34Fy8hR0+7HSpLkcVPc9qFJDp9g+0ckOWRS7a90k97/BzrDfmV7O/D6/W0k\nydOS/HKSK5OcPa5+0pJcnOSDE2j3HwK/v9TtDtz2UcBHgTMWcJ8/TfLjA9d9MvAnwJP3p53FmHT7\nS2Ex+3+1MexXtv+yRO38C+C3gE8Bhw2oX5AkP5lkwwLu8jFGL2T7JcnPzV2uqr8Avru/7S5GVd0D\nfGRvt+3ezzl+AfjMwPa/Bdywv+3MZyn6OS3z7f9eGPbLKMlzk/zrVn5akjdPu0/NTFVtr6pPVNWf\nDagfLMmTgHcs8G53A9/brZ0scLsnAJctcLsLaX+P/iQ5K8mmVj5552M9pp3zgJfv4+ZvAH87brsD\n7NHOQi20nzrwrJl2B1a6JE8F3gB8FTi+qt7c6jcBTwQOAf60qm4Cvgy8DXgfcAcwO6eds4EXAncB\nz6+qV7X6fwScBnwfuL2qPrHIfm4E/jnwTeDeqvpAq3858PQkFwK3tn7OV7+vdo4CfgW4BXgm8Oaq\nehA4kVEY/HSSW6rqjwZ0913AA8BbW9snA+9K8kfADPD9qnrvmDaeBfzf1v9vVNVftvojklwKPAH4\nclX9btvGOcBPAPcC/2e+/Zzkl4GnJTkM+DyjQwNvA7YwOqz2QeB/t/3xvnna+SHgGOCw1s+bqurW\ndtsG4FrgfEbPFZK8APjVJB9p47u2qj49307YWzut/oXAC4DtjPbn77T6dwK3A08Dfq2q7l5EP/8D\ncA7wU8B6Ru9AL6yqr7Z3B4cBTwJ+u6q+Nqb/bwDuA44CHq2qX2v1JwMXtW2uraorWv2lbf0fBj5U\nVbePaf9ljPblDwHX73yer0pV5c9+/ADXAMe18h8Dj2/ljzE6fnoQcNWc9T+4j/L7gPWtfPGc+t8A\nTmvlzbttewPw1oH9vA44opV/Fzhmb/3Y7T571O+rHeAK4JQ59c+ac5+3AhsWsE/3GBfw34EjW/n9\nA9vZW/8/AazZvR3gD4DMKR80T7vnMjrE9ePAzwEvYhRm+3x82/Im4Nwh/dzXfgOuab8PZjSJmHf9\nvdUzmoDc0Mo/DHyilR8P/Fkrnwr87GL62fq2s/21wKZWXg/8VisfuXMsYx7Dj7TfBwGvmVP/h4xe\nNA4CbpxT/5k2vicC75pv/zMK+Lnt/8HQ5+hK/HFmv/82VNV3AKrqRXPqXwb8NPA4RrPIca4E/lOS\n6xmFJa3Nf9mOeb+WvZx8W4ATgX/cjgJ8k9Efw91L2M7ZVXVp6/NF+9HPfdlRVT9o5f153t5VVQ/P\nbSfJE4DjgFe2cd3OKPjumaedvwEeYfQO5OH97NNCPARQVY8k+UGSmaratsA2ngN8rbVzJ/DSVt6R\n5KeSXMxoJv/4xXSw9e3rSZ4BPJdRMAOcyejdwflteeuA5q5P8n7gN6vqaoAkR482Uw/OaXenc4FX\nMHrBOW5M288GDp/Tn28O6M+KZdjvv319k9yHgPdU1c3t7fc4d1XVK9pVDdckuaiqHkzyXkazpA+0\nq0kW62+q6tpWvnbeNZennQPJo8DdK3BcaxkdslgSSZ4IbGb0buUIRjPhxfpvjEL3u+0FBUb7+Zah\n+znJoW2d3wf+VZJzq+o9Y9b/MPBLVfX1dqhqPo8CW1fg474onqDdf3cm+RGAJM9I8tQ28ziyBf0a\nRrOZndd3PzrnvnOvkf/3SVJVfwL8T0azDhgdwvkfrXzEflwnvjXJj7Z+Pi/JomZt87Rzc5J/0OqP\nTvJjc+7zMLAmybFJjljkdhfj4SRr2snwfZ7YrKrvM3qMjoLReZJFngiFXR/fIxdyxyRPH7Da0UkO\nSrIOuKeq7l9Q70a+CpyU5OC23Z2TkecBf9XeKRzRbtvj+Tawn3/O6DDX3BejzwDPn9POS8a0sR74\nmaq6t6reDZwEf/d4PW5n35KcmWQto7+Zb7Wg32f/5/gK8Oy0zyYM6M+KZtjvvzcAb20n7Z5fVd9s\nT8bvJHk78IuM3u7vfKv4kSSXJnkFcGg7QQSjkHh9ktcxOjTypVb/l0nemeRNjE7S/vycbZ8PvCCj\nK17GeT3wltbPJ1XVDhi9QAGnJ3n13JX3Vb+vdhgdt704yb8FXgN8cc59Ps3oipwLq2rITPR84PlJ\n1re+PAs4J8kZGV1PfkqSlw5o51PA+xkdp60kZ7R2NrYTzeckOa2t+4vAlW0/P1rtQO4+nM7o5Pos\no5Pnp7U6GD1eP5vkAuCoduKX9qL4EkaHig7erb1tSf4j8JSdFW3szwMu2G3dR4BXAf8U+Jk56x/H\nKEh3fxz3aKeqHgB+FfjNJG/ksXf4nwFmk7wFOJvR4ZFTF9PPqnqU0XPgU3Pqvgv81yT/ue3neU+e\nNicneW2SX2J0vmWn1wPva+08pb3o3QIck+RXgIsZvdi+uPVzj/3fDgO9DfiNth+2D+jPipX5n9Oa\npIyu5nhoTLBohZrE45vkg1W1aanaUz+c2U9RVT1o0K9eS/34ZnR57rlJTlmqNtUPZ/aS1AFn9pLU\nAcNekjpg2EtSBwx7SerAAfMJ2nXr1tWGDRum3Q1JWlE+97nP3VVVM+PWO2DCfsOGDWzZsmXa3ZCk\nFSXJN4as52EcSeqAYS9JHTDsJakDhr0kdcCwl6QOGPaS1AHDXpI6YNhLUgcMe0nqwAHzCVotzIbL\nrp/atu+4/LypbVvS4jizl6QOGPaS1AHDXpI6YNhLUgcMe0nqgGEvSR0w7CWpA4a9JHXAsJekDhj2\nktQBw16SOmDYS1IHDHtJ6oBhL0kdMOwlqQNjv88+yQbgA8CdwL1V9bokPw9sBx6oqo+29QbVSZKW\n39CZ/dur6vwW9CcC91fVNcBskjVD6yY0BknSGEMD+PQkzwS+BTwZ+GKrvxM4EThzYN2XlqDPkqQF\nGjKzvxu4oap+G/gnwDrgvnbbjrY8tG4XSS5JsiXJlm3bti16EJKk+Y0N+6q6p6r+V1v8PHAocHhb\nXssoyHcMrNu97c1VNVtVszMzM4sehCRpfmPDPsmrk7y2LT4d+DTw7Lb8VEaHZv5qYJ0kaQqGHMb5\nY+DYJBcCd1TVn7fli4EvVdWDVXXzkLqJjUKSNK+xJ2ir6rvAu3aru2Iv6w2qkyQtPz9UJUkdMOwl\nqQOGvSR1wLCXpA4Y9pLUAcNekjpg2EtSBwx7SeqAYS9JHTDsJakDhr0kdcCwl6QOGPaS1AHDXpI6\nYNhLUgcMe0nqgGEvSR0w7CWpA4a9JHXAsJekDhj2ktQBw16SOmDYS1IHDHtJ6oBhL0kdMOwlqQOG\nvSR1wLCXpA4Y9pLUgTVDV0xyFvALVXVBkk3AQ8AhVXV1u31QnSRp+Q2a2Sc5DDgJOCjJMcD6qroG\nODbJuqF1kxqEJGl+Qw/jXAj8XivPAre18q3AWQuokyRNwdiwT3IS8LWquq9VrQN2lne05aF1kqQp\nGHLM/oXA4UnOBE4E/hA4vN22llGQPzCwbhdJLgEuATj++OMXNwJJ0lhjZ/ZVdWVVXV5VlwNfAW4A\nTmg3bwRuBG4aWLd725uraraqZmdmZvZrIJKkfVvI1TivBE4Gjga2tytt7q+qre32QXWSpOU3OOyr\n6jrgurZ4615uv2pInSRp+fmhKknqgGEvSR0w7CWpA4a9JHXAsJekDhj2ktQBw16SOmDYS1IHDHtJ\n6oBhL0kdMOwlqQOGvSR1wLCXpA4Y9pLUAcNekjpg2EtSBwx7SeqAYS9JHTDsJakDg/8HrSQthw2X\nXT+V7d5x+XlT2e5ycWYvSR1wZi9pD9OaXWtynNlLUgcMe0nqgGEvSR0w7CWpA4a9JHXAsJekDhj2\nktQBw16SOjD2Q1VJngD8G+CLwBnAG4ELgYeAQ6rq6rbepiF1kqTlN2Rm/wjwyaq6DjgMOAZYX1XX\nAMcmWZdkUN2kBiFJmt/YmX1V3ZPktiTvBr4A/H3gtnbzrcBZwAMD6z6+dF2XJA016Jh9VW2tqjcB\nTwXWA/e1m3YA69rPkLpdJLkkyZYkW7Zt27boQUiS5jc27JMckeS4tnhz+314+72WUZDvGFi3i6ra\nXFWzVTU7MzOzuBFIksYaMrN/OfDqVt4AfB04oS1vBG4EbhpYJ0magiFh/zHgcUnOB46sqr8Atrcr\nbe5vh3juHFI3mSFIksYZdIIWeNtudVftZb1BdZKk5ec/L9GC+W/jpJXHT9BKUgcMe0nqgGEvSR0w\n7CWpA4a9JHXAsJekDhj2ktQBw16SOmDYS1IHDHtJ6oBhL0kdMOwlqQOGvSR1wLCXpA4Y9pLUAcNe\nkjpg2EtSBwx7SeqAYS9JHTDsJakDhr0kdcCwl6QOGPaS1AHDXpI6YNhLUgcMe0nqgGEvSR0w7CWp\nA2vGrZDkIOBS4A5gFngzcAHwEHBIVV3d1ts0pE6StPyGzOxPAdZX1XXAt4HT2vI1wLFJ1iU5Zkjd\npAYhSZrf2Jk98AXgO638TEaBf1tbvhU4C3hgYN3H97/LkqSFGjuzr6qHq2prkrOBv273ua/dvANY\n136G1EmSpmDQCdokRwOnt+PuO4DD201r2/LQut3bvSTJliRbtm3btuhBSJLmN/RqnIuAX2/lHwAn\ntPJG4EbgpoF1u6iqzVU1W1WzMzMzC++9JGmQIVfjvBh4CXBqkuOAa4Ht7Uqb+6tqa1tvUJ0kafmN\nDfuq+iTwyQHrXTWkTpK0/PxQlSR1wLCXpA4Y9pLUAcNekjpg2EtSBwx7SeqAYS9JHTDsJakDhr0k\ndcCwl6QOGPaS1AHDXpI6YNhLUgeG/FtCzWPDZddPuwuSNJYze0nqgDN76QDmO0ctFWf2ktQBw16S\nOmDYS1IHPGYvSUz3/Mgdl5838W04s5ekDhj2ktQBw16SOmDYS1IHDHtJ6oBhL0kdMOwlqQOGvSR1\nwLCXpA4MCvskZyR5x6Q7I0majKFfl/BZ4N/tXEiyCXgIOKSqrl5InSRp+Q0K+6p6NMl9AEmOAdZX\n1TuTvDHJOuCRIXVVddfERqJVb7V/d4k0SYv5IrRZ4LZWvhU4C3hgYN3HF91TSdKiLeYE7Trgvlbe\n0ZaH1u0iySVJtiTZsm3btkV0RZI0xGLCfgdweCuvbctD63ZRVZuraraqZmdmZhbRFUnSEIsJ+5uA\nE1p5I3DjAuokSVMw9NLLU4HTkryoqu4Etrcrbe6vqq1D6yYzBEnSOEOvxvkc8PQ5y1ftZZ1BdZKk\n5ecnaCWpA4a9JHXAsJekDizmQ1VSd6b56V1pKTizl6QOGPaS1AHDXpI6YNhLUgcMe0nqgGEvSR0w\n7CWpA4a9JHXAsJekDhj2ktQBw16SOmDYS1IHDHtJ6oBhL0kdMOwlqQOGvSR1wLCXpA4Y9pLUAcNe\nkjpg2EtSBwx7SeqAYS9JHTDsJakDhr0kdcCwl6QOrJn0BpJsAh4CDqmqqye9PUnSniY6s09yDLC+\nqq4Bjk2ybpLbkyTt3aQP48wCt7XyrcBZE96eJGkvJn0YZx3wg1beARw/iY1suOz6STQrSavGpMN+\nB3B4K69ty38nySXAJW3x3iS3TLg/MHoBumsZtnMgccyrX2/jhVU05rx78Kp7G/OPDLnjpMP+JuB1\nrbwR+PDcG6tqM7B5wn3YRZItVTW7nNucNse8+vU2XnDMCzXRY/ZVdSewvV2Rc39VbZ3k9iRJezfx\nSy+r6qpJb0OSNL8eP1S1rIeNDhCOefXrbbzgmBckVbWUHZEkHYB6nNlLUncM+1UkyRlJ3jHtfiyn\n3sbc23jBMS+VVR32STYluSDJa/Zx+8FJLk/yqiRvWu7+TcBngZPnW2HcPlmB5h1zkoOSvCnJK5Nc\nkeTQZezbJIx9jAGSnJXkmmXoz3IY8rx+aZKLk2xeJV/LMu55veDsWrVhP/B7eX4M+F5VfRh4JMkT\nl7WTS6yqHgXu29ftq/G7isaNGTiF0ZivA77N6Cs8VqwB4yXJYcBJrJK/7wHP60OA51TV7wDv5bFP\n7a9YAx7nBWfXqngy7MOQ7+X5MnBkkgC3VNX3lqtzU9LjdxV9AbiilZ8JfHWKfVkuFwK/N+1OLKMz\ngEOS/DPg71XVQ9Pu0DJYcHat5rBfx2OvjDva8i6q6n7gPcCTgB4uSxq7T1abqnq4qrYmORv466ra\nPu0+TVKSk4CvVdW8s/9VZj3w/ar6EPCsJM+ddocmbTHZtZrDft7v5QFI8pPAwVX1beDJSU5dxv5N\nw9h9sholORo4vZP/p/BC4MwklwEnJnnZtDu0DP6Wx74v5vPAc6bYl2WxmOxazWF/E3BCK28EbtzL\nOht5LPzuB56yDP2apiH7ZDW6CPh1gCTnTLkvE1VVV1bV5VV1OfCVqvrotPu0DG5mdG4GRl8KdvsU\n+7JcFpxdqzbsd/9eHuD/JXlLm+Xt9CHgkiSvYnRC64bl7+nSaa/upyV5UTtbv8t4V+N3FY0bc5IX\nAy8B3p/kBuAZ0+rrUhg33jnrvRI4OckJe7aysgx4Xn8D+Hb7Oz6iqj47tc4ukQGP84Kzq5tP0CZ5\nPPAV4Lyq+uK0+zNpvY0X+htzb+MFx7w/Y+4m7CWpZ6v2MI4k6TGGvSR1wLCXpA4Y9pLUAcNekjpg\n2EtSBwx7SerA/weac6dzbSWmzwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11a2516a0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(two_model_uplift_ratio)\n",
"plt.title(\"causal effect in the multiplicative scale\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Problems when we handle the binary outcome via metalearners"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* metalearners in EconML seem to focus on the continuous outcome\n",
"* When we use the ordinary classification models provided by sklearn, we get poor results because metalearners call `predict` methods that return 0 or 1"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/****/.pyenv/versions/3.6.1/lib/python3.6/site-packages/numba/errors.py:131: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9\n",
" warnings.warn(msg)\n"
]
}
],
"source": [
"from econml.metalearners import TLearner"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"# initialize sklearn models\n",
"lr_treat_raw = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"lr_control_raw = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"# initialize TLearner\n",
"T_learner = TLearner(lr_control_raw, lr_treat_raw)\n",
"# fit\n",
"T_learner.fit(y_train, w_train, X_train)\n",
"# predict\n",
"cate_additive_scale = T_learner.effect(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* TLearner tells us that the cate for each instance is `0`\n",
"* The result is quite different from the causal effect in the additive scale described above"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0])"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.unique(cate_additive_scale)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Proposition"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create wrappers of sklearn models"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Define init, fit and predict method yourself\n",
"* Predict method should not return the class labels, but the probabilities of class `1`"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.base import BaseEstimator, ClassifierMixin\n",
"\n",
"class MLWrapper(BaseEstimator, ClassifierMixin):\n",
" def __init__(self, model):\n",
" self.model = model\n",
"\n",
" def fit(self, X, y):\n",
" self.model.fit(X, y)\n",
" return self\n",
"\n",
" def predict(self, X):\n",
" return self.model.predict_proba(X)[:, 1]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"# initialize wrapper models\n",
"lr_control_wrap = MLWrapper(LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs'))\n",
"lr_treat_wrap = MLWrapper(LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs'))\n",
"# initialize TLearner\n",
"T_learner_wrap = TLearner(lr_control_wrap, lr_treat_wrap)\n",
"# fit\n",
"T_learner_wrap.fit(y_train, w_train, X_train)\n",
"# predict\n",
"cate_additive_scale = T_learner_wrap.effect(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* The result is the same as the causal effect in the additive scale described above"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11a2322e8>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nRK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116f1c048>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(cate_additive_scale)\n",
"plt.title(\"causal effect in the additive scale\")"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(cate_additive_scale != two_model_uplift_diff)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Override predict methods after the initialization of TLearner"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* If we override predict methods before the initialization of TLearner, we have no chance\n",
"* This would be because TLearner clones models"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"# initialize sklearn models\n",
"lr_treat_raw = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"lr_control_raw = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"# override predict methods before the initialization of TLearner\n",
"lr_control_raw.predict = lambda x: lr_control_raw.predict_proba(x)[:, 1]\n",
"lr_treat_raw.predict = lambda x: lr_treat_raw.predict_proba(x)[:, 1]\n",
"# initialize TLearner\n",
"T_learner = TLearner(lr_control_raw, lr_treat_raw)\n",
"# fit\n",
"T_learner.fit(y_train, w_train, X_train)\n",
"# predict\n",
"cate_additive_scale = T_learner.effect(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0])"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.unique(cate_additive_scale)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* In my opiniion, we should not override predict methods before the initialization of sklearn models... It's dangerous!\n",
"* We can override predict methods after the initialization of TLearner\n",
"* The result is the same as the causal effect in the additive scale described above"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"# initialize sklearn models\n",
"lr_treat_raw = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"lr_control_raw = LogisticRegression(C=0.1, max_iter=1000, solver='lbfgs')\n",
"# initialize TLearner\n",
"T_learner = TLearner(lr_control_raw, lr_treat_raw)\n",
"# override predict methods after the initialization of TLearner\n",
"T_learner.controls_model.predict = lambda x: T_learner.controls_model.predict_proba(x)[:, 1]\n",
"T_learner.treated_model.predict = lambda x: T_learner.treated_model.predict_proba(x)[:, 1]\n",
"# fit\n",
"T_learner.fit(y_train, w_train, X_train)\n",
"# predict\n",
"cate_additive_scale = T_learner.effect(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(cate_additive_scale != two_model_uplift_diff)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.1"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "321px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@aallex14
Copy link

aallex14 commented Apr 2, 2021

Thanks a lot!. That's really helpful. The model wrapper helps me a lot using T learner, but X-learners seem to be more complicated and a single wrap seems not enough I am wondering if you could share some hints.

@aallex14
Copy link

aallex14 commented Apr 2, 2021

No worry. I wrapped cate_models as well and it works for me. Thanks again!

@fullflu
Copy link
Author

fullflu commented Jul 6, 2022

Thank you for your comment!
I would be happy if this notebook is helpful for you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment