├── solutions ├── grid_search_max_depth_and_max_features.py ├── grid_search_list_values.py ├── 01_scatter_plot_income_groups.py ├── grid_search_best_three.py └── grid_search_max_depth.py ├── LICENSE ├── .gitignore └── 02_Hyper_parameter_optimization.ipynb /solutions/grid_search_max_depth_and_max_features.py: -------------------------------------------------------------------------------- 1 | param_grid = {"max_depth": [1, 2, 4, 8, 16, 32], 2 | 'max_features': [3, 6, 12, 24, 48, 96]} 3 | grid_search = GridSearchCV(clf, param_grid=param_grid, scoring='roc_auc') 4 | grid_search.fit(X_dev, y_dev) 5 | -------------------------------------------------------------------------------- /solutions/grid_search_list_values.py: -------------------------------------------------------------------------------- 1 | print("max_depth, train_score, test_score") 2 | for n, max_depth in enumerate(grid_search.cv_results_['param_max_depth']): 3 | print(max_depth, 4 | grid_search.cv_results_['mean_train_score'][n], 5 | grid_search.cv_results_['mean_test_score'][n],) 6 | -------------------------------------------------------------------------------- /solutions/01_scatter_plot_income_groups.py: -------------------------------------------------------------------------------- 1 | plt.scatter(low_income['age'], low_income['hours-per-week'], 2 | alpha=0.03, s=50, c='b', label='<=50K'); 3 | plt.scatter(high_income['age'], high_income['hours-per-week'], 4 | alpha=0.03, s=50, c='g', label='>50K'); 5 | plt.legend() 6 | plt.xlabel('age'); plt.ylabel('hours-per-week'); -------------------------------------------------------------------------------- /solutions/grid_search_best_three.py: -------------------------------------------------------------------------------- 1 | def report(results, n_top=3): 2 | for i in range(1, n_top + 1): 3 | candidates = np.flatnonzero(results['rank_test_score'] == i) 4 | for candidate in candidates: 5 | print("Model with rank: {0}".format(i)) 6 | print("Mean validation score: {0:.3f} (std: {1:.3f})".format( 7 | results['mean_test_score'][candidate], 8 | results['std_test_score'][candidate])) 9 | print("Parameters: {0}".format(results['params'][candidate])) 10 | print("") 11 | 12 | report(grid_search.cv_results_) 13 | -------------------------------------------------------------------------------- /solutions/grid_search_max_depth.py: -------------------------------------------------------------------------------- 1 | def plot_grid_scores(param_name, cv_result, ylim=(0, 1.1)): 2 | param_values = np.array(cv_result["param_%s" % param_name]) 3 | 4 | plt.title("Scores for %s." % param_name) 5 | 6 | plt.ylim(*ylim) 7 | plt.grid() 8 | plt.xlim(min(param_values), max(param_values)) 9 | plt.xlabel(param_name) 10 | plt.ylabel("Score") 11 | 12 | train_scores_mean = cv_result['mean_train_score'] 13 | test_scores_mean = cv_result['mean_test_score'] 14 | plt.scatter(param_values, train_scores_mean, marker='o', color="r", 15 | label="Training scores") 16 | plt.scatter(param_values, test_scores_mean, marker='o', color="g", 17 | label="Cross-validation scores") 18 | plt.legend(loc="best") 19 | print("Best test score: {:.4f}".format(np.max(test_scores_mean))) 20 | 21 | plot_grid_scores("max_depth", grid_search.cv_results_) 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Olivier Grisel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /02_Hyper_parameter_optimization.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "%matplotlib inline\n", 12 | "import numpy as np\n", 13 | "import pandas as pd\n", 14 | "import matplotlib.pyplot as plt\n", 15 | "import warnings\n", 16 | "warnings.simplefilter(action = \"ignore\", category = FutureWarning)" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "# Finding the best hyper-parameters\n", 24 | "\n", 25 | "Some text about finding hyper-parameters." 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "# Fetch the data and load it\n", 33 | "\n", 34 | "This is a repeat of the previous notebook. Downloads the data and fits a simple decision tree classifier." 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 2, 40 | "metadata": { 41 | "collapsed": true 42 | }, 43 | "outputs": [], 44 | "source": [ 45 | "import os\n", 46 | "from urllib.request import urlretrieve\n", 47 | "\n", 48 | "url = (\"https://archive.ics.uci.edu/ml/machine-learning-databases\"\n", 49 | " \"/adult/adult.data\")\n", 50 | "local_filename = os.path.basename(url)\n", 51 | "if not os.path.exists(local_filename):\n", 52 | " print(\"Downloading Adult Census datasets from UCI\")\n", 53 | " urlretrieve(url, local_filename)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 3, 59 | "metadata": { 60 | "collapsed": true 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "names = (\"age, workclass, fnlwgt, education, education-num, \"\n", 65 | " \"marital-status, occupation, relationship, race, sex, \"\n", 66 | " \"capital-gain, capital-loss, hours-per-week, \"\n", 67 | " \"native-country, income\").split(', ') \n", 68 | "data = pd.read_csv(local_filename, names=names)\n", 69 | "data = data.drop('fnlwgt', axis=1)" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 4, 75 | "metadata": { 76 | "collapsed": true 77 | }, 78 | "outputs": [], 79 | "source": [ 80 | "target = data['income']\n", 81 | "features_data = data.drop('income', axis=1)\n", 82 | "features = pd.get_dummies(features_data)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 5, 88 | "metadata": { 89 | "collapsed": true 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "X = features.values.astype(np.float32)\n", 94 | "y = (target.values == ' >50K').astype(np.int32)" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 6, 100 | "metadata": { 101 | "collapsed": true 102 | }, 103 | "outputs": [], 104 | "source": [ 105 | "from sklearn.model_selection import train_test_split\n", 106 | "\n", 107 | "X_dev, X_eval, y_dev, y_eval = train_test_split(\n", 108 | " X, y, test_size=0.2, random_state=0)" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 7, 114 | "metadata": { 115 | "collapsed": true 116 | }, 117 | "outputs": [], 118 | "source": [ 119 | "from sklearn.tree import DecisionTreeClassifier\n", 120 | "\n", 121 | "clf = DecisionTreeClassifier(max_depth=8)" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 8, 127 | "metadata": {}, 128 | "outputs": [ 129 | { 130 | "name": "stdout", 131 | "output_type": "stream", 132 | "text": [ 133 | "ROC AUC Decision Tree: 0.9006 +/-0.0023\n" 134 | ] 135 | } 136 | ], 137 | "source": [ 138 | "from sklearn.model_selection import cross_val_score\n", 139 | "\n", 140 | "scores = cross_val_score(clf, X_dev, y_dev, cv=5, scoring='roc_auc')\n", 141 | "print(\"ROC AUC Decision Tree: {:.4f} +/-{:.4f}\".format(\n", 142 | " np.mean(scores), np.std(scores)))" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "# Tuning your estimator\n", 150 | "\n", 151 | "Hyper-parameters are not directly learnt by the classifier or regressor from the data. They need setting from the outside. An example of a hyper-parameter is `max_depth` for a decision tree classifier. In `scikit-learn` you can spot them as the parameters that are passed to the constructor of your estimator.\n", 152 | "\n", 153 | "The best value of a hyper-parameter depends on the kind of problem you are solving:\n", 154 | "\n", 155 | "* how many features and samples do you have?\n", 156 | "* mostly numerical or mostly categorical features?\n", 157 | "* is it a regression or classification task?\n", 158 | "\n", 159 | "Therefore you should optimise the hyper-parameters for each problem, otherwise the performance of your classifier will not be as good as it could be.\n", 160 | "\n", 161 | "## Search over a grid of parameters\n", 162 | "\n", 163 | "This is the simplest strategy: you try every combination of values for each hyper-parameter." 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 9, 169 | "metadata": { 170 | "collapsed": true 171 | }, 172 | "outputs": [], 173 | "source": [ 174 | "from sklearn.model_selection import GridSearchCV\n", 175 | "\n", 176 | "param_grid = {\"max_depth\": [1, 2, 4, 8, 16, 32]}\n", 177 | "grid_search = GridSearchCV(clf, param_grid=param_grid, scoring='roc_auc')" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 10, 183 | "metadata": {}, 184 | "outputs": [ 185 | { 186 | "data": { 187 | "text/plain": [ 188 | "GridSearchCV(cv=None, error_score='raise',\n", 189 | " estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=8,\n", 190 | " max_features=None, max_leaf_nodes=None,\n", 191 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 192 | " min_samples_leaf=1, min_samples_split=2,\n", 193 | " min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", 194 | " splitter='best'),\n", 195 | " fit_params=None, iid=True, n_jobs=1,\n", 196 | " param_grid={'max_depth': [1, 2, 4, 8, 16, 32]},\n", 197 | " pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n", 198 | " scoring='roc_auc', verbose=0)" 199 | ] 200 | }, 201 | "execution_count": 10, 202 | "metadata": {}, 203 | "output_type": "execute_result" 204 | } 205 | ], 206 | "source": [ 207 | "grid_search.fit(X_dev, y_dev)" 208 | ] 209 | }, 210 | { 211 | "cell_type": "markdown", 212 | "metadata": {}, 213 | "source": [ 214 | "### Question\n", 215 | "\n", 216 | "Print out the values of `max_depth` tried, and the average train and test scores for each.\n", 217 | "\n", 218 | "(Try and retrieve the `max_depth` values from the `grid_search` object, not the parameter grid.)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": null, 224 | "metadata": {}, 225 | "outputs": [], 226 | "source": [] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": null, 231 | "metadata": {}, 232 | "outputs": [], 233 | "source": [ 234 | "# %load solutions/grid_search_list_values.py" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "### Question\n", 242 | "\n", 243 | "Compare the test and train performance at for each value of `max_depth` to that obtained from the previous validation curve example by making a plot similar to `plot_validation_curve`.\n" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": null, 249 | "metadata": { 250 | "collapsed": true 251 | }, 252 | "outputs": [], 253 | "source": [] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": null, 258 | "metadata": {}, 259 | "outputs": [], 260 | "source": [ 261 | "# %load solutions/grid_search_max_depth.py" 262 | ] 263 | }, 264 | { 265 | "cell_type": "markdown", 266 | "metadata": {}, 267 | "source": [ 268 | "### Question\n", 269 | "\n", 270 | "Extend the parameter grid to also search over different values for the `max_features` hyper-parameter. (Try: 3, 6, 12, 24, 48, and 96 if you need inspiration)" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": null, 276 | "metadata": { 277 | "collapsed": true 278 | }, 279 | "outputs": [], 280 | "source": [] 281 | }, 282 | { 283 | "cell_type": "code", 284 | "execution_count": null, 285 | "metadata": {}, 286 | "outputs": [], 287 | "source": [ 288 | "# %load solutions/grid_search_max_depth_and_max_features.py" 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": {}, 294 | "source": [ 295 | "### Question\n", 296 | "\n", 297 | "How many different models/hyper-parameter combinations did you just evaluate? What are the best three combinations? (Should you rank by train or test score?)" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": null, 303 | "metadata": { 304 | "collapsed": true 305 | }, 306 | "outputs": [], 307 | "source": [] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": null, 312 | "metadata": {}, 313 | "outputs": [], 314 | "source": [ 315 | "# %load solutions/grid_search_best_three.py" 316 | ] 317 | }, 318 | { 319 | "cell_type": "markdown", 320 | "metadata": {}, 321 | "source": [ 322 | "### Question\n", 323 | "\n", 324 | "Reuse your plotting from before to show how the score varies as a function of `max_depth`. Do you notice how we repeatedly evaluate the classifier at the same value of `max_depth`? Before going to the next section, see if you can think of a way to get a better picture of the behaviour as a function of `max_depth` without increasing the number of times you have to fit a model." 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "execution_count": null, 330 | "metadata": { 331 | "collapsed": true 332 | }, 333 | "outputs": [], 334 | "source": [] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 15, 339 | "metadata": {}, 340 | "outputs": [ 341 | { 342 | "name": "stdout", 343 | "output_type": "stream", 344 | "text": [ 345 | "Best test score: 0.8975\n" 346 | ] 347 | }, 348 | { 349 | "data": { 350 | "image/png": "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\nlzN48GAuu+yy8AvznnvuCYeirhkKe+fOnVx88cX06tWLnj178vjjjwMwbty4cNjp2nM0AEybNo2x\nY8eGyzNmzGD06NEAXH755fTr148ePXowffr0hGWvuW3Y3Rk9ejSnnnoqF1xwQThcN8CECRMYMGAA\nPXv2pLS0FHfnySefZOHChZSUlNC7d2927dpFcXExCxfGGilmzZpFUVERPXv23Ge47NzcXMaPH0+v\nXr0466yz9gucAC+//HI4SVGfPn3YsWMHAHfffTdFRUX06tUrHDV28eLFnHXWWZxxxhmMGDGCzz//\nHIDi4mLGjBnDueeey5QpU/jss8+48sorGTBgAAMGDOD111+v81gJlZTAI49Afn7yPLWl8oRbS3rp\niebMO2jrBclfDdSQJ5pnLpnpORNznLsIXzkTc3zmktSeak70hOyUKVN8zJgxCfPPmzfPc3Jy/KOP\nPnJ394ULF3rPnj29oqLCd+zY4YWFhf7222/7k08+6TfeeGO43datW33Tpk1+yimn+N69e93d/fPP\nP99v/xs3bvQTTzwxXB46dKi/+uqr7u6+efNmd3evrKz0Hj16+KZNm9zdPT8/3z/77DN3d+/YsWPs\nc5k50y+44AKvqqrydevWeV5env/ud7/bZz/u7tdee63PmTPH3d3PPfdcX7BgQbiuZnndunV+3HHH\n+caNG33Pnj0+ZMgQnz17tru7A+H2Y8eO9R//+Mf71emSSy7x1157zd3dd+zY4Xv27PG5c+f62Wef\n7Tt37tynTEVFRV5eXu7u7j/4wQ/8tttuC8syatSo8HyNHDky/FxWr17tp512WtJj1Zbo7wtY6Cl8\nx+pKQSRVydpnG9Fu2xDjXxxP5Z59h86u3FPJ+BfTM3Q2wMCBAzn++OOB2NDWI0aMoGPHjuTm5nLF\nFVfw6quvUlRUxPPPP88dd9zBq6++Sl5eHnl5ebRv354bbriBp59+mpycnP32feSRR3LCCScwf/58\nNm/ezIoVK8Ixle67777wF/nHH3/MBx98kLSMr7/+OiNHjiQrK4tjjjmG8847L1w3b948zjzzTIqK\ninjppZd4991366zvggULKC4u5sgjj6Rt27aUlJTwyiuvALERYC+55BIg+bDggwYN4rvf/S733Xcf\nW7dupW3btrzwwgtcf/314WfQuXNntm3bxtatWzn33HMB+OY3vxkeB+Dqq68O37/wwguMHj2a3r17\n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\nAABJRU5ErkJggg==\n", 351 | "text/plain": [ 352 | "" 353 | ] 354 | }, 355 | "metadata": {}, 356 | "output_type": "display_data" 357 | } 358 | ], 359 | "source": [ 360 | "#plot_grid_scores(\"max_depth\", grid_search.cv_results_)" 361 | ] 362 | }, 363 | { 364 | "cell_type": "markdown", 365 | "metadata": {}, 366 | "source": [ 367 | "## Random grid search\n", 368 | "\n", 369 | "An alternative to the exhaustive grid search is to sample parameter values at random. This has two main benefits over an exhaustive search:\n", 370 | "* A budget can be chosen independent of the number of parameters and possible values.\n", 371 | "* Adding parameters that do not influence the performance does not decrease efficiency." 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": 16, 377 | "metadata": {}, 378 | "outputs": [ 379 | { 380 | "data": { 381 | "text/plain": [ 382 | "RandomizedSearchCV(cv=None, error_score='raise',\n", 383 | " estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=8,\n", 384 | " max_features=None, max_leaf_nodes=None,\n", 385 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 386 | " min_samples_leaf=1, min_samples_split=2,\n", 387 | " min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", 388 | " splitter='best'),\n", 389 | " fit_params=None, iid=True, n_iter=36, n_jobs=1,\n", 390 | " param_distributions={'max_depth': , 'max_features': },\n", 391 | " pre_dispatch='2*n_jobs', random_state=None, refit=True,\n", 392 | " return_train_score=True, scoring='roc_auc', verbose=0)" 393 | ] 394 | }, 395 | "execution_count": 16, 396 | "metadata": {}, 397 | "output_type": "execute_result" 398 | } 399 | ], 400 | "source": [ 401 | "from scipy.stats import randint as sp_randint\n", 402 | "\n", 403 | "from sklearn.model_selection import RandomizedSearchCV\n", 404 | "\n", 405 | "param_grid = {\"max_depth\": sp_randint(1, 32),\n", 406 | " \"max_features\": sp_randint(1, 96),\n", 407 | " }\n", 408 | "random_search = RandomizedSearchCV(clf, param_distributions=param_grid,\n", 409 | " n_iter=36, scoring='roc_auc')\n", 410 | "random_search.fit(X_dev, y_dev)" 411 | ] 412 | }, 413 | { 414 | "cell_type": "code", 415 | "execution_count": 17, 416 | "metadata": {}, 417 | "outputs": [ 418 | { 419 | "name": "stdout", 420 | "output_type": "stream", 421 | "text": [ 422 | "Best test score: 0.8943\n" 423 | ] 424 | }, 425 | { 426 | "data": { 427 | "image/png": "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\nBQXR8NzNDfk9depU7rnnHrZv387JJ5/MsmXL9mhZqUN779q1ixdffDEa2nvNmjUUFRW127JEckWX\nCwrTT59OYUHjjXRhQSHTT9/zobNPO+00Pv7440b99q+99lr0MJpUo0aN4pFHHmHbtm1s3bqVhx9+\nmFGjRvHuu+9SWFjIxRdfzHXXXccrr7xCbW0tmzZt4qyzzuK2227j1VdfJS8vL9qwNTzOc/z48Tz6\n6KPcf//90QN2Nm3axH777UdhYSHLli3jxRdfbLENn/nMZ/jZz35GfX09a9euZcGCBQBRANh///2p\nra1tdEVS79690/bBjxw5kmeeeYb169dTX1/P/fffH+3NZ+Ltt9+mtLSU66+/nhEjRrBs2TI++9nP\nMnfuXLaFT83buHEjxcXF7LffftHv/D//8z/NLudzn/tc9ChRIHpEabpliXRlXe5YubI0GCJ72lPT\nWLVpFQOKBzD99OlR+p4wMx5++GGuueYabrnlFnr06EFJSQm33347a9asaZR3+PDhXHrppYwcORII\nLuM8/vjjeeKJJ7juuuvo1q0bBQUFzJw5ky1btjBu3Dg++ugj3L3ZYaf3228/jj32WJYuXRqVO2bM\nGGbNmsWxxx7L0UcfzYknnthiG8aPH8/TTz/NoEGDGDBgACeddBIQjKV0xRVXMGTIEA488MBoCG0I\nLlu98sor2WeffaLnOQMcdNBB3HzzzYwePRp35+yzz2bcuHEZ/5633347CxYsoFu3bgwePJixY8ey\nzz77sHjxYsrLy+nevTtnnXUW3/3ud7n33nu58sor2bZtG4cffjhz585NW+Ydd9zB1VdfzXHHHUdd\nXR2f+cxnmDVrVtpliXRlGjp7L8jloaUht9unobOzm9r3T5kOnd3luo9ERKR5CgoiIhLJmaCQbd1g\nkh30dyVdTU4EhR49erBhwwb9A0u7cnc2bdpEjx49OroqIntNTlx91L9/f1avXs3777/f0VVJ66OP\nPsrpDUsut2/r1q0MHTq0o6shstfkRFAoKCiI7hjujGpqajj++OM7uhqJyeX21dTUUFBQ0NHVENlr\nEu0+MrMxZvammS03s6lp5puZ3RHOf83MhidZHxERaVliQcHM8oA7gbHAIGCCmTUdV3kscGT4qgJm\nJlUfERFpXZJHCiOB5e7+jrvvAOYDTW9rHQf8NBzE70VgXzM7KME6iYhIC5I8p3AI8PeU6dXACRnk\n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\n", 428 | "text/plain": [ 429 | "" 430 | ] 431 | }, 432 | "metadata": {}, 433 | "output_type": "display_data" 434 | } 435 | ], 436 | "source": [ 437 | "plot_grid_scores(\"max_depth\", random_search.cv_results_)" 438 | ] 439 | }, 440 | { 441 | "cell_type": "markdown", 442 | "metadata": {}, 443 | "source": [ 444 | "For the same number of model evaluations you get a much better view of how the performance varies as a function of `max_depth`. This is a big advantage especially if one of the hyper-parameters does not influence the performance of the estimator. Though as you increase the number of dimensions making a projection into just one becomes more noisy." 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "execution_count": 18, 450 | "metadata": {}, 451 | "outputs": [ 452 | { 453 | "data": { 454 | "text/plain": [ 455 | "RandomizedSearchCV(cv=None, error_score='raise',\n", 456 | " estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=8,\n", 457 | " max_features=None, max_leaf_nodes=None,\n", 458 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 459 | " min_samples_leaf=1, min_samples_split=2,\n", 460 | " min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", 461 | " splitter='best'),\n", 462 | " fit_params=None, iid=True, n_iter=36, n_jobs=1,\n", 463 | " param_distributions={'max_depth': , 'max_features': , 'min_samples_leaf': },\n", 464 | " pre_dispatch='2*n_jobs', random_state=None, refit=True,\n", 465 | " return_train_score=True, scoring='roc_auc', verbose=0)" 466 | ] 467 | }, 468 | "execution_count": 18, 469 | "metadata": {}, 470 | "output_type": "execute_result" 471 | } 472 | ], 473 | "source": [ 474 | "param_grid = {\"max_depth\": sp_randint(1, 32),\n", 475 | " \"max_features\": sp_randint(1, 96),\n", 476 | " \"min_samples_leaf\": sp_randint(15, 40)\n", 477 | " }\n", 478 | "random_search = RandomizedSearchCV(clf, param_distributions=param_grid,\n", 479 | " n_iter=36, scoring='roc_auc')\n", 480 | "random_search.fit(X_dev, y_dev)" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": 19, 486 | "metadata": {}, 487 | "outputs": [ 488 | { 489 | "name": "stdout", 490 | "output_type": "stream", 491 | "text": [ 492 | "Best test score: 0.9038\n" 493 | ] 494 | }, 495 | { 496 | "data": { 497 | "image/png": "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\nz+f555+nsLCQJ598kuuvv57nn3+e7t270717dzp37sxll13Gww8/TF79gfyAAw88kCOPPJKXX36Z\nTZs2sXLlynBMpdtuuy1cI3///fd55513Go3xueeeY9y4ceTk5HDIIYdw2mmnhfMWLVrECSecQGFh\nIc888wxvvvlmk/199dVXKSkp4cADD6Rjx46Ulpby3HPPAbERYM8555zwc0k0LPjw4cP5wQ9+wG23\n3cbnn39Ox44deeqppxg/fnz4GfTo0YPNmzfz+eefh/eq+N73vhe+D8BFF10UPn/qqaeYNGkSgwcP\n5txzz2XLli1UVVUlfC+R9qzdJYXe3RMPkd1YeTL69+/f5FXEiX7M6zvmmGN47bXXKCws5Ec/+hHT\np0+nY8eO/PWvf+XCCy/k8ccfZ9SoUdTU1IS7O37yk58AcPHFF/PAAw/w0EMPMXbsWMyMyspKnnrq\nKf7yl7/w+uuvc/zxxyccprs5X3zxBRMnTuTBBx/kjTfe4Iorrtijdmrl5uaGw3M3NuT3lClTuOuu\nu9ixYwfDhw9n5cqVe/Re8UN77969m5dffjkc2nv9+vXk5+e32nuJZIt2lxTKTy8nL7fuj3Rebh7l\np+/50NmnnXYaX375ZZ399suWLQtvRhNvxIgRPPLII2zfvp1t27axYMECRowYwQcffEBeXh6XXHIJ\nkydP5rXXXqOqqorNmzdz1llnMWPGDF5//XVycnLCH7ba23mOHTuWRx99lPnz54c32Nm8eTP7778/\neXl5rFy5kpdffrnJPpxyyincf//91NTUsGHDBhYtWgQQJoADDjiAqqqqOmckdevWLeE++GHDhvHs\ns8+yceNGampqmD9/frg2n4x3332XwsJCrr/+eoYOHcrKlSv5xje+wT333MP24K55n376Kd27d2f/\n/fcPP+f//u//bvR9zjzzzPBWokB4i9JE7yXSnrW7beXSwtgQ2VOfnsrazWvp3b035aeXh+V7wsxY\nsGAB1157LTfddBOdO3emT58+3Hrrraxfv75O3SFDhnDppZcybNgwIHYa5/HHH88TTzzB5MmT6dCh\nA7m5ucyaNYutW7cyZswYvvjiC9y90WGn999/f4477jiWL18etjtq1Chmz57NcccdR9++fTnxxBOb\n7MPYsWN55pln6NevH7179+akk04CYmMpXXHFFQwYMICDDjooHEIbYqetXnnlleyzzz7h/ZwBDj74\n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\n", 498 | "text/plain": [ 499 | "" 500 | ] 501 | }, 502 | "metadata": {}, 503 | "output_type": "display_data" 504 | } 505 | ], 506 | "source": [ 507 | "plot_grid_scores(\"max_depth\", random_search.cv_results_)" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 20, 513 | "metadata": {}, 514 | "outputs": [ 515 | { 516 | "name": "stdout", 517 | "output_type": "stream", 518 | "text": [ 519 | "Best test score: 0.9038\n" 520 | ] 521 | }, 522 | { 523 | "data": { 524 | "image/png": "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\nZOjQocyaNQuAVatWcdZZZzFkyBCuuuoqPvzwQwDGjh3LzTffTFFREXPnzuX999/nsssuY+TIkYwc\nOZLnnnsuYV0inVbtA1Lay2vEiBFe39q1aw8pa8iAuwc4t3HIa8DdA5JeRn1z5871m2++Oe64ZcuW\neW5urm/cuNHd3VesWOGDBw/2yspK37t3rw8cONBfffVVf/jhh/3aa6+N5tu1a5fv2LHDTznlFD94\n8KDv2bPHP/zww0OW/9577/lJJ50UDU+YMMGXL1/u7u47d+50d/eqqiofNGiQ79ixI2iDAQP8/fff\nd3f3Hj16uLv7I4884ueff75XV1f7tm3bPC8vz3/zm9/UWY67+9VXX+1Llixxd/dzzz3XX3nllWhc\n7fC2bdv8+OOP9/fee88PHDjg48aN88WLF7u7OxDNP3PmTP/ud797yDpddNFF/uc//9nd3ffu3esH\nDhzwpUuX+ujRo33fvn11YiosLPSKigp3d//mN7/pN910UxTLtGnTomVOmTIlapfNmzf7aaed1mBd\n9aXy/9XWLVu2LNMhtGkduX2AFZ7ENrbTHSls2R3/FtkNlbeEUaNGccIJJwDBra0nT55Mjx496Nmz\nJ1/4whdYvnw5hYWFPPHEE9xyyy0sX76cvLw88vLy6NatG1/96ldZsmQJufVv5AccffTRnHjiibz4\n4ovs3LmTdevWRfdUuueee6I98rfeeov169c3GOOzzz7LlClTyMrK4rjjjuO8886Lxi1btowzzzyT\nwsJCnn76adasWZNwfV955RXGjh3L0UcfTXZ2NsXFxTz77LNAcAfYiy66CGj4tuDnnHMOX//617nn\nnnvYtWsX2dnZPPnkk0ydOjVqg969e7N792527drFueeeC8BVV10V1QNwxRVXRO+ffPJJZsyYwbBh\nw7j44ovZs2cPlZWVcesS6cw6XVLIz4t/i+yGypMxaNCghL8iTuYZAqeccgqvvvoqhYWFfOtb3+L2\n228nOzubl19+mcsvv5zHHnuMCRMmUFNTE3V3fPvb3wbgyiuv5KGHHuKRRx5h8uTJmBkVFRU8+eST\nvPDCC7z22mucccYZcW/T3ZiPP/6Y6dOn8/DDD7N69Wquu+66Ji2nVk5OTnR77oZu+T1r1izuu+8+\nPvroI8455xzWrVvXpLpi2/3gwYO8+OKL0a29t23bRs+ePVusLpGOotMlhdLxpeTm1N3jzs3JpXR8\n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\n", 525 | "text/plain": [ 526 | "" 527 | ] 528 | }, 529 | "metadata": {}, 530 | "output_type": "display_data" 531 | } 532 | ], 533 | "source": [ 534 | "plot_grid_scores(\"max_features\", random_search.cv_results_)" 535 | ] 536 | }, 537 | { 538 | "cell_type": "code", 539 | "execution_count": 21, 540 | "metadata": {}, 541 | "outputs": [ 542 | { 543 | "name": "stdout", 544 | "output_type": "stream", 545 | "text": [ 546 | "Best test score: 0.9038\n" 547 | ] 548 | }, 549 | { 550 | "data": { 551 | "image/png": "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\n8/2VV17xhx56yK+++upovq1bt/rmzZv9hBNOaHTY6Q8++MCPO+64aIjocePG+aJFi9z9X8N0V1VV\n+YABA3zz5s1BHeTm+ocffuju7t27d3d394cfftjPPvtsr66u9o0bN3qvXr38D3/4Q63luLtffvnl\n/vjjj7u7+5lnnllrWPCa1xs3bvSjjz7aP/jgA9+zZ4+PGTPG58+f7+7uQDT/tGnT/Ac/+EG9z3T+\n+ef7Cy+84O7uO3bs8D179viCBQv8tNNOi4bmrompoKDAy8vL3d39u9/9rn/jG9+IYpkyZUpUL5Mm\nTYrqpaKiwk888cQG11WXhs7ODB29XtDQ2fGt3xZ/iOyGylvCyJEjOeaYY4BgaOuJEyfSvXt3evTo\nwUUXXcSiRYsoKCjgqaee4sYbb2TRokX06tWLXr160bVrV7761a/yyCOPkFN3ID+gT58+HHvssfz9\n739ny5YtvPHGG9GYSnfeeWe0R/7OO++wevXqBmN8/vnnmTRpEllZWRx55JGcddZZ0XsLFy7klFNO\noaCggGeffZYVK1Y0+nlffvllCgsL6dOnD507d6aoqIjnn38eCEaAPf/884GGhwUfNWoU//Vf/8Wd\nd97J1q1b6dy5M08//TRXXXVVVAcHH3ww27ZtY+vWrZx55pkAXHHFFdF6AC699NLo+dNPP811113H\nkCFDuOCCC9i+fTuVlZVx1yWSyTIuKfTrFX+I7IbKEzFgwIBGryJO5B4CJ5xwAq+88goFBQV85zvf\n4ZZbbqFz5878/e9/55JLLuFPf/oT48aNY+/evVF3x/e+9z0ALrvsMubPn8/DDz/MxIkTMTPKy8t5\n+umneemll3jttdc4+eST4w7T3ZRdu3YxdepUHnroIZYvX84111yT1HJqZGdnR8NzNzTk9/Tp07nn\nnnv45JNPGDVqFG+88UZS64qt93379rF48eJoaO+NGzfSo0ePFluXSEeRcUmhZGwJOdm197hzsnMo\nGZv80NlnnXUWn376aa1++9dffz26GU2s0aNH8+ijj1JVVcXOnTuZP38+o0eP5t133yUnJ4fLL7+c\nadOm8corr1BZWcm2bds499xzuf3223nttdfIysqKfthqbuc5ceJEnnjiCebNmxfdYGfbtm0cdNBB\n5OTk8MYbb7B48eJGP8MZZ5zBAw88wN69e9m0aRMLFy4EiBLAoYceSmVlZa0zknr27Bm3D37kyJE8\n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\n", 552 | "text/plain": [ 553 | "" 554 | ] 555 | }, 556 | "metadata": {}, 557 | "output_type": "display_data" 558 | } 559 | ], 560 | "source": [ 561 | "plot_grid_scores(\"min_samples_leaf\", random_search.cv_results_)" 562 | ] 563 | }, 564 | { 565 | "cell_type": "code", 566 | "execution_count": 22, 567 | "metadata": {}, 568 | "outputs": [ 569 | { 570 | "data": { 571 | "text/plain": [ 572 | "{'max_depth': 31, 'max_features': 95, 'min_samples_leaf': 34}" 573 | ] 574 | }, 575 | "execution_count": 22, 576 | "metadata": {}, 577 | "output_type": "execute_result" 578 | } 579 | ], 580 | "source": [ 581 | "random_search.best_params_" 582 | ] 583 | }, 584 | { 585 | "cell_type": "markdown", 586 | "metadata": {}, 587 | "source": [ 588 | "## Bayesian optimisation\n", 589 | "\n", 590 | "Neither the exhaustive grid search nor random search adapt their search for the best hyper-parameter as they evaluate points. For the grid all points are chosen upfront, and for random search all of them are chosen at random.\n", 591 | "\n", 592 | "It makes sense to use the knowledge from the first few evaluations to decide what hyper-parameters to try next. This is what tools like `scikit-optimize` try and do. The technique is known as bayesian optimisation or sequential model based optimisation.\n", 593 | "\n", 594 | "The basic algorithm goes like this:\n", 595 | "* evaluate a new set of hyper-parameters\n", 596 | "* fit a regression model to all sets of hyper-parameters\n", 597 | "* use the regression model to predict which set of hyper-parameters is the best\n", 598 | "* evaluate that set of hyper-parameters\n", 599 | "* repeat.\n", 600 | "\n", 601 | "`scikit-optimize` provides a drop-in replacement for `GridSearchCV` and `RandomSearchCV` that performs all this on the inside:" 602 | ] 603 | }, 604 | { 605 | "cell_type": "code", 606 | "execution_count": 23, 607 | "metadata": { 608 | "collapsed": true 609 | }, 610 | "outputs": [], 611 | "source": [ 612 | "from skopt import BayesSearchCV" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "execution_count": 29, 618 | "metadata": {}, 619 | "outputs": [], 620 | "source": [ 621 | "bayes_search = BayesSearchCV(\n", 622 | " clf,\n", 623 | " {\"max_depth\": (1, 32),\n", 624 | " \"max_features\": (1, 96),\n", 625 | " \"min_samples_leaf\": (15, 40)\n", 626 | " },\n", 627 | " n_iter=15,\n", 628 | " scoring='roc_auc'\n", 629 | ")" 630 | ] 631 | }, 632 | { 633 | "cell_type": "code", 634 | "execution_count": 30, 635 | "metadata": {}, 636 | "outputs": [], 637 | "source": [ 638 | "bayes_search.fit(X_dev, y_dev)" 639 | ] 640 | }, 641 | { 642 | "cell_type": "code", 643 | "execution_count": 31, 644 | "metadata": {}, 645 | "outputs": [ 646 | { 647 | "name": "stdout", 648 | "output_type": "stream", 649 | "text": [ 650 | "Best test score: 0.9031\n" 651 | ] 652 | }, 653 | { 654 | "data": { 655 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEXCAYAAABCjVgAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8FdW5//HPQ4hCCMbrQQUhar0B4RpQRDR4K14qov6O\n0lirv2oKij9tjxzpoa3Wlqr1HG+tgNQqts1BrYqXHnqsIlG8oFyKUC4KUkAuioAGQrwQeH5/zGS6\nCTvJDmTY2cn3/XrtV/asWXvmWXt29rNnzcwac3dEREQAWqU7ABERaTqUFEREJKKkICIiESUFERGJ\nKCmIiEhESUFERCJKCtLimNlAM1tmZhVmdnG644mDmbmZfSOmZa80s7PjWLakn5KC7DUzO83M3jKz\ncjPbbGZvmlm/dMdVhzuA37h7rrs/l+5gmjIzm2xmv0h3HLLvtE53AJLZzOwA4M/ASOApYD9gEPBV\nI68ny913NNLiugCL9jCO1u5e1UhxiDQ52lOQvXU8gLtPcfcd7v6Fu//V3RdUVzCz68xsiZltNbPF\nZtYnLD/JzMrM7HMzW2RmFyW8ZrKZTTCzaWa2DRhsZvub2X+a2Woz+8TMJppZ27D+oWb253BZm81s\nppnt9vk2sw+BY4AXw+6j/c3sSDN7IXzdcjO7LqH+7Wb2tJn90cy2AFcnWeZkMxtvZn8Jl/mmmR1u\nZveb2WdmttTMeifUH2NmHya8H8MS5k0ws2cSpu82s+lmZnVtBDMbbWbrzWydmf3fGvPqet+KzGyN\nmf2HmW0Mu4aKw3klQDHw72G7XkxYbC8zWxDuHT5pZm3qik8yiLvrocceP4ADgE3A48B5wEE15v8f\nYC3QDzDgGwS/1LOB5cB/EOxdnAlsBU4IXzcZKAcGEvx4aQPcB7wAHAy0B14E7gzr3wlMDJebTbC3\nYrXEvBI4O2H6dWB8uI5ewKfAmeG824HtwMVhHG2TLG8ysBHoGy7jVeAfwFVAFvALYEaN9+TIcHmX\nA9uAI8J5OcAHBMlnULjcTvVsgyHAJ0B3oB3w34AD3wjn1/W+FQFVwL3A/sAZYTyJ2+EXSd6/d8M2\nHAwsAUak+7OoR+M80h6AHpn/AE4KvzzWhF8wLwAdwnkvATclec0g4GOgVULZFOD28Plk4PcJ8yz8\nsjo2oWwA8I/w+R3A89VfhPXEGyUF4ChgB9A+Yf6dwOTw+e3A6/UsbzLw24TpG4ElCdMFwOd1vH4+\nMDRh+mRgM7AKGJ5Cex4F7kqYPr46KaTwvlUnhXYJ858CfpLQtmRJ4cqE6V8BE9P9OdSjcR7qPpK9\n5u5L3P1qd+9E8Gv1SOD+cPZRwIdJXnYk8JG770woWwV0TJj+KOH5YQS/oueGXUSfA/8blgPcQ7Dn\n8VczW2FmY1IM/0hgs7tvTTGO2nyS8PyLJNO51RNmdpWZzU9oR3fg0Or57v4OsILgC/2pFNuQGOOq\nhOf1vW8An7n7thqvP7KedX6c8LyShPZJZlNSkEbl7ksJfl12D4s+Ao5NUnUdcFSNfv/OBF1N0eIS\nnm8k+HLt5u4Hho88d88N17vV3f/N3Y8BLgJ+aGZnpRDyOuBgM2ufYhx7xcy6AL8FRgGHuPuBwN8J\nEkB1nRsIunLWAf+ewmLXEyTfap0Tntf5voUOMrN2NV6/LnyuYZRbGCUF2StmdqKZ/ZuZdQqnjwKG\nA7PCKo8At5hZXwt8I/xifIfgF+a/m1m2mRUB3wKeSLaecI/it8B9ZvYv4bo6mtk3w+cXhss2gmMR\nO4CdyZZVY7kfAW8Bd5pZGzPrAXwP+OMevSH1a0fwRftpGPc1/DOBYmbHExyDuBL4DsH706ueZT4F\nXG1mXc0sB7itekZ971uCn5nZfmY2CLgQ+FNY/gnBgXlpIZQUZG9tJegDfyc8S2gWwS/ffwNw9z8B\n4wgOfm4FngMOdvevCZLAeQS/ZscDV4V7GrW5laCLaFZ4JtArwAnhvOPC6QrgbWC8u89IsQ3DgXyC\nX8dTgdvc/ZUUX9sg7r4Y+K8wxk8Ijje8CcHprgTJ6G53f8/dlxEciP+Dme1fxzL/QtBd9yrB+/Nq\njSp1vW8QdAV9RtD+UoKDxtXb4XdA17Drqd5rOsysc3imUuf66krTZO7aOxRpqcI9tD+Gx4NEtKcg\nIiL/pKQgkgHCi8sqkjz+ku7YpHlR95GIiES0pyAiIpGMGxDv0EMP9fz8/HSHkZJt27bRrl27+itm\nGLUrs6hdmSWuds2dO3ejux9WX72MSwr5+fnMmTMn3WGkpKysjKKionSH0ejUrsyidmWWuNplZqvq\nr6XuIxERSaCkICIiESUFERGJKCmIiEhESUFERCJKCiIiElFSEBGRiJKCiIhElBRERCSipCAiIhEl\nBRERiSgpiIhIRElBREQiSgoiIhJRUhARkUhsScHMHjWzDWb291rmm5k9aGbLzWyBmfWJKxYREUlN\nnHsKk4Ehdcw/DzgufJQAE2KMRUREUhBbUnD314HNdVQZCvzeA7OAA83siLjiERGR+qXzdpwdgY8S\npteEZetrVjSzEoK9CTp06EBZWdm+iG+vVVRUZEysDaF2ZRa1K7Oku10ZcY9md58ETAIoLCz0TLkv\nq+4hm1nUrsyidsUjnWcfrQWOSpjuFJaJiEiapDMpvABcFZ6FdApQ7u67dR2JiMi+E1v3kZlNAYqA\nQ81sDXAbkA3g7hOBacD5wHKgErgmrlhERCQ1sSUFdx9ez3wHbohr/SIi0nC6ollERCJKCiIiElFS\nEBGRiJKCiGSW0lLIz4e5c4O/paXpjqhZyYiL10REgCABlJRAZWUwvWpVMA1QXJy+uJoR7SmISOYY\nO/afCaFaZWVQLo1CSUEkLtXdHK1aqZujsaxe3bByiT6HfaFvKtXVfSQSB3VzxKNz5+C9TFYuu6v5\nOUyB9hSaq3T/Sk33+tOtOXdzpHPbjhsHOTm7luXkBOWyu2Sfw3poT6E5Svev1HSvvylort0c6d62\n1euoTq5dugQJoaV8rhpqDz5v2lPIJKn+Qkv3r9R0r78p6NyZ0gLIvxla3Rb8LS0g87s5msK2LS6G\nlSuhb9/grxJC7fbg86akkClKSym97xryh62i1U+d/GGrKL3vmuSJYfXq5F9Ie/srNdXzw+NafwYp\nvfV8Si6CVQeCW/C35KKgPKM11z2g5mrcOEr7ZpN/M8xN8b6WSgoZovSRmyj55vZdv2S+uZ3SR27a\nve4ZB1PyrRpfSN8Kyvc8gLDboPogX3W3QZLEEMv6M8zYr6ZRmb1rWWV2UJ7RmsAeUOnCUvLvz2fu\n+rnk359P6cIWdryqAUp7QMlFxqoDU3+NkkKGGNtrE5X77VpWuV9Qvlvds0le9+y9CWAspcdWBr84\njgy/DI5N3m0Qy/ozzOry5L+cayvPFOneAypdWErJiyWsKg9+nKwqX0XJiyVKDLUYO30slf51g16j\npJAhVuelXr66anPyurWUp6L0gFXRr39I+PV/wO6nB8ax/kzTOS/5L+fayjNFuveAxk4fS+X2XY9p\nVG6vZOz0FnS8qgH25EeIkkKG6Jx9SMrlcXwhjf1mVvJf/9/M2ifrzzTjzhpHTvaup07mZOcw7qzM\nPnUy3XtA6V5/ptmT/zklhTjEMGDXuIseIMd2/VbOsf0Yd9EDu9eN4Qtpde6OlMub6xdiQxQXFDPp\nW5PoktcFw+iS14VJ35pEcUFmnymT7oSf7vVnmmT/i/VRUmhsCWcJzT2Sus8SaoDigmImDXt01y+Z\nYY8m/ZKJ4wupc16XlMub6xdiQxUXFLPy5pXsvG0nK29e2Szan+6En+71Z5rE/8VU6eK1RlZ9llB1\nV0v1WUI8chPFe3k+dXFBccpfLA2pm4pxZ42j5MWSXfpz6/pnbOz1S9NQvU3HTh/L6vLVdM7rzLiz\nxu2zbZ24foAueV326fozUfX/ov3A5qZSX0mhkdV1llAmf2z1zyjV0p3wq9dfVlbGyuEr0xZHc6Wk\n0MgacpZQptE/o0jzp2MKjawhZwmJiDQ1SgoNUDrhevJHt6bV7Ub+6NaUTrh+tzoNOUtIRKSpUVJI\nUemE6ylZO4FVuTuCKzlzd1CydsJuiaG4oJjv5g4ia2cwnbUTvps7SH3vIpIRlBRSNHbFpORXcq6Y\ntEtZ6YTreXzzdHaE7+yOVvD45ulJ9ypERJoaJYUUrW5Xy8VbNcpTTR4iIk2RkkKKDq7l5kU1y1NN\nHiIiTZGSQiPrvG33sYDqKhcRaUqUFFK0uZbhQ2qWjzumhJztu5blbA/KRUSaOiWFFKV6/UHxyPFM\n6jiSLhXBnkGXiiwmdRxJ8cjxsccoIrK3lBRS1JDrD4pHjmflPVX0PaIvK++pUkIQkYwRa1IwsyFm\n9r6ZLTezMUnm55nZi2b2npktMrNr4oxnbzRklFIRkUwV29hHZpYFPAScA6wBZpvZC+6+OKHaDcBi\nd/+WmR0GvG9mpe4NvH/cPpLugcBEROIW555Cf2C5u68Iv+SfAIbWqONAezMzIBfYDFTFGJOIiNTB\n3D2eBZtdBgxx92vD6e8AJ7v7qIQ67YEXgBOB9sDl7v4/SZZVApQAdOjQoe8TTzwRS8yNraKigtzc\n3HSH0ejUrsyidmWWuNo1ePDgue5eWF+9dA+d/U1gPnAmcCzwspnNdPctiZXcfRIwCaCwsNCLior2\ndZx7pKysjEyJtSHUrsyidmWWdLcrzu6jtcBRCdOdwrJE1wDPemA58A+CvQYREUmDOJPCbOA4Mzva\nzPYDriDoKkq0GjgLwMw6ACcAK2KMSURE6hBbUnD3KmAU8BKwBHjK3ReZ2QgzGxFW+zlwqpktBKYD\nt7r7xrqWO3fd3FrvZSAiInsn1mMK7j4NmFajbGLC83XAuQ1dbvW9DJiALgwTEWlEGXtFs4ajFhFp\nfBmbFEDDUYuINLaMTgoajlpEpHFlbFLQcNQiIo0vI5OChqMWEYlHuq9obrC+R/Zlzj1z0h2GiEiz\nlJF7CiIiEg8lBRERiSgpiIhIRElBREQiSgoiIhJRUhARkYiSgoiIRJQUREQkoqQgIiIRJQUREYko\nKYiISERJQUREIkoKIiISUVIQEZGIkoKIiESUFEREJKKkICIiESUFERGJKCmIiEhESUFERCJKCiIi\nElFSEBGRiJKCiIhElBRERCQSa1IwsyFm9r6ZLTezMbXUKTKz+Wa2yMxeizMeERGpW+u4FmxmWcBD\nwDnAGmC2mb3g7osT6hwIjAeGuPtqM/uXuOIREZH6pbynYGanmdk14fPDzOzoel7SH1ju7ivc/Wvg\nCWBojTrfBp5199UA7r4h9dBFRKSxmbvXX8nsNqAQOMHdjzezI4E/ufvAOl5zGcEewLXh9HeAk919\nVEKd+4FsoBvQHnjA3X+fZFklQAlAhw4d+j7xxBMNaGL6VFRUkJubm+4wGp3alVnUrswSV7sGDx48\n190L66uXavfRMKA3MA/A3deZWfu9iC9x/X2Bs4C2wNtmNsvdP0is5O6TgEkAhYWFXlRU1Airjl9Z\nWRmZEmtDqF2ZRe3KLOluV6pJ4Wt3dzNzADNrl8Jr1gJHJUx3CssSrQE2ufs2YJuZvQ70BD5ARET2\nuVSPKTxlZg8DB5rZdcArwG/rec1s4DgzO9rM9gOuAF6oUed54DQza21mOcDJwJLUwxcRkcaU0p6C\nu/+nmZ0DbAFOAH7q7i/X85oqMxsFvARkAY+6+yIzGxHOn+juS8zsf4EFwE7gEXf/+160R0RE9kK9\nSSE8tfQVdx8M1JkIanL3acC0GmUTa0zfA9zTkOWKiEg86u0+cvcdwE4zy9sH8YiISBqleqC5Alho\nZi8D26oL3f3/xRKViIikRapJ4dnwISIizViqB5ofD88gOj4set/dt8cXloiIpENKp6SaWRGwjGAs\no/HAB2Z2eoxxiWS80gnXkz+6Na1uN/JHt6Z0wvXpDkmkXql2H/0XcK67vw9gZscDUwiuRhaRGkon\nXE/J2glUhqMVrMrdQcnaCTABikeOT29wInVI9eK17OqEABAOQ5EdT0gimW/siklU1vgPqcwOykWa\nslSTwhwzeyS890GRmf0WmBNnYCKZbHW7HQ0qF4lLdTcmR6TWs5Nq99FI4Aag+hTUmQTHFkQkic7b\nsliVu3sC6LwtKw3RSEtVsxszFanuKbQmGNb6Ene/BHiQYOgKEUli3DEl5NQ4Py9ne1Ausq8k68as\nT6pJYTrB0NbV2hIMiiciSRSPHM+kjiPpUpGFOXSpyGJSx5E6yCz71J50V6bafdTG3SuqJ9y9IhzV\nVERqUTxyPMXqZZU0qq0bsy6p7ilsM7M+1RNmVgh80aA1iYjIPpWsG7M+qe4p3Az8yczWhdNHAJc3\nbFUiIrIvFY8cDxOCYwurSG2Poc49BTPrZ2aHu/ts4ETgSWA78L/AP/Y2YBERiVfxyPGsvKcK1jM3\nlfr1dR89DHwdPh8A/AfBUBefEd4zWUREmo/6uo+y3H1z+PxyYJK7PwM8Y2bz4w1NRET2tfr2FLLM\nrDpxnAW8mjAv1eMRIiKSIer7Yp8CvGZmGwnONpoJYGbfAMpjjk1ERPaxOpOCu48zs+kEZxv91d09\nnNUKuDHu4EREZN+qtwvI3WclKfsgnnBERCSdUr14TUREWgAlBRERiSgpiIhIRElBREQiSgoiIhJR\nUhARkYiSgoiIRJQUREQkoqQgIiIRJQUREYnEmhTMbIiZvW9my81sTB31+plZlZldFmc8IiJSt9iS\ngpllEdyQ5zygKzDczLrWUu9u4K9xxSIiIqmJc0+hP7Dc3Ve4+9fAE8DQJPVuBJ4BNsQYi4iIpCDO\nG+V0BD5KmF4DnJxYwcw6AsOAwUC/2hZkZiVACUCHDh0oKytr7FhjUVFRkTGxNoTalVnUrsyS7nal\n++5p9wO3uvtOM6u1krtPIrwndGFhoRcVFe2b6PZSWVkZmRJrQ6hdmUXtyizpblecSWEtcFTCdKew\nLFEh8ESYEA4FzjezKnd/Lsa4RESkFnEmhdnAcWZ2NEEyuAL4dmIFdz+6+rmZTQb+rIQgIpI+sSUF\nd68ys1HAS0AW8Ki7LzKzEeH8iXGtW0RE9kysxxTcfRowrUZZ0mTg7lfHGYuIiNRPVzSLiEhESUFE\nRCJKCiIiElFSEBGRiJKCiIhElBRERCSipCAiIhElBRERiSgpiIhIRElBREQiSgoiIhJRUhARkYiS\ngoiIRJQUREQkoqQgIiIRJQUREYkoKYiISERJQUREIkoKIiISUVIQEZGIkoKIiESUFEREJKKkICIi\nESUFERGJKCmIiEhESUFERCJKCiIiElFSEBGRiJKCiIhElBRERCQSa1IwsyFm9r6ZLTezMUnmF5vZ\nAjNbaGZvmVnPOOMREZG6xZYUzCwLeAg4D+gKDDezrjWq/QM4w90LgJ8Dk+KKR0RE6hfnnkJ/YLm7\nr3D3r4EngKGJFdz9LXf/LJycBXSKMR4REamHuXs8Cza7DBji7teG098BTnb3UbXUvwU4sbp+jXkl\nQAlAhw4d+j7xxBOxxNzYKioqyM3NTXcYjU7tyixqV2aJq12DBw+e6+6F9dVr3ehr3gNmNhj4HnBa\nsvnuPomwa6mwsNCLior2XXB7oaysjEyJtSHUrsyidmWWdLcrzqSwFjgqYbpTWLYLM+sBPAKc5+6b\n9mRF27dvZ82aNXz55Zd7FGhc8vLyWLJkSbrDaHQtqV1t2rShU6dOZGdnpykqkX0rzqQwGzjOzI4m\nSAZXAN9OrGBmnYFnge+4+wd7uqI1a9bQvn178vPzMbO9iblRbd26lfbt26c7jEbXUtrl7mzatIk1\na9Zw9NFHpzEykX0ntgPN7l4FjAJeApYAT7n7IjMbYWYjwmo/BQ4BxpvZfDObsyfr+vLLLznkkEOa\nVEKQzGdmHHLIIU1uD1QkTrEeU3D3acC0GmUTE55fC+x2YHlPKCFIHPS5kpZGVzSLiEhESaERbNq0\niV69etGrVy8OP/xwOnbsSK9evRg4cCBff/11Ssu45ppreP/99+us89BDD1FaWtoYIYuIJNUkTknd\n50pLYexYWL0aOneGceOguHiPF3fIIYcwf/58AG6//XZyc3O55ZZb2Lp1K/vttx8QHLR0d1q1Sp6H\nH3vssXrXc8MNN+xxjHGqr20ikjla3n9xaSmUlMCqVeAe/C0pCcob2YcffkjXrl0pLi6mW7durF+/\nnpKSEgoLC+nWrRt33HFHVPe0005j/vz5VFVVceCBBzJmzBh69uzJgAED2LBhAwA//vGPuf/++6P6\nY8aMoX///pxwwgm89dZbAGzbto1LL72Url27ctlll1FYWBglrESjR4+ma9eu9OjRg1tvvRWAjz/+\nmKFDh9KjRw969uzJO++8A8CvfvUrunfvTvfu3fn1r38NwPLly3dr21/+8hcGDBhAnz59uPzyy9m2\nbVut6xKRpqnlJYWxY6GycteyysqgPAZLly7lBz/4AYsXL6Zjx47cddddzJkzh/fee4+XX36ZxYsX\n7/aa8vJyzjjjDN577z0GDBjAo48+mnTZ7s67777LPffcEyWYX//61xx++OEsXryYn/zkJ/ztb3/b\n7XWffPIJ06ZNY9GiRSxYsIAf/ehHQLAncs4557BgwQLmzp3LSSedxDvvvENpaSmzZ8/m7bffZvz4\n8SxatGi3tmVnZ3PXXXcxffp05s2bR48ePXjggQdqXZeINE0tLymsXt2w8r107LHHUlj4zyvLp0yZ\nQp8+fejTpw9LlixJmhTatm3LeeedB0Dfvn1ZuXJl0mVfcsklu9V54403uOKKKwDo2bMn3bp12+11\nBx98MK1ateK6665j6tSptGvXDgiupPz+978PQOvWrTnggAN44403uPTSS2nbti3t27fn4osvjvZK\nEtv21ltvsXjxYk499VR69epFaWkpK1eurHVdItI0tbyk0Llzw8r3UuKX4LJly3jggQd49dVXWbBg\nAUOGDEl6Dnz1cQiArKwsqqqqki57//33r7dOMtnZ2cyZM4eLL76Y5557jgsuuCCa15BTMBPb5u4M\nGTKE+fPnM3/+fBYvXsykSZPqXJeIND0tLymMGwc5ObuW5eQE5THbsmUL7du354ADDmD9+vW89NJL\njb6OgQMH8tRTTwGwcOHCpHsiW7duZcuWLVx44YXcd999URfT4MGDmTgxuIxkx44dbNmyhUGDBjF1\n6lS++OILKioqeP755zn11FN3W+app57Ka6+9xooVK4Dg2MayZctqXZeINE0t7+yj6rOMGvHso1T1\n6dOHrl27cuKJJ9KlSxcGDhzY6Ou48cYbueqqq+jatWv0yMvL26VOeXk5l1xyCV999RU7d+7k3nvv\nBeA3v/kN1113HQ8//DCtW7fm4Ycfpn///gwfPpx+/foBMHLkSLp168Ynn3yyyzI7dOjA7373Oy6/\n/PLoNNxf/vKXtG3bNum6RKRpim3o7LgUFhb6nDm7joaxZMkSTjrppDRFVLt0jBFUVVVFVVUVbdq0\nYdmyZZx77rksW7aM1q0bL/+3lLGPqjXVz1eq0j3qZlzUroYxs8wZOlsaT0VFBWeddRZVVVW4e/Sr\nX0QkFfq2aGYOPPBA5s6dm+4wRCRDtbwDzSIiUislBRERiSgpiIhIRElBREQiSgqN5OOPP+aKK67g\n2GOPpW/fvpx//vksW7Ys3WEllZ+fz8aNGwGSXogGcPXVV/P000/XuZzJkyezbt26aPraa69NerGc\niGSOFpkUSheWkn9/Pq1+1or8+/MpXbh3I6S6O8OGDaOoqIgPP/yQuXPncuedd/Lpp5/uUq8hQ1Hs\nK9XjGO2JmknhkUceoWvXro0RVqNqiu+7SFPV4pJC6cJSSl4sYVX5KhxnVfkqSl4s2avEMGPGDLKz\nsxkxYkRU1rNnT0499VTKysoYNGgQF110UfSFee+990ZDUVcPhb1t2zYuuOACevbsSffu3XnyyScB\nGDNmTDTs9C233LLbuidOnMjo0aOj6cmTJzNq1CgALr74Yvr27Uu3bt2YNGlS0thzc3OBILGNGjWK\nE044gbPPPjsarhvgjjvuoF+/fnTv3p2SkhLcnaeffpo5c+ZQXFxMr169+OKLLygqKqL6wsIpU6ZQ\nUFBA9+7ddxkuOzc3l7Fjx9KzZ09OOeWU3a6MBnjttdeimxb17t2brVu3AnD33XdTUFBAz549GTNm\nDADz58/nlFNOoUePHgwbNozPPvsMgKKiIm6++WYKCwt54IEH+PTTT7n00kvp168f/fr1480339xt\nXaeddlq0LpEWq/oGKZny6Nu3r9e0ePHi3cpq0+W+Ls7t7Pbocl+XlJdR0wMPPOA333zzbuVbtmzx\nGTNmeE5Ojq9YscLd3efMmePdu3f3iooK37p1q3ft2tXnzZvnTz/9tF977bXRaz///HPfuHGjH3/8\n8b5z5053d//ss892W8eGDRv82GOPjaaHDBniM2fOdHf3TZs2ubt7ZWWld+vWzTdu3Bi8B126+Kef\nfuru7u3atXN392eeecbPPvtsr6qq8rVr13peXp7/6U9/2mU57u5XXnmlP/nkk+7ufsYZZ/js2bOj\nedXTa9eu9aOOOso3bNjg27dv98GDB/vUqVPd3R3wF154wd3dR48e7T//+c93a9OFF17ob7zxhru7\nb9261bdv3+7Tpk3zAQMG+LZt23aJqaCgwMvKytzd/Sc/+YnfdNNNUSwjR46Mljl8+PDofVm1apWf\neOKJu61r3bp1vn379t3iacjnqymaMWNGukOIhdrVMMAcT+E7tsXtKawuTz5Edm3ljaF///4cffTR\nQDC09bBhw2jXrh25ublccsklzJw5k4KCAl5++WVuvfVWZs6cSV5eHnl5ebRp04bvfe97PPvss+TU\nHMgPOOywwzjmmGOYNWsWmzZtYunSpdGYSg8++GD0i/yjjz6q8xjH66+/zvDhw8nKyuLII4/kzDPP\njObNmDGDk08+mYKCAl599VWWLFlSZ3tnz55NUVERhx12GK1bt6a4uJjXX38dCEaAvfDCC4HahwUf\nOHAgP/zhD3nwwQf5/PPPad26Na+88grXXHNN9B4cfPDBlJeX8/nnn3PGGWcA8N3vfjdaD8Dll18e\nPX/llVf4fbs9AAAKFElEQVQYNWoUvXr14qKLLmLLli1UVFTssq7y8nJd/S0tXotLCp3zkg+RXVt5\nKrp161bnVcSp3EPg+OOPZ968eRQUFPDjH/+YO+64g9atW/Puu+9y2WWX8ec//5khQ4awY8eOqLvj\npz/9KQBXXHEFTz31FM888wzDhg3DzCgrK+OVV17h7bff5r333qN3795Jh+muz5dffsn111/P008/\nzcKFC7nuuuv2aDnVsrOzo+G5axvye8yYMTzyyCN88cUXDBw4kKVLl+7RuhLf9507dzJr1qxoaO+1\na9eSm5u7y7rOPffcPV6XSHPR4pLCuLPGkZO96y/unOwcxp2150Nnn3nmmXz11Ve79NsvWLAg6UHc\nQYMG8dxzz1FZWcm2bduYOnUqgwYNYt26deTk5HDllVcyevRo5s2bR0VFBeXl5Zx//vncd999vPfe\ne2RlZUVfbNV3Wxs2bBjPP/88U6ZMiW6wU15ezkEHHUROTg5Lly5l1qxZdbbh9NNP58knn2THjh2s\nX7+eGTNmAEQJ4NBDD6WiomKXM5Lat2+ftA++f//+vPbaa2zcuJEdO3YwZcqU6Nd8Kj788EMKCgq4\n9dZb6devH0uXLuWcc87hscceozK8a97mzZvJy8vjoIMOYubMmQD84Q9/qHU95557bnQrUSC6RWni\nuvr06aOkIC1ei9tXLi4IhsgeO30sq8tX0zmvM+POGheV7wkzY+rUqdx8883cfffdtGnThvz8fH7x\ni19QXl6+S90+ffpw9dVX079/fyA4jbN379689NJLjB49mlatWpGdnc2ECRPYunUrQ4cO5csvv8Td\nax12+qCDDuKkk05i8eLF0XKHDBnCxIkTOemkkzjhhBM45ZRT6mzDsGHDePXVV+natSudO3dmwIAB\nQDCW0nXXXUf37t05/PDDoyG0IThtdcSIEbRt25a33347Kj/iiCO46667GDx4MO7OBRdcwNChQ1N+\nP++//35mzJhBq1at6NatG+eddx77778/8+fPp7CwkP3224/zzz+fX/7ylzz++OOMGDGCyspKjjnm\nGB577LGky3zwwQe54YYb6NGjB1VVVZx++ulMnDhxl3Udf/zx0R3vRFoqDZ0do5Y2xHSm09DZmUXt\n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\n", 656 | "text/plain": [ 657 | "" 658 | ] 659 | }, 660 | "metadata": {}, 661 | "output_type": "display_data" 662 | } 663 | ], 664 | "source": [ 665 | "plot_grid_scores(\"max_depth\", bayes_search.cv_results_)" 666 | ] 667 | }, 668 | { 669 | "cell_type": "code", 670 | "execution_count": 32, 671 | "metadata": {}, 672 | "outputs": [ 673 | { 674 | "data": { 675 | "text/plain": [ 676 | "{'max_depth': 17, 'max_features': 96, 'min_samples_leaf': 38}" 677 | ] 678 | }, 679 | "execution_count": 32, 680 | "metadata": {}, 681 | "output_type": "execute_result" 682 | } 683 | ], 684 | "source": [ 685 | "bayes_search.best_params_" 686 | ] 687 | }, 688 | { 689 | "cell_type": "code", 690 | "execution_count": 33, 691 | "metadata": {}, 692 | "outputs": [ 693 | { 694 | "data": { 695 | "text/plain": [ 696 | "0.90312348138963017" 697 | ] 698 | }, 699 | "execution_count": 33, 700 | "metadata": {}, 701 | "output_type": "execute_result" 702 | } 703 | ], 704 | "source": [ 705 | "bayes_search.best_score_" 706 | ] 707 | }, 708 | { 709 | "cell_type": "markdown", 710 | "metadata": {}, 711 | "source": [ 712 | "## Bonus questions\n", 713 | "\n", 714 | "* try `RandomSearchCV` with a more complex estimator\n", 715 | "* use the `sklearn` `Pipeline` class to incorporate your preprocessing steps in the hyper-parameter optimization.\n", 716 | "* come back to this after learning about other ways of dealing with categorical values and treat different encoding schemes as a hyper-parameter that needs optimizing." 717 | ] 718 | } 719 | ], 720 | "metadata": { 721 | "kernelspec": { 722 | "display_name": "Python 3", 723 | "language": "python", 724 | "name": "python3" 725 | }, 726 | "language_info": { 727 | "codemirror_mode": { 728 | "name": "ipython", 729 | "version": 3 730 | }, 731 | "file_extension": ".py", 732 | "mimetype": "text/x-python", 733 | "name": "python", 734 | "nbconvert_exporter": "python", 735 | "pygments_lexer": "ipython3", 736 | "version": "3.6.2" 737 | } 738 | }, 739 | "nbformat": 4, 740 | "nbformat_minor": 2 741 | } 742 | --------------------------------------------------------------------------------