{
"cells": [
{
"cell_type": "markdown",
"id": "c7938b37",
"metadata": {},
"source": [
"Now that I have the data, it is time to train a model to learn how to create these tiers. As I am going through the fastai course (specifically the Tabular section), I will use the fastai library to train a neural network, as well as their recommended Random Forest approach to see which performs best. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "6e9599ba",
"metadata": {},
"outputs": [],
"source": [
"from fastai.tabular.all import *\n",
"from sklearn.tree import DecisionTreeRegressor, export_graphviz\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"from scipy.cluster import hierarchy as hc\n",
"import graphviz\n",
"import os\n",
"from dtreeviz.trees import *\n",
"from treeinterpreter import treeinterpreter\n",
"from waterfall_chart import plot as waterfall\n",
"from sklearn.inspection import plot_partial_dependence\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix"
]
},
{
"cell_type": "markdown",
"id": "eac4bcb3",
"metadata": {},
"source": [
"# Load CSV into Fastai Dataloaders and Train/Valid Splits"
]
},
{
"cell_type": "markdown",
"id": "e804b4f8",
"metadata": {},
"source": [
"I will use FastAis dataloaders to easily load, normalize, and split the data for future training. \n",
"I also export the train and valid datasets to try out with the Decision Trees/Random Forest approach."
]
},
{
"cell_type": "code",
"execution_count": 143,
"id": "a5c98335",
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(\"rookie_year.csv\")\n",
"splits = RandomSplitter(valid_pct=0.2)(range_of(df))"
]
},
{
"cell_type": "markdown",
"id": "3b41b614",
"metadata": {},
"source": [
"I've decided to use the following categories: Completions, Attempts, Yards, Completion Percentage, Touchdowns, Interceptions, Yards/Game, and Sacks to feed the model. "
]
},
{
"cell_type": "code",
"execution_count": 144,
"id": "b6df7e2a",
"metadata": {},
"outputs": [],
"source": [
"to = TabularPandas(df,\n",
" cont_names=[\"Cmp\", \"Att\", \"Yds\", \"Cmp%\", \"TD\", \"Int\", \"Y/G\", \"Sk\"],\n",
" y_names=\"Tier\",\n",
" procs=[FillMissing, Normalize],\n",
" splits=splits\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 145,
"id": "2994daa6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
" \n",
"
\n",
"
\n",
"
Cmp
\n",
"
Att
\n",
"
Yds
\n",
"
Cmp%
\n",
"
TD
\n",
"
Int
\n",
"
Y/G
\n",
"
Sk
\n",
"
Tier
\n",
"
\n",
" \n",
" \n",
"
\n",
"
239
\n",
"
47.0
\n",
"
98.0
\n",
"
530.0
\n",
"
48.000000
\n",
"
3.0
\n",
"
2.0
\n",
"
132.500000
\n",
"
18.0
\n",
"
Below-Average Career QB
\n",
"
\n",
"
\n",
"
293
\n",
"
255.0
\n",
"
476.0
\n",
"
2894.0
\n",
"
53.599998
\n",
"
11.0
\n",
"
22.0
\n",
"
192.899994
\n",
"
38.0
\n",
"
Below-Average Career QB
\n",
"
\n",
"
\n",
"
267
\n",
"
52.0
\n",
"
126.0
\n",
"
716.0
\n",
"
41.299999
\n",
"
8.0
\n",
"
13.0
\n",
"
89.500000
\n",
"
20.0
\n",
"
Below-Average Career QB
\n",
"
\n",
"
\n",
"
98
\n",
"
169.0
\n",
"
320.0
\n",
"
2074.0
\n",
"
52.799999
\n",
"
10.0
\n",
"
12.0
\n",
"
172.800003
\n",
"
28.0
\n",
"
Average Career QB
\n",
"
\n",
"
\n",
"
322
\n",
"
82.0
\n",
"
161.0
\n",
"
864.0
\n",
"
50.900002
\n",
"
4.0
\n",
"
9.0
\n",
"
123.400002
\n",
"
15.0
\n",
"
Below-Average Career QB
\n",
"
\n",
"
\n",
"
5
\n",
"
173.0
\n",
"
296.0
\n",
"
2210.0
\n",
"
58.400002
\n",
"
20.0
\n",
"
6.0
\n",
"
200.899994
\n",
"
10.0
\n",
"
Elite Career QB
\n",
"
\n",
"
\n",
"
40
\n",
"
158.0
\n",
"
328.0
\n",
"
2158.0
\n",
"
48.200001
\n",
"
19.0
\n",
"
16.0
\n",
"
154.100006
\n",
"
36.0
\n",
"
Above Average Career QB
\n",
"
\n",
"
\n",
"
11
\n",
"
87.0
\n",
"
194.0
\n",
"
1126.0
\n",
"
44.799999
\n",
"
6.0
\n",
"
13.0
\n",
"
112.599998
\n",
"
14.0
\n",
"
Elite Career QB
\n",
"
\n",
"
\n",
"
41
\n",
"
166.0
\n",
"
346.0
\n",
"
2183.0
\n",
"
48.000000
\n",
"
18.0
\n",
"
21.0
\n",
"
155.899994
\n",
"
47.0
\n",
"
Above Average Career QB
\n",
"
\n",
"
\n",
"
288
\n",
"
178.0
\n",
"
261.0
\n",
"
1694.0
\n",
"
68.199997
\n",
"
8.0
\n",
"
7.0
\n",
"
24.200001
\n",
"
26.0
\n",
"
Below-Average Career QB
\n",
"
\n",
" \n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"to.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "b4855366",
"metadata": {},
"outputs": [],
"source": [
"dls = to.dataloaders(bs=64)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "1126b4b4",
"metadata": {},
"outputs": [],
"source": [
"# Train Valid Split\n",
"xs,y = to.train.xs,to.train.y \n",
"valid_xs,valid_y = to.valid.xs,to.valid.y"
]
},
{
"cell_type": "markdown",
"id": "d77e5d80",
"metadata": {},
"source": [
"# Decision Trees/Random Forests"
]
},
{
"cell_type": "markdown",
"id": "8bb4b750",
"metadata": {},
"source": [
"Fastai Recommends to at least try this approach first to see the performance since they are easier to work with, train, and understand than neural networks. "
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "065dc50c",
"metadata": {},
"outputs": [],
"source": [
"# Helper functions for Tree Visualization\n",
"os.environ[\"PATH\"] += os.pathsep + 'C:/Program Files (x86)/Graphviz/bin/'\n",
"def draw_tree(t, df, size=10, ratio=0.6, precision=0, **kwargs):\n",
" s=export_graphviz(t, out_file=None, feature_names=df.columns, filled=True, rounded=True,\n",
" special_characters=True, rotate=False, precision=precision, **kwargs)\n",
" return graphviz.Source(re.sub('Tree {', f'Tree {{ size={size}; ratio={ratio}', s))\n",
"\n",
"def cluster_columns(df, figsize=(10,6), font_size=12):\n",
" corr = np.round(scipy.stats.spearmanr(df).correlation, 4)\n",
" corr_condensed = hc.distance.squareform(1-corr)\n",
" z = hc.linkage(corr_condensed, method='average')\n",
" fig = plt.figure(figsize=figsize)\n",
" hc.dendrogram(z, labels=df.columns, orientation='left', leaf_font_size=font_size)\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"id": "0f172991",
"metadata": {},
"source": [
"### Simple Decision Tree with 4 leaf nodes"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "f0341db8",
"metadata": {},
"outputs": [],
"source": [
"m = DecisionTreeRegressor(max_leaf_nodes=4)\n",
"m.fit(xs, y);"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "cf217221",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"draw_tree(m, xs, size=10, leaves_parallel=True, precision=2)"
]
},
{
"cell_type": "markdown",
"id": "588f5cff",
"metadata": {},
"source": [
"Similar Visualization, but with the datapoints"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "e3434720",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:450: UserWarning: X does not have valid feature names, but DecisionTreeRegressor was fitted with feature names\n",
" warnings.warn(\n"
]
},
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"samp_idx = np.random.permutation(len(y))[:500]\n",
"dtreeviz(m, xs.iloc[samp_idx], y.iloc[samp_idx], xs.columns, \"Tier\",\n",
" fontname='DejaVu Sans', scale=2, label_fontsize=10,\n",
" orientation='LR')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "28ce0ea8",
"metadata": {},
"outputs": [],
"source": [
"def r_mse(pred,y): return round(math.sqrt(((pred-y)**2).mean()), 6)\n",
"def m_rmse(m, xs, y): return r_mse(m.predict(xs), y)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "155d9325",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"325"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(xs)"
]
},
{
"cell_type": "markdown",
"id": "e4b30628",
"metadata": {},
"source": [
"### Use arbitraly big Decision Tree"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "cf682f74",
"metadata": {},
"outputs": [],
"source": [
"m = DecisionTreeRegressor()\n",
"m.fit(xs, y);"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "49ee9105",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0, 1.300522)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m_rmse(m, xs, y), m_rmse(m, valid_xs, valid_y)"
]
},
{
"cell_type": "markdown",
"id": "73d2d181",
"metadata": {},
"source": [
"Train Error is 0, but valid error is high (definition of overfitting). Here is why:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "f6c3c51c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(124, 325)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m.get_n_leaves(), len(xs)"
]
},
{
"cell_type": "markdown",
"id": "861edf2e",
"metadata": {},
"source": [
"There are too many leaves compared to datapoints, need to have less so it can generalize more... Time for random forests to do this!"
]
},
{
"cell_type": "markdown",
"id": "d816c4a7",
"metadata": {},
"source": [
"### Random Forests"
]
},
{
"cell_type": "markdown",
"id": "712c7fd5",
"metadata": {},
"source": [
"Use the random forest approach with 40 \"estimators\" (random trees) which will be averaged (called bagging). "
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "935e23b3",
"metadata": {},
"outputs": [],
"source": [
"def rf(xs, y, n_estimators=40, max_samples=len(xs),\n",
" max_features=0.5, min_samples_leaf=5, **kwargs):\n",
" m = RandomForestRegressor(n_jobs=-1, n_estimators=n_estimators,\n",
" max_samples=max_samples, max_features=max_features,\n",
" min_samples_leaf=min_samples_leaf, oob_score=True)\n",
" m.fit(xs, y)\n",
" return m"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "8e50772a",
"metadata": {},
"outputs": [],
"source": [
"m = rf(xs, y)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "2762c7e7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.617003, 0.841323)"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m_rmse(m, xs, y), m_rmse(m, valid_xs, valid_y)"
]
},
{
"cell_type": "markdown",
"id": "82bd1adf",
"metadata": {},
"source": [
"It looks like the error is much better. Now I will check how many estimators to use..."
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "0d6d3707",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n",
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\base.py:443: UserWarning: X has feature names, but DecisionTreeRegressor was fitted without feature names\n",
" warnings.warn(\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"preds = np.stack([t.predict(valid_xs) for t in m.estimators_])\n",
"plt.plot([r_mse(preds[:i+1].mean(0), valid_y) for i in range(40)]);"
]
},
{
"cell_type": "markdown",
"id": "141e6fb8",
"metadata": {},
"source": [
"It looks like 40 estimators seems to give us some of the best performance. We can also look at the oob (out-of-bag) error. https://en.wikipedia.org/wiki/Out-of-bag_error"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "7ab2abb1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.860368"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r_mse(m.oob_prediction_, y)"
]
},
{
"cell_type": "markdown",
"id": "fa422767",
"metadata": {},
"source": [
"This is a bit higher than the valid set, which makes sense. Now I will look at the predictions. I want to know how important each feature is in the dataset. Luckily there is this nice property (feature_importances_) that tells us just that"
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "22035062",
"metadata": {},
"outputs": [],
"source": [
"def rf_feat_importance(m, df):\n",
" return pd.DataFrame({'cols':df.columns, 'imp':m.feature_importances_}\n",
" ).sort_values('imp', ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "0af127b7",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
cols
\n",
"
imp
\n",
"
\n",
" \n",
" \n",
"
\n",
"
3
\n",
"
Cmp%
\n",
"
0.147414
\n",
"
\n",
"
\n",
"
4
\n",
"
TD
\n",
"
0.145543
\n",
"
\n",
"
\n",
"
0
\n",
"
Cmp
\n",
"
0.144447
\n",
"
\n",
"
\n",
"
2
\n",
"
Yds
\n",
"
0.143749
\n",
"
\n",
"
\n",
"
6
\n",
"
Y/G
\n",
"
0.120133
\n",
"
\n",
"
\n",
"
1
\n",
"
Att
\n",
"
0.114358
\n",
"
\n",
"
\n",
"
7
\n",
"
Sk
\n",
"
0.107574
\n",
"
\n",
"
\n",
"
5
\n",
"
Int
\n",
"
0.076782
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" cols imp\n",
"3 Cmp% 0.147414\n",
"4 TD 0.145543\n",
"0 Cmp 0.144447\n",
"2 Yds 0.143749\n",
"6 Y/G 0.120133\n",
"1 Att 0.114358\n",
"7 Sk 0.107574\n",
"5 Int 0.076782"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fi = rf_feat_importance(m, xs)\n",
"fi"
]
},
{
"cell_type": "markdown",
"id": "532e13e4",
"metadata": {},
"source": [
"Completion Percentage Seems to be the highest category followed by TD. Interestingly enough, interceptions are the lowest predictor. One thing to do is see if I can remove low-importance features. I'll use the cluster_columns function defined above which can tell us how closely connected two components are. "
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "73887e96",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"cluster_columns(xs)"
]
},
{
"cell_type": "markdown",
"id": "424be215",
"metadata": {},
"source": [
"It looks like Attempts and Completions are pretty similar (which makes sense) "
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "fe8c12fb",
"metadata": {},
"outputs": [],
"source": [
"def get_oob(df):\n",
" m = RandomForestRegressor(n_estimators=40, min_samples_leaf=15,\n",
" max_samples=len(df), max_features=0.5, n_jobs=-1, oob_score=True)\n",
" m.fit(df, y)\n",
" return m.oob_score_"
]
},
{
"cell_type": "markdown",
"id": "7ec8a178",
"metadata": {},
"source": [
"I will check the difference of OOB Error between Completions and Attempts"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "ee94b69a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.006721497139362986"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_oob(xs)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "4485995a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'Cmp': 0.003757497556912348, 'Att': -0.000486470984402132}"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"{c:get_oob(xs.drop(c, axis=1)) for c in (\n",
" 'Cmp', 'Att')}"
]
},
{
"cell_type": "markdown",
"id": "6188e231",
"metadata": {},
"source": [
"I will drop the completions column and try the random forest again"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "336da4b9",
"metadata": {},
"outputs": [],
"source": [
"xs_final = xs.drop((\"Cmp\"), axis=1)\n",
"valid_xs_final = valid_xs.drop((\"Cmp\"), axis=1)"
]
},
{
"cell_type": "markdown",
"id": "fc0a7c96",
"metadata": {},
"source": [
"But first, save the final dataset for future processing"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "e5518547",
"metadata": {},
"outputs": [],
"source": [
"save_pickle('xs_final.pkl', xs_final)\n",
"save_pickle('valid_xs_final.pkl', valid_xs_final)"
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "30840512",
"metadata": {},
"outputs": [],
"source": [
"xs_final = load_pickle('xs_final.pkl')\n",
"valid_xs_final = load_pickle('valid_xs_final.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 109,
"id": "ca07591b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.628506, 0.869091)"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = rf(xs_final, y)\n",
"m_rmse(m, xs_final, y), m_rmse(m, valid_xs_final, valid_y)"
]
},
{
"cell_type": "markdown",
"id": "e0d794a9",
"metadata": {},
"source": [
"I will also plot partial dependence on some of the best features. This will tell me how much each feature affects the overall score if all the other features were unchanged. "
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "df65d79f",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function plot_partial_dependence is deprecated; Function `plot_partial_dependence` is deprecated in 1.0 and will be removed in 1.2. Use PartialDependenceDisplay.from_estimator instead\n",
" warnings.warn(msg, category=FutureWarning)\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig,ax = plt.subplots(figsize=(12, 4))\n",
"plot_partial_dependence(m, valid_xs_final, ['Cmp%','TD'],\n",
" grid_resolution=20, ax=ax);"
]
},
{
"cell_type": "markdown",
"id": "d873a9ab",
"metadata": {},
"source": [
"Completion percentage looks good. The better the completion percentage, the better the overall score. However, TDs are a bit concerning. I will now use the treeinterpreter on a row to see how these predictions are made on an individual row. "
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "1ea2721d",
"metadata": {},
"outputs": [],
"source": [
"row = valid_xs_final.iloc[:5]"
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "be976f7a",
"metadata": {},
"outputs": [],
"source": [
"prediction,bias,contributions = treeinterpreter.predict(m, row.values)"
]
},
{
"cell_type": "code",
"execution_count": 114,
"id": "cc57a5be",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([1.62246257]), 1.4856153846153846, 0.13684718549424438)"
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prediction[0], bias[0], contributions[0].sum()"
]
},
{
"cell_type": "code",
"execution_count": 118,
"id": "f9ed2e3a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Att 0.301647\n",
"Yds 0.442272\n",
"Cmp% 1.244385\n",
"TD -0.550133\n",
"Int -1.090999\n",
"Y/G 0.323963\n",
"Sk -0.063729\n",
"Name: 81, dtype: float64"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valid_xs_final.iloc[0]"
]
},
{
"cell_type": "markdown",
"id": "c0045a86",
"metadata": {},
"source": [
"Lets's see which QB this is..."
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "76c9976d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Unnamed: 0 5\n",
"Name Jeff Hostetler\n",
"Year 1991\n",
"Age 30\n",
"Tm 0.0\n",
"Pos 0.0\n",
"No. 15.0\n",
"G 12\n",
"GS 12.0\n",
"QBrec 0.0\n",
"Cmp 179\n",
"Att 285\n",
"Cmp% 62.8\n",
"Yds 2032\n",
"TD 5\n",
"TD% 1.8\n",
"Int 4\n",
"Int% 1.4\n",
"1D 0.0\n",
"Lng 55\n",
"Y/A 7.1\n",
"AY/A 6.8\n",
"Y/C 11.4\n",
"Y/G 169.3\n",
"Rate 84.1\n",
"QBR 0.0\n",
"Sk 20\n",
"Yds.1 100\n",
"Sk% 6.6\n",
"NY/A 6.33\n",
"ANY/A 6.07\n",
"4QC 1.0\n",
"GWD 2.0\n",
"AV 10\n",
"Awards 0.0\n",
"Career_AV 65\n",
"Tier Above Average Career QB\n",
"Name: 81, dtype: object"
]
},
"execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[valid_xs_final.iloc[0].name]"
]
},
{
"cell_type": "code",
"execution_count": 120,
"id": "60a8acf4",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\matth\\Anaconda3\\envs\\qb_preds\\lib\\site-packages\\waterfall_chart.py:66: FutureWarning: Behavior when concatenating bool-dtype and numeric-dtype arrays is deprecated; in a future version these will cast to object dtype (instead of coercing bools to numeric values). To retain the old behavior, explicitly cast bool-dtype arrays to numeric dtype.\n",
" trans.loc[net_label]= total\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAsRUlEQVR4nO3de3xU1bn/8c9jIIDcg1ERFLGiCFVRIygYg2IVUA5Ua5XiBW/UgmhbS8WfVouXovV4KigHb0CwWC/1Sm1QOWgUqyIRI4otEpGbgCKBCEJCAs/vj70Th5CQDJfMnvB9v155zZ619trzLEjmmbX2mr3N3REREYma/RIdgIiISFWUoEREJJKUoEREJJKUoEREJJKUoEREJJIaJDqA3XHAAQf44YcfnugwRERkN3z44Yffunt65fKkTlCHH344eXl5iQ5DRER2g5ktrapcU3wiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJSlAiIhJJcScoM+trZgvNrMDMRldR39nM3jOzEjP7XaW6JWb2iZnlm1leTHmamc00s0XhY+td646IyK7Jzs+m56Se9Jrci3mr5m1XV1xWzJAXhpA5JZMhLwyhuKwYgCXrl3Dm1DPpNbkXf5r9p4r9z3riLHpn9ybj0Qye+uSpOu0H7Lwv7y5/l2MnHkvjuxqz4rsVFeWjXh9FVnYW3R/rzqjXRwFQuLmQ3tm9K34a3tmQdZvX1V1H3L3WP0AK8AVwBJAKfAx0qbTPgcDJwN3A7yrVLQEOqOK4fwZGh9ujgXtrE89JJ53kIiK7q3BToZ/w8AleUlbiiwsXe69Jvbarnzh3ot+Re4e7u4/JHeMT5050d/eL/n6Rv73kbXd37zO1j/97zb/d3b2krMTd3YuKi/zwBw6vq264e819Wb95vW8o2eBZU7J8edHyivLymN3dT59yun/69afbtZuzYo6f89dz9krMQJ5X8R4f7wiqO1Dg7ovdfQvwNDCwUsL7xt3nAqVxHHcgMDXcngoMijMuEUmAPfVJHeDKl6+k7f1tuXr61XUWf7k5X80h87BMUlNS6di6Ixu3bKSkrKSiPndJLucddR4AA44awNtL3wYgf3U+mR0yATi307kV5akpqQB8v+V7uqZ3rcuu1NiXlo1b0iy12Q7tymMu3VpK04ZNOaT5IdvVT5s/jUuOu2TvBl9JvAmqHbA85vmKsKy2HHjdzD40s2Ex5Qe5+yqA8PHA6g5gZsPMLM/M8tasWRPHS4vInrRu8zrGzxlP7tBcpv10GtfPuH67+q7pXXnvqvc4pf0p25Xf3edu3hr6Fh9c8wEfrPyABd8sAODOM+7kqQvqfjoMgqms1k1+OLPQsnFLCjcXVlnfqnEr1m5eC8A231axT6vGrVi7KSjfum0rWdlZHDvxWAYevd1n+L2upr7szMickRwx/gjaNmtLy8YtK8rLtpXxyuevMKjzoD0d7k7Fm6CsijKPo30vdz8R6AeMMLPT43x93P1Rd89w94z09B3ubyUidWRPf1Jv1yKez7p7VlqTNNYXr694XlRcRFqTtCrri0p+qNvPfngLjS1P2S+Ft4a+xcLrFjL2nbEUFRft/U5UESvs2JedebD/g3x5w5d8u/lbXi14taL89S9e59RDT63y/3NvijdBrQAOjXneHlhZ28buvjJ8/AZ4kWDKEOBrM2sLED5+E2dcIlLH9sYn9UTp0a4H7yx7h9KtpSwrWkaz1GY0atCooj6rQxY5i3IAyFmUQ1aHLACOP/h43l3+LgAzCmZweofTKd1aWjGyapralMYNGtO4QePI9KU65Qs/GuzXgKYNm7J/w/0r6qbNn8Ylx9bt9B7En6DmAp3MrKOZpQIXA9Nr09DMmppZ8/Jt4Gzg07B6OnB5uH058HKccYlIHdsbn9QTpXWT1gw/eThZ2VkMfn4wD/R9gPzV+dz3r/sAGNptKJ988wmZUzL55JtPGNptKABj+4zlljduodfkXmQelskx6cfwzfff0Du7N2dMPYMzp57JH07/Q60SRF315fO1n3PWE2fx8dcfM/j5wUycOxGAIS8MoXd2b3pN7sWhLQ6l9+G9Adi4ZSPvrXiPn/zoJ3XWhwpVrZzY2Q/QH/icYDXfLWHZtcC14fbBBCOt74D14XYLgpV/H4c/C8rbhm3aALOAReFjWm1i0So+kcQp3FToJz1ykm8p2+JL1y/dYbVYucqrxTaXbq7YHvzcYH/zyzcrnr/55Zt+1ctX7bWYJZqoZhWfBXXJKSMjw/Py8mreUUT2iskfTebxeY9jZozrO44G+zVg5hczGdVrFJ+v/Zzh/xzOh6s+5McH/phf/PgX/OrkX3HBsxewdtNaSreVctqhp3HvT+4F4NY3bmVGwQxWb1zNMQccw8sXv0zT1KYJ7qHUBTP70N0zdihXghIRkUSqLkHpUkciIhJJDRIdgIhIInRZc2rCXvuz9Pf26PE6zd2jh4vLopP33rE1ghIRkUjSCEpEaq0+jTr29PFkz9MISkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIkkJSkREIinuBGVmfc1soZkVmNnoKuo7m9l7ZlZiZr+rTVszSzOzmWa2KHxsvWvdERGR+iKuBGVmKcAEoB/QBRhsZl0q7VYIXA/8dxxtRwOz3L0TMCt8LiIi+7B4R1DdgQJ3X+zuW4CngYGxO7j7N+4+FyiNo+1AYGq4PRUYFGdcIiJSz8SboNoBy2OerwjLdrftQe6+CiB8PLC6g5jZMDPLM7O8NWvW1DpwERFJLvEmKKuizOug7Q8N3B919wx3z0hPT4+3uYiIJIl4E9QK4NCY5+2BlXug7ddm1hYgfPwmzrhERKSeiTdBzQU6mVlHM0sFLgam74G204HLw+3LgZfjjEtEROqZBvHs7O5lZnYd8BqQAkx29wVmdm1Y/7CZHQzkAS2AbWb2a6CLu39XVdvw0PcAz5rZVcAy4MI90DcREUlicSUoAHfPAXIqlT0cs72aYPquVm3D8rVAn3hjERGR+ktXkhARkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUhSghIRkUiKO0GZWV8zW2hmBWY2uop6M7PxYf18Mzsxpm6JmX1iZvlmlhdTnmZmM81sUfjYete7JCIi9UFcCcrMUoAJQD+gCzDYzLpU2q0f0Cn8GQZMrFR/hrt3c/eMmLLRwCx37wTMCp+LiMg+LN4RVHegwN0Xu/sW4GlgYKV9BgJPeOB9oJWZta3huAOBqeH2VGBQnHGJiEg9E2+Cagcsj3m+Iiyr7T4OvG5mH5rZsJh9DnL3VQDh44HVBWBmw8wsz8zy1qxZE2f4IiKSLOJNUFZFmcexTy93P5FgGnCEmZ0e5+vj7o+6e4a7Z6Snp8fbXEREkkS8CWoFcGjM8/bAytru4+7lj98ALxJMGQJ8XT4NGD5+E2dcIiJSz8SboOYCncyso5mlAhcD0yvtMx24LFzNdwpQ5O6rzKypmTUHMLOmwNnApzFtLg+3Lwde3oW+iIhIPdIgnp3dvczMrgNeA1KAye6+wMyuDesfBnKA/kABsAm4Imx+EPCimZW/7t/c/dWw7h7gWTO7ClgGXLhbvRIRkaQXV4ICcPccgiQUW/ZwzLYDI6potxg4vppjrgX6xBuLiIjUX7qShIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlIiIRJISlEgdy87PpueknvSa3It5q+ZtV1dcVsyQF4aQOSWTIS8MobisGIBRr48iKzuL7o91Z9Tro7ZrU7i5kNb3tmba/Gl11geRuqAEJVKH1m1ex/g548kdmsu0n07j+hnXb1efnZ9N5zadmX3FbI5uczTZ+dkA3N3nbt4a+hYfXPMBH6z8gAXfLKhoM3b2WHod2qsuuyFSJ5SgROrQnK/mkHlYJqkpqXRs3ZGNWzZSUlZSUZ+7JJfzjjoPgAFHDeDtpW8DkJqSCkDp1lKaNmzKIc0PAWBZ0TJWbVxFxiEZddwTkb1PCUqkDhVuLqR1k9YVz1s2bknh5sIq61s1bsXazWsr6kbmjOSI8UfQtllbWjZuCcCY3DHcknlLHUUvUreUoETqUFqTNNYXr694XlRcRFqTtCrri0q2r3uw/4N8ecOXfLv5W14teJVPvv4EM+OY9GPqKnyROhX3HXVFZNf1aNeDW9+4ldKtpazauIpmqc1o1KBRRX1WhyxyFuXQ7eBu5CzKIatDFhAsnmjcoDEN9mtA04ZN2b/h/ny46kMWrl1I32l9KSgsoGlqU45qcxTd23VPVPdE9iglKJE61LpJa4afPJys7CzMjHF9x5G/Op+ZX8xkVK9RDO02lCunX0nmlEzat2jPlIFTABjywhDWblpL6bZSTjv0NHof3huAod2GAvDH3D9yZNqRSk5Sr5i7JzqGXZaRkeF5eXmJDkNkn9FlzakJe+3P0t9L2GtHXae5iXvtRSfv/jHM7EN332Glj85BiYhIJMWdoMysr5ktNLMCMxtdRb2Z2fiwfr6ZnVhTWzNLM7OZZrYofGxd+bgiIrJviStBmVkKMAHoB3QBBptZl0q79QM6hT/DgIm1aDsamOXunYBZ4XMREdmHxbtIojtQ4O6LAczsaWAg8FnMPgOBJzw4ufW+mbUys7bA4TtpOxDoHbafCuQCN+1Cf0QiJ1HnbfbGORudB5K6FO8UXztgeczzFWFZbfbZWduD3H0VQPh4YJxxiYhIPRPvCMqqKKu8DLC6fWrTtuYAzIYRTB2Snp7OsGHD6Nq1K5mZmTz88MO0bNmSUaNGceuttwJw//33c/PNN7NlyxZ+85vf8NJLL/Hll1/y85//nBUj7uSdotWc2uIgOjRqxtNrvuCwRs24ML0j96/4hBTbj/s6due3i98H4PYOJ/LgygUUlpZw1cFH88GGNXzyfSF9W7cH4NV1Kzi2aRrdm6czafVC0ho2YuQhXRmzNLgg6P8ccQqjvvyArb6Nm2a/wjPPPMOyZcsYPHgwS5cu5d133yUzM5O2bdvy7LPP0rFjRwYNGsRf/vIXUlNTGTt2LDfeeCMAd911F/fddx9FRUVce+21zJ49mwULFjBgwABKSkp4/fXXOeGEEzjhhBOYPHky6enp/OpXv+KOO+4A4MEHH2TkyJEAjB49mr/+9a989dVXXHLJJSxatIg5c+bQu3dv2rRpw/PPP8+RRx5J//79GT9+PE2aNGHMmDH8/ve/B2Ds2LHcfffdbNy4kREjRjBr1iz+85//MGjQIDZs2MCsWbPIyMiga9euTJ06lYMPPpirrrqKu+++e4dYbrnlFiZNmsTq1au5/PLLWbBgAXl5efTp04fmzZvz0ksv0blzZ/r06cOECRNo1qwZt9xyCzfffDMAf/7zn7n99tvZvHkz119/PTk5ORQUFHDBBRewdu1acnNz6dGjB506dWLatGm0a9eOSy+9lHvuuWeHWG677TYmTpzImjVruPLKK/noo4/46KOPOPvss2nUqBH/+Mc/avW7t+q7xaT9si0bZhRSuqyEFv/VhrKvt7BpzgaanNyMhu0b8d2La2nYLpUWg9qwdsIq2A8OGtOBr/+wFIADft+edY+uZuv6MlpdciCb522k5LNNND2zFQDfv7GeRl32p8mJzVg/7RtSWjVg1c2ruP322wF44IEHuPHGG9m6dSujRo3S7149+90bFMf73qpVq5g9ezY9e/akQ4cOPPXUUxx22GFcdNFF3HfffaSkpHD//ffz61//GoAxY8Ywbtw4CgsLueaaa5gzZw7z58+nX79+AAx7bAbHHXccPXr04LHHHiMtLY0bbrghrt+9at/v41lmbmanAn9093PC5zcDuPvYmH0eAXLd/anw+UKC6bvDq2tbvo+7rwqnA3Pd/eia4tndZeZlmVftctvd1WD2pIS9ttSt+jTFJ7I37Kll5nOBTmbW0cxSgYuB6ZX2mQ5cFq7mOwUoCqftdtZ2OnB5uH058HKccYmISD0T1xSfu5eZ2XXAa0AKMNndF5jZtWH9w0AO0B8oADYBV+ysbXjoe4BnzewqYBlw4W73TEREklrclzpy9xyCJBRb9nDMtgMjats2LF8L9Ik3FhERqb90JQkREYkkJSgREYkkJShJCtn52fSc1JNek3sxb9W87eqKy4oZ8sIQMqdkMuSFIRSXFW9Xn5WdxdXTr654vnjdYgY8NYAzp57JZS9eVifxi0j8lKAk8tZtXsf4OePJHZrLtJ9O4/oZ129Xn52fTec2nZl9xWyObnM02fnZFXWvfP4KLRq12G7/63Ku49HzHuWNy9/giZ8+URddEJFdoAQlkTfnqzlkHpZJakoqHVt3ZOOWjZSUlVTU5y7J5byjzgNgwFEDeHvp2wBs821MmDuBESf/sGZn6fqlbCrdxA2v3kDv7N48/9nzddsZEak13bBQIq9wcyGtm/xwgfuWjVtSuLmQts3b7lDfqnEr1m5eC8DU/Kmc3/l8GjdoXNF25YaVfLT6Iz4b/hnNGzWn56SenNnxzO2OLyLRoBGURF5akzTWF6+veF5UXERak7Qq64tKgrrismKe/ORJrjjhih2OdeyBx9KuRTtaNGpBt4O7sahwUV10Q0TipAQlkdejXQ/eWfYOpVtLWVa0jGapzWjUoFFFfVaHLHIWBV+vy1mUQ1aHLL5c9yXri9dz3t/O4/czf89rX7zG4/Me58i0I9lUuokNJRso21bGZ2s+o0PLDonqmojshKb4JPJaN2nN8JOHk5WdhZkxru848lfnM/OLmYzqNYqh3YZy5fQryZySSfsW7ZkycAqNGzQmb1hwncbcJblMmz+Nq08MVvLde9a99HuyH6XbSrnmxGs4qNlBieyeiFQjrovFRo0uFivJQBeLFdm5PXWxWBERkTqhBCUiIpGkBCUiIpGkBCUiIpGkVXwSSfVpYYEWK4jsGo2gREQkkpSgREQkkpSgREQkkpSgREQkkpSgREQkkpSgREQkkuJKUBYYb2YFZjbfzE6sZr+OZjbHzBaZ2TNmlhqW9zazIjPLD39ui2nT18wWhscevXvdEhGRZBfvCKof0Cn8GQZMrGa/e4G/uHsnYB0Qe1XW2e7eLfy5A8DMUoAJ4fG7AIPNrEucsYmISD0Sb4IaCDzhgfeBVmbWNnYHMzPgTOC5sGgqMKiG43YHCtx9sbtvAZ4OX0tERPZR8SaodsDymOcrwrJYbYD17l5WzT6nmtnHZjbDzLrGcVwREdmHxHupI6uirPINpXa2zzygg7tvNLP+wEsE04W1OW5wcLNhBNOLHHbYYbUIWUREklGNIygzG1G+qAFYCRwaU90+LIv1LcHUX4PK+7j7d+6+MdzOARqa2QEEI6aajkvY7lF3z3D3jPT09JrCFxGRJFVjgnL3CeWLGghGPJeFq/lOAYrcfVWl/R14E/hZWHQ58DKAmR0cnqPCzLqHr78WmAt0Clf/pQIXA9P3QP9ERCRJxXsOKgdYDBQAjwHDyyvMLMfMDgmf3gT81swKCM5Jld/f/GfAp2b2MTAeuDhccFEGXAe8BvwbeNbdF+xin0REpB6I6xxUODoaUU1d/5jtxQQr8yrv8xDwUDXtcwgSoIiIiK4kUZ9l52fTc1JPek3uxbxV87arKy4rZsgLQ8icksmQF4ZQXFYMwIxFMzj5sZMrysu2BYsxH8l7hB6P9yBzSiazFs+q876IyL5HCaqeWrd5HePnjCd3aC7TfjqN62dcv119dn42ndt0ZvYVszm6zdFk52cD8Ic3/8BzFz7H7Ctm03C/hsz8YibffP8Nj3z4CO9c8Q45v8jhpv+7ia3btiagVyKyL1GCqqfmfDWHzMMySU1JpWPrjmzcspGSspKK+twluZx31HkADDhqAG8vfRuArgd2ZX3xetydopIi0pums2T9Erqkd6FhSkOaN2pO09SmfLHui4T0S0T2Hbrlez1VuLmQ1k1aVzxv2bglhZsLadu87Q71rRq3Yu3mtQBcdtxl9H2yLy0ateD4g44n45AMCjcXkr86n+9KvmNDyQY+Xv0xhZsL675TIrJP0Qiqnkprksb64vUVz4uKi0hrklZlfVHJD3W/fOWXfHD1Byy8biFpTdL4+4K/k9YkjTG9xzDgqQH85rXfcPzBx3NI80MQEdmblKDqqR7tevDOsnco3VrKsqJlNEttRqMGjSrqszpkkbMoWDSZsyiHrA5ZAKTsl1IxskrfP71ipHRBlwt4a+hbjOs7jv0b7s9hLXUVDxHZuzTFV0+1btKa4ScPJys7CzNjXN9x5K/OZ+YXMxnVaxRDuw3lyulXkjklk/Yt2jNl4BQA7jrjLs6ceiaNGzSmVeNW3HTaTQBc9uJlLP9uOfs33J8H+z2YyK6JyD7Cgq82JaeMjAzPy8vb5fZlmVfVvNNe0mD2pJp32od1WXNqQl73s/T3EvK6IvsyM/vQ3TMql2uKT0REIkkJSkREIkkJSkREIkmLJOqR+nTeRueCREQjKBERiSQlKBERiSQlKBERiSQlKBERiSQlKBERiSQlKBERiSQlKBERiSQlKBERiSQlKBERiaS4EpQFxptZgZnNN7MTq9nvunAfN7MDatPezPqa2cKwbvSud0lEROqDeEdQ/YBO4c8wYGI1+/0LOAtYWpv2ZpYCTAjruwCDzaxLnLGJiEg9Em+CGgg84YH3gVZm1rbyTu7+kbsviaN9d6DA3Re7+xbg6XBfERHZR8WboNoBy2OerwjLdrf97h5XRETqmXgTlFVRFs8teatrX+vjmtkwM8szs7w1a9bE8dIiIpJMakxQZjbCzPLNLB9YCRwaU90+LKutFdW0r658B+7+qLtnuHtGenp6HC8tIiLJpMYE5e4T3L2bu3cDXgIuC1fjnQIUufuqOF5vejXt5wKdzKyjmaUCF4f7iojIPireKb4cYDFQADwGDC+vMLMcMzsk3L7ezFYQjITmm9njO2vv7mXAdcBrwL+BZ919wa52SkREkl9cd9R1dwdGVFPXP2Z7PDA+zvY5BAlMREREV5IQEZFoUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIUoISEZFIiitBWWC8mRWY2XwzO7Ga/a4L93EzOyCmvLeZFZlZfvhzW0xdXzNbGLYbvetdEhGR+qBBnPv3AzqFPz2AieFjZf8CXgFyq6ib7e7nxRaYWQowAfgJsAKYa2bT3f2zOOMTEZF6It4pvoHAEx54H2hlZm0r7+TuH7n7kjiO2x0ocPfF7r4FeDp8LRER2UfFm6DaActjnq8Iy+Jxqpl9bGYzzKzrHjyuiIjUI/FO8VkVZR5H+3lAB3ffaGb9gZcIpgtrfVwzGwYMAzjssMPieGkREUkmNY6gzGxE+aIGYCVwaEx1+7CsVtz9O3ffGG7nAA3DRRQrantcd3/U3TPcPSM9Pb22Ly0iIkmmxgTl7hPcvZu7dyMY8VwWruY7BShy91W1fTEzO9jMLNzuHr7+WmAu0MnMOppZKnAxMD3u3oiISL0R7zmoHGAxUAA8BgwvrzCzHDM7JNy+3sxWEIyE5pvZ4+FuPwM+NbOPgfHAxeGCizLgOuA14N/As+6+YDf6JSIiSS6uc1Du7sCIaur6x2yPJ0hAlfd5CHiomvY5BAlQREREV5IQEZFoUoISEZFIUoISEZFIUoISEZFIiveLuvVKg9mTEh3CHvVZ+nuJDkFEZI/RCEpERCJJCUpERCJJCUpERCJJCaqyefOgVy/o2ROys3es37ABTj0VWrWCadO2r7v3XujTB3r3hjfeCMo2bYKrr/6hfN26vRu/iEg9sU8vkqjSyJFB4mnXDk45BQYOhNatf6hv0gRefBEefnj7djNmQFERzJq1ffmYMfDzn8PZZ+/92EVE6hGNoGKVlMD330PHjpCaCpmZMHfu9vs0aAAHH7xj22efheLiYKR06aVBsoIgYb36ajB6uv32vd4FEZH6Qgkq1tq1wdRduVatgrLaWLkS9tsvSEg9esDYsUH5J5/AmWfCm2/CZ58FyUpERGqkBAXw0EPBCOe2234Y+UCwnZZWu2OkpUHfvsF2374wf/725WZwzjk/lIuIyE4pQQFcdx3k5sLjj8P++8OyZVBaCu+8A9271+4YvXtDXl6wnZcHRx6583IREdkpLZKobNw4GDwY3GH48B8WSAwZAk8+GWwPGAALFgTJ7J13ggUTQ4fCNdfAGWdAw4bwxBPBvvfcE5QXF0OnTjBoUCJ6JSKSdCy4xVNyysjI8Lzy0YmIiCQlM/vQ3TMql2uKT0REIkkJSkREIkkJSkREIkkJSkREIkkJSkREIimuBGWB8WZWYGbzzezEavZ70swWmtmnZjbZzBrW1N7M+oZtCsxs9O51S0REkl28I6h+QKfwZxgwsZr9ngQ6A8cCTYCrd9bezFKACWF9F2CwmXWJMzYREalH4k1QA4EnPPA+0MrM2lbeyd1zwn0c+ABoX0P77kCBuy929y3A0+G+IiKyj4o3QbUDlsc8XxGWVSmc2rsUKL9CanXt4zquiIjUf/EmKKuibGeXovhf4G13n11D+1of18yGmVmemeWtWbNmp8GKiEjyqjFBmdkIM8s3s3xgJXBoTHX7sKyqdrcD6cBvY4pXVNO+uvIduPuj7p7h7hnp6ek1hS8iIkmqxgTl7hPcvZu7dwNeAi4LV+OdAhS5+6rKbczsauAcYLC7b4upml5N+7lAJzPraGapwMXhviIiso+K62KxZmbAQ0BfYBNwhbvnhXU5wNXuvtLMyoClwIaw6QvufkcN7fsDDwApwGR3v7sW8awJXydRDgC+TeDr70nqSzSpL9GkvuxZHdx9hymxpL6aeaKZWV5VV+BNRupLNKkv0aS+1A1dSUJERCJJCUpERCJJCWr3PJroAPYg9SWa1JdoUl/qgM5BiYhIJGkEJSIikaQEJSIikaQEJfWWmen3O2LMrGWiY5DkoT/g3RB+8bjeS5Z+hlciOd7MeppZqrtvS5bYq1Mef7L3A8DM7gHGmlnnRMeyp8X+/5hZi0TGsiui+vulBLWLzMzC24lgZpeb2fmJjmlPM7M2AJ4EK2nM7FzgGeBP4c/HZna4u3tU//hqYmZpMf/2P05oMLvJzB4BOhKsGPs+weHsUZXeC64Ariq/SWsyCGPtGm73q+oWSonSINEBJKuYX8hRwCDglwkNaO/4i5lNdfdZiQ5kZ8zsHGAM8Ft3fzssexB4zczOcvflsW8iSaS/mZ0MLCK4iWc/YEOy9SP8GznE3QfElLUFegKz3H19omLbE2LeC7oDZwIj3L00sVHF5Wjg0ph78/VIcDwVNIKKk5kdWX6rejNrD5zt7r2AFWbW38xuSmyEe1QuUHGxXzNLidpoJExO04Eb3f1tM2sM4O4jgf8DXjGzhsn2pg7g7tOAM4C7gEvd/TuS82+2BcGFpgEws3RgNnAncJGZtU5QXHuEme1nZp2Ax4GWQNKMngDc/VOgBDgfmOjuRQkOqUIy/rInTDi3fA1wsZkdD6wD2pnZFGA8MAAYaWa3JDDM3WJm7cysg5mlAR8DV4TlVwD3AaPN7IxExlguTE53Ah8BfzKzBu5eXJ6kgBuA9QSfEJNCFR8AHiK4K/UYM2vi7lsTENYuMbOzwv+LYmD/sKwBcBTwG+C/gAsJp5eSSez/k7tvc/dFwK+BNOC0ZJriC00luLnscWZ2Wfn0vpk1TWRQmuKrhfJfRnf/zsweBYYR3BJkLHABwR/Z8+6+wMxygW5mlpJMbyYAZnYE8BbwN4J7ef0vsCy8BUpX4HmCT8O9gDcTFSdUJKeHgAvcfb6ZPQt8YGYnhUmqIbAV2EjwBhl5lc5lnEsQ91R3f9TMXgKeAC40syFAsbs/n7hod87MmgC/A7YQjMRfNrM3wr+RfHf/PtyvCEi6EVTM/9O1QBeCuzM8THD+83eAm9mr7r4lcVHWzMxGEtyLrzVwE8H/10XApnBU2NbMfuvuZYmITyOo2mkfM0WUCRwDDCb49F7m7neEf3gjgVuBacmWnEIdgEfc/SaCT+1O8Mn350BjghFjK+AkM2uUqCDN7GyCN+uPCZIQ7v5zgnM188xsv/AcwCUEUy7rEhVrbVio0on2e4E/Ag+Y2fHuPghINbPpwB+A/yQq3pqY2RiCBRH3ArcACwimKV83s+MI76AdfqhY4+7/SFSsu8PMRgA/A/5K8L4wwt1zCD7YjQHOSmB4NTKzXwEDCRLrycBt7v5P4J/AKcB5wKREJSfQCKpGZnYgMNnMLgQyCIbxPYDTgT7AUDObBqwCzia4SeOCBIW7uzYBPc2sD8Gij7XALIJE9TTBlFkH4DF3L0lEgGFsDxHcqfkggpO7r7n7m+5+kZk9A7wVjnSHA9e4+9pExBqHlPI3gXDkdD5wLMHf5+3AFWY2yd0HmlkGsNLdq7zjdKKFo+12QJq7v2nBkvKz3f2BcLpvClBoZqVAobtfG7ZLxkUsbQimKa8GvgNuMbNG7v6cmW0mSMyRE/NvfSDBTNDlwFfATeEU7PPu/oyZNXP3jYmMVQmqZg0JprX2I/jk93X45jzTzL4DJhJMh90NnJ9kq3eAH35h3X1OuPrtUIJR4N/DYf4Yd/+FmX0M4O4bEviG8h0w1N3fNbOjCUZJZ4fh5IZJ6iVgMnC8u3+WgBhrzcwOAPLM7ER3LwROArKA7uH/xziCDwYjzexxd/8gkfHWxN23mNkSgje+d4CVwPlm9rK732Nmfyf4wNOk/INcOOLdVu1BEyyc4rfYGMOy9gQzDQvdvV9Yfq2ZbXL3JxITba10MrPFwBHAc8BqYKC7l5nZdUCZmT2S6OQEmuKrkbt/BbwH9AY+BNaFoyncfQ7BH+EG4PtkTE4QzKdb8OXWcwkScLa73x9WrwBWhZ+mNrj7hvI2CYp1bpic9nP3hQRTfaXAOWZ2erjPIODQqCcnAHf/FhgJvGtmLd39DoIR4mgzO87d1wAPEvw/LElcpDtnZgPN7LzwjfsTgtE47v4ywd1aHw6ff+Hui2OSk0U5OYUal8doZj8xs6zw9/8egkU488K6Kwg+TLyfqEBrEiagfxJMv35JMFLPDZPTUIJZh1lRGc3qauZVCN/oBhJ80psM3AgUuPtYMxtGsGCgEcHqscsIpvWWJSre3WVmWQSreF4kmFO/A/hbzInsMcB0d/8wcVFWLxzl/YJgyuUZd/9XgkOKm5n1J1gJehLBKPHmcPtudy8/rxbJN3ILvm5xL9Cc4Eu4BwDdgF+4+0wLLjl1J/DP8MNF0kznmdmPCPp2FdCf4BzzBoLFRC8SfDiaACwnGFFdFdUPRmb2XwTnle4lOB3RAuhM8OH7n8AJBFPikYlfCaoK4dTRj4GfEHxC+hnBJ9jrgH8DxxMskmhMsKjg08REuvvMrCvBp76/h28mvQjOe0x19ycTG13thec6fgo8Ho46kk6YpMYRnOv8juBNvSNwJbAlGd7ULVgJeijBebRvgTfd/Z1wtVtrdx+b0ADjZGYdCEa4HQneL88Pp2VvIlhl+STwOcF7QapH9EvHZtaOYCbo/9z9ynCR0wUE/1ctCH7vSjxC34ECJahaCVcenUuwgu358vMAFnzvJmErXHZHOBUDwUqxCwj+0B5w981mdh7B6qs+7r4pQSHGzYIv5CblNGu5MEndD5zq7uvNrE0SLPKoOI8Z8/gjgpPvqcALBNOT0whWhBZFPdnGLhAwsxMIzgveDJzm7ovMrCPBdFhjYIq7z0tctLVjweXYHiK44srT4ch2KNAJuDeKyVWLJKpR6Q9ufrgqZwjBqrEUd38vGZNT7Aoed//azP5IsAz7GMJLzxCc2N6QuCh3TbInJwB3zwlXws0ys4xkSE7wwznJmMcvzOyvwAjgR+7+gZmdmwz/R+Ho4lIz+4rgPfIkgmsI/gi4y8xucvcvzexhgi+yL09ctLXn7i+YWQnBBXsJk1Q20LT83HLUaAQVh/owjQQQjpD+hyAZferuE8zs/xF8b2Ml4Zd0wxPckgBRWOK7J5jZQe7+dbidTOeeuhB8wXgL0NHdS8NR01CCK2HcGibhpJtFseCajo8Cv3H35xIdz84oQcUpWaeRYkaErQi+6DmT4I/vauAjd7/PzG4g+ILecx7hqxRI8kmG5BS7ECVMUHcDhwNj3f3ZsLw9wdTeIQR/O1uj3q+qmNlPgC/cfXGiY9kZTfHFKRmTE1QsJc8kuPhoS4JVSKUElwK6wcxuc/c7LLih3Llmtgp4Lxn/+CR6kuH3KCY5/ZLg8kVLCK4ScaeZNXX3KQQJ65/Av5Nt5BTL3WcmOoba0Peg6jEzSw1PhGJmpxAsY94fOIdg0cc2II/gxOmxFlxu/17gC2BxMrypiOxJZnYBcD3BFS8aEHyZ9Rng/5nZUwR/H0s9+FK17GWa4qunwqXyNwJPEVxK/88E36mZYWYXE1yV/X8JvssB0DxqS0xF6lp4LnaLu/93uFjlSoLvCk0k+GrJUx58QVzqgEZQ9VA4f/4cwbXA/kPw5cmtwIjwXMDTwCME3+W4wIPbBSg5icBnQKaZdXH3Le7+MMEXWL939z8qOdUtjaDqGQvuWfUi8KS7T44p/zHBhW43ATeE56QGA1+6e2QvzSJSl8JFRL8juO5mLtAEuA3ol8wrd5OVElQ9Y8F9kCYBI929KHbVoZkdQ/DF3G/dfUQCwxSJLDM7hODL6wMIFhGNcfePExvVvklTfPVPU4IpidMgWHVoZilh3VqCeyg1Dy9xJCKVuPtKd38QGARcquSUOFpmXs+El8d5ELjAzL5y9/yY6gyCC92O8ojeT0gkKpLpMl/1lUZQ9dOLBDdQvNbMzgS2hReBvR/4q5KTiCQDnYOqp8zsIIILcw4nuF/Nj4B73P2lRMYlIlJbSlD1XJiotgGN3H1FMlxyRkQElKBERCSidA5KREQiSQlKREQiSQlKREQiSQlKREQiSQlKREQiSQlKREQiSQlKREQi6f8DfQD47F4wsI8AAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"waterfall(valid_xs_final.columns, contributions[0], threshold=0.08, \n",
" rotation_value=45,formatting='{:,.3f}');"
]
},
{
"cell_type": "markdown",
"id": "ed896bc5",
"metadata": {},
"source": [
"This plot is a nice visualization of how much each factor affected the tier. One thing to look at is the confusion matrix, which helps visualize the accuracy of the predictions."
]
},
{
"cell_type": "code",
"execution_count": 122,
"id": "841fcb62",
"metadata": {},
"outputs": [],
"source": [
"def create_confusion_matrix(m, xs, y):\n",
" predictions = m.predict(xs).round()\n",
" return confusion_matrix(y, predictions)\n",
"def plot_confusion(c):\n",
" plt.figure(figsize=(15, 10))\n",
" ax = sns.heatmap(c, annot=True, cmap='Blues')\n",
"\n",
" ax.set_title('Confusion Matrix with labels\\n\\n');\n",
" ax.set_xlabel('\\nPredicted QB Tier')\n",
" ax.set_ylabel('Actual QB Tier');\n",
"\n",
" ## Ticket labels - List must be in alphabetical order\n",
" labels = ['Elite','Above-Average', 'Average', \"Below-Average\", \"Poor\"]\n",
" try:\n",
" ax.xaxis.set_ticklabels(labels)\n",
" ax.yaxis.set_ticklabels(labels)\n",
" except ValueError:\n",
" ax.xaxis.set_ticklabels(labels[:-1])\n",
" ax.yaxis.set_ticklabels(labels[:-1]) \n",
" \n",
"\n",
" ## Display the visualization of the Confusion Matrix.\n",
" plt.show() "
]
},
{
"cell_type": "code",
"execution_count": 123,
"id": "e4fb9c71",
"metadata": {},
"outputs": [],
"source": [
"cf1 = create_confusion_matrix(m, xs_final, y)\n",
"cf2 = create_confusion_matrix(m, valid_xs_final, valid_y)"
]
},
{
"cell_type": "code",
"execution_count": 124,
"id": "d8d9cc61",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"