"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# code for loading the format for the notebook\n",
"import os\n",
"\n",
"# path : store the current path to convert back to it later\n",
"path = os.getcwd()\n",
"os.chdir(os.path.join('..', 'notebook_format'))\n",
"\n",
"from formats import load_style\n",
"load_style(css_style='custom2.css', plot_style=False)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ethen 2020-02-20 15:09:58 \n",
"\n",
"CPython 3.6.4\n",
"IPython 7.9.0\n",
"\n",
"numpy 1.16.5\n",
"pandas 0.25.0\n",
"sklearn 0.21.2\n",
"matplotlib 3.1.1\n",
"xgboost 0.81\n",
"lightgbm 2.2.4\n"
]
}
],
"source": [
"os.chdir(path)\n",
"\n",
"# 1. magic for inline plot\n",
"# 2. magic to print version\n",
"# 3. magic so that the notebook will reload external python modules\n",
"# 4. magic to enable retina (high resolution) plots\n",
"# https://gist.github.com/minrk/3301035\n",
"%matplotlib inline\n",
"%load_ext watermark\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"%config InlineBackend.figure_format='retina'\n",
"\n",
"import os\n",
"import time\n",
"import numpy as np\n",
"import pandas as pd\n",
"import xgboost as xgb\n",
"import lightgbm as lgb\n",
"import matplotlib.pyplot as plt\n",
"import sklearn.metrics as metrics\n",
"from copy import deepcopy\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.datasets.california_housing import fetch_california_housing\n",
"\n",
"# prevent scientific notations\n",
"pd.set_option('display.float_format', lambda x: '%.3f' % x)\n",
"\n",
"%watermark -a 'Ethen' -d -t -v -p numpy,pandas,sklearn,matplotlib,xgboost,lightgbm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Monotonic Constraint with Boosted Tree"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Real world machine learning is often times more than just fitting a model with high accuracy, often times we also want one that makes intuitive sense, or interpretable. Today's topic will be around monotonic.\n",
"\n",
"The idea around monotonic can be best illustrated by a few example:\n",
"\n",
"- If we applied for a credit card but got declined, one possible reason could be our previous credit card balance is too high. In this case, our mental model tells us that the underlying model should be monotonic with credit card balance. i.e. someone with a credit card balance higher than us but otherwise identical credit profile should also get rejected.\n",
"- A hotel chain might want to estimate the likelihood of a room being booked at a given price and day of the week. Our intuition tells us, with all else being equal, a cheaper price is most likely preferred by the user. i.e. price should have a monotonic relationship with booking probability.\n",
"\n",
"What may happen after building a model, especially when using popular non-linear models such as random forest, boosted tree or neural networks is that we end up with counter-intuitive scenarios (e.g. the higher the price the higher the booking probability, when all else being equal). This kind of situation often happens in the areas where data are sparse, or have a lot of noise.\n",
"\n",
"If our domain knowledge tells us that this feature has a monotonic relationship with the outcome, then we should try enforcing a monotonic constraint and check our model's overall performance. We might find out that by constraining the model, not only will it not lead to a significant degradation of the model's performance on the training set, but also can result in a better performance on the test data.\n",
"\n",
"Popular open-sourced boosted tree libraries such as XGBoost and LightGBM both have the capabilities of introducing monotonic constraint to the features that we specify. In this notebook, we will explore how this can be achieved."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Preparation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll be using the california housing data to illustrate the concept. In particular, we'll see how to enforce monotonic constraint on the feature `MedInc`, medium income on the target, medium house value."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature names: ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']\n",
"data shape: (20640, 8)\n",
"description:\n",
".. _california_housing_dataset:\n",
"\n",
"California Housing dataset\n",
"--------------------------\n",
"\n",
"**Data Set Characteristics:**\n",
"\n",
" :Number of Instances: 20640\n",
"\n",
" :Number of Attributes: 8 numeric, predictive attributes and the target\n",
"\n",
" :Attribute Information:\n",
" - MedInc median income in block\n",
" - HouseAge median house age in block\n",
" - AveRooms average number of rooms\n",
" - AveBedrms average number of bedrooms\n",
" - Population block population\n",
" - AveOccup average house occupancy\n",
" - Latitude house block latitude\n",
" - Longitude house block longitude\n",
"\n",
" :Missing Attribute Values: None\n",
"\n",
"This dataset was obtained from the StatLib repository.\n",
"http://lib.stat.cmu.edu/datasets/\n",
"\n",
"The target variable is the median house value for California districts.\n",
"\n",
"This dataset was derived from the 1990 U.S. census, using one row per census\n",
"block group. A block group is the smallest geographical unit for which the U.S.\n",
"Census Bureau publishes sample data (a block group typically has a population\n",
"of 600 to 3,000 people).\n",
"\n",
"It can be downloaded/loaded using the\n",
":func:`sklearn.datasets.fetch_california_housing` function.\n",
"\n",
".. topic:: References\n",
"\n",
" - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
" Statistics and Probability Letters, 33 (1997) 291-297\n",
"\n"
]
}
],
"source": [
"cal_housing = fetch_california_housing()\n",
"print('feature names:', cal_housing.feature_names)\n",
"print('data shape: ', cal_housing.data.shape)\n",
"\n",
"print('description:')\n",
"print(cal_housing.DESCR)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"test_size = 0.2\n",
"random_state = 123\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(\n",
" cal_housing.data,\n",
" cal_housing.target,\n",
" test_size=test_size,\n",
" random_state=random_state)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## XGBoost"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll follow the standard process of fitting the boosted tree model and evaluate of regression model metrics."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dtrain = xgb.DMatrix(X_train, y_train, feature_names=cal_housing.feature_names)\n",
"dtest = xgb.DMatrix(X_test, y_test, feature_names=cal_housing.feature_names)\n",
"dtrain"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0]\ttrain-rmse:1.78053\teval-rmse:1.77867\n",
"Multiple eval metrics have been passed: 'eval-rmse' will be used for early stopping.\n",
"\n",
"Will train until eval-rmse hasn't improved in 10 rounds.\n",
"[50]\ttrain-rmse:0.469279\teval-rmse:0.503594\n",
"[100]\ttrain-rmse:0.419359\teval-rmse:0.477911\n",
"[150]\ttrain-rmse:0.388882\teval-rmse:0.467229\n",
"[200]\ttrain-rmse:0.366135\teval-rmse:0.4603\n",
"[250]\ttrain-rmse:0.348431\teval-rmse:0.457543\n",
"[300]\ttrain-rmse:0.332337\teval-rmse:0.453901\n",
"Stopping. Best iteration:\n",
"[325]\ttrain-rmse:0.325168\teval-rmse:0.45305\n",
"\n"
]
}
],
"source": [
"evals = [(dtrain, 'train'), (dtest, 'eval')]\n",
"\n",
"params_no_constraint = {\n",
" 'nthread': 6,\n",
" 'seed': 0,\n",
" 'eval_metric': 'rmse',\n",
" 'eta': 0.1,\n",
" 'max_depth': 5\n",
"}\n",
"evals_result = {}\n",
"model_no_constraint = xgb.train(\n",
" params_no_constraint, dtrain,\n",
" evals=evals,\n",
" evals_result=evals_result,\n",
" num_boost_round=1000,\n",
" early_stopping_rounds=10,\n",
" verbose_eval=50)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def mape_score(y_true, y_score):\n",
" \"\"\"Mean Absolute Percentage Error (MAPE).\"\"\"\n",
" mask = y_true != 0\n",
" y_true = y_true[mask]\n",
" y_score = y_score[mask]\n",
" mape = np.abs(y_true - y_score) / y_true\n",
" return np.mean(mape)\n",
"\n",
"\n",
"def compute_score(model, dmatrix, verbose=True):\n",
" \"\"\"\n",
" Computes the model evaluation score (r2, rmse, mape) for the\n",
" input model and dmatrix.\n",
" \"\"\"\n",
" y_true = dmatrix.get_label()\n",
" y_score = model.predict(dmatrix)\n",
"\n",
" r2 = round(metrics.r2_score(y_true, y_score), 3)\n",
" rmse = round(np.sqrt(metrics.mean_squared_error(y_true, y_score)), 3)\n",
" mape = round(mape_score(y_true, y_score), 3)\n",
" if verbose:\n",
" print('r2: ', r2)\n",
" print('rmse: ', rmse)\n",
" print('mape: ', mape)\n",
"\n",
" return r2, rmse, mape"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"r2: 0.845\n",
"rmse: 0.453\n",
"mape: 0.169\n"
]
}
],
"source": [
"r2, rmse, mape = compute_score(model_no_constraint, dtest)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To explore the relationship between the medium income feature and our target, medium house value. We will take one record from our data, impute different values for its medium income feature, and check what's the predicted medium house value."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"