{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exercise Set 4: Supervised learning\n",
"\n",
"In this exercise set, we will mainly be looking at different supervised learning algorithms, both tinkering around with them and seeing how the models perform for a given dataset. We will look at:\n",
"\n",
"- Logistic regression\n",
"- Decision tree\n",
"- Ensemble methods\n",
" - Random Forest\n",
" - AdaBoost\n",
"- Neural network\n",
"\n",
"If you in general need more information about models or how to tune their hyperparameters, try looking up the documentation or googling `hyperparameter tuning + model_name`\n",
"\n",
"\n",
"Throughout your career, you've probably worked with many problems. Some problems can easily be formulated as regression problem, whereas others are easily formulated as a classification problem."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.1**\n",
"> \n",
"> Name three different problems which you've worked with where the outcome of interest was:\n",
"> - Continuous (regression) \n",
"> - Categorical (classification)\n",
"> \n",
"> Have you encountered problems where the outcome of interest could be both continuous and categorical?\n",
"> Would being able to predict these outcomes of interest be valuable?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For this session, I invite you to use a dataset of your own, as different models work best for different problems:\n",
"\n",
"- This can be either a regression problem or a classification problem. \n",
" \n",
"- Feel free to preprocess in another program and export it as a `csv` file or another format of your choosing\n",
"\n",
"The exercises are designed with a classification problem in mind, but all exercises except the ones about confusion matrices can be exchanged for regression problems by changin from a `Classifier` to a `Regressor` model.\n",
"\n",
"The dataset I've decided upon is a dataset regarding classification of high income people, namely the [Census Income Data Set from the UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/Census+Income). I've reduced the amount of features and sample size, as well as done a little bit of cleaning, from the full sample to reduce computation time. All the categorical features are one-hot encoded."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
high_income
\n",
"
age
\n",
"
education_num
\n",
"
hours_per_week
\n",
"
capital_gain
\n",
"
capital_loss
\n",
"
sex_female
\n",
"
sex_male
\n",
"
race_black
\n",
"
race_white
\n",
"
marital_status_divorced
\n",
"
marital_status_married_civ_spouse
\n",
"
marital_status_never_married
\n",
"
\n",
" \n",
" \n",
"
\n",
"
count
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
876.000000
\n",
"
\n",
"
\n",
"
mean
\n",
"
0.243151
\n",
"
37.535388
\n",
"
10.070776
\n",
"
40.142694
\n",
"
1486.558219
\n",
"
88.038813
\n",
"
0.302511
\n",
"
0.697489
\n",
"
0.085616
\n",
"
0.914384
\n",
"
0.155251
\n",
"
0.498858
\n",
"
0.345890
\n",
"
\n",
"
\n",
"
std
\n",
"
0.429230
\n",
"
13.106417
\n",
"
2.439581
\n",
"
11.915376
\n",
"
9766.347789
\n",
"
411.781508
\n",
"
0.459608
\n",
"
0.459608
\n",
"
0.279957
\n",
"
0.279957
\n",
"
0.362351
\n",
"
0.500284
\n",
"
0.475929
\n",
"
\n",
"
\n",
"
min
\n",
"
0.000000
\n",
"
17.000000
\n",
"
2.000000
\n",
"
2.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
25%
\n",
"
0.000000
\n",
"
27.000000
\n",
"
9.000000
\n",
"
40.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
1.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
50%
\n",
"
0.000000
\n",
"
37.000000
\n",
"
10.000000
\n",
"
40.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
1.000000
\n",
"
0.000000
\n",
"
1.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
75%
\n",
"
0.000000
\n",
"
46.000000
\n",
"
12.000000
\n",
"
45.000000
\n",
"
0.000000
\n",
"
0.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
0.000000
\n",
"
1.000000
\n",
"
0.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
\n",
"
\n",
"
max
\n",
"
1.000000
\n",
"
90.000000
\n",
"
16.000000
\n",
"
99.000000
\n",
"
99999.000000
\n",
"
3683.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
1.000000
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" high_income age education_num hours_per_week capital_gain \\\n",
"count 876.000000 876.000000 876.000000 876.000000 876.000000 \n",
"mean 0.243151 37.535388 10.070776 40.142694 1486.558219 \n",
"std 0.429230 13.106417 2.439581 11.915376 9766.347789 \n",
"min 0.000000 17.000000 2.000000 2.000000 0.000000 \n",
"25% 0.000000 27.000000 9.000000 40.000000 0.000000 \n",
"50% 0.000000 37.000000 10.000000 40.000000 0.000000 \n",
"75% 0.000000 46.000000 12.000000 45.000000 0.000000 \n",
"max 1.000000 90.000000 16.000000 99.000000 99999.000000 \n",
"\n",
" capital_loss sex_female sex_male race_black race_white \\\n",
"count 876.000000 876.000000 876.000000 876.000000 876.000000 \n",
"mean 88.038813 0.302511 0.697489 0.085616 0.914384 \n",
"std 411.781508 0.459608 0.459608 0.279957 0.279957 \n",
"min 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 0.000000 1.000000 \n",
"50% 0.000000 0.000000 1.000000 0.000000 1.000000 \n",
"75% 0.000000 1.000000 1.000000 0.000000 1.000000 \n",
"max 3683.000000 1.000000 1.000000 1.000000 1.000000 \n",
"\n",
" marital_status_divorced marital_status_married_civ_spouse \\\n",
"count 876.000000 876.000000 \n",
"mean 0.155251 0.498858 \n",
"std 0.362351 0.500284 \n",
"min 0.000000 0.000000 \n",
"25% 0.000000 0.000000 \n",
"50% 0.000000 0.000000 \n",
"75% 0.000000 1.000000 \n",
"max 1.000000 1.000000 \n",
"\n",
" marital_status_never_married \n",
"count 876.000000 \n",
"mean 0.345890 \n",
"std 0.475929 \n",
"min 0.000000 \n",
"25% 0.000000 \n",
"50% 0.000000 \n",
"75% 1.000000 \n",
"max 1.000000 "
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Suppress convergencewarnings if they appear\n",
"import warnings\n",
"from sklearn.exceptions import ConvergenceWarning\n",
"warnings.filterwarnings(action='ignore', category=ConvergenceWarning)\n",
"\n",
"# Actual code to load\n",
"import pandas as pd\n",
"\n",
"df = pd.read_csv('adult_preprocessed.csv')\n",
"df.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.2**\n",
"> \n",
"> What column in the DataFrame is the target of interest? Subset this as a `Series` called `y`, and the rest of the columns as a `DataFrame` called `X`\n",
"> \n",
">> *Hints:* \n",
">> \n",
">> `y = df['column_name']` subsets a column as a Series.\n",
">>\n",
">> `X = df.drop(columns='column_name')` drops a column in a dataframe"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"X = df.drop(columns='high_income')\n",
"y = df['high_income']\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.3**\n",
"> \n",
"> As a first step, you should split the data into a development and test set. Make a development and test split with 80% of the data in the development set. Name them `X_dev`, `X_test`, `y_dev` and `y_test`\n",
"> \n",
">> *Hints:*\n",
">> \n",
">> Try importing `train_test_split` from `sklearn.model_selection`\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.model_selection import train_test_split\n",
"X_dev, X_test, y_dev, y_test = train_test_split(X, y, train_size=0.8, random_state=73)\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Validation curves\n",
"\n",
"Last week, you were introduced to validation curves. This is a way of getting an understanding how a single hyperparameter changes the performance of a model on both seen and unseen data. We will be using this tool throughout these exercises to probe the models and see how the hyperparameters change the performance of the model.\n",
"\n",
"Below I've created a snippet of code, which you can copy and use to create the validation curves. This is essentially a function, but I've refrained from creating a function so you can easily change it around.\n",
"\n",
"To use it, we need to define four things:\n",
"\n",
"- A modelling pipeline, e.g. a `Pipeline` with `PolynomialFeatures`, `StandardScaling` then `Lasso`\n",
"- A scoring method, e.g. `neg_mean_squared_error` or `accuracy`, see [this list for potential candidates](https://scikit-learn.org/stable/modules/model_evaluation.html#the-scoring-parameter-defining-model-evaluation-rules)\n",
"- A hyperparameter range, e.g. `np.logspace(-4, 4, 10)`\n",
"- The name of the modelling step and the hyperparameter name, e.g. `lasso__alpha`\n",
"\n",
"\n",
"Also make sure that your development data is called `X_dev` and `y_dev`.\n",
"\n",
"Note that you can change the scale (normal vs log) by changing `logx` to `False`\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (2883952296.py, line 6)",
"output_type": "error",
"traceback": [
"\u001b[1;36m File \u001b[1;32m\"C:\\Users\\wkg579\\AppData\\Local\\Temp\\ipykernel_16852\\2883952296.py\"\u001b[1;36m, line \u001b[1;32m6\u001b[0m\n\u001b[1;33m pipeline = # FILL IN\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"from sklearn.model_selection import validation_curve\n",
"from sklearn.pipeline import Pipeline\n",
"import pandas as pd\n",
"\n",
"# Modelling pipeline we want to use\n",
"pipeline = # FILL IN\n",
"\n",
"# The measure we want to evaluate or model against\n",
"score_type = # FILL IN\n",
"\n",
"# A range of hyperparameter values we want to examine\n",
"param_range = # FILL IN\n",
"\n",
"# The name of the step in the pipeline and the name of the hyperparameter\n",
"param_name = # FILL IN\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=True, ax=ax)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Logistic Regression\n",
"\n",
"Here I give an example with LogisticRegression, as this is the only model we are going to be examining today which only supports classification."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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lbvuuott27Zx2WWX8fe///2c17v33nu58cYbufzyy8nIyCAjI4PExMRa17d06VKKi4u5//77q/z6r4OYiLgeH7MLEBH5rT179vDJJ5+wdu3a8pCyaNEi4uLi+Oijj7jhhhuYM2cOI0aM4N577wWgQ4cOrFu3jk8//bTKa4aEhBAYGEhRURHR0dFOqTEsLIyYmBiHryUi9U8tQCLicnbu3ImPjw/9+/cvP9a4cWM6duzIzp07Adi9ezf9+vWr8H2//XNdstvtWCyWerufiDiXApCIuBy73X7O42Who6oAcq7vqwsdOnQgJyeHjIyMeruniDiPApCIuJwuXbpQWlrKd999V37sxIkT/Pzzz3Tu3BmATp06sXHjxgrft3nz5vNe18/PD6vV6pQar7/+evz8/Hjuueeq/Hp2drZT7iMidUNjgETE5bRv357Ro0czZcoUXn31VUJDQ3nwwQdp3rw5o0ePBuDOO+/k4osv5qWXXmLUqFF8/fXXfPbZZ+ftlmrdujVffPEFu3fvpnHjxoSHh+Pr61urGuPi4nj55Ze54447yM3NZfz48bRu3ZrDhw+zcOFCQkJCNBVexIWpBUhEXNJbb71FQkICV155JQMGDMBut7N8+fLywDJw4ED+9a9/8dJLL9GjRw8+//xz7r77bgICAs55zSlTptCxY0f69OlD06ZNWbt2rUM13n777Xz55ZekpaVxzTXX0KlTJyZPnkxYWFj54GwRcU0We312mouI1KEpU6awa9cuVq9ebXYpIuLi1AUmIm7rhRde4LLLLiM4OJjPPvuMd955h3nz5pldloi4AbUAiYjbuvHGG1m1ahV5eXnEx8dz5513MnXq1Gp//9NPP83TTz9d5ddOnTpFcHBwlV9LSkris88+q1XNIuIaFIBExGNlZWWRlZVV5dcCAwM5ffr0Ob/WvHnzuixNROqYApCIiIh4HM0CExEREY+jACQiIiIeRwFIREREPI4CkIiIiHgcBSARERHxOApAIiIi4nEUgERERMTj/D9EDLP71h9nDwAAAABJRU5ErkJggg==",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.model_selection import validation_curve\n",
"from sklearn.pipeline import Pipeline\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Additional imports\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"# Pipeline with StandardScaler and LogisticRegression (could add PolynomialFeatures etc.)\n",
"\n",
"pipeline = Pipeline([\n",
" ('scaler', StandardScaler()),\n",
" ('logit', LogisticRegression())\n",
"])\n",
"\n",
"# I want to evaluate the hyperparameter with accuracy\n",
"score_type = 'accuracy'\n",
"\n",
"# Logarithmically spaced between 10^-4 and 10^4\n",
"param_range = np.logspace(-2, 2, 20)\n",
"\n",
"# Model step is called 'logit', hyperparameter is called 'C'\n",
"param_name = 'logit__C' # Remember two underscores\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
" \n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=True, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As expected, we find that lower values of `C` corresponds to higher regularization, which causes the model to underfit on both the training and test data. For higher values of `C` the model starts to overfit, where we see a gap between the train and validation scores. However, the out of sample performance does not seem to be too bad even with very little regularization."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Train
\n",
"
Validation
\n",
"
logit__C
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.805000
\n",
"
0.798571
\n",
"
0.010000
\n",
"
\n",
"
\n",
"
1
\n",
"
0.816071
\n",
"
0.807143
\n",
"
0.016238
\n",
"
\n",
"
\n",
"
2
\n",
"
0.826429
\n",
"
0.818571
\n",
"
0.026367
\n",
"
\n",
"
\n",
"
3
\n",
"
0.829286
\n",
"
0.822857
\n",
"
0.042813
\n",
"
\n",
"
\n",
"
4
\n",
"
0.829286
\n",
"
0.820000
\n",
"
0.069519
\n",
"
\n",
"
\n",
"
5
\n",
"
0.835714
\n",
"
0.821429
\n",
"
0.112884
\n",
"
\n",
"
\n",
"
6
\n",
"
0.838571
\n",
"
0.825714
\n",
"
0.183298
\n",
"
\n",
"
\n",
"
7
\n",
"
0.838929
\n",
"
0.824286
\n",
"
0.297635
\n",
"
\n",
"
\n",
"
8
\n",
"
0.841786
\n",
"
0.827143
\n",
"
0.483293
\n",
"
\n",
"
\n",
"
9
\n",
"
0.841429
\n",
"
0.828571
\n",
"
0.784760
\n",
"
\n",
"
\n",
"
10
\n",
"
0.843571
\n",
"
0.828571
\n",
"
1.274275
\n",
"
\n",
"
\n",
"
11
\n",
"
0.843571
\n",
"
0.827143
\n",
"
2.069138
\n",
"
\n",
"
\n",
"
12
\n",
"
0.842857
\n",
"
0.827143
\n",
"
3.359818
\n",
"
\n",
"
\n",
"
13
\n",
"
0.841429
\n",
"
0.828571
\n",
"
5.455595
\n",
"
\n",
"
\n",
"
14
\n",
"
0.841071
\n",
"
0.828571
\n",
"
8.858668
\n",
"
\n",
"
\n",
"
15
\n",
"
0.840714
\n",
"
0.827143
\n",
"
14.384499
\n",
"
\n",
"
\n",
"
16
\n",
"
0.840714
\n",
"
0.827143
\n",
"
23.357215
\n",
"
\n",
"
\n",
"
17
\n",
"
0.840714
\n",
"
0.827143
\n",
"
37.926902
\n",
"
\n",
"
\n",
"
18
\n",
"
0.840714
\n",
"
0.827143
\n",
"
61.584821
\n",
"
\n",
"
\n",
"
19
\n",
"
0.840714
\n",
"
0.827143
\n",
"
100.000000
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Train Validation logit__C\n",
"0 0.805000 0.798571 0.010000\n",
"1 0.816071 0.807143 0.016238\n",
"2 0.826429 0.818571 0.026367\n",
"3 0.829286 0.822857 0.042813\n",
"4 0.829286 0.820000 0.069519\n",
"5 0.835714 0.821429 0.112884\n",
"6 0.838571 0.825714 0.183298\n",
"7 0.838929 0.824286 0.297635\n",
"8 0.841786 0.827143 0.483293\n",
"9 0.841429 0.828571 0.784760\n",
"10 0.843571 0.828571 1.274275\n",
"11 0.843571 0.827143 2.069138\n",
"12 0.842857 0.827143 3.359818\n",
"13 0.841429 0.828571 5.455595\n",
"14 0.841071 0.828571 8.858668\n",
"15 0.840714 0.827143 14.384499\n",
"16 0.840714 0.827143 23.357215\n",
"17 0.840714 0.827143 37.926902\n",
"18 0.840714 0.827143 61.584821\n",
"19 0.840714 0.827143 100.000000"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"score_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.3**\n",
"> \n",
"> Having now examined how the logistic regression, we want to see how it performs on the test data. Create a pipeline with the best hyperparameter found before, fit on the development data and calculate the accuracy on the test data.\n",
"> \n",
">> *Hints:* \n",
">>\n",
">> Try importing `accuracy_score` from `sklearn.metrics`\n",
">>\n",
">> `best_param = score_df.iloc[score_df['Validation'].idxmax()][param_name]` gets the hyperparameter for the highest validation score\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test score 0.835\n"
]
}
],
"source": [
"### BEGIN SOLUTION\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"best_param = score_df.iloc[score_df['Validation'].idxmax()][param_name]\n",
"\n",
"pipeline = Pipeline([\n",
" ('scaler', StandardScaler()),\n",
" ('logit', LogisticRegression(C=best_param))\n",
"])\n",
"\n",
"pipeline.fit(X_dev, y_dev)\n",
"print(f'Test score {accuracy_score(pipeline.predict(X_test), y_test):.3f}')\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.4**\n",
"> \n",
"> Plot the confusion matrix using the pipeline from last exercise using the test set. Has the model learnt anything useful?\n",
">> *Hints*:\n",
">>\n",
">> Try importing `ConfusionMatrixDisplay` from `sklearn.metrics`\n",
">>\n",
">> If this fails, there also exists a deprecated function `sklearn.metrics.plot_confusion_matrix`, which is available in previous versions of `sklearn`\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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n9uuXbu8+rMG0LRI9sDPrrjiCvXv31+jR4/WnDlzdN555+ngwYN64403NHr0aPXp00d33nmnJkyYoD59+ujSSy/V888/r+3bt6tz586nvGdERIRmzJih6dOnKzw8XJdccokOHz6s7du3a+LEiWrbtq0iIyP11ltvqX379oqIiFBcXJyysrI0depUxcbGavjw4aqqqtLmzZtVUlKiadOmafz48crMzNTEiRN13333ae/evfrv//5vr77v2WefrdraWs2fP18jR47Uxx9/rCeffLLOeWFhYbrjjjv0xBNPKCwsTLfffrsuvvhid/J/4IEHNGLECCUlJekPf/iDQkJC9MUXX+jLL7/Uww8/7P3/CAA+x2x84Gc2m01vvPGGLr/8ct1yyy0699xzNW7cOO3du9c9e/66667TAw88oBkzZig1NVX79u3TX/7yl1+97/3336+77rpLDzzwgLp27arrrrtOxcXFko6Phz/xxBNavHixHA6HRo0aJUmaNGmSnnnmGS1dulQ9evTQwIEDtXTpUvejes2bN9drr72mHTt2qHfv3srMzNScOXO8+r69evVSbm6u5syZo+7du+v5559XTk5OnfOioqI0Y8YMjR8/Xv3791dkZKReeOEF9/Fhw4bp9ddfV15envr27auLL75Yubm56tixo1fxAGg8NsMXg38AAOCMRWUPAECQI9kDABDkSPYAAAQ5kj0AAEGOZA8AQJAj2QMAEORI9gAABDmSPQAAQY5kDwBAkCPZAwAQ5Ej2AAAEuf8PuReeALx6n7kAAAAASUVORK5CYII=",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.metrics import ConfusionMatrixDisplay\n",
"\n",
"disp = ConfusionMatrixDisplay.from_estimator(pipeline, X_test, y_test)\n",
"plt.show()\n",
"\n",
"# Not just predicting majority class, the model has indeed learnt something!\n",
"\n",
"# deprecated function\n",
"#from sklearn.metrics import plot_confusion_matrix\n",
"#plot_confusion_matrix(pipeline, X_test, y_test)\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.5**\n",
"> \n",
"> If you're using the dataset I gave you, you might have noticed that the class distribution is not completely equal, which can be seen both using summary statistics and in the confusion matrix. In this setting, a baseline model becomes even more important, as a model which guesses the majority class all the time might perform quite well if the data is imbalanced enough.\n",
">\n",
"> Create a pipeline with a baseline model that always guesses the majority class\n",
"> \n",
">> *Hints:* \n",
">> \n",
">> try importing `DummyClassifier` from `sklearn.dummy`\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test score 0.761\n"
]
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.dummy import DummyClassifier\n",
"\n",
"pipeline = Pipeline([\n",
" ('dummy', DummyClassifier())\n",
"])\n",
"\n",
"pipeline.fit(X_dev, y_dev)\n",
"\n",
"print(f'Test score {accuracy_score(pipeline.predict(X_test), y_test):.3f}')\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 1.6 (OPTIONAL)**\n",
"> \n",
"> What would the confusion matrix for this dummy classifier look like? Try plotting it: Was your intuition correct?\n",
">\n",
">> *Hints*:\n",
">>\n",
">> Try importing `ConfusionMatrixDisplay` from `sklearn.metrics`\n",
">>\n",
">> If this fails, there also exists a deprecated function `sklearn.metrics.plot_confusion_matrix`, which is available in previous versions of `sklearn`\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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AIQ4kj0AACGOZA8AQIgj2aPRWsJrGgF/eOeddzRu3Dg5HA7ZbDatX78+0CEBPkWyR6O0lNc0Av5QUVGhPn36aPny5YEOBfALbr1DowwePFj9+/f3eC1jz549NWHCBGVmZgYwMsC3bDab1q1bpwkTJgQ6FMBnqOzxk868pnHUqFEe44F4TSMAwHske/yklvSaRgCA90j2aLSW8JpGAID3SPb4SS3pNY0AAO+R7PGTWtJrGgEA3uOtd2iUlvKaRsAfTp48qQMHDrg/FxYWateuXYqPj1fnzp0DGBngG9x6h0ZbsWKFlixZ4n5N46OPPqqrrroq0GEBpr399tsaMWJEvfFp06Zp7dq1zR8Q4GMkewAAQhxz9gAAhDiSPQAAIY5kDwBAiCPZAwAQ4kj2AACEOJI9AAAhjmQPAECII9kDABDiSPaASenp6erbt6/7880336wJEyY0exxffvmlbDabdu3addZjunbtquzs7EZfc+3atWrXrp3p2Gw2m9avX2/6OgCahmSPkHTzzTfLZrPJZrOpVatW6tatm+666y5VVFT4/bsfe+yxRj9itTEJGgDM4kU4CFk///nPtWbNGtXW1urdd9/VjBkzVFFRoZUrV9Y7tra2Vq1atfLJ98bFxfnkOgDgK1T2CFl2u13JyclKSUnRlClTNHXqVHcr+Uzr/X/+53/UrVs32e12GYahEydO6LbbblNiYqJiY2P1s5/9TB9//LHHdR955BElJSUpJiZG06dP16lTpzz2/7CN73K5tHjxYp1//vmy2+3q3LmzFi1aJElKTU2VJPXr1082m03Dhw93n7dmzRr17NlTUVFR6tGjh1asWOHxPR999JH69eunqKgoDRw4UDt37vT6zygrK0u9e/dWmzZtlJKSotmzZ+vkyZP1jlu/fr0uuOACRUVFaeTIkSoqKvLY//e//10DBgxQVFSUunXrpgcffFB1dXVexwPAP0j2sIzo6GjV1ta6Px84cEAvvPCC/va3v7nb6Nddd52Ki4u1ceNGFRQUqH///rr66qv1zTffSJJeeOEFLVy4UIsWLVJ+fr46duxYLwn/0H333afFixfr/vvv12effabc3FwlJSVJOp2wJen111/X0aNH9dJLL0mSVq9erQULFmjRokXau3evMjIydP/99ysnJ0eSVFFRobFjx+rCCy9UQUGB0tPTddddd3n9ZxIWFqalS5dq9+7dysnJ0Ztvvqn58+d7HFNZWalFixYpJydH77//vsrKyjR58mT3/tdee0033nij5s6dq88++0yrVq3S2rVr3b/QAGgBDCAETZs2zRg/frz784cffmgkJCQYkyZNMgzDMBYuXGi0atXKKCkpcR/zxhtvGLGxscapU6c8rnXeeecZq1atMgzDMIYMGWLMmjXLY//gwYONPn36NPjdZWVlht1uN1avXt1gnIWFhYYkY+fOnR7jKSkpRm5ursfYww8/bAwZMsQwDMNYtWqVER8fb1RUVLj3r1y5ssFrfV+XLl2MRx999Kz7X3jhBSMhIcH9ec2aNYYkY9u2be6xvXv3GpKMDz/80DAMw7jyyiuNjIwMj+s89dRTRseOHd2fJRnr1q076/cC8C/m7BGyXnnlFbVt21Z1dXWqra3V+PHjtWzZMvf+Ll266JxzznF/Ligo0MmTJ5WQkOBxnaqqKn3++eeSpL1792rWrFke+4cMGaK33nqrwRj27t2r6upqXX311Y2O+9ixYyoqKtL06dN16623usfr6urc6wH27t2rPn36qHXr1h5xeOutt95SRkaGPvvsM5WVlamurk6nTp1SRUWF2rRpI0mKiIjQwIED3ef06NFD7dq10969e3XppZeqoKBA27dv96jknU6nTp06pcrKSo8YAQQGyR4ha8SIEVq5cqVatWolh8NRbwHemWR2hsvlUseOHfX222/Xu1ZTbz+Ljo72+hyXyyXpdCt/8ODBHvvCw8MlSYZhNCme7zt48KCuvfZazZo1Sw8//LDi4+P13nvvafr06R7THdLpW+d+6MyYy+XSgw8+qIkTJ9Y7JioqynScAMwj2SNktWnTRueff36jj+/fv7+Ki4sVERGhrl27NnhMz549tW3bNt10003usW3btp31mt27d1d0dLTeeOMNzZgxo97+yMhISacr4TOSkpLUqVMnffHFF5o6dWqD173ooov01FNPqaqqyv0LxY/F0ZD8/HzV1dXpz3/+s8LCTi/feeGFF+odV1dXp/z8fF166aWSpH379unbb79Vjx49JJ3+c9u3b59Xf9YAmhfJHvjONddcoyFDhmjChAlavHixLrzwQh05ckQbN27UhAkTNHDgQP3ud7/TtGnTNHDgQF1xxRV65plntGfPHnXr1q3Ba0ZFRemee+7R/PnzFRkZqcsvv1zHjh3Tnj17NH36dCUmJio6OlqbNm3Sueeeq6ioKMXFxSk9PV1z585VbGysxowZo+rqauXn56u0tFTz5s3TlClTtGDBAk2fPl1/+MMf9OWXX+pPf/qTVz/veeedp7q6Oi1btkzjxo3T+++/r8cff7zeca1atdIdd9yhpUuXqlWrVrr99tt12WWXuZP/Aw88oLFjxyolJUW//OUvFRYWpk8++USffvqp/vjHP3r/PwKAz7EaH/iOzWbTxo0bddVVV+mWW27RBRdcoMmTJ+vLL790r56/4YYb9MADD+iee+7RgAEDdPDgQf32t7/90evef//9uvPOO/XAAw+oZ8+euuGGG1RSUiLp9Hz40qVLtWrVKjkcDo0fP16SNGPGDP31r3/V2rVr1bt3bw0bNkxr165136rXtm1b/f3vf9dnn32mfv36acGCBVq8eLFXP2/fvn2VlZWlxYsXq1evXnrmmWeUmZlZ77jWrVvrnnvu0ZQpUzRkyBBFR0frueeec+8fPXq0XnnlFeXl5WnQoEG67LLLlJWVpS5dungVDwD/sRm+mPwDAAAtFpU9AAAhjmQPAECII9kDABDiSPYAAIQ4kj0AACGOZA8AQIgj2QMAEOJI9gAAhDiSPQAAIY5kDwBAiCPZAwAQ4v4/M6AWfRvXbLoAAAAASUVORK5CYII=",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.metrics import ConfusionMatrixDisplay\n",
"\n",
"disp = ConfusionMatrixDisplay.from_estimator(pipeline, X_test, y_test)\n",
"plt.show()\n",
"\n",
"# deprecated function\n",
"#from sklearn.metrics import plot_confusion_matrix\n",
"#plot_confusion_matrix(pipeline, X_test, y_test)\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Decision Tree\n",
"\n",
"Having now examined a logistic regression, baseline models and the confusion matrix, we turn to the more exotic models you were introduced to today, starting with the decision tree."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 2.1**\n",
"> \n",
"> What does the `max_depth` parameter in a decision tree do? Does the model overfit more or less if you increase this value?\n",
"> >\n",
"> Create a validation plot with values of `max_depth`. Use the values `np.unique(np.logspace(0, 4, 10).astype(int))` which returns integers which are evenly spaced on a log scale. Why should they be converted to integers? \n",
">\n",
">> *Hints*:\n",
">>\n",
">> Try importing `DecisionTreeClassifier` or `DecisionTreeRegressor` from `sklearn.tree`\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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dAmsAoSGhmK32wsl3KSkpEJJWConncOqT+ewatP5q/oq2zlUAKoA3t7exMbGsnjx4gLrFy9eTI8ePSyqSkpC57Dq0zms2nT+qr7Kdg51CcxFzpw5w549e/K/37dvH5s3b6ZWrVo0bNiQxx57jBEjRtCpUye6d+/O1KlTSUhI4P7777ewajmfzmHVp3NYten8VX1V6hyWy71lbmjp0qUGUGi566678vd59913jaioKMPb29vo2LGj8dNPP1lXsBSic1j16RxWbTp/VV9VOoeaC0xERETcjvoAiYiIiNtRABIRERG3owAkIiIibkcBSERERNyOApCIiIi4HQUgERERcTsKQCIiIuJ2FIBERETE7SgAiYiIiNtRABIRKQfTp0+nRo0aFfJao0aNYtiwYRXyWiLVhQKQiOTr06cPY8eOtboMuYj9+/djs9nYvHmz1aWIVHkKQCJSbIZhkJOTY3UZIiJlpgAkIoB5GeWnn37irbfewmazYbPZmD59OjabjW+//ZZOnTrh4+PDsmXLMAyDV155hcaNG+Pn50e7du2YN29egePt2LGD6667jsDAQMLCwhgxYgTHjx8vc519+vTh4YcfZuzYsdSsWZOwsDCmTp1KWload999N0FBQVxxxRV88803+c9xOByMHj2a6Oho/Pz8aN68OW+99Vb+9oyMDFq1asV9992Xv27fvn2EhITw/vvvF6uu6dOn07BhQ/z9/bnxxhs5ceJEoX0WLFhAbGwsvr6+NG7cmAkTJhQIlDabjSlTpjBo0CD8/PyIjo5m7ty5+dujo6MB6NChAzabjT59+hQ4/muvvUZ4eDi1a9fmwQcfJDs7u1i1i7glS+agF5FK5/Tp00b37t2NMWPGGImJiUZiYqKxZMkSAzDatm1rfPfdd8aePXuM48ePG08//bTRokULY9GiRcbevXuNDz/80PDx8TF+/PFHwzAM4/Dhw0ZoaKgxbtw4Y+fOncbGjRuNa6+91ujbt2+Z67zqqquMoKAg41//+pfx22+/Gf/6178MDw8PY9CgQcbUqVON3377zfjLX/5i1K5d20hLSzMMwzCysrKM5557zli7dq3x+++/G5988onh7+9vxMfH5x9306ZNhre3tzF//nwjJyfH6NmzpzF06NBi1bR69WrDZrMZEydONHbt2mW89dZbRo0aNYyQkJD8fRYtWmQEBwcb06dPN/bu3Wt89913RqNGjYx//vOf+fsARu3atY3333/f2LVrl/Hss88adrvd2LFjh2EYhrF27VoDMJYsWWIkJiYaJ06cMAzDMO666y4jODjYuP/++42dO3caCxYsMPz9/Y2pU6eW8V9bpPpSABKRfFdddZXx6KOP5n+/dOlSAzA+//zz/HVnzpwxfH19jZUrVxZ47ujRo43bb7/dMAzDGD9+vNG/f/8C2w8cOGAAxq5du8pcY69evfK/z8nJMQICAowRI0bkr0tMTDQAY9WqVRc9zgMPPGDcfPPNBda98sorRmhoqPHwww8b9erVM44dO1asmm6//XZj4MCBBdbFxcUVCEC9e/c2XnzxxQL7fPzxx0Z4eHj+94Bx//33F9ina9euxl/+8hfDMAxj3759BmBs2rSpwD533XWXERUVZeTk5OSvu/XWW424uLhi1S/ijjyta3sSkaqiU6dO+Y937NhBRkYG1157bYF9srKy6NChAwAbNmxg6dKlBAYGFjrW3r17adasWZnqadu2bf5ju91O7dq1adOmTf66sLAwAJKSkvLX/fvf/+aDDz7gjz/+4OzZs2RlZdG+ffsCx3388cf54osveOedd/jmm28IDQ0tVj07d+7kxhtvLLCue/fuLFq0KP/7DRs2sG7dOv7v//4vf53D4SAjI4P09HT8/f3zn3fhcYrT6blVq1bY7fb878PDw9m6dWux6hdxRwpAInJZAQEB+Y+dTicAX3/9NQ0aNCiwn4+PT/4+Q4YM4eWXXy50rPDw8DLX4+XlVeB7m81WYJ3NZitQ65w5c/jrX//KpEmT6N69O0FBQbz66qusWbOmwHGSkpLYtWsXdrud3bt3M3DgwGLVYxjGZfdxOp1MmDCBm266qdA2X1/fSz437/1cSlH/JnnvX0QKUwASkXze3t44HI5L7hMTE4OPjw8JCQlcddVVRe7TsWNHPvvsMxo1aoSnp/W/ZpYtW0aPHj144IEH8tft3bu30H733HMPrVu3ZsyYMYwePZqrr76amJiYyx4/JiaG1atXF1h34fcdO3Zk165dNGnS5JLHWr16NSNHjizwfV7Lmre3N8Blz5GIXJ71v5lEpNJo1KgRa9asYf/+/QQGBhbZghAUFMQTTzzBX//6V5xOJ7169SIlJYWVK1cSGBjIXXfdxYMPPsj777/P7bffzt/+9jdCQ0PZs2cPs2fP5v333y9wqaYiNGnShBkzZvDtt98SHR3Nxx9/zLp16/LvqgJ49913WbVqFb/88guRkZF888033HHHHaxZsyY/eFzMI488Qo8ePXjllVcYNmwY3333XYHLXwDPPfcc119/PZGRkdx66614eHjwyy+/sHXrVl544YX8/ebOnUunTp3o1asXM2fOZO3atfz3v/8FoG7duvj5+bFo0SIiIiLw9fUlJCTEhf9SIu5Dt8GLSL4nnngCu91OTEwMderUISEhocj9/vWvf/Hcc88xceJEWrZsyYABA1iwYEF+oKhfvz4rVqzA4XAwYMAAWrduzaOPPkpISAgeHhX/a+f+++/npptuIi4ujq5du3LixIkCrUG//vorf/vb33jvvfeIjIwEzEB0+vRpxo8ff9njd+vWjQ8++IB33nmH9u3b89133/Hss88W2GfAgAF89dVXLF68mM6dO9OtWzdef/11oqKiCuw3YcIEZs+eTdu2bfnoo4+YOXNmfiuUp6cnb7/9Nv/5z3+oX78+Q4cOLes/jYjbshnFuXgtIiLlzmazMX/+fE1rIVIB1AIkIiIibkcBSEQqVEJCAoGBgUUuHh4eeHh4XHT7xS7JlbdBgwZdtKYXX3zRkppEpGx0CUxEKlROTg779+8v1XOtuqvs0KFDnD17tshttWrVolatWhVckYiUlQKQiIiIuB1dAhMRERG3owAkIiIibkcBSERERNyOApCIiIi4HQUgERERcTsKQCIiIuJ2FIBERETE7fw/XguKq5S1cLYAAAAASUVORK5CYII=",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# Controls the maximum depth of the tree. \n",
"# Higher values permit more overfitting\n",
"\n",
"from sklearn.tree import DecisionTreeClassifier \n",
"\n",
"pipeline = Pipeline([\n",
" ('tree', DecisionTreeClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_range = np.unique(np.logspace(0, 4, 10).astype(int))\n",
"\n",
"param_name = 'tree__max_depth'\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range}) \n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=True, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 2.2**\n",
"> \n",
"> What does the `min_samples_split` parameter in a decision tree do? Does the model overfit more or less if you increase this value?\n",
"> \n",
"> Create a validation plot with values of `min_samples_split`. Use the values `np.arange(0.05, 1.05, 0.05)` which returns fractions from 0.05 to 1, spaced 0.05 apart. \n",
"> \n",
"> What do these fractions mean? "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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gU7nFkwsewAyDpf6oRP6NGNwhzoVVJiImEk9QCVQD5BIFZObDe/3hpTfILwbDP2yVPOBRMSxqAdIROR87l5w+4fg4Qf718LqV8yuSERMpgAkIs6hZmMYeG716E+vw54fzK1HREylACQizqPtbRAxHDDOzQdKNrsiETGJApCIOJd+0yCkDWSlwqcjIT/P7IpExAQKQCLiXNy9rfuFefjB/jWwerrZFYmICRSARMT5BDWFG9+yfv3Ta5Dwo6nliEjlUwASEefU7nboeB/W+UD3Q2aK2RWJSCVSABIR59V/OtRqDaePWecDFeSbXZGIVBIFIBFxXoXzgdx9YV8crH7V7IpEpJIoAImIcwtuBje+af169XTYu9rcekSkUigAiYi0j4arhgCGdSgs84jZFYlIBVMAEhEB6P8q1GoFp49aJ0VrPpBIlaYAJCIC4OFzbj6QDySutm6XISJVlgKQiEih4OYw4A3r16tfgcSfzK1HRCqMApCIyPk63AUd7gWjwDof6NRRsysSkQqgACQi8nc3vAbBLeHUEc0HEqmi3MwuQETE7hTOB5rXE/augthnoGkfs6sSqVo8/aFuR9Oe3mIYhmHas9upjIwMAgICSE9Px9/f3+xyRMQs2z6Bzx8yuwqRqqleZxgZW66nvJzPb/UAiYhcSIe7rcNgvy4B9LuiSLmq3sDUp1cAEhG5mO7jrTcRqVI0CVpEREScjgKQiIiIOB0FIBEREXE6CkAiIiLidBSARERExOkoAImIiIjTUQASERERp6MAJCIiIk5HAUhEREScjgKQiIiIOB0FIBEREXE6CkAiIiLidBSARERExOkoAImIiIjTcTO7AHtkGAYAGRkZJlciIiIipVX4uV34OX4xCkAlyMzMBCAsLMzkSkRERORyZWZmEhAQcNE2FqM0McnJFBQUcPjwYapVq4bFYjG7HKeRkZFBWFgYBw4cwN/f3+xynIree/PovTeP3nvzVNR7bxgGmZmZ1KlTBxeXi8/yUQ9QCVxcXKhXr57ZZTgtf39//WdkEr335tF7bx699+apiPf+Uj0/hTQJWkRERJyOApCIiIg4HQUgsRuenp48++yzeHp6ml2K09F7bx699+bRe28ee3jvNQlaREREnI56gERERMTpKACJiIiI01EAEhEREaejACSVavbs2TRs2BAvLy8iIiKIi4u7YNtly5bRp08fgoOD8ff3p2vXrnz33XeVWG3Vcjnv/fnWrl2Lm5sbHTp0qNgCq7DLfe/Pnj3LpEmTCA8Px9PTk8aNGzN//vxKqrZqudz3PiYmhvbt2+Pj40NoaCjDhw8nLS2tkqqtGn766ScGDhxInTp1sFgsfP7555d8zOrVq4mIiMDLy4tGjRrx7rvvVnyhhkglWbRokeHu7m7MmzfPiI+PN8aOHWv4+voa+/fvL7H92LFjjenTpxu//PKLsWvXLmPixImGu7u7sWXLlkqu3PFd7ntf6OTJk0ajRo2MqKgoo3379pVTbBVTlvd+0KBBRpcuXYzY2FgjMTHR2LBhg7F27dpKrLpquNz3Pi4uznBxcTHefvttY+/evUZcXJzRunVrY/DgwZVcuWNbvny5MWnSJOPTTz81AOOzzz67aPu9e/caPj4+xtixY434+Hhj3rx5hru7u7F06dIKrVMBSCpN586djVGjRhU51qJFC+Ppp58u9TlatWplPP/88+VdWpVX1vc+OjramDx5svHss88qAJXR5b733377rREQEGCkpaVVRnlV2uW+96+99prRqFGjIsfeeecdo169ehVWY1VXmgD05JNPGi1atChy7MEHHzSuueaaCqzMMDQEJpUiJyeHzZs3ExUVVeR4VFQU69atK9U5CgoKyMzMpEaNGhVRYpVV1vf+gw8+ICEhgWeffbaiS6yyyvLef/nll3Tq1IlXX32VunXr0qxZMx5//HHOnDlTGSVXGWV57yMjIzl48CDLly/HMAyOHDnC0qVLGTBgQGWU7LTWr19f7OfUt29fNm3aRG5uboU9r/YCk0qRmppKfn4+ISEhRY6HhISQkpJSqnPMmDGD06dPc8cdd1REiVVWWd773bt38/TTTxMXF4ebm/6bKKuyvPd79+5lzZo1eHl58dlnn5GamsrDDz/M8ePHNQ/oMpTlvY+MjCQmJobo6Giys7PJy8tj0KBBzJw5szJKdlopKSkl/pzy8vJITU0lNDS0Qp5XPUBSqSwWS5H7hmEUO1aShQsX8txzz7F48WJq1apVUeVVaaV97/Pz87n77rt5/vnnadasWWWVV6Vdzt/7goICLBYLMTExdO7cmRtuuIE33niDBQsWqBeoDC7nvY+Pj2fMmDE888wzbN68mRUrVpCYmMioUaMqo1SnVtLPqaTj5Um/2kmlCAoKwtXVtdhvXkePHi2W/P9u8eLFjBgxgiVLltC7d++KLLNKutz3PjMzk02bNrF161YeeeQRwPqhbBgGbm5ufP/99/Tq1atSand0Zfl7HxoaSt26dYvsaN2yZUsMw+DgwYM0bdq0QmuuKsry3k+bNo1u3brxxBNPANCuXTt8fX3p0aMHL774YoX1RDi72rVrl/hzcnNzo2bNmhX2vOoBkkrh4eFBREQEsbGxRY7HxsYSGRl5wcctXLiQYcOG8cknn2gcvowu97339/fnt99+Y9u2bbbbqFGjaN68Odu2baNLly6VVbrDK8vf+27dunH48GFOnTplO7Zr1y5cXFyoV69ehdZblZTlvc/KysLFpejHoqurK/BXj4SUv65duxb7OX3//fd06tQJd3f3inviCp1iLXKewiWp77//vhEfH2+MGzfO8PX1Nfbt22cYhmE8/fTTxpAhQ2ztP/nkE8PNzc3497//bSQnJ9tuJ0+eNOslOKzLfe//TqvAyu5y3/vMzEyjXr16xm233Wb88ccfxurVq42mTZsaI0eONOslOKzLfe8/+OADw83NzZg9e7aRkJBgrFmzxujUqZPRuXNns16CQ8rMzDS2bt1qbN261QCMN954w9i6davt8gN/f98Ll8GPHz/eiI+PN95//30tg5eq59///rcRHh5ueHh4GB07djRWr15t+959991nXHvttbb71157rQEUu913332VX3gVcDnv/d8pAF2Zy33vd+zYYfTu3dvw9vY26tWrZzz22GNGVlZWJVddNVzue//OO+8YrVq1Mry9vY3Q0FDjnnvuMQ4ePFjJVTu2H3/88aL/d5f0vq9atcq46qqrDA8PD6NBgwbGnDlzKrxO7QYvIiIiTkdzgERERMTpKACJiIiI01EAEhEREaejACQiIiJORwFIREREnI4CkIiIiDgdBSARERFxOgpAIiIi4nQUgETEVKtWrcJisXDy5EmzS6lQzz33HB06dDC7jFKxWCx8/vnnAOzbtw+LxcK2bdtMrUmkvCkAiTiI6667jnHjxpldRrmLjIwkOTm5yO7nYj/CwsJITk6mTZs2gPMEVqn63MwuQETKh2EY5Ofn4+bmWP+sPTw8qF27ttllyAW4urrq5yNVknqARBzAsGHDWL16NW+//TYWiwWLxcKCBQuwWCx89913dOrUCU9PT+Li4jAMg1dffZVGjRrh7e1N+/btWbp0aZHzxcfHc8MNN+Dn50dISAhDhgwhNTX1iuu87rrrePTRRxk3bhzVq1cnJCSEuXPncvr0aYYPH061atVo3Lgx3377re0xf+9RWLBgAYGBgXz33Xe0bNkSPz8/+vXrR3JycqlqWLVqFZ07d8bX15fAwEC6devG/v37AUhISOCmm24iJCQEPz8/rr76alauXFnk8Q0aNODFF19k6NCh+Pn5ER4ezhdffMGxY8e46aab8PPzo23btmzatMn2mMKaP//8c5o1a4aXlxd9+vThwIEDF631gw8+oGXLlnh5edGiRQtmz55t+15OTg6PPPIIoaGheHl50aBBA6ZNm1aq9+C5556jfv36eHp6UqdOHcaMGVPk9U2dOpW7774bPz8/6tSpw8yZMy94rvOHwPbt20fPnj0BqF69OhaLhWHDhpWqJhG7U+HbrYrIFTt58qTRtWtX4/777zeSk5ON5ORkY+XKlQZgtGvXzvj++++NPXv2GKmpqca//vUvo0WLFsaKFSuMhIQE44MPPjA8PT2NVatWGYZhGIcPHzaCgoKMiRMnGjt27DC2bNli9OnTx+jZs+cV13nttdca1apVM6ZOnWrs2rXLmDp1quHi4mL079/fmDt3rrFr1y7joYceMmrWrGmcPn3aMIy/do4+ceKEYRiG8cEHHxju7u5G7969jY0bNxqbN282WrZsadx9992XfP7c3FwjICDAePzxx409e/YY8fHxxoIFC4z9+/cbhmEY27ZtM959913j119/NXbt2mVMmjTJ8PLysn3fMAwjPDzcqFGjhvHuu+/a6q1WrZrRr18/47///a+xc+dOY/DgwUbLli2NgoKCIjV36tTJWLdunbFp0yajc+fORmRkpO28zz77rNG+fXvb/blz5xqhoaHGp59+auzdu9f49NNPjRo1ahgLFiwwDMMwXnvtNSMsLMz46aefjH379hlxcXHGJ598csn3YMmSJYa/v7+xfPlyY//+/caGDRuMuXPnFnl91apVM6ZNm2bs3LnTeOeddwxXV1fj+++/t7UBjM8++8wwDMNITEw0AGPr1q1GXl6e8emnnxqAsXPnTiM5Odk4efLkJWsSsUcKQCIO4tprrzXGjh1ru18YHD7//HPbsVOnThleXl7GunXrijx2xIgRxl133WUYhmFMmTLFiIqKKvL9AwcO2D7UrrTG7t272+7n5eUZvr6+xpAh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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# min_samples_split decides how many samples are required in an internal node before it can be split\n",
"# Higher values reduce overfitting\n",
"# By giving it fractions, it is interpreted as ceil(min_samples_split * n_samples),\n",
"# i.e. share of sample size, which turns it into an integer again\n",
"\n",
"from sklearn.tree import DecisionTreeClassifier \n",
"\n",
"pipeline = Pipeline([\n",
" ('tree', DecisionTreeClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_range = np.arange(0.05, 1.05, 0.05)\n",
"\n",
"param_name = 'tree__min_samples_split'\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"mse_score = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"mse_score.set_index(param_name).plot(logx=False, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 2.3**\n",
"> \n",
"> What does the `min_samples_leaf` parameter in a decision tree do? Does the model overfit more or less if you increase this value?\n",
"> \n",
"> Create a validation plot with values of `min_samples_split`. Use the values `np.arange(2, 50, 2)` "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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YmKisWXLFmPLli0GYHz88cfGli1bjEOHDhmGYRgffPCB4e/vb8ydO9fYvn270b17dyMoKMhISEiwuPKi46mnnjL8/f2NZcuWGXFxcY5HUlKSYx9dh/w3ZMgQY8WKFcaBAweMP/74w3j11VcNFxcXY/HixYZh6BpY6d93pRmGrkVBef75541ly5YZ+/fvN9atW2fcfffdhq+vr+MzOa+ug4LRFXz22WdG1apVDQ8PD6NZs2aOW5YlfyxdutQAsj0eeeQRwzDMWzLfeOMNIzAw0PD09DRuueUWY/v27dYWXcTk9PMHjK+//tqxj65D/nvsscccv3vKly9v3H777Y5QZBi6Blb6bzDStSgY3bp1M4KCggx3d3ejYsWKxn333Wfs3LnT8f28ug42wzCMPGjREhERESn0NMZIRERE5CIFIxEREZGLFIxERERELlIwEhEREblIwUhERETkIgUjERERkYsUjEREREQuUjASERERuUjBSEScwrJly7DZbJw5c8bqUvLVm2++SZMmTQrkXDabjfnz5+fpMY8dO0b79u0pUaIEpUqVytNjizgDBSORQubWW29l8ODBVpeR58LCwoiLi8Pf39/qUuQyRo8eTVxcHFu3buXPP/+0uhyRPOdmdQEikrcMw8But+PmVrj+9/bw8CAwMNDqMuQK9u3bR2hoKDVr1rS6FJF8oRYjkUKkd+/eLF++nE8++QSbzYbNZmPKlCnYbDYWLVpE8+bN8fT0ZOXKlRiGwYgRI6hevTre3t40btyY2bNnZznerl27uPPOOylZsiQBAQH07NmTkydPXnedt956KwMGDGDw4MGULl2agIAAJk2axPnz53n00Ufx9fWlRo0a/Prrr47X/LcrbcqUKZQqVYpFixZRt25dSpYsSYcOHYiLi7uqGpYtW0aLFi0cXT6tW7fm0KFDgPnh3rlzZwICAihZsiQ33ngjS5YsyfL6kJAQ3n33XXr16kXJkiWpWrUqP/74IydOnKBz586ULFmShg0bsmnTJsdrMmueP38+tWrVwsvLi/bt2xMbG3vZWr/++mvq1q2Ll5cXderUYfz48Y7vpaam8swzzxAUFISXlxchISEMHz78qn4G/3XkyBG6detG6dKlKVu2LJ07d+bgwYOO72/cuJH27dtTrlw5/P39adu2LZs3b87yM5kzZw7ffPMNNpuN3r1756oOEWemYCRSiHzyySe0atWKJ554gri4OOLi4ggODgbgpZdeYvjw4URHR9OoUSNee+01vv76ayZMmMDOnTt59tln6dGjB8uXLwcgLi6Otm3b0qRJEzZt2sTChQuJj4+na9eueVLr1KlTKVeuHBs2bGDAgAE89dRTPPjgg4SFhbF582YiIiLo2bMnSUlJlzxGUlISo0aN4ttvv2XFihXExMTwwgsvXPHc6enpdOnShbZt2/LHH3+wdu1a+vbti81mA+DcuXPceeedLFmyhC1bthAREUGnTp2IiYnJcpzRo0fTunVrtmzZwl133UXPnj3p1asXPXr0YPPmzdxwww306tWLf6/FnZSUxHvvvcfUqVNZvXo1CQkJPPTQQ5es9YsvvmDo0KG89957REdH8/777zNs2DCmTp0KwKeffspPP/3EDz/8wJ49e/juu+8ICQm54s8gp5/lbbfdRsmSJVmxYgWrVq1yhM3U1FQAEhMTeeSRR1i5ciXr1q2jZs2a3HnnnSQmJgJmcOrQoQNdu3YlLi6OTz755JrrEHF6hogUKm3btjUGDRrkeL506VIDMObPn+/Ydu7cOcPLy8tYs2ZNltf26dPH6N69u2EYhjFs2DAjPDw8y/djY2MNwNizZ89113jzzTc7nqenpxslSpQwevbs6dgWFxdnAMbatWuzvI+///7bMAzD+Prrrw3A+Ouvvxyv+eyzz4yAgIArnv/UqVMGYCxbtuyqa65Xr54xduxYx/OqVasaPXr0yFbvsGHDHNvWrl1rAEZcXFyWmtetW+fYJzo62gCM9evXG4ZhGG+88YbRuHFjx/eDg4ON77//Pkst77zzjtGqVSvDMAxjwIABRrt27YyMjIyrfi+ZAGPevHmGYRjGV199ZdSuXTvLcVJSUgxvb29j0aJFOb4+PT3d8PX1NX7++WfHts6dOxuPPPLINdciUlgUrkEIInJJzZs3d3y9a9cukpOTad++fZZ9UlNTadq0KQBRUVEsXbqUkiVLZjvWvn37qFWr1nXV06hRI8fXrq6ulC1bloYNGzq2BQQEAHD8+PFLHsPHx4caNWo4ngcFBV12/0xlypShd+/eRERE0L59e+644w66du1KUFAQAOfPn+ett97il19+4ejRo6Snp3PhwoVsLUb/fg+Z9V7qPWSOj3Jzc8tyLerUqUOpUqWIjo6mRYsWWY5/4sQJYmNj6dOnD0888YRje3p6umMQeu/evWnfvj21a9emQ4cO3H333YSHh1/xZ/BfUVFR/PXXX/j6+mbZnpyczL59+xzv4/XXX+f3338nPj4eu91OUlJStp+LSFGmYCRSRJQoUcLxdUZGBgD/+9//qFSpUpb9PD09Hft06tSJDz/8MNuxMgPE9XB3d8/y3GazZdmW2a2VWevVHsP4V7fV5Xz99dcMHDiQhQsXMnPmTF577TUiIyO56aabePHFF1m0aBGjRo3ihhtuwNvbmwceeMDRpZTT+TPrvZr3kLn9StsyX/fFF1/QsmXLLN9zdXUFoFmzZhw4cIBff/2VJUuW0LVrV+64445s48WuJCMjg9DQUKZNm5bte+XLlwfMEHbixAnGjBlD1apV8fT0pFWrVtl+LiJFmYKRSCHj4eGB3W6/7D716tXD09OTmJgY2rZtm+M+zZo1Y86cOYSEhBS6O9iuVtOmTWnatClDhgyhVatWfP/999x0002sXLmS3r17c++99wLmmKN/D0K+Hunp6WzatMnROrRnzx7OnDlDnTp1su0bEBBApUqV2L9/Pw8//PAlj+nn50e3bt3o1q0bDzzwAB06dOD06dOUKVPmqutq1qwZM2fOpEKFCvj5+eW4z8qVKxk/fjx33nknALGxsXkyGF+kMNHga5FCJiQkhPXr13Pw4EFOnjyZY4uLr68vL7zwAs8++yxTp05l3759bNmyhc8++8wxqLd///6cPn2a7t27s2HDBvbv38/ixYt57LHHrhi8nN2BAwcYMmQIa9eu5dChQyxevJg///yTunXrAnDDDTcwd+5ctm7dyrZt2/i///u/y7ZcXQt3d3cGDBjA+vXr2bx5M48++ig33XRTtm60TG+++SbDhw/nk08+4c8//2T79u18/fXXfPzxx4A5AHzGjBns3r2bP//8k1mzZhEYGHjNkys+/PDDlCtXjs6dO7Ny5UoOHDjA8uXLGTRoEIcPHwbMn8u3335LdHQ069ev5+GHH8bb2/u6fh4ihY2CkUgh88ILL+Dq6kq9evUoX778Jcd/vPPOO7z++usMHz6cunXrEhERwc8//0y1atUAqFixIqtXr8ZutxMREUGDBg0YNGgQ/v7+uLgU7l8NPj4+7N69m/vvv59atWrRt29fnnnmGZ588knADBulS5cmLCyMTp06ERERQbNmzfLs3C+//DL/93//R6tWrfD29mbGjBmX3P/xxx/nyy+/ZMqUKTRs2JC2bdsyZcoUx3UqWbIkH374Ic2bN+fGG2/k4MGDLFiw4JqvkY+PDytWrKBKlSrcd9991K1bl8cee4wLFy44WpAmT57M33//TdOmTenZsycDBw6kQoUKuf9hiBRCNuNqO+xFROSypkyZwuDBg4v8siYiRVnh/rNQREREJA8pGIlINjExMZQsWTLHh4uLCy4uLpf8fkHd2n2p85csWZKVK1cWSA1WmjZt2iXff/369a0uT6TQUleaiGSTnp6e67u0Cuout7/++uuS36tUqVKRHzScmJhIfHx8jt9zd3enatWqBVyRSNGgYCQiIiJykbrSRERERC5SMBIRERG5SMFIRERE5CIFIxEREZGLFIxERERELlIwEhEREblIwUhERETkIgUjERERkYv+H5JqIZSHEUUkAAAAAElFTkSuQmCC",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# min_samples_leaf decides how many samples are required in a leaf node\n",
"# before it is allowed.\n",
"# Higher values reduce overfitting\n",
"\n",
"from sklearn.tree import DecisionTreeClassifier \n",
"\n",
"pipeline = Pipeline([\n",
" ('tree', DecisionTreeClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_range = np.arange(2, 50, 2)\n",
"\n",
"param_name = 'tree__min_samples_leaf'\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=False, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 2.4**\n",
"> \n",
"> To find the best hyperparamter values, implement a randomized search (`RandomizedSearchCV`) using the previous hyperparameter ranges. Use `n_iter = 25`. If your model takes too long to run, you can change this parameter -- should you increase it or lower it to reduce running time?\n",
"> What are the best hyperparameters?\n",
">>\n",
">> *Hints*:\n",
">> \n",
">> Look at exercise 2.6 from exercise session 3 for inspiration\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'tree__min_samples_split': 0.19, 'tree__min_samples_leaf': 12, 'tree__max_depth': 379}\n",
"Vali score 0.840\n"
]
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.model_selection import RandomizedSearchCV\n",
"\n",
"pipeline = Pipeline([\n",
" ('tree', DecisionTreeClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_grid= [{\n",
" 'tree__min_samples_split': np.arange(0.01, 0.2, 0.01),\n",
" 'tree__min_samples_leaf': np.arange(2, 50, 2),\n",
" 'tree__max_depth': np.unique(np.logspace(1, 4, 20).astype(int))\n",
" }]\n",
"\n",
"rs = RandomizedSearchCV(estimator=pipeline, \n",
" param_distributions=param_grid, \n",
" scoring=score_type, \n",
" cv=5, \n",
" n_iter = 50,\n",
" n_jobs=-1)\n",
"\n",
"rs = rs.fit(X_dev, y_dev)\n",
"best_tree_params = rs.best_params_\n",
"print(rs.best_params_)\n",
"print(f'Vali score {rs.best_score_:.3f}')\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 2.5**\n",
"> \n",
"> Calculate the accuracy of your model with the best hyperparameters. Is it better than the baseline?\n",
">> *Hints*:\n",
">>\n",
">> If you are using regression data, you can compare to a baseline with `DummyRegressor` from `sklearn.dummy`\n",
">>\n",
">> Feel free to plot the confusion matrix as well\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test score 0.835\n"
]
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# It is better than baseline!\n",
"\n",
"print(f'Test score {accuracy_score(rs.predict(X_test), y_test):.3f}')\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ensemble Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As covered in the lectures, there exists two overarching ensemble methods, bagging and boosting.\n",
"\n",
"- For bagging, we use bootstrap aggregation to train many models, averaging their predictions afterwards.\n",
"- For boosting, we sequentially train models, optimizing them to aid each other in the prediction task.\n",
"\n",
"As examples of these two ensemble methods, we covered Random Forests, a bagging algorithm, and AdaBoost, a boosting algorithm, which we will cover in the next two sections."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Random Forest (Bagging)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 3.1**\n",
"> \n",
"> The Random Forest has all the same hyperparameters as the decision tree, but also a few new. For each point below, explain what the hype parameter pertaining to `sklearn.ensemble.RandomForestClassifier` controls, and how setting it either too low or too high (or True/False) might hurt model performance:\n",
"1. `n_estimators`\n",
"2. `max_depth`\n",
"3. `max_features`\n",
"4. `bootstrap`"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# n_estimators: number of trees\n",
"# max_depth: maximal number of total splits applied\n",
"# max_features: number of features used for splitting\n",
"# bootstrap: whether or not to use bootstrap to sample observations or all data\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 3.2**\n",
"> \n",
"> For `n_estimators > 1`, how should one set the hyperparameters `max_features` and `bootstrap` so that all the trees in the ensemble end up identical?"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# max_features = X.shape[1] (amount of columns), consider all features at all splits\n",
"# bootstrap = False, do not bootstrap and use all samples for each tree\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 3.3**\n",
"> \n",
"> Create a validation plot with values of `n_estimators`. Use the values `np.unique(np.logspace(0, 3, 25).astype(int))`. How does it influence the train and validation scores?"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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RUWxZMkSpk6dytGjR9m3bx+RkZHcfvvttqxVRERExCZKNBXGww8/zJw5cwC4++67ef3112natKn1dT8/P1599dV8U1SIiIiIlBclCkDbt2/nnXfe4dZbb8XT07PQdcLDw1m5cmWpihMRERGxB80FVgjNBSYiIuJ87D4X2MSJE5k5c2aB5TNnzuS1114rySZFREREykyJAtD7779P48aNCyy/5ppreO+990pdlIiIiIg9lSgAJSYmEhYWVmB5tWrVSEhIKHVRIiIiIvZUogAUGRnJ2rVrCyxfu3Yt4eHhpS5KRERExJ5KdBXY8OHDGTt2LFlZWfTs2ROAFStW8MQTTzBu3DibFigiIiJiayUKQE888QQnT57koYcess7/5e3tzZNPPsn48eNtWqCIiIiIrZXqMvjU1FR27NiBj48PDRo0wMvLy5a1OYwugxcREXE+xfn8LlELUB5/f3/atWtXmk2IiIiIlLkSB6CNGzcyf/584uPjrd1geb788stSFyYiIiJiLyW6Cmzu3Ll07tyZ7du3s3DhQrKysti+fTs//vgjQUFBtq5RRERExKZKFIBeeeUV3n77bb777js8PT35z3/+w44dO7jjjjuoVauWrWsUERERsakSBaC9e/dy4403AuDl5cXZs2exWCw88sgjzJgxw6YFioiIiNhaiQJQlSpVOHPmDAA1a9Zk27ZtAJw+fZq0tDTbVSciIiJiByUaBN21a1eWLVtGs2bNuOOOOxgzZgw//vgjy5Yto1evXrauUURERMSmShSApk6dSnp6OgDjx4/Hw8ODn3/+mVtuuYUJEybYtEARERERWyv2jRCzs7OZPXs2sbGx1KhRw151OZRuhCgiIuJ8ivP5XewxQJUqVeLBBx8kIyOjxAWKiIiIOFKJBkF36NCBLVu22LoWERERkTJRojFADz30EOPGjePQoUO0adMGPz+/fK83b97cJsWJiIiI2EOJJkN1cyvYcGSxWDAMA4vFQk5Ojk2KcxSNARIREXE+dp8Mdd++fSUqTERERKQ8KFEAioqKsnUdIiIiImWmRAHo008/veLrQ4YMKVExIiIiImWhRGOAgoOD832flZVFWloanp6e+Pr6cvLkSZsV6AgaAyQiIuJ87HofIIBTp07le6SmprJz5066dOnCnDlzSlS0iIiISFkpUQAqTIMGDXj11VcZM2aMrTYpIiIi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LzFkyBD8/f2Jiori66+/5tixYwwYMAB/f3+aNWvGpk2brO85ceIEd955JxEREfj6+tKsWTPmzJmT77hXr17Nf/7zHywWCxaLhf379wOwevVq2rdvj5eXF2FhYfzrX/8iOzvb+t7u3bszatQoHn30UUJCQrj++usB+Pe//02tWrXw8vIiPDyc0aNHF+dHIeLcHDIHvYjY3enTp40XXnjBiIiIMBISEoykpCRj9OjRRnh4uLFo0SLjzz//NO655x4jODjYOHHihGEYhrFy5UoDMJo3b24sXbrU2LNnj3H8+HHjqaeeMho3bmwsXrzY2Lt3r/Hxxx8bXl5exqpVqwzDMIyRI0caLVu2NDZu3Gjs27fPWLZsmfHNN98YhmEYGzZsMABj+fLlRkJCgnVfJXXPPfcYgYGBxogRI4wdO3YY3377reHr62vMmDGjSO//xz/+YcTExBg//fSTsWfPHuONN94wvLy8jF27dhmGYRg33nijcf311xu///67sXfvXuPbb781Vq9ebWRnZxtffPGFARg7d+40EhISjNOnTxuGYRjXXnutMWbMGOs+oqKijCpVqhjvvfeesWvXLuPBBx80AgICjD59+hiff/65sXPnTmPgwIFGdHS0kZubaxiGYRw6dMh44403jC1bthh79+41pkyZYri7uxu//PKL9efZqVMn47777jMSEhKMhIQEIzs72zh06JDh6+trPPTQQ8aOHTuMhQsXGiEhIcZzzz1nrefaa681/P39jccff9z466+/jB07dhjz5883AgMDjUWLFhkHDhww1q9fX+R/Q5GKQAFIpAJ7++23jaioKMMwDCM1NdXw8PAwZs+ebX09MzPTCA8PN15//XXDMC4EoK+++sq6TmpqquHt7W3ExcXl2/awYcOMO++80zAMw+jXr59x7733FlrDvn37DMDYsmWLTY7pnnvuMaKioozs7Gzrsttvv90YNGjQVd+7Z88ew2KxGIcPH863vFevXsb48eMNwzCMZs2aGf/+978LfX/ev8+pU6fyLS8sAN19993W7xMSEgzAmDBhgnXZunXrDMBISEi4bL033HCDMW7cuMvuxzAM46mnnjIaNWpkDVKGYRjvvvuu4e/vb+Tk5Fjf17Jly3zvmzRpktGwYUMjMzPzsvsXqcjUBSbiIvbu3UtWVhadO3e2LvPw8KB9+/bs2LEj37pt27a1Pt++fTvp6elcf/31+Pv7Wx+ffvope/fuBeDBBx9k7ty5tGzZkieeeIK4uDi7Hss111yDu7u79fuwsDCSkpKu+r5ff/0VwzBo2LBhvmNZvXq19VhGjx7NSy+9ROfOnXnuuef4/fffS1Rj8+bNrc9DQ0MBaNasWYFleXXn5OTw8ssv07x5c6pWrYq/vz9Lly4lPj7+ivvZsWMHnTp1wmKxWJd17tyZ1NRUDh06ZF128c8U4Pbbb+fcuXPUrVuX++67j4ULF+brNhOp6DSyUcRFGIYBkO+DMm/5pcv8/Pysz3NzcwH4/vvvqVmzZr71vLy8AOjbty8HDhzg+++/Z/ny5fTq1YuRI0fy5ptv2vw4wAxuF7NYLNY6ryQ3Nxd3d3c2b96cL0AB+Pv7AzB8+HBiY2P5/vvvWbp0KRMnTmTSpEk8/PDDJa4x79+3sGV5dU+aNIm3336byZMn06xZM/z8/Bg7diyZmZlX3E9hP7/CftYX/0wBIiMj2blzJ8uWLWP58uU89NBDvPHGG6xevbrAv69IRaQWIBEXUb9+fTw9Pfn555+ty7Kysti0aRPR0dGXfV+TJk3w8vIiPj6e+vXr53tERkZa16tWrRpDhw7lv//9L5MnT2bGjBkA1quNcnJy7HRkRdeqVStycnJISkoqcCw1atSwrhcZGcmIESP48ssvGTduHB988AFg32NZs2YNAwYM4O6776ZFixbUrVuX3bt351vH09OzwL6bNGlCXFycNfQAxMXFERAQUCCwXsrHx4f+/fszZcoUVq1axbp16/jjjz9sd1Ai5ZhagERchJ+fHw8++CCPP/44VapUoVatWrz++uukpaUxbNiwy74vICCAxx57jEceeYTc3Fy6dOlCSkoKcXFx+Pv7c8899/Dss8/Spk0brrnmGjIyMvjuu++soap69er4+PiwePFiIiIi8Pb2JigoqKwOO5+GDRty1113MWTIECZNmkSrVq04fvw4P/74I82aNeOGG25g7Nix9O3bl4YNG3Lq1Cl+/PFH67FERUVhsVj47rvvuOGGG/Dx8bG2HJVW/fr1+eKLL4iLiyM4OJi33nqLxMTEfOG0du3arF+/nv379+Pv70+VKlV46KGHmDx5Mg8//DCjRo1i586dPPfcczz66KO4uV3+b9xZs2aRk5NDhw4d8PX15bPPPsPHx4eoqCibHI9IeacWIBEX8uqrr3LrrbcyePBgWrduzZ49e1iyZAnBwcFXfN+LL77Is88+y8SJE4mOjiY2NpZvv/3Weom7p6cn48ePp3nz5nTr1g13d3fmzp0LQKVKlZgyZQrvv/8+4eHhDBgwwO7HeSUff/wxQ4YMYdy4cTRq1Ij+/fuzfv16a2tWTk4OI0eOJDo6mj59+tCoUSOmTZsGQM2aNXn++ef517/+RWhoKKNGjbJZXRMmTKB169bExsbSvXt3atSowcCBA/Ot89hjj+Hu7k6TJk2oVq0a8fHx1KxZk0WLFrFhwwZatGjBiBEjGDZsGM8888wV91e5cmU++OADOnfuTPPmzVmxYgXffvstVatWtdkxiZRnFuPidlMRERERF6AWIBEREXE5GgMkImXuSuNmzp07h4+PT6Gv/fDDD3Tt2vWy712zZg19+/a97OupqalFL1JEKjR1gYlImduzZ89lX7tSAKpZs+ZlX8t77+HDhy/7ev369YtepIhUaApAIiIi4nI0BkhERERcjgKQiIiIuBwFIBEREXE5CkAiIiLichSARERExOUoAImIiIjLUQASERERl/P/GaG8sFSUukUAAAAASUVORK5CYII=",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.ensemble import RandomForestClassifier \n",
"\n",
"pipeline = Pipeline([\n",
" ('forest', RandomForestClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_range = np.unique(np.logspace(0, 3, 25).astype(int))\n",
"\n",
"param_name = 'forest__n_estimators'\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=True, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()\n",
"\n",
"# Both train and validation scores increase and plateau as a function of n_estimators!\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 3.4**\n",
"> \n",
"> What does the `max_features` parameter in a Random Forest do? Does the model overfit more or less if you increase this value?\n",
"> \n",
"> Create a validation plot with values of `max_features`. Use the values `np.arange(0.1, 1.01, 0.1)`. Does it influence the train and validation scores?"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"pipeline = Pipeline([\n",
" ('forest', RandomForestClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_range = np.arange(0.1, 1.01, 0.1)\n",
"\n",
"param_name = 'forest__max_features'\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=False, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()\n",
"\n",
"# Doesn't change much -- still overfitting with default tree, it seems!\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 3.5 (OPTIONAL)**\n",
"> \n",
"> To find the best hyperparamter values, implement a randomized search (`RandomizedSearchCV`) using the previous hyperparameter ranges, including the decision tree section. Use `n_iter = 10`. If your model takes too long to run, you can change this parameter -- should you increase it or lower it to reduce running time?\n",
"> What are the best hyperparameters? How does the model perform on the test set?\n",
">>\n",
">> *Hints*:\n",
">> \n",
">> Look at exercise 2.6 from exercise session 3 for inspiration\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'forest__n_estimators': 749, 'forest__min_samples_split': 0.05, 'forest__min_samples_leaf': 4, 'forest__max_features': 0.4, 'forest__max_depth': 88}\n",
"Vali score 0.841\n",
"Test score 0.858\n"
]
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"pipeline = Pipeline([\n",
" ('forest', RandomForestClassifier())\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_grid= [{\n",
" 'forest__n_estimators': np.unique(np.logspace(0, 3, 25).astype(int)),\n",
" 'forest__max_features': np.arange(0.1, 1.01, 0.1),\n",
" 'forest__min_samples_split': np.arange(0.01, 0.2, 0.01),\n",
" 'forest__min_samples_leaf': np.arange(2, 50, 2),\n",
" 'forest__max_depth': np.unique(np.logspace(1, 4, 20).astype(int))\n",
" }]\n",
"\n",
"rs = RandomizedSearchCV(estimator=pipeline, \n",
" param_distributions=param_grid, \n",
" scoring=score_type, \n",
" cv=5, \n",
" n_iter = 10,\n",
" n_jobs=-1,\n",
" random_state=73)\n",
"\n",
"rs = rs.fit(X_dev, y_dev)\n",
"print(rs.best_params_)\n",
"print(f'Vali score {rs.best_score_:.3f}')\n",
"print(f'Test score {accuracy_score(rs.predict(X_test), y_test):.3f}')\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## AdaBoost (Boosting)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 4.1**\n",
"> \n",
"> What does the `n_estimators` parameter in a AdaBoost do? Does the model overfit more or less if you increase this value?\n",
"> \n",
"> Create a validation plot with values of `n_estimators`. Use the values `[int(x) for x in np.linspace(start = 1, stop = 500, num = 10)]` \n",
">>\n",
">> *Hints*:\n",
">>\n",
">> Try importing `AdaBoostClassifier` from `sklearn.ensemble`"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGxCAYAAACKvAkXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFCUlEQVR4nO3deVxVdf7H8fcFWWVxBwlFzNxyScEFzHIp0VFHp5qcmkzLbHElm8ms1Gxm0vbF1KYaM381ammWNWbSuKRpueKGY2YaLii54goI398fR65ewQ0uXOC8no/Hfcg995xzP+dc9L79nu/5fh3GGCMAAAAb8fJ0AQAAACWNAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyHAAQAAGyngqcLKI1yc3O1b98+BQcHy+FweLocAABwFYwxOn78uCIiIuTldfk2HgJQAfbt26datWp5ugwAAFAIu3fvVmRk5GXXIQAVIDg4WJJ1AkNCQjxcDQAAuBoZGRmqVauW83v8cghABci77BUSEkIAAgCgjLma7it0ggYAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALZDAAIAALbDZKglyBij09k5ni4DAIBSIcDH+6omLi0OBKASdDo7R43HfOPpMgAAKBVSnk9QoK9nogiXwAAAgO3QAlSCAny8lfJ8gqfLAACgVAjw8fbYexOASpDD4fBYUx8AADiPS2AAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2CEAAAMB2PB6AJk+erOjoaPn7+ysmJkbLli277PqTJk1So0aNFBAQoAYNGmj69Okur0+bNk0OhyPf48yZM8V5GAAAoAyp4Mk3nzVrlhITEzV58mS1a9dO//znP9WtWzelpKSodu3a+dafMmWKRo0apffee0+tWrXSqlWrNHDgQFWuXFk9e/Z0rhcSEqJt27a5bOvv71/sxwMAAMoGhzHGeOrN27Rpo5YtW2rKlCnOZY0aNVLv3r01fvz4fOvHx8erXbt2evnll53LEhMTtWbNGi1fvlyS1QKUmJioo0ePFrqujIwMhYaG6tixYwoJCSn0fgAAQMm5lu9vj10Cy8rK0tq1a9WlSxeX5V26dNGKFSsK3CYzMzNfS05AQIBWrVql7Oxs57ITJ04oKipKkZGR6tGjh9avX+/+AwAAAGWWxwLQwYMHlZOTo7CwMJflYWFh2r9/f4HbJCQk6P3339fatWtljNGaNWs0depUZWdn6+DBg5Kkhg0batq0aZo3b55mzJghf39/tWvXTtu3b79kLZmZmcrIyHB5AACA8svjnaAdDofLc2NMvmV5Ro8erW7duqlt27by8fFRr1691L9/f0mSt7e3JKlt27a677771Lx5c7Vv316ffPKJ6tevr4kTJ16yhvHjxys0NNT5qFWrlnsODgAAlEoeC0DVqlWTt7d3vtae9PT0fK1CeQICAjR16lSdOnVKu3btUmpqqurUqaPg4GBVq1atwG28vLzUqlWry7YAjRo1SseOHXM+du/eXfgDAwAApZ7HApCvr69iYmKUlJTksjwpKUnx8fGX3dbHx0eRkZHy9vbWzJkz1aNHD3l5FXwoxhglJyerZs2al9yfn5+fQkJCXB4AAKD88uht8CNGjFDfvn0VGxuruLg4vfvuu0pNTdWjjz4qyWqZ2bt3r3Osn59++kmrVq1SmzZtdOTIEb322mvavHmzPvzwQ+c+x40bp7Zt2+qGG25QRkaG3nrrLSUnJ2vSpEkeOUYAAFD6eDQA9enTR4cOHdLzzz+vtLQ0NWnSRPPnz1dUVJQkKS0tTampqc71c3Jy9Oqrr2rbtm3y8fFRx44dtWLFCtWpU8e5ztGjR/Xwww9r//79Cg0NVYsWLfTdd9+pdevWJX14AACglPLoOEClFeMAAQBQ9pSJcYAAAAA8hQAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABshwAEAABsx+MBaPLkyYqOjpa/v79iYmK0bNmyy64/adIkNWrUSAEBAWrQoIGmT5+eb505c+aocePG8vPzU+PGjTV37tziKh8AAJRBHg1As2bNUmJiop555hmtX79e7du3V7du3ZSamlrg+lOmTNGoUaP03HPPacuWLRo3bpwGDx6sL7/80rnOypUr1adPH/Xt21cbNmxQ3759dffdd+vHH38sqcMCAAClnMMYYzz15m3atFHLli01ZcoU57JGjRqpd+/eGj9+fL714+Pj1a5dO7388svOZYmJiVqzZo2WL18uSerTp48yMjL09ddfO9fp2rWrKleurBkzZlxVXRkZGQoNDdWxY8cUEhJS2MMDAAAl6Fq+vz3WApSVlaW1a9eqS5cuLsu7dOmiFStWFLhNZmam/P39XZYFBARo1apVys7OlmS1AF28z4SEhEvuEwAA2I/HAtDBgweVk5OjsLAwl+VhYWHav39/gdskJCTo/fff19q1a2WM0Zo1azR16lRlZ2fr4MGDkqT9+/df0z4lK1hlZGS4PAAAQPnl8U7QDofD5bkxJt+yPKNHj1a3bt3Utm1b+fj4qFevXurfv78kydvbu1D7lKTx48crNDTU+ahVq1YhjwYAAJQFHgtA1apVk7e3d76WmfT09HwtOHkCAgI0depUnTp1Srt27VJqaqrq1Kmj4OBgVatWTZIUHh5+TfuUpFGjRunYsWPOx+7du4t4dAAAoDTzWADy9fVVTEyMkpKSXJYnJSUpPj7+stv6+PgoMjJS3t7emjlzpnr06CEvL+tQ4uLi8u1z4cKFl92nn5+fQkJCXB4AAKD8quDJNx8x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hXz9dp599lnnz3Xq1NETTzyhWbNm6cknn1RAQICCgoJUoUIFhYeHX/K9Pv74Y50+fVrTp093Tpn19ttvq2fPnnrxxRcVFhYmSapcubLefvtteXt7q2HDhurevbv++9//ls4ABAAAikfDhg0VHx+vqVOnqmPHjtqxY4eWLVumhQsXKicnRxMmTNCsWbO0d+9eZWZmKjMzM9+cnJeydetW1a5d2xl+JCkuLi7ferNnz9Ybb7yhn3/+WSdOnNDZs2cVEhJyTcexdetWNW/e3KW2du3aKTc3V9u2bXMGoBtvvFHe3t7OdWrWrKlNmzZd03sVRqEC0F133aXY2Fg99dRTLstffvllrVq1Sp9++qlbigMAwG18Aq2WGE+99zUYMGCAhgwZokmTJumDDz5QVFSUOnfurJdfflmvv/663njjDTVt2lQVK1ZUYmKisrKyrmq/xph8yxwXXZr74Ycf9Kc//Unjxo1TQkKCQkNDNXPmzGvu4pI3P2hBLlzu4+OT77WSuNJUqE7QS5cuVffu3fMt79q1q7777rsiFwUAgNs5HNZlKE88rqL/z4XuvvtueXt769///rc+/PBDPfDAA3I4HFq2bJl69eql++67T82bN1fdunW1ffv2q95v48aNlZqa6nLH9sqVK13W+f777xUVFaVnnnlGsbGxuuGGG/Ldlebr63vFic8bN26s5ORknTx50mXfXl5eql+//lXXXFwKFYBOnDghX1/ffMt9fHyUkZFR5KIAALCzoKAg9enTR08//bT27dun/v37S5Lq1aunpKQkrVixQlu3btUjjzyi/fv3X/V+b7vtNjVo0ED333+/NmzYoGXLlumZZ55xWadevXpKTU3VzJkztWPHDr311luaO3euyzp16tTRzp07lZycrIMHDyozMzPfe/35z3+Wv7+/+vXrp82bN2vx4sUaOnSo+vbt67z85UmFCkBNmjTRrFmz8i2fOXOmGjduXOSiAACwuwEDBujIkSO67bbbVLt2bUnS6NGj1bJlSyUkJKhDhw4KDw/Pd2f25Xh5eWnu3LnKzMxU69at9dBDD+kf//iHyzq9evXS448/riFDhuimm27SihUrNHr0aJd17rzzTnXt2lUdO3ZU9erVC7wVPzAwUN98840OHz6sVq1a6a677lLnzp319ttvX/vJKAYOU9AFwSuYN2+e7rzzTt17773q1KmT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87g7duwoSapcubIcDof69+8v6cqfX15933zzjWJjY+Xn56dly5Zpw4YN6tixo4KDgxUSEqKYmBitWbOmUJ8L4HHFNs0qALebPXu2mTNnjvnpp5/M+vXrTc+ePU3Tpk1NTk6OOXHihKlevbrp06eP2bx5s/nyyy9N3bp1jSSzfv16Y4wxWVlZZsyYMWbVqlXml19+MR999JEJDAw0s2bNcr5Hv379TFBQkHM/X331lalevbp5+umnnesMGzbMREREmPnz55stW7aYfv36mcqVK5tDhw4ZY4zZs2ePCQwMNIMGDTJbt241c+fONdWqVTNjx441xhizb98+U6FCBfPaa6+ZnTt3mo0bN5pJkyaZ48ePm+PHj5u7777bdO3a1aSlpZm0tDSTmZlZ6HO2c+dOI8k0bNjQfPXVV2bbtm3mrrvuMlFRUSY7O/uK22/cuNEEBQWZ119/3fz000/m+++/Ny1atDD9+/c3xhizevVq4+3tbf7973+bXbt2mXXr1pk333zTGGPM0aNHTVxcnBk4cKDzWM6ePWsWL15sJJkjR44YY4z54IMPjI+Pj7n99tvNunXrzNKlS03VqlVNly5dzN133222bNlivvzyS+Pr62tmzpzprO1f//qXmT9/vtmxY4dZuXKladu2renWrZsxxpizZ8+aOXPmGElm27ZtJi0tzRw9evSqPr+8+po1a2YWLlxofv75Z3Pw4EFz4403mvvuu89s3brV/PTTT+aTTz4xycnJhf5sAE8iAAFlWHp6upFkNm3aZP75z3+aKlWqmJMnTzpfnzJliksAKsigQYPMnXfe6Xzer1+/AvcTFBTkDFo+Pj7m448/dr6elZVlIiIizEsvvWSMMebpp582DRo0MLm5uc51Jk2a5NzH2rVrjSSza9euAmvq16+f6dWr17WejgLlBaD333/fuWzLli1Gktm6desVt+/bt695+OGHXZYtW7bMeHl5mdOnT5s5c+aYkJAQk5GRUeD2t956qxk+fLjLsoICkCTz888/O9d55JFHTGBgoDl+/LhzWUJCgnnkkUcuWeuqVauMJOc2F7+PMeaqPr+87T7//HOX/QcHB5tp06Zd8v2BsoRLYEAZsmPHDt17772qW7euQkJCFB0dLUlKTU3V1q1b1bx5cwUGBjrXj4uLy7ePd955R7GxsapevbqCgoL03nvvKTU11WWdgvZz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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"from sklearn.ensemble import AdaBoostClassifier \n",
"\n",
"\n",
"pipeline = Pipeline([\n",
" ('adaboost', AdaBoostClassifier(base_estimator=DecisionTreeClassifier()))\n",
"])\n",
"\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_range = [int(x) for x in np.linspace(start = 1, stop = 500, num = 10)]\n",
"\n",
"param_name = 'adaboost__n_estimators'\n",
"\n",
"# Calculate train and test scores using 5 fold cross validation\n",
"train_scores, test_scores = \\\n",
" validation_curve(estimator = pipeline,\n",
" X = X_dev,\n",
" y = y_dev,\n",
" scoring = score_type,\n",
" param_name = param_name,\n",
" param_range = param_range, \n",
" cv = 5)\n",
"\n",
"# Convert train and test scores into a DataFrame\n",
"score_df = pd.DataFrame({'Train':train_scores.mean(axis=1),\n",
" 'Validation':test_scores.mean(axis=1),\n",
" param_name:param_range})\n",
"\n",
"# Plot the scores as a function of hyperparameter\n",
"f, ax = plt.subplots()\n",
"score_df.set_index(param_name).plot(logx=False, ax=ax)\n",
"ax.set_ylabel(score_type)\n",
"plt.show()\n",
"\n",
"# It's overfitting even with very small values of n_estimators, \n",
"# but overfitting even more for larger values\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 4.2**\n",
"> \n",
"> As AdaBoost is a boosting algorithm, it is designed to use weak learners. What does this imply for the hyperparameter space you should search over?"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# The base estimators should be weak, \n",
"# i.e. uncomplicated, such as Decision Trees with low max depth.\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 4.3 (OPTIONAL)**\n",
"> \n",
"> Iterate over the hyperparameter grid given below using `RandomizedSearchCV` with `n_iter = 10`. Are there any new hyperparameters that you haven't seen before? Consider whether you are getting any corner solutions? What does this imply for your hyperparameter search?\n",
"> \n",
">\n",
"> Note how I specify hyperparameters in the decision tree using `__` twice, first to access `base_estimator` and then the base estimators hyperparameters."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.ensemble import AdaBoostClassifier\n",
"\n",
"pipeline = Pipeline([\n",
" ('adaboost', AdaBoostClassifier(base_estimator=DecisionTreeClassifier()))\n",
"])\n",
"\n",
"\n",
"param_grid= [{\n",
" 'adaboost__n_estimators': [int(x) for x in np.linspace(start = 200, stop = 2000, num = 4)],\n",
" 'adaboost__learning_rate': [0.01, 0.1, 0.5, 1],\n",
" 'adaboost__base_estimator__max_depth': [1, 5, 9],\n",
" 'adaboost__base_estimator__min_samples_split': [2, 5, 9],\n",
" 'adaboost__base_estimator__min_samples_leaf': [1, 3, 5],\n",
" 'adaboost__base_estimator__max_leaf_nodes': [2, 5, 9],\n",
" } ]\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'adaboost__n_estimators': 2000, 'adaboost__learning_rate': 0.01, 'adaboost__base_estimator__min_samples_split': 9, 'adaboost__base_estimator__min_samples_leaf': 1, 'adaboost__base_estimator__max_leaf_nodes': 9, 'adaboost__base_estimator__max_depth': 1}\n",
"Vali score 0.853\n",
"Test score 0.858\n"
]
}
],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"# Introduced max_leaf_nodes to make sure we have weak learners\n",
"\n",
"from sklearn.ensemble import AdaBoostClassifier\n",
"\n",
"pipeline = Pipeline([\n",
" ('adaboost', AdaBoostClassifier(base_estimator=DecisionTreeClassifier()))\n",
"])\n",
"\n",
"score_type = 'accuracy'\n",
"\n",
"param_grid= [{\n",
" 'adaboost__n_estimators': [int(x) for x in np.linspace(start = 200, stop = 2000, num = 4)],\n",
" 'adaboost__learning_rate': [0.01, 0.1, 0.5, 1],\n",
" 'adaboost__base_estimator__max_depth': [1, 5, 9],\n",
" 'adaboost__base_estimator__min_samples_split': [2, 5, 9],\n",
" 'adaboost__base_estimator__min_samples_leaf': [1, 3, 5],\n",
" 'adaboost__base_estimator__max_leaf_nodes': [2, 5, 9],\n",
" } ]\n",
"\n",
"rs = RandomizedSearchCV(estimator=pipeline, \n",
" param_distributions=param_grid, \n",
" scoring=score_type, \n",
" cv=5, \n",
" n_iter = 10,\n",
" n_jobs=-1,\n",
" random_state=73)\n",
"\n",
"rs = rs.fit(X_dev, y_dev)\n",
"print(rs.best_params_)\n",
"print(f'Vali score {rs.best_score_:.3f}')\n",
"print(f'Test score {accuracy_score(rs.predict(X_test), y_test):.3f}')\n",
"\n",
"### END SOLUTION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Gradient Boosting\n",
"\n",
"As a small aside, there exists a subset of boosting models called Gradient Boosting models. These models are very powerful, and you should be aware that they exist. In essence, instead of changing weights of samples, they are trained to minimize the residual. \n",
"\n",
"One example from `sklearn` is `GradientBoostingClassifier`, see documentation [here](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html) and `HistGradientBoostingClassifier`, see documentation [here](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.HistGradientBoostingClassifier.html#sklearn.ensemble.HistGradientBoostingClassifier), which also have `Regressor` counterparts. \n",
"\n",
"The perhaps most popular is `XGBoost`. It is not implemented in `sklearn`, but it uses the same interface, so the process is exactly the same with `fit` and `predict`. See the documentation [here](https://xgboost.readthedocs.io/en/stable/python/python_intro.html#). The source is Chen, T., & Guestrin, C. (2016, August). Xgboost: A scalable tree boosting system. In Proceedings of the 22nd acm sigkdd international conference on knowledge discovery and data mining (pp. 785-794). \n",
"\n",
"Other boosting algorithms are `LightGBM` for efficient training and `CatBoost` for many categorical features."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Neural network\n",
"\n",
"## A visual inspection of neural networks\n",
"Instead of diving into code, it's more important that our intuition about what neural networks are doing is as good as possible. The best (and most fun) way to do that is to play around and with things a bit, so go familiarize yourself with the [Tensorflow Playground](https://playground.tensorflow.org/), slide some knobs and pull some levers. The example in the lecture uses the same idea for demonstrating the intuition of neural networks."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 5.1** \n",
">\n",
"> Using the dataset with the two point clouds, create the minimal neural network that separates the clusters. You can share your answer with a link (the URL on playground.tensorflow.org changes as you update the network, so at any time you can use the link to show others what you have created)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Candidate answer](https://playground.tensorflow.org/#activation=sigmoid&batchSize=10&dataset=gauss®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=&seed=0.51946&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 5.2** \n",
"> \n",
"> Using the dataset with the two circular clusters, one inner and one outer. Create the minimal neural network that separates the clusters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Candidate answer](https://playground.tensorflow.org/#activation=sigmoid&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=3&seed=0.16342&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 5.3 (OPTIONAL)** \n",
"> \n",
"> See if you can create a network that performs well on the the dataset with the intertwined spirals. Can you do it with only $x_1$ and $x_2$?\n",
">> *Hints*: \n",
">>\n",
">> Try experimenting with depth of the network, regularization and possibly the activation function"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Candidate answer using all features](https://playground.tensorflow.org/#activation=relu&batchSize=10&dataset=spiral®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=7,7,8&seed=0.64953&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=true&xSquared=true&ySquared=true&cosX=false&sinX=true&cosY=false&sinY=true&collectStats=false&problem=classification&initZero=false&hideText=false) and [candidate answer with vertical/horizontal only](https://playground.tensorflow.org/#activation=relu®ularization=L2&batchSize=10&dataset=spiral®Dataset=reg-plane&learningRate=0.03®ularizationRate=0.001&noise=0&networkShape=8,8,8,8,8&seed=0.65027&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having now slid some knobs and pulled some levers to get some intuition for how the neural networks operate, we turn to the Multilayer Perceptron in `sklearn`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **Exercise 5.4 (OPTIONAL)**\n",
"> \n",
"> Try to create a neural network which performs better than the best model on the test data. You may want to consider looking at different strengths of regularization (`alpha`, perhaps using `np.logspace`) and different amounts of hidden layers and hidden neurons. At this point in time, a just semi-exhaustive search of hyperparameters becomes computationally infeasible, and machine learning turns to art. \n",
"> \n",
"> *Note:* It is not given that a neural network performs best for the given problem, and even if the model exists, it may be hard to find the right architecture. I have not succeeded.\n",
">\n",
">> *Hints:* \n",
">>\n",
">> It may be time-consuming to do k fold cross validation. Splitting your development data into a train and validation set a single time is also a possibility. Only rule is that you don't use the test data for model selection!"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"### BEGIN SOLUTION\n",
"\n",
"X_train, X_val, y_train, y_val = train_test_split(X_dev, y_dev, train_size=0.8, random_state=73)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"