{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 13 - Ensemble Methods - Random Forest\n",
"\n",
"\n",
"by [Alejandro Correa Bahnsen](albahnsen.com/) and [Jesus Solano](https://github.com/jesugome)\n",
"\n",
"version 1.5, February 2019\n",
"\n",
"## Part of the class [Practical Machine Learning](https://github.com/albahnsen/PracticalMachineLearningClass)\n",
"\n",
"\n",
"\n",
"This notebook is licensed under a [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US). Special thanks goes to [Kevin Markham](https://github.com/justmarkham))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Why are we learning about ensembling?\n",
"\n",
"- Very popular method for improving the predictive performance of machine learning models\n",
"- Provides a foundation for understanding more sophisticated models"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Lesson objectives\n",
"\n",
"Students will be able to:\n",
"\n",
"- Explain the difference between bagged trees and Random Forests\n",
"- Build and tune a Random Forest model in scikit-learn\n",
"- Decide whether a decision tree or a Random Forest is a better model for a given problem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Part 1: Building and tuning decision trees\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
AtBat
\n",
"
Hits
\n",
"
HmRun
\n",
"
Runs
\n",
"
RBI
\n",
"
Walks
\n",
"
Years
\n",
"
CAtBat
\n",
"
CHits
\n",
"
CHmRun
\n",
"
CRuns
\n",
"
CRBI
\n",
"
CWalks
\n",
"
League
\n",
"
Division
\n",
"
PutOuts
\n",
"
Assists
\n",
"
Errors
\n",
"
Salary
\n",
"
NewLeague
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1
\n",
"
315
\n",
"
81
\n",
"
7
\n",
"
24
\n",
"
38
\n",
"
39
\n",
"
14
\n",
"
3449
\n",
"
835
\n",
"
69
\n",
"
321
\n",
"
414
\n",
"
375
\n",
"
N
\n",
"
W
\n",
"
632
\n",
"
43
\n",
"
10
\n",
"
475.0
\n",
"
N
\n",
"
\n",
"
\n",
"
2
\n",
"
479
\n",
"
130
\n",
"
18
\n",
"
66
\n",
"
72
\n",
"
76
\n",
"
3
\n",
"
1624
\n",
"
457
\n",
"
63
\n",
"
224
\n",
"
266
\n",
"
263
\n",
"
A
\n",
"
W
\n",
"
880
\n",
"
82
\n",
"
14
\n",
"
480.0
\n",
"
A
\n",
"
\n",
"
\n",
"
3
\n",
"
496
\n",
"
141
\n",
"
20
\n",
"
65
\n",
"
78
\n",
"
37
\n",
"
11
\n",
"
5628
\n",
"
1575
\n",
"
225
\n",
"
828
\n",
"
838
\n",
"
354
\n",
"
N
\n",
"
E
\n",
"
200
\n",
"
11
\n",
"
3
\n",
"
500.0
\n",
"
N
\n",
"
\n",
"
\n",
"
4
\n",
"
321
\n",
"
87
\n",
"
10
\n",
"
39
\n",
"
42
\n",
"
30
\n",
"
2
\n",
"
396
\n",
"
101
\n",
"
12
\n",
"
48
\n",
"
46
\n",
"
33
\n",
"
N
\n",
"
E
\n",
"
805
\n",
"
40
\n",
"
4
\n",
"
91.5
\n",
"
N
\n",
"
\n",
"
\n",
"
5
\n",
"
594
\n",
"
169
\n",
"
4
\n",
"
74
\n",
"
51
\n",
"
35
\n",
"
11
\n",
"
4408
\n",
"
1133
\n",
"
19
\n",
"
501
\n",
"
336
\n",
"
194
\n",
"
A
\n",
"
W
\n",
"
282
\n",
"
421
\n",
"
25
\n",
"
750.0
\n",
"
A
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns \\\n",
"1 315 81 7 24 38 39 14 3449 835 69 321 \n",
"2 479 130 18 66 72 76 3 1624 457 63 224 \n",
"3 496 141 20 65 78 37 11 5628 1575 225 828 \n",
"4 321 87 10 39 42 30 2 396 101 12 48 \n",
"5 594 169 4 74 51 35 11 4408 1133 19 501 \n",
"\n",
" CRBI CWalks League Division PutOuts Assists Errors Salary NewLeague \n",
"1 414 375 N W 632 43 10 475.0 N \n",
"2 266 263 A W 880 82 14 480.0 A \n",
"3 838 354 N E 200 11 3 500.0 N \n",
"4 46 33 N E 805 40 4 91.5 N \n",
"5 336 194 A W 282 421 25 750.0 A "
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"# read in the data\n",
"url = 'https://raw.githubusercontent.com/albahnsen/PracticalMachineLearningClass/master/datasets/hitters.csv'\n",
"hitters = pd.read_csv(url)\n",
"\n",
"# remove rows with missing values\n",
"hitters.dropna(inplace=True)\n",
"hitters.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" feature importance\n",
"0 AtBat 0.000000\n",
"7 League 0.000000\n",
"8 Division 0.000000\n",
"10 Assists 0.000000\n",
"11 Errors 0.000000\n",
"12 NewLeague 0.000000\n",
"9 PutOuts 0.006048\n",
"2 HmRun 0.010841\n",
"4 RBI 0.012073\n",
"3 Runs 0.021020\n",
"5 Walks 0.103473\n",
"1 Hits 0.298269\n",
"6 Years 0.548277"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# compute feature importances\n",
"pd.DataFrame({'feature':feature_cols, 'importance':clf.feature_importances_}).sort_values('importance')"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 10.000000\n",
"mean 0.820575\n",
"std 0.083007\n",
"min 0.692308\n",
"25% 0.751781\n",
"50% 0.830484\n",
"75% 0.879630\n",
"max 0.923077\n",
"dtype: float64"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series(cross_val_score(clf, X, y, cv=10)).describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Part 2: Random Forests\n",
"\n",
"Random Forests is a **slight variation of bagged trees** that has even better performance:\n",
"\n",
"- Exactly like bagging, we create an ensemble of decision trees using bootstrapped samples of the training set.\n",
"- However, when building each tree, each time a split is considered, a **random sample of m features** is chosen as split candidates from the **full set of p features**. The split is only allowed to use **one of those m features**.\n",
" - A new random sample of features is chosen for **every single tree at every single split**.\n",
" - For **classification**, m is typically chosen to be the square root of p.\n",
" - For **regression**, m is typically chosen to be somewhere between p/3 and p.\n",
"\n",
"What's the point?\n",
"\n",
"- Suppose there is **one very strong feature** in the data set. When using bagged trees, most of the trees will use that feature as the top split, resulting in an ensemble of similar trees that are **highly correlated**.\n",
"- Averaging highly correlated quantities does not significantly reduce variance (which is the entire goal of bagging).\n",
"- By randomly leaving out candidate features from each split, **Random Forests \"decorrelates\" the trees**, such that the averaging process can reduce the variance of the resulting model."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Predicting salary with a Random Forest"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\albah\\Anaconda3\\lib\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
" from numpy.core.umath_tests import inner1d\n"
]
},
{
"data": {
"text/plain": [
"RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n",
" max_depth=None, max_features='auto', max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,\n",
" oob_score=False, random_state=None, verbose=0,\n",
" warm_start=False)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.ensemble import RandomForestClassifier\n",
"clf = RandomForestClassifier()\n",
"clf"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 10.000000\n",
"mean 0.817749\n",
"std 0.062496\n",
"min 0.703704\n",
"25% 0.783333\n",
"50% 0.811254\n",
"75% 0.846154\n",
"max 0.923077\n",
"dtype: float64"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series(cross_val_score(clf, X, y, cv=10)).describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tuning n_estimators\n",
"\n",
"One important tuning parameter is **n_estimators**, which is the number of trees that should be grown. It should be a large enough value that the error seems to have \"stabilized\"."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"# list of values to try for n_estimators\n",
"estimator_range = range(10, 310, 10)\n",
"\n",
"# list to store the average Accuracy for each value of n_estimators\n",
"accuracy_scores = []\n",
"\n",
"# use 5-fold cross-validation with each value of n_estimators (WARNING: SLOW!)\n",
"for estimator in estimator_range:\n",
" clf = RandomForestClassifier(n_estimators=estimator, random_state=1, n_jobs=-1)\n",
" accuracy_scores.append(cross_val_score(clf, X, y, cv=5, scoring='accuracy').mean())"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Accuracy')"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(estimator_range, accuracy_scores)\n",
"plt.xlabel('n_estimators')\n",
"plt.ylabel('Accuracy')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tuning max_features\n",
"\n",
"The other important tuning parameter is **max_features**, which is the number of features that should be considered at each split."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"# list of values to try for max_features\n",
"feature_range = range(1, len(feature_cols)+1)\n",
"\n",
"# list to store the average Accuracy for each value of max_features\n",
"accuracy_scores = []\n",
"\n",
"# use 10-fold cross-validation with each value of max_features (WARNING: SLOW!)\n",
"for feature in feature_range:\n",
" clf = RandomForestClassifier(n_estimators=200, max_features=feature, random_state=1, n_jobs=-1)\n",
" accuracy_scores.append(cross_val_score(clf, X, y, cv=5, scoring='accuracy').mean())"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Accuracy')"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"