{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 06 - Ensemble Methods - Bagging\n", "\n", "\n", "by [Alejandro Correa Bahnsen](albahnsen.com/)\n", "\n", "version 0.4, Feb 2017\n", "\n", "## Part of the Tutorial [Practical Machine Learning](https://github.com/albahnsen/Tutorial_PracticalMachineLearning_Pycon)\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", "- Define ensembling and its requirements\n", "- Identify the two basic methods of ensembling\n", "- Decide whether manual ensembling is a useful approach for a given problem\n", "- Explain bagging and how it can be applied to decision trees\n", "- Explain how out-of-bag error and feature importances are calculated from bagged trees\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: Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ensemble learning is a widely studied topic in the machine learning community. The main idea behind \n", "the ensemble methodology is to combine several individual base classifiers in order to have a \n", "classifier that outperforms each of them.\n", "\n", "Nowadays, ensemble methods are one \n", "of the most popular and well studied machine learning techniques, and it can be \n", "noted that since 2009 all the first-place and second-place winners of the KDD-Cup https://www.sigkdd.org/kddcup/ used ensemble methods. The core \n", "principle in ensemble learning, is to induce random perturbations into the learning procedure in \n", "order to produce several different base classifiers from a single training set, then combining the \n", "base classifiers in order to make the final prediction. In order to induce the random permutations \n", "and therefore create the different base classifiers, several methods have been proposed, in \n", "particular: \n", "* bagging\n", "* pasting\n", "* random forests \n", "* random patches \n", "\n", "Finally, after the base classifiers \n", "are trained, they are typically combined using either:\n", "* majority voting\n", "* weighted voting \n", "* stacking\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are three main reasons regarding why ensemble \n", "methods perform better than single models: statistical, computational and representational . First, from a statistical point of view, when the learning set is too \n", "small, an algorithm can find several good models within the search space, that arise to the same \n", "performance on the training set $\\mathcal{S}$. Nevertheless, without a validation set, there is \n", "a risk of choosing the wrong model. The second reason is computational; in general, algorithms \n", "rely on some local search optimization and may get stuck in a local optima. Then, an ensemble may \n", "solve this by focusing different algorithms to different spaces across the training set. The last \n", "reason is representational. In most cases, for a learning set of finite size, the true function \n", "$f$ cannot be represented by any of the candidate models. By combining several models in an \n", "ensemble, it may be possible to obtain a model with a larger coverage across the space of \n", "representable functions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](https://raw.githubusercontent.com/albahnsen/PracticalMachineLearningClass/master/notebooks/ch9_fig1.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "\n", "Let's pretend that instead of building a single model to solve a binary classification problem, you created **five independent models**, and each model was correct about 70% of the time. If you combined these models into an \"ensemble\" and used their majority vote as a prediction, how often would the ensemble be correct?" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1]\n", "[1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0]\n", "[1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 1 0 1 1]\n", "[1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0]\n", "[0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1]\n" ] } ], "source": [ "import numpy as np\n", "\n", "# set a seed for reproducibility\n", "np.random.seed(1234)\n", "\n", "# generate 1000 random numbers (between 0 and 1) for each model, representing 1000 observations\n", "mod1 = np.random.rand(1000)\n", "mod2 = np.random.rand(1000)\n", "mod3 = np.random.rand(1000)\n", "mod4 = np.random.rand(1000)\n", "mod5 = np.random.rand(1000)\n", "\n", "# each model independently predicts 1 (the \"correct response\") if random number was at least 0.3\n", "preds1 = np.where(mod1 > 0.3, 1, 0)\n", "preds2 = np.where(mod2 > 0.3, 1, 0)\n", "preds3 = np.where(mod3 > 0.3, 1, 0)\n", "preds4 = np.where(mod4 > 0.3, 1, 0)\n", "preds5 = np.where(mod5 > 0.3, 1, 0)\n", "\n", "# print the first 20 predictions from each model\n", "print(preds1[:20])\n", "print(preds2[:20])\n", "print(preds3[:20])\n", "print(preds4[:20])\n", "print(preds5[:20])" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1]\n" ] } ], "source": [ "# average the predictions and then round to 0 or 1\n", "ensemble_preds = np.round((preds1 + preds2 + preds3 + preds4 + preds5)/5.0).astype(int)\n", "\n", "# print the ensemble's first 20 predictions\n", "print(ensemble_preds[:20])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.713\n", "0.665\n", "0.717\n", "0.712\n", "0.687\n" ] } ], "source": [ "# how accurate was each individual model?\n", "print(preds1.mean())\n", "print(preds2.mean())\n", "print(preds3.mean())\n", "print(preds4.mean())\n", "print(preds5.mean())" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.841\n" ] } ], "source": [ "# how accurate was the ensemble?\n", "print(ensemble_preds.mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note:** As you add more models to the voting process, the probability of error decreases, which is known as [Condorcet's Jury Theorem](http://en.wikipedia.org/wiki/Condorcet%27s_jury_theorem)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is ensembling?\n", "\n", "**Ensemble learning (or \"ensembling\")** is the process of combining several predictive models in order to produce a combined model that is more accurate than any individual model.\n", "\n", "- **Regression:** take the average of the predictions\n", "- **Classification:** take a vote and use the most common prediction, or take the average of the predicted probabilities\n", "\n", "For ensembling to work well, the models must have the following characteristics:\n", "\n", "- **Accurate:** they outperform the null model\n", "- **Independent:** their predictions are generated using different processes\n", "\n", "**The big idea:** If you have a collection of individually imperfect (and independent) models, the \"one-off\" mistakes made by each model are probably not going to be made by the rest of the models, and thus the mistakes will be discarded when averaging the models.\n", "\n", "There are two basic **methods for ensembling:**\n", "\n", "- Manually ensemble your individual models\n", "- Use a model that ensembles for you" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Theoretical performance of an ensemble\n", " If we assume that each one of the $T$ base classifiers has a probability $\\rho$ of \n", " being correct, the probability of an ensemble making the correct decision, assuming independence, \n", " denoted by $P_c$, can be calculated using the binomial distribution\n", "\n", "$$P_c = \\sum_{j>T/2}^{T} {{T}\\choose{j}} \\rho^j(1-\\rho)^{T-j}.$$\n", "\n", " Furthermore, as shown, if $T\\ge3$ then:\n", "\n", "$$\n", " \\lim_{T \\to \\infty} P_c= \\begin{cases} \n", " 1 &\\mbox{if } \\rho>0.5 \\\\ \n", " 0 &\\mbox{if } \\rho<0.5 \\\\ \n", " 0.5 &\\mbox{if } \\rho=0.5 ,\n", " \\end{cases}\n", "$$\n", "\tleading to the conclusion that \n", "$$\n", " \\rho \\ge 0.5 \\quad \\text{and} \\quad T\\ge3 \\quad \\Rightarrow \\quad P_c\\ge \\rho.\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Part 2: Manual ensembling\n", "\n", "What makes a good manual ensemble?\n", "\n", "- Different types of **models**\n", "- Different combinations of **features**\n", "- Different **tuning parameters**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Machine learning flowchart](https://raw.githubusercontent.com/justmarkham/DAT8/master/notebooks/images/crowdflower_ensembling.jpg)\n", "\n", "*Machine learning flowchart created by the [winner](https://github.com/ChenglongChen/Kaggle_CrowdFlower) of Kaggle's [CrowdFlower competition](https://www.kaggle.com/c/crowdflower-search-relevance)*" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# read in and prepare the vehicle training data\n", "import pandas as pd\n", "train = pd.read_csv('data/vehicles_train.csv')\n", "train['vtype'] = train.vtype.map({'car':0, 'truck':1})\n", "# read in and prepare the vehicle testing data\n", "test = pd.read_csv('data/vehicles_test.csv')\n", "test['vtype'] = test.vtype.map({'car':0, 'truck':1})" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
priceyearmilesdoorsvtype
02200020121300020
11400020103000020
21300020107350040
3950020097800040
4900020074700040
\n", "
" ], "text/plain": [ " price year miles doors vtype\n", "0 22000 2012 13000 2 0\n", "1 14000 2010 30000 2 0\n", "2 13000 2010 73500 4 0\n", "3 9500 2009 78000 4 0\n", "4 9000 2007 47000 4 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train different models" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "from sklearn.tree import DecisionTreeRegressor\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.neighbors import KNeighborsRegressor\n", "\n", "models = {'lr': LinearRegression(),\n", " 'dt': DecisionTreeRegressor(),\n", " 'nb': GaussianNB(),\n", " 'nn': KNeighborsRegressor()}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Train all the models\n", "X_train = train.iloc[:, 1:]\n", "X_test = test.iloc[:, 1:]\n", "y_train = train.price\n", "y_test = test.price\n", "\n", "for model in models.keys():\n", " models[model].fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# predict test for each model\n", "y_pred = pd.DataFrame(index=test.index, columns=models.keys())\n", "for model in models.keys():\n", " y_pred[model] = models[model].predict(X_test)\n", " " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dt 1414.21356237\n", "lr 2138.35790287\n", "nn 1671.32681823\n", "nb 5477.22557505\n" ] } ], "source": [ "# Evaluate each model\n", "from sklearn.metrics import mean_squared_error\n", "\n", "for model in models.keys():\n", " print(model,np.sqrt(mean_squared_error(y_pred[model], y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evaluate the error of the mean of the predictions" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1193.164765760328" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(mean_squared_error(y_pred.mean(axis=1), y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparing manual ensembling with a single model approach\n", "\n", "**Advantages of manual ensembling:**\n", "\n", "- Increases predictive accuracy\n", "- Easy to get started\n", "\n", "**Disadvantages of manual ensembling:**\n", "\n", "- Decreases interpretability\n", "- Takes longer to train\n", "- Takes longer to predict\n", "- More complex to automate and maintain\n", "- Small gains in accuracy may not be worth the added complexity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 3: Bagging\n", "\n", "The primary weakness of **decision trees** is that they don't tend to have the best predictive accuracy. This is partially due to **high variance**, meaning that different splits in the training data can lead to very different trees.\n", "\n", "**Bagging** is a general purpose procedure for reducing the variance of a machine learning method, but is particularly useful for decision trees. Bagging is short for **bootstrap aggregation**, meaning the aggregation of bootstrap samples.\n", "\n", "What is a **bootstrap sample**? A random sample with replacement:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]\n", "[ 6 12 13 9 10 12 6 16 1 17 2 13 8 14 7 19 6 19 12 11]\n" ] } ], "source": [ "# set a seed for reproducibility\n", "np.random.seed(1)\n", "\n", "# create an array of 1 through 20\n", "nums = np.arange(1, 21)\n", "print(nums)\n", "\n", "# sample that array 20 times with replacement\n", "print(np.random.choice(a=nums, size=20, replace=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**How does bagging work (for decision trees)?**\n", "\n", "1. Grow B trees using B bootstrap samples from the training data.\n", "2. Train each tree on its bootstrap sample and make predictions.\n", "3. Combine the predictions:\n", " - Average the predictions for **regression trees**\n", " - Take a vote for **classification trees**\n", "\n", "Notes:\n", "\n", "- **Each bootstrap sample** should be the same size as the original training set.\n", "- **B** should be a large enough value that the error seems to have \"stabilized\".\n", "- The trees are **grown deep** so that they have low bias/high variance.\n", "\n", "Bagging increases predictive accuracy by **reducing the variance**, similar to how cross-validation reduces the variance associated with train/test split (for estimating out-of-sample error) by splitting many times an averaging the results.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([13, 2, 12, 2, 6, 1, 3, 10, 11, 9, 6, 1, 0, 1]),\n", " array([ 9, 0, 0, 9, 3, 13, 4, 0, 0, 4, 1, 7, 3, 2]),\n", " array([ 4, 7, 2, 4, 8, 13, 0, 7, 9, 3, 12, 12, 4, 6]),\n", " array([ 1, 5, 6, 11, 2, 1, 12, 8, 3, 10, 5, 0, 11, 2]),\n", " array([10, 10, 6, 13, 2, 4, 11, 11, 13, 12, 4, 6, 13, 3]),\n", " array([10, 0, 6, 4, 7, 11, 6, 7, 1, 11, 10, 5, 7, 9]),\n", " array([ 2, 4, 8, 1, 12, 2, 1, 1, 3, 12, 5, 9, 0, 8]),\n", " array([11, 1, 6, 3, 3, 11, 5, 9, 7, 9, 2, 3, 11, 3]),\n", " array([ 3, 8, 6, 9, 7, 6, 3, 9, 6, 12, 6, 11, 6, 1]),\n", " array([13, 10, 3, 4, 3, 1, 13, 0, 5, 8, 13, 6, 11, 8])]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# set a seed for reproducibility\n", "np.random.seed(123)\n", "\n", "n_samples = train.shape[0]\n", "n_B = 10\n", "\n", "# create ten bootstrap samples (will be used to select rows from the DataFrame)\n", "samples = [np.random.choice(a=n_samples, size=n_samples, replace=True) for _ in range(1, n_B +1 )]\n", "samples" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
priceyearmilesdoorsvtype
131300199713800040
21300020107350040
121800199916300021
21300020107350040
63000200417700040
11400020103000020
3950020097800040
102500200319000021
11500020016200040
91900200316000040
63000200417700040
11400020103000020
02200020121300020
11400020103000020
\n", "
" ], "text/plain": [ " price year miles doors vtype\n", "13 1300 1997 138000 4 0\n", "2 13000 2010 73500 4 0\n", "12 1800 1999 163000 2 1\n", "2 13000 2010 73500 4 0\n", "6 3000 2004 177000 4 0\n", "1 14000 2010 30000 2 0\n", "3 9500 2009 78000 4 0\n", "10 2500 2003 190000 2 1\n", "11 5000 2001 62000 4 0\n", "9 1900 2003 160000 4 0\n", "6 3000 2004 177000 4 0\n", "1 14000 2010 30000 2 0\n", "0 22000 2012 13000 2 0\n", "1 14000 2010 30000 2 0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show the rows for the first decision tree\n", "train.iloc[samples[0], :]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Build one tree for each sample" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.tree import DecisionTreeRegressor\n", "\n", "# grow each tree deep\n", "treereg = DecisionTreeRegressor(max_depth=None, random_state=123)\n", "\n", "# DataFrame for storing predicted price from each tree\n", "y_pred = pd.DataFrame(index=test.index, columns=[list(range(n_B))])\n", "\n", "# grow one tree for each bootstrap sample and make predictions on testing data\n", "for i, sample in enumerate(samples):\n", " X_train = train.iloc[sample, 1:]\n", " y_train = train.iloc[sample, 0]\n", " treereg.fit(X_train, y_train)\n", " y_pred[i] = treereg.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789
01300.01300.03000.04000.01300.04000.04000.04000.03000.04000.0
15000.01300.03000.05000.05000.05000.04000.05000.05000.05000.0
214000.013000.013000.013000.013000.014000.013000.013000.09500.09000.0
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 \\\n", "0 1300.0 1300.0 3000.0 4000.0 1300.0 4000.0 4000.0 4000.0 \n", "1 5000.0 1300.0 3000.0 5000.0 5000.0 5000.0 4000.0 5000.0 \n", "2 14000.0 13000.0 13000.0 13000.0 13000.0 14000.0 13000.0 13000.0 \n", "\n", " 8 9 \n", "0 3000.0 4000.0 \n", "1 5000.0 5000.0 \n", "2 9500.0 9000.0 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Results of each tree" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 1621.72747402\n", "1 2942.78779391\n", "2 1825.74185835\n", "3 1000.0\n", "4 1276.71453348\n", "5 1414.21356237\n", "6 1414.21356237\n", "7 1000.0\n", "8 1554.56317551\n", "9 1914.85421551\n" ] } ], "source": [ "for i in range(n_B):\n", " print(i, np.sqrt(mean_squared_error(y_pred[i], y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Results of the ensemble" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 2990.0\n", "1 4330.0\n", "2 12450.0\n", "dtype: float64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred.mean(axis=1)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "998.58232843700307" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(mean_squared_error(y_test, y_pred.mean(axis=1)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bagged decision trees in scikit-learn (with B=500)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# define the training and testing sets\n", "X_train = train.iloc[:, 1:]\n", "y_train = train.iloc[:, 0]\n", "X_test = test.iloc[:, 1:]\n", "y_test = test.iloc[:, 0]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# instruct BaggingRegressor to use DecisionTreeRegressor as the \"base estimator\"\n", "from sklearn.ensemble import BaggingRegressor\n", "bagreg = BaggingRegressor(DecisionTreeRegressor(), n_estimators=500, \n", " bootstrap=True, oob_score=True, random_state=1)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 3344.2, 5395. , 12902. ])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# fit and predict\n", "bagreg.fit(X_train, y_train)\n", "y_pred = bagreg.predict(X_test)\n", "y_pred" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "657.80003040437748" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculate RMSE\n", "np.sqrt(mean_squared_error(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Estimating out-of-sample error\n", "\n", "For bagged models, out-of-sample error can be estimated without using **train/test split** or **cross-validation**!\n", "\n", "On average, each bagged tree uses about **two-thirds** of the observations. For each tree, the **remaining observations** are called \"out-of-bag\" observations." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([13, 2, 12, 2, 6, 1, 3, 10, 11, 9, 6, 1, 0, 1])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show the first bootstrap sample\n", "samples[0]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0, 1, 2, 3, 6, 9, 10, 11, 12, 13}\n", "{0, 1, 2, 3, 4, 7, 9, 13}\n", "{0, 2, 3, 4, 6, 7, 8, 9, 12, 13}\n", "{0, 1, 2, 3, 5, 6, 8, 10, 11, 12}\n", "{2, 3, 4, 6, 10, 11, 12, 13}\n", "{0, 1, 4, 5, 6, 7, 9, 10, 11}\n", "{0, 1, 2, 3, 4, 5, 8, 9, 12}\n", "{1, 2, 3, 5, 6, 7, 9, 11}\n", "{1, 3, 6, 7, 8, 9, 11, 12}\n", "{0, 1, 3, 4, 5, 6, 8, 10, 11, 13}\n" ] } ], "source": [ "# show the \"in-bag\" observations for each sample\n", "for sample in samples:\n", " print(set(sample))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4, 5, 7, 8]\n", "[5, 6, 8, 10, 11, 12]\n", "[1, 5, 10, 11]\n", "[4, 7, 9, 13]\n", "[0, 1, 5, 7, 8, 9]\n", "[2, 3, 8, 12, 13]\n", "[6, 7, 10, 11, 13]\n", "[0, 4, 8, 10, 12, 13]\n", "[0, 2, 4, 5, 10, 13]\n", "[2, 7, 9, 12]\n" ] } ], "source": [ "# show the \"out-of-bag\" observations for each sample\n", "for sample in samples:\n", " print(sorted(set(range(n_samples)) - set(sample)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How to calculate **\"out-of-bag error\":**\n", "\n", "1. For every observation in the training data, predict its response value using **only** the trees in which that observation was out-of-bag. Average those predictions (for regression) or take a vote (for classification).\n", "2. Compare all predictions to the actual response values in order to compute the out-of-bag error.\n", "\n", "When B is sufficiently large, the **out-of-bag error** is an accurate estimate of **out-of-sample error**." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.79869551339899825" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute the out-of-bag R-squared score (not MSE, unfortunately!) for B=500\n", "bagreg.oob_score_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Estimating feature importance\n", "\n", "Bagging increases **predictive accuracy**, but decreases **model interpretability** because it's no longer possible to visualize the tree to understand the importance of each feature.\n", "\n", "However, we can still obtain an overall summary of **feature importance** from bagged models:\n", "\n", "- **Bagged regression trees:** calculate the total amount that **MSE** is decreased due to splits over a given feature, averaged over all trees\n", "- **Bagged classification trees:** calculate the total amount that **Gini index** is decreased due to splits over a given feature, averaged over all trees" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 4: 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": [ "# Part 5: Building and tuning decision trees and Random Forests\n", "\n", "- Major League Baseball player data from 1986-87: [data](https://github.com/justmarkham/DAT8/blob/master/data/hitters.csv), [data dictionary](https://cran.r-project.org/web/packages/ISLR/ISLR.pdf) (page 7)\n", "- Each observation represents a player\n", "- **Goal:** Predict player salary" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AtBatHitsHmRunRunsRBIWalksYearsCAtBatCHitsCHmRunCRunsCRBICWalksLeagueDivisionPutOutsAssistsErrorsSalaryNewLeague
131581724383914344983569321414375NW6324310475.0N
2479130186672763162445763224266263AW8808214480.0A
3496141206578371156281575225828838354NE200113500.0N
43218710394230239610112484633NE80540491.5N
55941694745135114408113319501336194AW28242125750.0A
\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": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# read in the data\n", "hitters = pd.read_csv('data/hitters.csv')\n", "\n", "# remove rows with missing values\n", "hitters.dropna(inplace=True)\n", "hitters.head()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AtBatHitsHmRunRunsRBIWalksYearsCAtBatCHitsCHmRunCRunsCRBICWalksLeagueDivisionPutOutsAssistsErrorsSalaryNewLeague
131581724383914344983569321414375006324310475.00
2479130186672763162445763224266263108808214480.01
349614120657837115628157522582883835401200113500.00
432187103942302396101124846330180540491.50
559416947451351144081133195013361941028242125750.01
\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 0 0 632 43 10 475.0 0 \n", "2 266 263 1 0 880 82 14 480.0 1 \n", "3 838 354 0 1 200 11 3 500.0 0 \n", "4 46 33 0 1 805 40 4 91.5 0 \n", "5 336 194 1 0 282 421 25 750.0 1 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# encode categorical variables as integers\n", "hitters['League'] = pd.factorize(hitters.League)[0]\n", "hitters['Division'] = pd.factorize(hitters.Division)[0]\n", "hitters['NewLeague'] = pd.factorize(hitters.NewLeague)[0]\n", "hitters.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# allow plots to appear in the notebook\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.style.use('fivethirtyeight')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAEtCAYAAABqATufAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VFXewPHvnT6ZTHqDQOggAgGXFisCAlLEDsSuS1PW\nRXY1URbEV1SEVbAhYl1dFUEEFVkQRaxIQEWKQECKlABJSJ8+9973j+iECDMJySSTcj7Pk+fJzJy5\nc+6dO+d3T7nnSEVFRSqCIAiCIFRJE+oMCIIgCEJjIYKmIAiCIFSTCJqCIAiCUE0iaAqCIAhCNYmg\nKQiCIAjVJIKmIAiCIFSTCJqCIAiCUE0hDZrz589n0KBBpKSk0LFjR8aNG8fu3bsrpbnnnnuIjo6u\n9Dd06NBKadxuNw888AAdOnQgOTmZ9PR0cnJy6nNXBEEQhGYgpEFz48aNTJgwgXXr1rFq1Sp0Oh3X\nXHMNRUVFldINHDiQffv2sXfvXvbu3cuyZcsqvf7ggw+yevVqXn/9ddasWUNpaSljx45FVcW8DYIg\nCELwSA1pRiCbzUZKSgrvvvsuw4YNA8prmgUFBbz33ntnfU9JSQkdO3Zk0aJFXH/99QAcO3aMHj16\n8MEHHzBw4MB6y78gCILQtDWoPs3S0lIURSEqKqrS85s2baJTp0706dOHqVOnkp+f73vt559/xuv1\nVgqOycnJdOnShaysrHrLuyAIgtD06UKdgdM9+OCD9OzZk379+vmeGzJkCKNHj6ZNmzYcPnyY2bNn\nM3r0aL766iv0ej25ublotVpiYmIqbSs+Pp7c3Nz63gVBEAShCWswQXP69Ols3ryZtWvXIkmS7/lr\nr73W93/Xrl3p2bMnPXr04NNPP2XUqFGhyKogCILQTDWI5tmHHnqIlStXsmrVKlJSUgKmTUpKomXL\nlhw4cACAhIQEZFmmoKCgUrq8vDwSEhLqLM+CIAhC8xPyoJmZmekLmB06dKgyfX5+PsePHycxMRGA\nXr16odPp2LBhgy/NsWPHyM7OJi0trc7yLQiCIDQ/IW2evf/++1m2bBnvvPMOERERvj5Ii8WCxWLB\nZrPx5JNPMnr0aBITE/ntt9+YPXs2CQkJvqbZiIgIbr31VmbNmkVcXBxRUVHMmDGDHj16MGDAgFDu\nXoOxb98+OnXqFOps1Buxv01bc9vfurD4T4Mtz2bSn279E8qFNGi+9tprSJLE1VdfXen5zMxMMjMz\n0Wq17Nq1i6VLl1JcXExiYiKXXXYZ//nPf7BYLL70Tz75JDqdjrvuugun08mAAQNYvHhxpb5RQRAE\noVyDGczSCIX02BUWFgZ83WQy8cEHH1S5Hb1ez9y5c5k7d26wsiYIgtBk6UOdgUZMXHAIgiA0M6Lg\nrzlx7ARBEJoZUdOsORE0BUEQmhlR8NecOHbNgMFgCHUWBEFoQERNs+ZE0GzCNCd+wfjVc3TSGvGa\n/4aS0DnUWRIEoQEQBX/NiWPXRElleYS9fSva/PKZkzz5v2K/YymYrCHOmSAIoSZqmjUngmZT5XGg\nKTzie6g9dQDJ40AVQVMQmj1zqDPQiIV8Gj2hbqjhCTiH/x8qoEoSzitnoVpiQ50tQRAaAH01/oSz\nEzXNpkpvwt33drztLsbmcGBucwFotKHOlSAIDYAo+GtO1DSbMqMFJbknR9VY0BtDnRtBEBoIUdOs\nORE0BUEQmhldNf78mT9/PoMGDSIlJYWOHTsybtw4du/e7Xvd6/Uya9YsLr74YpKTkznvvPOYMGEC\nR48erbSdkSNHEh0d7fuLiYlh/PjxldIUFRUxceJEUlJSSElJYdKkSRQXFwfjENSYCJqCIAjNTG1q\nmhs3bmTChAmsW7eOVatWodPpuOaaayj6fVUUu93Ojh07yMjI4Ouvv2bJkiUcPXqUG2+8EUVRfNuR\nJIlbbrmFffv2sXfvXrKzs1mwYEGlzxo/fjw7d+5k5cqVrFixgu3btzN58uRgHopzJpq2BUEQmpna\nFPzLly+v9Hjx4sWkpKSQlZXFsGHDiIiIYMWKFZXSPPPMM6SlpZGdnU3Xrl19z5vNZuLi4s76OXv3\n7mX9+vWsW7eO3r17A7BgwQKGDx/O/v37q7X+cl0QNU1BEIRmJph9mqWlpSiKQlSANTpLSkqQJOmM\nNCtWrKBDhw5ceOGFzJw5k7KyMt9rmzdvxmq10rdvX99zaWlpWCwWsrKyziGHwSVqmoIgCM1MMAv+\nBx98kJ49e9KvX7+zvu7xeJgxYwbDhw+nRYsWvufHjBlD69atSUpKYs+ePTzyyCPs2rXLtxxkbm4u\nsbFn3iYXFxdHbm5uEPfg3IigKQiC0MwEa3Ts9OnT2bx5M2vXrkWSpDNel2WZCRMmUFpaytKlSyu9\ndtttt/n+79q1K23btmXQoEFs376d1NTUIOUw+ETzrCAIQjMTjObZhx56iJUrV7Jq1SpSUlLOeF2W\nZe666y52797Nxx9/HLD5FqBXr15otVoOHCif+jMhIYFTp06dkS4/P5+EhIRq5LBuiKApCILQzNTm\nlhOAzMxMX8A824Acr9fLHXfcwe7du/nkk0/8DvY53c6dO5FlmcTERAD69etHWVkZW7Zs8aXJysrC\nbrfTv3//au1nXRDNsyF0/LjE9u1ajEaVXr1kqrgQEwRBCAp9LUr++++/n2XLlvHOO+8QERHh61+0\nWCxYLBZkWea2225j27ZtLFmyBFVVfWkiIiIwmUwcOnSIZcuWMXToUGJiYtizZw8zZ86kV69epKWl\nAdC5c2cGDx7MfffdxzPPPIOqqkybNo0rr7wyZCNnQQTNkCkshMxMEx9/XL7W5SOPOLj3XjdaMdOd\nIAh1TFeNkl/18/xrr72GJElcffXVlZ7PzMwkMzOTY8eOsXbtWgAuv/zySmkWLlxIeno6er2er776\nisWLF2Oz2UhOTmbYsGFkZGRU6ht99dVXycjI4PrrrwdgxIgRzJs3r9r7WRekoqIif8dGqEO//irR\np0+E73H79jLr15cRHR38z9q3bx+dOnUK/oYbKLG/TVtz29+6ENam6mYt+29F9ZCTxkf0aYZIVBRc\ncIHX93jIEC/h4SHMkCAIzYZeV/WfcHbi0IRIXJzKa6/Z+e47HRaLSlqajF7MkiwIQn0Q3UA1JoJm\nCLVvr9K+vSfU2RAEobkRJX+NiUMnCILQ3IiSv8bEoRMEQWhuRMlfY+LQCYIgNDeiT7PGRNBsZJxO\n0GjAYAh1TgRBaLREyV9j4paTRuSHHzSMGmVh7Ngwdu0SX50gCDVU23n0mjFxaBqJY8ckxo61cOpU\nebCcOlVixQobVmvg951ygRom5ucTBOE0onm2xkTQbCQ8HigurpheKi9PwlPF3Srf5Wn5249mDJpw\nFpnt/CVGqfJzTp60A5CYGFar/AqC0ICJkr/GRBtfI5GcrPLssw4kScVoVHnqKQcxMf7TH7NL3Lop\njIM2LdmlWib9EEaBK/BnfPPNMS6//AMGDlzBxo3Hg7sDgiA0HKJ5tsbEoWkk9Hq48UYPfft60Wqh\nXbvAUwargFupqJm6ZQklwFuOH7dx552fk5/vBGDixC/YsOE64uPNwci+IAgNiWierTERNBsRgwE6\nd67e/PrJZpX3Liwmz3MUFYlWxlbEmar/WaqqoqpiLn9BaJJEyV9j4tA1VZKXi1uuQg37G6BDsr+G\n6h2MhHTW5C1aWHjttSsYP349Go3Eyy8PIiFB9GsKQpN0DhfQQmWiT7Opkk6ghv0TJAUkN6o5E6RT\nAd8yYEAy33xzPV9/fT0XX9yynjIqCEK901bjz4/58+czaNAgUlJS6NixI+PGjWP37t1npJszZw5d\nu3alRYsWjBo1ij179lR63e1288ADD9ChQweSk5NJT08nJyenUpqioiImTpxISkoKKSkpTJo0ieLi\n4lrtem2JoNlk6UGtWK8TJRrUqpdRSUqyiJGzgtDU1WIg0MaNG5kwYQLr1q1j1apV6HQ6rrnmGoqK\nKtbffOaZZ1i0aBH//ve/2bBhA/Hx8Vx77bXYbDZfmgcffJDVq1fz+uuvs2bNGkpLSxk7dmylbqHx\n48ezc+dOVq5cyYoVK9i+fTuTJ08O6qE4VyENmvV5xdLcSGoiku0N8F6A6rkQyfEsEpGhzpYgCA1B\nLYLm8uXLSU9P57zzzqNr164sXryY/Px8srKyfGleeuklpk2bxqhRozjvvPNYtGgRZWVlLF++HICS\nkhLefvttZs+ezYABA0hNTWXx4sX88ssvfPnllwBkZ2ezfv16nn32WXr37k2fPn1YsGABa9euZf/+\n/XVxVKolpEGzPq9YmiNJuQDJtoKT++cjKd1CnR1BEBqKWjTP/llpaSmKohAVVT6JyqFDhzh58iQD\nBw70pTGZTFx00UW+wLp161a8Xm+lNMnJyXTp0sWXZsuWLVitVvr27etLk5aWhsViqRSg61tIBwL9\ncdXxh8WLF5OSkkJWVhbDhg0DKl+xACxatIhOnTqxfPlybr/9dt8Vy6JFixgwYIBvOz169ODLL7+s\n9KU0RxImbGVizU5BEE4TxJL/wQcfpGfPnvTr1w+A3NxcJEkiPj6+Urr4+HhOnDgBQF5eHlqtlpg/\n3WweHx9Pbm6ubzuxsbFnfF5cXJwvTSg0qD7NurpiaSqOH5dZu9bJF184KSiQQ50doQqesjJOfvMN\nR//3P8qOHAl1dgShQpAmN5g+fTqbN2/mrbfeQpLOPjK/qWlQQfNcrlj+uNKozhVLU1BcLDNzZgnj\nxhVw3XUFvPyyDY+neTc/N3S/rVjB+quu4uubbuL7CRNwnDwZ6iwJQrkgNM8+9NBDrFy5klWrVpGS\nkuJ7PiEhAVVVycvLq5Q+Ly+PhIQEXxpZlikoKAiY5tSpM0f85+fn+9KEQoMJms3xiuVcFBSoLF/u\n8D1++20HxcWB55ItkGz8pDtMUQctxZIjYFohuGS3mwNvv+17nLdpE04RNIWGopY1zczMTF/A7NCh\nQ6XX2rZtS2JiIhs2bPA953Q6+f7770lLSwOgV69e6HS6SmmOHTtGdna2L02/fv0oKytjy5YtvjRZ\nWVnY7Xb69+9f0z2vtQYxucFDDz3Ehx9+yCeffOL3iiU5Odn3vL8rltNrm3l5eVx00UUBP3ffvn1B\n3pO6oygRpKXp2LTJC8DAgTqKi3MoLHSeNb0+wsTaNof4xXgcLHChvS0XHUrEY3fXZ7ZDJtTfrV6v\nJ/GKK8jfvBkAS7t22LVa8usoX6He3/rWXPa3U6dOdbPhWpT8999/P8uWLeOdd94hIiLC16JnsViw\nWCwA3H333cyfP5+OHTvSoUMHnnrqKcLDw7n++usBiIiI4NZbb2XWrFnExcURFRXFjBkz6NGjh29s\nSufOnRk8eDD33XcfzzzzDKqqMm3aNK688sozAnV9CnnQzMzM5KOPPuKTTz4JeMXSq1cvoOKK5bHH\nHgMqX7H88YX8+YrFnzo7IevISy95+e47FyaTRFqakeTkMzvJ/3BKsrHbsMn3eKfpBCNb9SBSbfpz\nye7bt69BfLfOO+8k5vzzcRcUEJeWRmTnznXyOQ1lf+tLc9vfOlGLkv+1115DkiSuvvrqSs9nZmaS\nmZkJwNSpU3E6nWRkZFBUVETv3r1ZsWKFL6gCPPnkk+h0Ou666y6cTicDBgxg8eLFlVoaX331VTIy\nMnxl+4gRI5g3b17NMx8EUlFRUcg6xk6/YunSpYvv+dOvWJ599lnmz5/PCy+84Lti2bRpE1u2bPGl\n+ec//8mnn37KwoULfVcsJSUlfPnll822qdeOm6XmH/nJUD4A5XJXJ0Y7e6AP/XVSnWtuharYX+Fc\nRc6qeo3d4v8rqjJNcxTSErQ+r1iamzAMXOPsyV88rfG6PHTSJTWLgCkIQjWIoqDGQlrTFOpHc7sy\nF/vbtDW3/a0LkXOqUdN8SNQ0z0ZcbwiCIDQ3xlBnoPESQVMQBKG5ESV/jYlDJwiC0NyIkr/GxKET\nBEFobs5hQnahMhE0BUEQmhtR8teYOHSCj4pKmVSCBISrYu1NQWiyRMlfY+LQCT5HtL+yzrIcCRhq\nG0truX2osyQIQl0QzbM11mAmbBeCzyPDvnwJm74FShV345ZJJXwetgKP5MItufgibCV2qbR+MioI\nQv0K0tJgzZEImk2UV4EVv+jp/6KVIf9tyad7dagBAqeEhPa0y8/y/8XpIQhNkgiaNSZKxSbqWLHE\n1FVmFFXCo0jc/z8zeTb/0wpaVCtD7TcSKccQJcdyhe16wlSL3/SCIDRiQVhPs7kS1xNNlAuIMqmc\nKCsPlNFmBVcVTbQt5DZcWzYeCTARVud5FAQhRETJX2Pi0DVRUWEq00c5+e+3BgxauOUSNxGmqqcZ\nNotgKQhNnyj5a0w0zzZRCUa4INbLnb3d3NbbRa9YL5H6UOdKEIQGoZZ9mhs3biQ9PZ3zzz+f6Oho\nlixZUun16OhoYmJiiI6OrvT3wAMP+NKMHDmy0msxMTGMHz++0naKioqYOHEiKSkppKSkMGnSJIqL\ni2u9+7UhrjeaKJsLln1l5PnPy2dm/r9rHHQc7EYf4BvPd8L2Yi0SkBolEysmdRaEpqmWfZY2m41u\n3bqRnp7O3Xfffcbre/furfT4p59+Ij09neuuu873nCRJ3HLLLcyaNQv191GKJpOp0vvGjx9PTk4O\nK1euRFVV7r33XiZPnnxGkK5PImg2UafKJBZ9YfA9fvELI+PSPCRGnr2J1u6Fp7INvPSrGYD7Ojt4\nsKsbkzhDBKHpMVWdJJAhQ4YwZMgQAO65554zXo+Pj6/0ePXq1XTs2JELL7yw0vNms5m4uLizfsbe\nvXtZv34969ato3fv3gAsWLCA4cOHs3//fjp06FC7nagh0TzbRFmMKr1SZN/jvu1kwgP0aea7Fd48\nWPFL+s9BI6c8Sp3mURCEEKnH0bM2m42VK1dy++23n/HaihUr6NChAxdeeCEzZ86krKzM99rmzZux\nWq307dvX91xaWhoWi4WsrKzgZfAciXpEExUbDovvsLN6mx6t5GXkBSqWAM2tJr2DfnFGvjpZPhAo\nLd6BSe8EMTBIEJqeeiz533//fTweD+np6ZWeHzNmDK1btyYpKYk9e/bwyCOPsGvXLj744AMAcnNz\niY2NPWN7cXFx5Obm1kvez0YEzSasQ6LK34e62b9/P23jAjdlROk1zOh+iiHxKloN9Ik/RYROdGrW\npyK87NQ5KJK8dJfDaKuI4y/UkXos+d966y1GjhxJTExMpedvu+023/9du3albdu2DBo0iO3bt5Oa\nmlp/GTxHImg2A4pSdTOr02Xm3xti+PqwHlWF4R10vDDMid5Q5VuFIFlnKOZFc/kVdIKs4zlbG5JU\n8QUIdaCeJi/Yvn07W7duZdasWVWm7dWrF1qtlgMHDpCamkpCQgKnTp06I11+fj4JCQl1kd1qEX2a\nAezaVcaTTx7gtdeOcvSoI9TZqVMlLolvDutxeiVcssSG3wyUuPzPICQEl4LK97qK/pxcrZdiSQ7w\nDkGohXqaRu/NN9+kbdu2DBgwoMq0O3fuRJZlEhMTAejXrx9lZWVs2bLFlyYrKwu73U7//v2Dk8Ea\nEDVNP44edXLDDT+Tk+MC4NdfW/HEE52RpKYZSKJNKuO6uXljW3mTYHo3N9HmqidDEPyTnEfR565E\n4zyGu0U6irWn37QaJIZ7Itmqs4ME53lNxKri5ynUkVqeWjabjQMHDqCqKoqicPToUXbs2EF0dDSt\nWrUCwOFw8P777zNt2rQz3n/o0CGWLVvG0KFDiYmJYc+ePcycOZNevXqRlpYGQOfOnRk8eDD33Xcf\nzzzzDKqqMm3aNK688sqQjZwFETT9Ki31+gImwPffF+N0KpjNTXNSRpcOrruwkAs7giRBUhy4tWbM\noc5YHToieVlusFMgydzkttBVCW5TqPHIixiPvAiA/uQyyvp8gWpu6zf9pR4rzyp6yiSF9rKROFXM\nRiHUkVqW/Fu3buWqq67yVSLmzJnDnDlzSE9PZ+HChUD5yFiHw8FNN910xvv1ej1fffUVixcvxmaz\nkZyczLBhw8jIyKhUMXn11VfJyMjg+uuvB2DEiBHMmzevdpmvJRE0/UhMNHDddQmsWFHexzRlSkqj\nDJheGQzGqkOfS+NgR8JKTrUs70Mo9CbSuWw0kQFu6MqWFF7QeZCBv3v1nKcGbu3fc1TD/BVGnG7I\nuMFF97ZV97UqKKiANsg9CV5UnjeW8qnRCcC3ejfvlsXSIli1O8WNtuRH30ONpwDJW0agursZLT3l\nxj9JvlsGQ+P7qTQvtfx+LrnkEgoLCwOmufnmm7n55pvP+lpycjKrV6+u8nMiIyNZvHhxjfJYV0TQ\n9CMmxsCcOZ25445kwsK0dO8eHuosAWC3y2g0EiZT1UHk52MaZq0xYdR24pHhLs5P8h+kjJKXEm3F\n9FQlmmKMktdv+iJUpund/KItDwN7JTfL3AZi/AS3Ejvc+6KZLXvLT7ntB7V89riN+Cj/YeSEppC1\nxh9xS16GO/vQWjn7TdA1YVNUDugq9q9Ao1CgQItgtb5rDLhSpqLdcQsSCu7EMSimlkHaeMN0xCnx\n4m9GtpRo+XsbF1fGeTGIURMNkyj5a0wcugASE40kJjacYf+bN9vJyMghPFzD3Lkt6NbNfw3yZInE\nzf+1cKy4vNTKs2v48C4bkX7eEqGGcbnjQj4zfwPA5c40rAEaZ12o5GgqAl6ORsXlNzU43RJH8ipK\n0JxTGhwe/+ldePjAtJHf9HkAvKH9nKllo4lUg3PfqE7WMLowggWxBSgSXFUSjsGpJZjt0d7YIZT1\n2YCk2JHDOoI+puo3NWKrcvUsOlr+e7l9h5YNfcvoFSEmyGiQRMlfY+LQNRLHjnkYN+43CgrKR1RO\nnZrDypVtsVrP3s7iliH/tPUzT5ZocHkl8NNAqEPLXzzdSJFbICERp8RUWpT6z2KRmOHWc7/Bgwo8\n7NYTh/9qWlyEyuzbnEx8zoyqwhN3OEgKUMv0IlOqrRixbJdcyARvNKlFD23zTfy1OAmvRiXJraNl\nXJALeI0eJcL/4J+mJsdVcVGkImGTm+aguSZBNJ/XmAiajYTXq1BaWlGonzol4/H4DzqJVpX5Vzv4\n2wozWgnmjnYQHx54NKwBPS2VxGrlR4fEVYqWbi4NKtBBldAHCJoaDVyd5uH8FBlFgY4tFQwBxrmE\nYWS0ox//DfsSBYVrHGlEBKmW+YeLY1USyrS4FOgQp2ARv4ZaGZPk5r3jevI9Gm5MdNM5TNQyGyxx\nrteYOHQhJMsqOTlutFqJli0Dj9xs2dLAq6+3YsdRBcWrcnlPAzEx/r8+gw5u6Omhd2sZu62U1DYW\nqrpbRlXhmLM8Uatq3G5iRKKrWv3ahEEP3dpUryCVkDjP24pppaNRJJU4xYouyJfHWgm6ao4CXlRN\nS+ri55AnyXhQiVe1AS8qmoJUq8L6vmWUeiVaGhVixLwMDZco+WtMdNOHiNer8tFHRfTps5tLLtlD\nVlZZwPQanYTUJ5YX2rbh9S5t0HaLrPIzjHo4L1HBKuegqyLeqCp8nq+l/7dWLvzWyhf5oW+/0aAh\nQY0iSYlGVwe/cs2JLYQvuwzrO33Q71sBcoBO1hrYpfFwU3g+V1nz+EhvxxVw7GzT0Mas0t0qAmZD\npxqr/hPOTgTNEDlyxMXEiYdwuVQKCmT+8Y8jlJb677M76pCY8HMYTkWiyKNh6g4zhe7g5ee4S2Li\n9jBsskSpLHHPjjBOOptwzchjx/xtBhpHPpLixvzFZKTS34K2eRmV50wl5GoUvBLMNpdwRON/NLIg\n1CdZV/WfcHbi0ISIRiNhMGjwesubK81mDZpAlzAqGDXg+r1106xR0QYxpmml8u3/waghqNsHQPWg\nUfYDCoqmPUi1XNSvNiQNqu60PlKNHqTg1q7NpzVd6wBN069oCo1EtYJicBtemgwRNEMkJcXAu++2\nY+rUI0REaJk/vzUWi/9CW3KrPJziYOEJI2YNTExw4/UAQZo0JtGo8m4PG5t+1SEBF3XyEGcMYimv\nKug8nxDm/Cug4DA9i0d/E0j+d8CDwm8aNzIqKYoBcxV9mh4vZB/VUOxoTQsHhAe6fURnwnnJXKQN\nf0PjLMR+2dOoEW1rtGtno0ViistKgaRwUquQ4bCSIqbFExoIr7YajYwiaJ6VVFRUJK5/Qyg/34Ne\nLxEZGbhAPVYsMfoNC2ntZdxeyCmUeO8WO9YAfQ+lLsgu0OBy2PlLiglzgI/weOCt1Xr++XR5pHk+\n00H6lR50QSrnJSWXcNsANOpxAFSMlFp+QNW2Pmt6BZUNuhIeD8tBASY7E7jWHY0xQI/CRxt13Pl0\nGIoi8a+bHEwZ7Sasqr4ZVwkobjAHb+KE05Wh4EYlGg1SkAcCKSrstmnILXHQLdZEQjAvchqwffv2\n0alTp1Bno1GTwqteJUQtC92alQ2Z6NMMsbg4fZUBEyA5UuXFa+38ekIiv0Ri7ghnwIDp8MIrPxu4\n4l0rI1cm8N4uPd4AA1dzCyQeftEMSIDEw4tM5BUFr5BXMaJIFTPiKFIiSP53oASZV8x5KOXZ4WVT\nLqcCzVBUBiu/0TPzWhf/utrJrgNaThRUI//GiDoLmADhaIhBG/SACfB1oZbLN4dz7e4E/pltJi+I\nfdxC0yZrtVX+CWcngmYjUeaGT/fribCCooPNORrkAEEwzyYxZ+MffYYSczeaKHD4L7hNRpU2LSoG\nIrVrqWAKZs1FE4nD/AJu3VV4tMOwh72NqvF/tWtAIlmuaLqNV3QBa5kmPfSKk/m/R4w8/pgJQ4GK\ntomPVn35iAHP7/2mq/L0HHaIn7NQPTLaKv+EsxOdLI1Evk1iwUYj6u81lgOFWkafV0qcn/m9w/TQ\nMVpm96nyr/i8WBmzzn8QiY2C12Y5eHaJEa1G5d50N9HW4O6Dou2Kw/wWoIIUuIAPQ8tURxLvKwXY\nJYV0V2zApbKcTvjvEgP8fnyWfmAg424X/mZAagpSrTL/yy//P1yrYg3w/QrC6bzVCIpijZ2zE0Gz\nkQjTQ+dYmezfg+AFLbxYAtwLFxem8sYoB29sN6CTvNzZUw7YnAsQE6tw2xg3EhATU0ezuUi/t7dW\nQ4pq5J+11bxQAAAgAElEQVTOFtVKazbDX1Jl9h8qLwzatVEIb2QLhpR5YWuxlmKPRHerTFtL4CB4\nS0sPYRrYWwa3t/LSuYr0gvAHWRT9NRby9pyNGzeSnp7O+eefT3R0NEuWLKn0+j333EN0dHSlv6FD\nh1ZK43a7eeCBB+jQoQPJycmkp6eTk5NTn7tR5xLCVd660cEDlzh5ZJCD/xvsxFzFpeB5cQpzBzmZ\n0O5XOsYELlDLXDDnExMj5lsYPt/C02tN2APNwN7AGA3wr2lOHs10MHWijSUv2UmMb1xB5KPjeq7a\nFM4tP1q4/acwjgdoTgdoZVL5e1s3D1j30TdKTFknVF9tm2frq9wuKipi4sSJpKSkkJKSwqRJkygu\nLiaUQn65YbPZ6NatG+np6dx9991nTTNw4EBefvllVLW8ENTrK0eLBx98kLVr1/L6668THR3N9OnT\nGTt2LF9//XWlBU3r2sGDLn74wYbZrKFfPwsJCYGj2qFDLrZscWAySfTrF0ZiYuD0XeIU/nV59SPZ\nkUKJzUe1KN42GKIlWkb6DyJFNomoZJlZj5YgAYU79RTZJcIa0YjMtq1V/j7BzcGDB2nXrl2os3NO\nFBXeO1bx/W8r0XHSJdGiGtMZut1iBJBwbmrbZ1lf5fb48ePJyclh5cqVqKrKvffey+TJk88I0vUp\n5EFzyJAhDBkyBCi/Ojkbg8FAXNzZRziWlJTw9ttvs2jRIgYMGADA4sWL6dGjB19++SUDBw6sm4z/\nSW6uh7vuOsjWreUrc9x/fyLTp7dAozl70M7P9zJ58lE2bSpPf++9sTz8cBJ6fXCCfJED7l9t5tPs\n8hP1tt4unhzhJMxPk64hXOHgpQ7Wm8pP8BExMkZZQ3WbUhuC0pwcjm3ciKOkhCJFIapDh1Bnqdo0\nEoxI9LK5UIdZqxKpU4g1NJ4LFqFxqW3QrI9yOzs7m/Xr17Nu3Tp69+4NwIIFCxg+fDj79++nQ4h+\n3yFvnq2OTZs20alTJ/r06cPUqVPJz8/3vfbzzz/j9XorBcfk5GS6dOlCVlZWveWxsFD2BUyA//2v\nGJvNf5NZUZHsC5jl6UspKwve0lclTonP91VcE63N1lPq8h8APQaV706rVX5nVPA0ovlDZY+HHxYs\nYO348Xz1j3/wv7/+Fftp50ljMCLFwcIRJ8kYfpy3BhbTOkwETaFueNFW+VdbtS23t2zZgtVqpW/f\nvr40aWlpWCyWei3b/6zBB80hQ4bw0ksv8fHHH/P444/z448/Mnr0aDye8ukqcnNz0Wq1xMRUXuA3\nPj6e3Nza3Zy7a1cxjz++i1de2c/Ro/aAaWNjtQwYEO57PHZsDOHh/g9vTIyWoUMr0o8ZE0lERPCG\neUeZVa7tXjGlx42pHiIDNPVFInGNUhFUr1EkqpoS/oBDYsFRA/OPGNhfRf9bXfOUlfHb+vW+x7k/\n/4wrxH0f5+ozs53ZEUUsDi9lWsQpjgW4L1UQakNGV+VfbQSj3M7NzSU2NvaMbcfFxdW6bK+NkDfP\nVuXaa6/1/d+1a1d69uxJjx49+PTTTxk1alSttr1v3z6/r7lcFsaM2UZOjvP3tCVMmRITsP/oscci\nyc6OICxMQ/v2bn799deAn//ww5GMG2fBaJRo397NgQOB05+raX3jGNk5Aq0EHSMKOXKwMGD6v8ZE\nMzAiHAloV1zK0cIi/4nDIri/oA153vJp9z4r0PJs3GEke4D31CG9Vst5N99M9tKl6EwmItu1o8Tr\nJT/Ad1zXnKYE1uXFcMyuYUxbG/GuIyjK2VsfjGYzWZ0r5uI9pVE47ijDfiSvWp8V6FxuiprL/tbV\nzEd1fR9mXZbbodbgg+afJSUl0bJlSw4cOABAQkICsixTUFBQ6aolLy+Piy66KOC2Ap2Qu3eX+AIm\nwJYtRSQkpGI2Bz7ZevSozl5U6N793NKfq278Pu1Y205A4JlvCjS55BrWIiGRZLyQ6Dj/xyfHBWOs\nhRTF/oqCStypToQZ42lljA/uDpwD98gp/JIziaJilXvu1tGmS6DJZ+veQ5tMLPql/D6flYdMbLja\nSAer/9r+mLIcNkdJIEFfp0I7jYfYahSazW1auea2v3XBRf32vdSk3E5ISODUqVNnbCs/P5+EhKqn\nAfxDsM+XBt88+2f5+fkcP36cxMREAHr16oVOp2PDhg2+NMeOHSM7O5u0tLQaf05iopEbbmjlezxl\nSscqAyaA2y0jy42vL8qBnfXm98k2/sge4w98aV6JC4ff9BaDmwNJP/BT2G/8HHaY3S22YDGE7h4V\np1Nl1v8pvPyayrLlMO5mmZycqm/DkGVw18HE1G4ZfsqrOF8KXRrK3AGasFWFIT8/y7uH9rL48AH+\nvWM5cWXHgp8xQaDum2f/rCbldr9+/SgrK2PLli2+NFlZWdjtdvr371/tz+7Xrx9XXHEFr7zyylmD\n8LkKedC02Wzs2LGD7du3oygKR48eZceOHRw9ehSbzcbMmTPZsmULhw8f5ptvvuGmm24iISHBV8WP\niIjg1ltvZdasWXz11Vds27aNyZMn06NHD9+orJqIiTHyxBM9WLXqEtavH8CoUS2rfM+mTYWMHr2F\n22/fyt69gReVbmjKVDel2gLf4xLNKcpU/9FE0SjkaSv6eU9pbaiaqoOUAxXHuczS43GA21ZlMqdT\nZd++is8/cULF4T/mA7D3iIbbnzAz+qEwNv0S3OYqgxamprrQSuX7Oq6ji5aWAMdH0qBNuoILP7uO\nYWtG0jLvZ9SwVv7TC0It1PY+zfootzt37szgwYO577772LJlC5s3b2batGlceeWV5zRyds6cOaiq\nSkZGBl27diU9PZ2PPvqoxrdqhXyVk2+//ZarrrrqjPsp09PTefrpp7n55pvZsWMHxcXFJCYmctll\nlzF9+nRatqwIYh6PhxkzZrB8+XKcTicDBgzgqaeeqpSmrv32m51LLvnOt5D00KHxvP32BRgMIb8u\nqVbzxHGPzC+GHzlgXQVAx5Kr6eb+C4l+8u9F4Tv9Ed4y7wDgZkd3LvW0Rh/gx7ZLI/OI0YVbgkec\nRnopgX+YmtydmNZloPHYcAyZh9zK/9Wlqqp89JGXu+5yoijw4IN67r3XiMVy9tqd2wM3zw7jsy3l\nt+REhKl8+2IpKYnB+zl4FNhdqMHukegYKRNXVWux4kVTvBvJU4Zi7Yhqrl5Td3Nrrmxu+1sXtkUO\nrTJNz+J1fl+rr3K7uLiYjIwM1qxZA8CIESOYN28eERER57rL7N+/n/fee4/ly5dz6NAhIiIiuOaa\naxg7dmyVXXmnC3nQbCp+/rmYyy//3vc4NdXKqlV9iYwMbt9Bbq4DjUYiLq76CzhXp5DxqLC+RKFQ\nmwdIxMrxDIqQ0AVoUXTj5bjGhopKCyUcY4AmnWIUxpmd7NWV17biFYmP7WYSVD8XFa5SLO+ORndi\nKwCKOZqyu75DjfB/IeTxqOzZo1BcbKNnTytWq//M2xww/IFwtu//I3CrbHmllE6tGt/PoSEFES82\nFMmJTo1AU0ezlzak/W2sfoocXmWavxSvqYechEZWVhbvv/8+K1eupLCwkNatWzNmzBjS09Np3759\nwPeGvhrURISH6/j738tnoTGZNPz1rynodMFt8tuwIYfLL1/N0KFr+Omn4N6DqJfgcquGHpoWpGqS\nuNwaOGACGNDRRomkrRIVMGBC+Xq2pZqKgFQqqYHXuFU8SK6KkbiSqwyUwJ2Per1Ejx5aEhNPBgyY\nABYzPPpXByaDCqg8MdFJq0Y27R5Afgm4pUQ8DWDBYIeUw69hc9gZfi+5htXIAfrEhdCqj/s0G7LU\n1FT69+9P9+7dUVWVnJwcnnvuOfr06cNNN90UcBpWETSDpFUrExdcEMn06Z154IGOnH9+OBZL8E68\nI0fK+Ne/fuCmm85j9OgOzJjxA8XFwZ0+zaSB7mEK3cIUgt2qHIeGGU4jBhW0KjzqNJKoBAhs5hgc\nQ59G1ZlQJQ2OkQtRrcFtbo+JUJh+q5OH73DSqZWMvpGNJd/1m4ZRMyxc8a9WvPm5HkeI5wouMHxJ\nif5nvJoSDptexa75LbQZEvyq74FADYGqqmzYsIHJkyfTuXNnJk2aRFFREU888QS7d+8mOzubxx57\njO+//55Jkyb53U7TOzIhYjJpueKKWNq1C8NgkDj//CCvqwXcdNMFzJ59CpNJw+zZqVS17JXXC4eP\nSjhcSajq7wuMhMgpFZ53a7lLDkMDLJIl0jQSyQHeI7cbSOn4TaDKqJEpoA1ec5/dBf94wcwPe8q3\nqdOqZC0upUNy46ltPrvSyJ4j5T/h+18206+LTGr74E7cfgIFO5CARHgVUyoqnDajlQRIYhL5hqo5\nrZe5fft2li1bxgcffMDJkydJSEjgjjvu8E04f7p77rkHvV7PjBkz/G5PBM0gcblkPvjgBNOm/UJ4\nuJalS3tz0UUxAd9TXOxh794y9HoNqalWNBr/1TtF0TN79ilcLhWXS+a554q46ir/9yrJMqxaq2PC\nvWFotVbeecXGFQODN03fuZKAfCT+LZfvY5RvZdBAb5JQo9vWWX5Obz2XpNBeVNSEVvunAB/k/O+W\nFO4wuDghwQSvjr95dUQF+JA490BKdD9h1/5GS+cYzHKb4GZICJrmFDQHDBiAyWRixIgRpKenM2jQ\noIBlbZcuXSpN3fdnonk2SI4ccTJt2i+oKpSWyjz00B5sNv/ToJWWenjzzSMMGZLFsGFZfPJJ4Gmh\ntFoJo7GiwDKbNWgDnPc5JySm/CMMr1fC5ZK478Ew8vJCFxViJHhBA21QaYHKaxpoGcIgZTbCvMlO\nuqR4SYhWePNfdtomhb6WuU+B7bJEcTWyMvUaN707eYmNUHjubw46Jwe3ZrdE5+XE73P2v6L3sr+K\nmqNZbUVn2/+RWvoSSe5r0dHIFjRtRppTn+azzz5LdnY2r732GldccUXAgAlw2WWX8cknn/h9XdQ0\ng0bFbNZit5fX5qKi9OgCjKQ5eNDBrFl7AXC5FB5/fB/9+0eRmHj2UbGtWhl455323HffEcLCNLzw\nQgoREf6/Pp0OwsNV7L/PCRsZoaDXhzYo9JVgjQYUIKEOAqZHhuwSDcWm1iS5wVrFwOXzOyi8NN+B\nU4HzwxSq+C0hq5Dt1eAAOmgUooJcrnwnS9zoNGBH4h6dl0yDl8gAx6mktUz3h8vo75Y4Hqng0EqY\ngljdjFYrtiWpYKjGtvVEgHrutwMI9asp9lmejd1u5/3330ej0XDLLbcEZZvnXNPMzs5m9erVlZ77\n7rvvuO666xg8eDAvvvhiUDLWEJw65WbTpmK2by/F4wl8la3RaHjkkS506xbOxRdHc8MNLfF6/Qcp\ng0GqFPTi4gwYjYFL4UsvtfL5551ZvbojPXuGBUzbIlHlnVdt9Owu06+3h0XPOIiKCviWehEnVT9g\nOmX4qUjD5kINxVWMDlVVWJ2j47LPwhm5MZEX9xmwVzHf+VqbjitOhDM818qzRUaqWmTmc5eWywrC\nGVxg5d82E6VBrNgpKjzt1mH/PTC96NVxKNBAKWARKsusKm/EKjyjg0PByw4A18laRns1dFIknnXr\n6aw2svZrwa/aTm7QWISFhbFt2zZkOXhdU+ccNGfMmMGbb77pe3zs2DHGjh3Ltm3bsNlszJgxg3ff\nfTdoGQyVoiIPs2f/xpVXbuPyy7eydm3g6Zd0Og3PP3+cjh2jsVjC+OyzIvR6/4f3vPOsvPVWL/r3\nj2LIkDgefbQLUVFVD3SJjtYFrGGeru9fFP63vIyX5u8ntVvjGpQhq7A8R8+g78IZutHKwgPGgEGw\n2AOP7TCh/F6wz9lp4kSAlVdKZZhTaEL+PUjNLzJxXPaf3qHAkzYT3t/TL3QYOaYEr3dDI0H7027J\nMaMSJgVuGTh9mW2jStAbQ9uoGp72GFjhMnK1osPYiNZWFQJrLkET4KKLLmLjxo1B2945/+q3bdvG\nxRdf7Hu8dOlSFEXh22+/ZdOmTQwbNoxXX301aBkMlePH3fznP8cBUBSYP/8IDof/q5WUFBP/+U9X\nbDaFuDg9Dz/crsrZgAYMiGPFit68884F9O5dN9VAiwVkuXFN6QdQ6Ia5+0z8MbrlqV+N5AZYD9Sk\nhU7WiguDRJNKoKmCTRrorK/4PmM1CuYAMcEgwXm6iu1HSQrmc5kOsBqm6GXG67wM1Mi8b3LTqYpf\n5+1IjFfhUlXlbSSCfbu/R4GdxVo25+v4LcRLvwnB1Zz6NOfNm8ePP/7IzJkzOXTokN+VhqrrnBu2\ni4uLK61x9tlnn3HppZfSokULAIYNG8bDDz9cq0w1BOHhWuLi9OTnl7cL9uxpxWgMXIr17h3BsmXd\n0WiqV8AcP+5hxw4nRqNEr15mIiNDe6IWILNH60YCzpMNRIfwhxOmhW5WmSOO8mPeNkwhLMDZatLC\nY70ctLYonHKoTD3fQ4sAizjrJZgZ66SFTiXXK/G3KBetAvT5aiXIsDiJ1ygckzVMsbhoowtu0Gyn\nUXnK6EVWyz+vKilIzEbi8NGjpLQK/jy13xRqueFnCwoSPcK9LOlpp5Up9IOlhNpzYwx1FupNv379\nUFWVhQsXsnDhQjQaDXp95VY9SZICTmhwunMOmvHx8Rw+fBiAoqIifvjhB2bPnu173eUK8R3WQdK6\ntYkVK7rz1lsnSEoycOONCdUKhtUNmEVFXh566DgfflgCwKOPJjJlShza6pSWdcCOwhdlHo7vNyFJ\ncKKDixEWCWOAxohcl8TWMi2qChdYZRKNwStQw3Tw+PkOukXI2LwSt6e4Sahi+x2sKvP+4uTw4cOk\nRKdU+Rnt9SpPxDmrTPeHdjqVR611d36XyfCTS0uxItHDINPWUL3j6apqZvoaWnFSj/J7TX9HmY4j\nDg2tTKG7bUkInqbU/FqVa6+99ow5cmvjnIPmwIEDefnll4mIiODbb78FyifR/cOePXtITg50y3rj\nkZpq5amngj9JAUB+vuwLmABvvlnIbbdFExUVmlFtBU6V/y2NZMWX5aN3xw110H+snZZ+mpjtMvz7\nsJFXcsqvWG9PcvF4RyfhQfwtdrCozOxy7kGqsV64fWTTMyWvfIBXqsHLe0l2WoZwxHP/SJm3y3so\niNCqxBgaV7+44F9zCpqLFi0K6vbOuYR++OGH+fXXX5k5cyYGg4FHH32UlJTyq3qn08mHH37ImDFj\ngprJpkhv1NCtm4lffimv6Vx0iRWTKXS3zXrKtKzZWNFks+ZbEw+NdIOf+RmKvBLLcivu6ViWa+CB\nNi7C/3zDfT064ZTIKtRSquuEzibRztJ4mhIVFd4r1aNBxSjBdreOXFkKadAcEe/BqrNx0KFhYIyX\nLo3oeAqBNaU+y/pWo+bZNWvWUFxcjNlsxmCoKDhVVeXjjz+mdevWQc1kU+SR9Fz31/YMzy/BZNbg\n0EXgcIOp+ouXVFtVN/MCxIbB4FQPn/xQ/n0O6eUhNsBdLRE6laExHt7/PXAOifESEeQ+vnPhVeD5\nA0YWHiwP/P1yvLzbx0ZcCLtuckskNu7XUlAmcXEnmS5J/mtqGgkeiD3BE8ataDQF5Dl7E6epuom5\nLsUa4JrEKu7bERql5nKf5ulycnLYtm0bJSUlZx0MlJ6eXq3tnPORmzt3LlddddUZc/YBmM1mdDod\nixcvJjMz81w33ehlZzv59NNioqO1DBwYQatW/u+uj7bC1zvD+X5nFLIM993kwmoJbrPi/mKJdUf0\naNSO6EqgTYT/oBYRBk/e7CD9YjeSBD3bKYQHCODhWshsX8LAOB2qCn0jvETo6mYpqOoo9cKakxWn\n8+YiHcUeibgg9rOeqzc36nl8dfkimikxMmvus5Ec7T8/3SNWUWR+AYC2lngSbYtBbVEveRWal9o2\nz27cuJHnn3+ebdu2cfz4cV588UVf0PF6vcyePZvPP/+cQ4cOYbVaufTSS5k1axatThuwNnLkyEq3\ngkiSxHXXXVfp7ouioiIyMjJYu3YtAMOHD2fevHlERkZWO68ul4spU6awcuVKFEVBkiRUVfV95h/q\nLGg++eSTtG/f/qxBE2D37t3MnTu32QXN48fdjBu3n4MHy1cemTgxjjlzWvkd2BMbCc9nOPhpjxaj\nAfp09RLMlcQKnHD312FsztUBZr7LdbPoMgeWAHHNWSyx6ystkgRdohW/TbMADjx8Ef0du+KPIwFF\n3kRa2S8hjOCuH1pdVh2Ma+Xmib3lQWpYgofoKgbSHLZJrM7Rk++SuL61h/Mjg9dn5/bCZ7sqDvbh\nAi0FNslv0FRRcOo2+R4r2jwUqVgETaFO1DZo2mw2unXrRnp6OnfffXel1+x2Ozt27CAjI4Pu3btT\nUlLC9OnTufHGG/nuu+98LV+SJHHLLbcwa9YsXxAz/ampbfz48eTk5LBy5UpUVeXee+9l8uTJLFmy\npNp5ffzxx/nwww/517/+Rf/+/Rk1ahSLFi0iKSmJF154gby8PF566aVqby/odfSysrIzhvM2ByUl\nii9gAnz7bRl2u4LV6v/kTElSSUmqm+avMo/Ej3kVn511UkeZR8Lip4+ssBCm3BtG1ubyU+Kbb3X8\n9z92/C2Q7pI8HNLm01Ipn8L7sPYULslDmBqaoKnTwPg2bnpHypQ43PRL0BETICteBZ7aY+StQ+Xt\nt8sO6/l0oI2W5uDUTA06uONCO5sPWgGJSzq6SQxQ05fQYHWPwqn7ASQwerujVeOCkhdB+LPa9mkO\nGTKEIUOGAOUrg5wuIiKCFStWVHrumWeeIS0tjezsbLp27ep73mw2Exd39vN87969rF+/nnXr1tG7\nd28AFixYwPDhw9m/fz8dOnSoVl5XrlzJuHHj+Mc//kFBQQEALVq0YMCAAQwYMIARI0bw+uuv8+9/\n/7ta26tW0Ny5cyc7duzwPf7+++/xes8s7IuKinj99deb5arqCQk6brghiuXLyxdOnjQpPmDArCnl\n99VBpCpmZ4kxqUw6382Lv5QHhUndXMQEaKq02SV27KzI77btWmw2iQg/Bb1FNTBi73De+l8ksgK3\njyzG0jL4HYjq7xMIVLW/ADEGGJwgs2/fAZLNgc9Bhww/FFSc/kccWso8gLlW2a3kBt3rdBjTi1KP\nnlTtjyQoA4C2ftNbvJehsy1CkWwY5PboRNAU6kh992mWlJQgSRJRf5rLc8WKFXzwwQckJCRwxRVX\nkJmZSXh4OACbN2/GarVWWnEkLS0Ni8VCVlZWtYNmbm6ubxs6Xfl+O53lAzAlSeLqq69mwYIFwQ2a\nn3zyCXPnzvV9yBtvvMEbb7xx1rRRUVG8/PLL1frwpiQ6Wsfjj7fi5ptjMZk0pKYGsfT9XY6Ux04O\no5U09FDbkqBG+00brod/9nIyrLUHj8tJ32Q9+gAxPC5WZeq9TubMLc/3ffe6iI31H2TLbDoefimS\nnw6Un0J7Dhr5+CEbsUG8Qydfc4qNxu9xSx4ucV5EkpIYtG1b9XBvZxd3/2AGJG5t6yIxmDfuy26i\n97/H0JxpvqdKz/+GQA3AGsyY5V7By0MIKAq4vGAOTYODUE31ecuJx+NhxowZDB8+3DcJDsCYMWNo\n3bo1SUlJ7Nmzh0ceeYRdu3bxwQcfAOXB7vSJdP4QFxdHbm7gVaH+nL6kpPz2PqvVitls5uDBg5Xy\nZ7PZqr29agXNO+64gyuvvBJVVRk0aBDTp0/3Vc1PZ7FYaNeunS+aNzeJiXoSE+umaboEG1u36nnu\nwUuxWBXueSyHS7t4MOL/82JNMCBZZt++Q0QaA9e8TCaYPNHNZZfKSBJ0O1/GEKDgc7olDuZWjMr9\nLU+L0y1R1cLY1eXGzTrT5xzVHwUgV3uSW8tuwaqGB2X7ANcke+hslXHIEudZZSKDWdBrDbj6TkP7\n8c1Iqozr/JtQwoM/a09DcjhP4rlVRn7Yr+W+q1wM7+3F2Px6ahqF+gqasiwzYcIESktLWbp0aaXX\nbrvtNt//Xbt2pW3btgwaNIjt27eTmpoatDz06NGDH3/8ESiv9F188cUsWrSInj17oigKL7/8Mj16\n9Kj29qoV3ZKSkkhKSgJg1apVdOnShfj4+BpkX/izU6c86PVSlZOw5+cYmDU+kb59HbjdGhb8syUX\nvFeCMXgxhMhIuDCtejO+xFlVHhnjZOrr5TXTR8Y6SIisOmAW2cvvSYypYnZxLzKl2orJH2ySHZng\n9v+addA7pu5u2Pe2u4Kym78Ejw0luiOY/bcMNAUfb9bz6mflTfR3Pqfli8fKuKC9mBChIaqPoCnL\nMnfddRd79uxh9erVZzTN/lmvXr3QarUcOHCA1NRUEhISOHXqzIUy8vPzSUhIqHY+br/9dt555x2c\nTicmk4lHH32UUaNGMXLkSFRVJSYmhscff7za2zvnKuEll1xyrm8R/NiwoZB//GMfVquWF17oQmqq\n/wio9eqZNOk4ixbtw2zWMGlSF3AHvwm4uvQ6GHuxh25tZRSge0sFfRVn00+HNUxZEoZbhufHObio\nvf8AbcbEQMflfBS2ChWVQc6BhAexlllTBTZweyUSrGqV62+i0aEkVP8KtrE7WVhxQFRVwhFggn0h\ntOp6cgOv18udd97pW0rS32Cf0+3cuRNZlklMLO+G6devH2VlZWzZssXXJ5mVlYXdbqd///7Vzsvw\n4cMZPny473HXrl3ZunUr33zzDVqtlrS0tCoD+umqDJpTpkxBkiSeffZZtFotU6ZMqXKjkiTxwgsv\nVDsTzdFvvzm4+eZfsNvLr8T/+c99fPhhKhaLn5NZdTF79i5KSsoDzSuvZHPNNd0J5TriW9EyITwM\nFXhZsnMx/oNgoR0yVpi5uv8ptBqV+9+PYflkBy391E4lJJy2TqSU3YWKgleKRFfFeqN1bccxDRPe\nNpNfpmH+DQ5GdA/ubUKN3dhL3Sz9Vk9usYabBrjolCzmqW2oajsQyGazceDAAVRVRVEUjh49yo4d\nO4iOjqZFixbcdtttbNu2jSVLlqCqqq8PMiIiApPJxKFDh1i2bBlDhw4lJiaGPXv2MHPmTHr16kVa\nWphafZ4AACAASURBVBoAnTt3ZvDgwdx3330888wzqKrKtGnTuPLKK6s9CMifiIgIRo4cWaP3Vnnk\nvv76azQaDYqioNVq+frrr6uc/DaYk+OGktstk5PjwGDQ0LJl4EWfz5WigNtdETDsdgVFCdS8qeJy\nVTR1ORwKshzcG/dVVeXIkTJAonVrS8DvMU+WmFAcxtHf15S8sziMr2PKSPIzjZ4iw8xbd3Ow7VJk\nSeaJ1BtB9X/iF8swKTec3e7ym5gtksqm1qW0DtG0cm4ZZnxkYs+J8p/MnW+FsSmzlE4JYmq5P3Rv\no7D+sTLKHBJJ0QrRoW8YEPxw1/J+6q1bt3LVVVf5yog5c+YwZ84c0tPTyczMZM2aNUiSxOWXX17p\nfQsXLiQ9PR29Xs9XX33F4sWLsdlsJCcnM2zYMDIyMiqVO6+++ioZGRlcf/31QPk85/PmzatV3mur\nyqB5+q0mZ3vcVLlcMkuXHmTatC1ERRlYtmwAvXsH7xaA1q1NvPxyFyZPziYsTMvTT3fEavX/dUiS\nwsyZrZg9+ygmk4a//z0JjSZ4Bbaqqnz66RHuvPMLJEniv/8dzODB/geuqFBpJKiiBh4CFGa1ccS6\nEoemfJTa/v9n77yjoyq3Pvyc6ZlJ740QCKFEQgtNQCJIU4oiKqIidoGrgoUq6KeogAWxEUHFBipc\nhOtVLigdlICAIiACASRASO9t2pnz/TGSEGVmQpgwCTnPWrMWM/NyWs6c37v3u0vMSpJKJ4J08coe\nEvZG1FXbx10hRnVEsud2Vr2V7C+ZmjQLlvDwX0qmFlyue7ZPnz4UFhY6/N7ZdwBRUVGsXbvW5X78\n/PxYvHjxJR1bQEDAJRtugiBcdP30YjTNMNdacOpUGZMm/YwkQX6+iWef/YVvvrkBrZtchCqVwKBB\nwWzc6INKJdC2rfMcR0EQWL48ncceC8dqtfHVV6e5+Wb3BWOdO1fB+PHbqhptT5y4nW3bbiE8/OIW\ndqhSYrFfBQ8U67FJ8KFfBRFOi7ULKKTqG1mQFE4zL/2V8G5IJeOy9VRKsDi0kmYerG2rUcErNxu5\n91N7LdmFd1TSIlgWB5nGydVce/bv1qq7qdWV69ChwyUdhCAI7N+/v84H1RBQKgXUagVms9288PXV\nuLXXpdEo8eWXMGWKBo0GvvgCBgxwPL5ZMy9eeqktTzxxCJ1OwZIlHfHzc188f6VVwMtLRVGRvaqR\nl5eKSqvzSJfrNCLbA8uQgEgX3U280HNDxa1s1K/GJoj0r7gFbwdW5nm6e4lsjS5DBCKUEp72+nds\nZmPjpDLMIoT7Sig915RGRuayuJpbg82YMaNet18r0byw7BHYI6M2b95M165dCQx0UqC0EdOypQ+f\nfdaHGTN+ITRUx//9X0dUKvc9Jc+dg6lT7UJjNsOzz9ro1k2Bn9/FlcFohtOlEQwaG4xVFDhXrqCL\nJDoVkrIKSDupwGiMppkJdE6MWb9APTPmD2TRK9tQKAQmzEzG1991yxXn1mVNwmzR3Fr2IJIgoa9l\nJGyYB63Lv2O1QY5NoNIGBquEv5zAL9NIuZpFs76plWj+PSk1Pz+fVq1aMWvWLJKTk+vlwDxNWZmZ\nffvO0bOnD5WVVs6cKSEhwXmeXUGBiWPHStHplLRr5+vUlavR2PMii+xV9wgPB2cle89mCzyz0AtR\ntLtLt/9m49rEUoIdHJLRBB+v0DD7VR3gzaJXKhk9woLSwSGF+ECHziEMnTYKBOjUWSDI27lglVnh\nSKkCCWjnY8O7FneTF4ZGu+S1MVvFPal6rJLAxFYmprcz4isLp0wjpCmKpsdag8HVEx3rjIyMcl57\n7deq96dPl5KcHIVOd/FLVlJiYd68IyxZchJBgA8/7MaoUY4DaaKjBf79bwXPP28jIABmz1ag1zu+\nrqIEoQESmXn2MZGhIlYn4pOTJ/Dimzr4a+XwxTd1DLjOSqiTdbhOzSRa/1WpTu+iQ4jFBp+f0TDj\nsH0fL7St5NFYM7qr9LdYKcL8P7RY/1qXXXRcy9hYM74aOXlfpvHRlJpQu7s1mLwq4wC9Xk1AQLU/\ns127QDQaxzdaVpaRJUtOAvaoygULjlJWZnG6j27dBP7zHwWffaagbVvnExF/X4mZE4wM7GlhxPUW\n7h1lxsdJFoyXDmKjq/PkWrUQ8apFbVW9xv5yRa5ZYH6alvOi/GqajnyzeydTJRXw4xElW35Xklvi\nenx9olFAO99qgQzQ2NA3INexjMylIKJy+bpauLA12HfffYckSaSkpLBmzRr69+9PYmIiP/30U623\nd/VcGTfTvLkPX301hCVLDhERYeDee9uiUDgWBYNBSXi4jqwse/X8Dh380dXC7NJoaic0Yf6Q1NZK\ndqWAVg3d2loxOFlyDAmS+PStShZ9qkGtsjFxnAUfN+bNKWwSbbxFdv9VBSbeINrzTtyEVYRPtmp4\n7t/2qkf3JZuYM9qIj4eKICkFmNLWSKjWxrlKBRPiTTQ3yKIp0zhpSu5Zj7QGa4rk5hp57bU/yM21\nsH9/Hi1a5NG6teM1zagoPatW9eLzz08REqLlttuauQwcOnKkgv37K9BqFXTp4kXz5s4VISFGIiHG\n7HRMjfHxNt59yUh6ejrNmzev9f+rDSVmGN7MShsfe/OutgEiLgzrS6KoHJZsqrb0P92uYfJNJnzc\n1O+yLrTwlvi/RJPH9i8j4y6akmh6pDXY+Qrx5znfZiUtLa2q99nfOd80tLGSm2tk48bMqveff36C\nu+5qgZeX40vWvr0f8+d3rNX2z5wxMnVqJtu3VwIwaVIAM2eGuy0P9ELM5toLbW0JUMOmYiUnRfv1\nOFEII2tfvtElBh30bmNhRapdODs1F/H2oGDKyFxNNKU1TY+0BhswYMBFg3+mTp36j88kSUIQhCoz\nuLESEKAhPt6HtLRSAAYOjHQqmJdKfr61SjABvvuunEcesRIV1Thu5hADzIkysaVYRJTgBn8LkW50\n/3ppYNatJnq3Eakww8BEK8Fu7NXZEMkX4WejigJRoJtOpLUcZCRTT1xNa5au8EhrsPfee69uR9uI\niYjQ88UXyezcmYO/v4aePd3bCi0wUEmXLlp++cXu7uvXT09gYOO6kdsH2Ggf4H4r9jzNgiXuTXaj\nz7eBs6JUw8x8u4s+RiWyNrLcY7V2Za5umpJ79u+twV544QWGDx9ev63B7rrrrjofcGMmPt6X+Hjf\netl2TIwXb78dyZ49Fej1Crp29cLLq3HdyH+WC3yfo8YmwZAwCy3lwJg6Y5NgXXn1z/G0VUmeKNRK\nNJtq03eZutOURPPvrcESEhLqtzVYfbNz507eeecdfvvtNzIzM1m0aNE/8mXmzp3LZ599RlFREUlJ\nSbz++uu0bdu26nuz2cyzzz7L6tWrMRqN9O3blzfeeIPIyMgrei579uTw73//SVCQjqFDm9G+vfNq\nSe3bG2jf3kU3ZjegdlY14QLS0gS+/lqJIMCoUSKtWjl+YJdYYMrvXmzMtW97fbaKz5IqnFbJOXkS\nVq9WYTLB7beLtG4ti+x5FALc6WNhh9F+PTtqrA47xpwnM1vgf1tUHD8Zz+3DbXRJlN25MrXDhPNa\n11czO3bsYOXKlWRlZdG6dWuuueaaxiWa5eXlXHPNNYwZM4YJEyb84/uFCxeSkpLCokWLaNWqFfPn\nz2fkyJHs3bsXg8EuONOnT2f9+vUsXbqUgIAAZs6cyejRo2vVxsxdHDtWzH33bScjowKAEydKeOed\na9FqPXeJjxwp4KOPDqJWCzzwgB+tWjmO/i0shAkTNOzda5+B7thhZflyM34OysOWWQX2FFaf295i\nFWWigL+Dcj9lZTBtmoYNG+z/54cfRL7+2kQtetM2GW42WGimKqPYJpCoFYlwYWV+8R81cxZ6/fVv\niU0rS2kVe/VPRHQ61+UdZZxztVua8+bN46233uLgwYM1GmAvX76cxx9/vKq4wcaNG1m5ciWbNm0i\nJiamVtv2eHGDgQMHMmvWLEaMGHFRgXv//fd58sknGTZsGG3btiUlJYWysjJWrVoF2CN5ly1bxpw5\nc0hOTqZDhw4sXryY33//na1bt17Wse3bl8O9925ixoxd/Pmn8+z60lJzlWACHDpUSEmJ8/W4AwfK\nuf/+4zz99CmOH690OvZSycur4L771vHBBwdZtOgATz+9jdJSx+kSBQUChw9X3w6HDikpcNLdJ1Aj\nMaFF9fYmxJoIcvKQLy+H336r/qH+/ruCiorGVVnqz2IFM3bouHedF/uy3f/T8VZCX73IcG8rsbVw\ny+694HoWlwoUl7j3ep4VBeaXaRhTqGerSenONNw6kVMg8M4KDc8sas3/flJhbjrL3W5HROny5Yyd\nO3cyZswYEhISCAgI4Msvv/zHmLlz59KuXTsiIiIYNmwYR44cqfG92WxmypQpxMXFERUVxZgxYzh3\n7lyNMUVFRTzyyCPExMQQExPDo48+SnFxscvz27FjB/37968hmCaTiRkzZuDr68s333zD2bNnWbp0\nKWVlZSxYsMDlNs/jcdF0xqlTp8jOzqZfv35Vn+l0Onr16sXu3bsBezNUq9VaY0xUVBRt2rSpGlMX\n0tNLufXW7/nvf0+RkvI78+f/6rRJdFSUnjvuaFH1/qGH2hAS4jjvMiPDzG23HWPNmkI++iiX2bPP\nYDS67nRvNFoxm12Pq6iwcuJE9c119GghlZVWh+PVWol7xlZ/f/dYK1onE3qdEsa3MLG2Zxnf9ijj\nsZYmnAUXBwbCU09ZOF94dvJkC8GNqLWWaIP5e7SkHNDy35Mabv3Wm1PFnhX9B8eYUf7lwh3Qx0Kz\nSPdezzVGNXPLvVhnVnN7kYHDLrre1Ddb96mY/b4X3+/ScPdsPQePN+jHV4PmckXzvIdw3rx56PX/\nLE123kP42muvsWXLFkJCQhg5cmSN1I7p06ezdu1ali5dyrp16ygtLWX06NFVViDAQw89xKFDh1iz\nZg2rV6/mwIEDjB8/3uX5nTx5kk6dOtX4bNu2bZSWlvLEE0/Qt29fDAYDI0eO5I477rgkA8vj7lln\n5OTkIAgCISE1I1dDQkLIysoCIDc3F6VS+Y9uKyEhIeTk5NR53xUVVoqLqyNDjx0rwmwWHdaeDQ83\n8Oyznbjllubo9So6dw5yun2j0UZOTrVIHT9uwmSScOZ52rs3m5kzU/H2VvPSSz1JSHC8j9BQPTNm\n9ODFF1MBmD69G4GBjkU8LBS69ZIIjbQgCNCipY0Q56eAvxp6B7kWcLAXo7/nHitduoiIIiQkSFzk\nt9ZgMYtwtLD6IV1sEqi0Cniy+vz114psXlFGdp6RxHZap3WF68Jxsfp8LQiUSZ6dJJzJrt6/JAkU\nlzUuT0VD4nLzNAcOHMjAgQMBmDhx4j++v9BDCJCSkkJ8fDyrVq1i3LhxVR7ClJSUqqYfixcvJjEx\nka1bt9KvXz+OHj3Kpk2b+OGHH6ry/t98801uvPFGTpw4QVxcnMPjKywsJDw8vMZnO3bsQBAEBg8e\nXOPzTp06/aMpiTMatGjWN2lpaQ6/Uyg0/OtfCbz33mHUagVPP92ejIz0i1bHv5D4eAATOTnlONds\nLTNmhDF3bjZKJUyfHkp+/mlyci4uQmazF6NHbyI/317JYtKk7aSkdEWSjA73MGxYMF273oRSKRAW\nBn/+ecLpsXe6xkBYSCAKBYQF53PqVIXT8XUh4K9l1ZwcXFyfy8PZ37YuKBQKnunUgvs2+mOxCfwr\nsRxFaQZpBWVu3c+lotdAi0goK4Y0116rS+L28FhWCxpKJYGhaiO+RTmkFXsu//q6jjEE+mopKFFw\nbaKZUL980tJyPXY8V4J4+wPF7dRnnqYrD+G4ceNcegj79evHnj178PHxqarmA9CzZ08MBgO7d+92\nKpphYWFkZmbW+Cw1NRW9Xl8jiBTsv22Npvbtihq0aIaGhiJJErm5uURFRVV9npubS2hoaNUYURQp\nKCioYW3m5ubSq1cvp9t3dUNOnRrObbe1QqdT0bq1H0o3dx3+179EBg8OQq0WaN1ah1od5nDsqVMl\n6HRKHn44EYvFxp49mQQGhhAY6Dwows9PorAwn1atahdxE9/q/L+inA1r0KSlpdXLwybWBtsDyzCK\n0NLXhp8uwu37uFQKzXAur4jW4f6o3eytjAc2e5VSIgnEKGyEKIMg1IX7oZ7ZuKicjKwK4pt7ER7s\nD7ixDFUToj4DgdzlIczJySEo6J/3W3BwsEsvYlJSEl9++SWPPPII/v7+HDp0iF9//ZUhQ4ag/Ft/\nxKNHj9bQF1c06EWB2NhYwsLC2LJlS9VnRqOR1NRUevbsCdhNa5VKVWNMRkYGR48erRpTV/z8tHTu\nHEK7dgFuF0wAb28lnToZuOYaPWoXTzyNRs0LL1zPf/5TxpYtJl54oa/LVJItWyT69rVx++0B7N7d\neNYPL4esrHLMZi+n6891RamAdkE2Oofa8GsAAZx/FCsYucPATXtj+DJdjdHxknWdiVdJJKlthDSQ\nYMuWUTbCfc8Q3ojWwxsil7um2dCZNm0amZmZJCUlcdNNN3HjjTciCAKTJ0+uMU6SJL777jt69OhR\n6217XDTLy8s5ePAgBw4cwGazcfbsWQ4ePMjZs2cBmDBhAgsXLuTbb7/l8OHDTJw4EW9vb0aNGgWA\nr68vY8eO5fnnn2fbtm389ttvjB8/nsTExKuqQXZensikSQfJzTWTnl7J7NlHKCx0HD6YkSFx3302\nsrPhzBmYMMFGQYF7HzSSBOlWgXSrUG+RlWfyBE7lCFhrsXS6Z082fft+w6BBm1i79hSi6Pm8xXNF\nAqfyBIz1EOn59jEt+4tUFFsEnvjFi2NlHv85yzQSrChdvurKhR7CC3HkIXQ2Jj8//x/bz8vLqxrj\niDZt2vDf//6XpKQk8vLy6NGjB6tXr67h6gX7Oqe3tzcjRoyo9fl53D3766+/Mnz48Kp0k7lz5zJ3\n7lzGjBnDe++9x6RJkzAajUydOrWquMHq1aurcjTBnpOjUql44IEHMBqNJCcns3jx4iveLNtoFDlz\nphK1WiA21r1FC5RKgQuCyrDZJNTq2p+fJIGL5dhLZpNZydgiAxLwiX8FgzVW3HnJd/yu5K43DBjN\nsOSxCkZ0t+LI4C8rM/PkkzvJybGn7jzwwFb27BlFbGz9VHSqDb+cVnDHBwYKygXmjzRyTw8zXrVf\nOnGJbGvJ1JX6XNO80EN4PoL1vIfwpZdeAmp6CM8bQH/3EHbv3p2ysjL27NlTJXa7d++moqKiVpZh\n9+7dWblypdMxffv2ZefOnZd0fkJRUZH823NAWZmF06dL0WqVtGzp61SEjUaR5cvP8PTThzAYlKxY\n0Z0+fZyv/1RWWjl1qgKVSkFcnMFpv06bzcZ//5vLU0/tx8tLyaJFXUhOdlxxyGqFtWslnnrKhkYD\nb7+tYMAAwamoWSwSJ+19tGnZEqeinCUK9C3wJsdmVzF/wcZPQWVEuahiU1sKSmHgc96cyLLPeDUq\niT0LSmkecvHtl5dbGDbsf/z6ax4AXl5Kdu0aRfPmnqnyLoowaomercfOu9Aldk4pIyHSfTOXP4oV\nPLTHi9PlSl5MrOTOGIvTtJ+rhfpas25KtPNzHdD1R7Hj50t5eTknT55EkiSGDBnCk08+yZAhQwgI\nCCA6Opq33nqLBQsW8O677xIXF8frr7/Orl272LNnT5XB8/TTT/P999/z3nvv4e/vz6xZsygpKWHr\n1q1Vz9rbb7+dc+fOsXDhQiRJYvLkycTGxvLFF1+450LUAVk0HVBebiEl5XdeemkfXl5KVqwYRN++\njsvyHT9eRteuW6ved+zoy//+1wuD4eJPMaNR5NNPTzNt2u9oNAqWL+/KwIHOXQ42m40TJ0yoVNCi\nhfPem2fOCAwdamDoUDNWK/z4o4b//recEAeiY7VKrFolMXGi/fsPPxS4+WYBpfLiwpknwoBCb06J\ndlGLUtjYElhGqJtEs6QChs4xcPCU/fr56SV+ml9KtJO1rN9+y+PRR7dRWmrh7bf70L9/1BX3NpzH\nZoPJq7Q0iwVJAfv/UDB7UCXtHMd61YkCE2TmFxMf7oemiXhnZdG8fFr7uQ61PlbsoBwY8OOPP9bw\nEJ7nvIcQYP78+XzyyScOy59aLBZmzZrFqlWrqjyEr7/+eo3yp8XFxUydOpV169YBcNNNN/Hqq6/i\n6+s5D5Ismg44cqSQnj1XV71PSgph7dqh6HQX9/UfP15GcvIOysvti2/9+gWzYkU3NJqLjz95spyk\npC1VLtfWrb3ZsKE3fn61qxPriqwsgeRkb7L/qlzTvr2V774rx1GJxYwMiZ49bZTaO6ERFAQ//qgg\nIsKx6OyzKJhUoscGvOVTQTc3t7I6cErBEx94UWkSePPBSnq1c76wabbAwSNQXmGhU4IaXw+2ErNi\nY32xkgczfDBJAg/5G5kQXkqc0o3+2b9oaiLS1M63PojzcZ0qdaLUjb3+riKagDOnbmi1SgwGFeXl\n9pDEZs28UakcC4ggSPzf/7Vh2bIM/PxUjBwZhsVicyiaGo0CPz81RUX2CJHISB0aN5oK4eESX3xR\nztSpXmg0Eq++anQomABaLYSEUCWaYWH2z5yRpLbxvwD7j8+3HqycDrE2vp1Vjs0Gfi6WiCUJvtus\n4sEZeiRJYMrDRibfZ8LgoQIKNpvAogIvTH8VBPiwSMedQUYaeVCizFWC1SrfiHWliTh0Lp0WLXz5\n978H06tXGLfd1pJZs5JQqRxfLo1GwTvv/EF0tAKl0sLmzZkOBRMgOtqLVau606dPIMOHhzN//jVu\nbw2WlGTj22/LSUk5QaKLDhjBwQKffKKgf38YOBCWLFEQGOjatemrqB/BPI+Pl2vBBCguhVdSdEh/\nidRrH2jJyvNcxRi1IBB3geXtrZAIFOQHlUzDwGzUunzJXBzZ0nRCr17hfPPNjSiVCqdBOgDNmhn4\n4IPuvPnmUaKjvXjssdYucy+7dg1gzZqeKBSO1w4vF70eLJbaVa3p0EFg5UoFgkC9HU99odNC25Yi\nx9PtwhQZakPvwVxKQYCngk3oFXDKrOCpEBMttZ5PgZGRARBrY2m6KT7hakMWTSecPVvOwYMFGAz2\nWrI+Po7XowoLjXzwwQEKCkrJyLDy44962rRxvJB+HlfCeiGZmSIHDlhQq6FTJzWBge63XJy5oBsy\nOi28ONlIi2YSeYU2/nWPlYhQz/7oW2gl5kcYkSTcmoojI3O5WC21Ec16qJZxFSCLpgPy8ir5179+\nYts2e9mn11/vzkMPtXU4PienklWrjle9/+ijw9xxR7xTob0UiotFZs8uYdUqex7ijBnePPWUzyXl\narqb7GyJffvs/+7cGadBQwA5OQK//KJEFKFzZ5FIN3flaBkjMedJI+np6TRv3tyt274cZMGUaWjY\nxNo8+mXRvBjymqYDcnKMVYIJ8Pnnx5221vLz09CqVbVl2bdvJHq9++YkBQVSlWDaj6eS4mLn7r6z\nGQJrvlNx4HAcWdnufXJXVEjMny9x11027rrLxssv2ygrcyyCRiO8+aaWO+80cPfdBp57TkeJ8xal\nl0yOWWBtgYpUTQzpRlmpZGQcYlW6fslcFNnSdEBAgJbWrX05dsz+ZB88OBovJ5nj4eEGvvhiMNu3\nn8PXV03v3pFurVfr6ytw7bUaUlPt7coGDNDi4+N4+8XFMGW2F1t3qLBJeu4cZWbeC0a83LTOV1QE\nX39dLZKrV8P06eDtIEq9uFhg1arqdJr//EfNc88Z8fV1LLTnigR2/anEZBW4tqWV2CDHYy02eC9L\nw1uZ9hPsXWjhs/gKgtyTwXNFyC+E3b+pyC8S6N5BpE1LeQ1Upp6QRbHOyKLpgIgIPcuX92PXrhz8\n/DT07Om88ACAICiQJCWSpHR7Un1QkJKUFH9++smEl5dAjx5atFrH+8jNhy6drCS0F1GpQBAl8vMF\noqPc4xL184Mbb4T16+3ux+Rk+2eO8PWVGDrUwief2KPyBg2y4ufn+FhMFnhtg5aPd9rH946z8Pn9\nFQQ6iKQts8G3BdUK+VOpmiKrQJC68QQzrFirYeYb9qIVzSJF/vdhOc0iGs/xyzQirLInpq7IoumE\n+Hg/4uNdB/MAZGVVcPfdW6os00cfbcsrr3R1q7UZG6siNrZ2fzIJgQ2pKn7ebxeSoTeYEQSzi/9V\newwGgcenqmjdX40EDO5qwcfH8QPeywumTTPRv78VqxW6dROdimypETYcvkAET6goqRQINFx8Hz5K\nuC3Iwqvn7DPoG3wtBKgaj+DYbLBue/Xf9sw5JXmFgkdFMy8Ptm5VkpYmMHiwSJcujed6yrhAXq6s\nM7Jouons7IoqwQTYsSOLsjILfn6eyXdSKGDfweo/794DKgSlgLvKfJdWwKzPvNjym13YNh9QsXx6\nBf5OiohEREiMGFG7X6ufF9zdw8z87+3u1lGdLQToHR+7SoBHwk0keYuUmsz0DFAS2IhcswoFDO1n\nYcceFSDQvrUVnc6zIrV2rZJJk+z376JFEhs3GmnTRhbOqwJZNOuMLJpuQqtV0K9fOFu22IOHhg2L\nRunBZYOwEIl7bzPz8Qr7Q2/c7WaCA933wMsrE/jlePXt8+txFfllAv7e7tmHWgWPXGeiR6wVsyjQ\nMVrEz0V1n2A1DA6wkpZ2gujwxlVmzWaDk9kK5jxtpNIoYBLtLmpPsm9ftZektFSgwHWNb5nGgiya\ndUYWTSfs3ZvFm2/uISrKm/HjO9OypeM6dOHheoYNi6BXr2DUagWtWnnj7e25qhreBnjgLhPXXCOi\nVkH3jiKaWlhe51tQuvIqa3QSoweaWfIf+zmOHmRG7WbLKMgA/dvWopHmFeJkOqzdoKGkFG68wUKX\nDu47X4UCrusscu9sexnAG7pbePR2t22+BhYR1LWY0N16q8jy5SpEUaBLF5FmzRqGlanROG9WIFML\nPDwha8zIoumAU6eKGTVqDcXFJgCKi00sWjTI4Rqlv7+O4cNb8scf+Xh5qWjfPqRW+6mosAfqFgwv\nlQAAIABJREFUOCu5dyGVlTaUSgGNxkVOZKHAvfMM/Jlp327PayysfKECXycl6Q7lCnxzxH5LjGxn\nJcFJR5EQA3TrYSWsmYQk2QNXQmtR39lksteJ1XmwWk9dEEXYd0DFnj/s0a0RkRIhQRaaRblvH4Ou\ntbLx/TJKywVax9oIdaNnACC9VODdg1oOFSh4qqOJ/lGi08lRnz42Nm0yUlgo0KqVRHS0Ww/nksnM\nNPPRR3ns2FHBI48UMHSoPzqdnDVXJxrOXLTRIYumAyorLVWCCZCWVojFYnMa2BMaaiA0tPbNp/fu\nLeK777JQqxWMHBlBQoLzthx79piYPr0AHx+Bl18O5JprHBdOMJohI6/6WNOzlBjNAr4OAmnyKmD/\nfivb38hFECD2mQDCeykJdDCp1yjhxpZWDgfYkBBICBDRubibDh1SMGOGDpMJ5s0z0qVL40mpMJng\nP5vVrN1qN9d/O6KkS3uRZlHuOwetBpIS6u+aLD+m4YM/7J6BMRtUbLuljGsCHe9PpYJOnSQaSrvr\nzZtLef31bAB27y5nwwYt3bq5t9l7k0F2z9YZeZrmgOhoXyZP7grYS93NnHktOleqcAlkZFRy4EAR\n69efZfPmcxw4UERFhePp37lzVkaPzmHfPjNbt5qYPDmf0lLH41WSxOMjTICEIEhMHGpCLTh++BUX\niLz6dB67d5nZlWpm4Yx8ioucP8C9NdA9zEaPMBFXhY+KimD8eC927FDz889q7r7bQFaW+8Pei8wg\n6h03z60rCiVkXTAJKasAVSNKZwG7pXkeqyRQ0cgenDk5NX2KZWWyuVRnrLV4OaBDhw4EBAT84zV6\n9GgAJkyY8I/vBg0aVGMbZrOZKVOmEBcXR1RUFGPGjOHcuXP1caZuR7Y0HeDjo+HJJ7tyyy3x6HQq\nWrd274O4qMjMc88dpKzMfncqFCcZMCAUvf7iblqzWaKkpFrE8vJsWJysS4gWgZ/XKXl2hAkB2Py1\nijsHWHBkNWiQKLpAJAsLbOhqYWFkV9gfxGFOIlvtxy9QUFAtOkVFgtPjrwu/FSqYsNeLUqsPC1UV\n9A8V3VbCTqeF2Y8ZuXOSAaMJZow3EhvduETzkWvMrD+jodgscF8bE3G+jcfSBxg82I/Fi3PJyrIy\naJAPbds2Mh9/Q8JY9/+6detWRLF6wpKZmcn111/PrbfeCoAgCPTr148lS5Yg/dUwWK2uGVAxffp0\n1q9fz9KlSwkICGDmzJmMHj2a7du3e6xxfG2RRdMJfn46OnWqnx+mVqugsrL6xisrszjtpxkZqeTV\nV/14+uliNBqYM8fXacH2iAiJh+838esvRiQEHpuoJdjJGmVkhJKFb/nz8EOFCAK8+aYfYWHOHRE/\nZSl5cLseCfjwugqui3A88w8JkViwoJJ779VjtcLbb1cS4cYcxHILPPmrF4dL7Lf0PakGdg0spbkD\nd3RdSO4u8uOKUkxmgeZRNrw91KuzriSF2Nh6cynlFoFobxv+jaz7U0KCFxs2tCEjo5i4OH9CQhpR\nTlFD4zK8DIGBNQ2ITz/9FF9fX2655ZaqzzQaDcHBwRf9/yUlJSxbtoyUlBSSk5MBWLx4MYmJiWzd\nupV+/frV/eCuALJoegi1WmLOnARmzz6MXq9k8uRWKJxoVFZWBcuWpTJ9ehySJLFkSSp9+iTj7+DJ\np1RKaFRn+GDJblQqgRv69UIQHFc1UioFRgzX0WF3qH1NM1bptB1aTqXAIzv0ZFXaD/qB7Xq2Dy8j\nwoHFKQj2KkCpqaXYbBAbK6Fy491nA8y2C9yPNnvAkTsRBGjVvOGs8dWFFr6N+/ibNdNgNBYRElK7\nQDsZB7jRNb9s2TJGjx6N9oKu9bt27SI+Ph4/Pz969+7N7Nmzq0R0//79WK3WGuIYFRVFmzZt2L17\ntyyaMo7R6USmTIlFkiQEobZ3ce1cFxkZlTz88O4q9+9jj+1l06YbCA52bF6oVAKtWtXfLaFQQFxc\n/TywfdSwoHMld6XqqbAKpHStoJkbrczz/PmnGbNZIiZGjZeX50MCDh9RUFIch38ehFx8Yl+DbMGM\nERvBkhoD7k8kzsgQKCuDsDAJf8cZWjKexk1LI5s3b+b06dOMGzeu6rOBAwcyYsQImjdvzunTp5kz\nZw4jRoxg27ZtqNVqcnJyUCqV/7BYQ0JCyMnJcc+B1SOyaHoIUYQpU1IRRfuDPSEhgCFDYhyODw/X\n869/XcfJkwKCAJMmRTm0MsFuFalU1Q91jUbh1JK9VEK9JJZcV8FDO/TYJLt71pGVeaXoHiSy44Yy\n8guLaRfhi7v7aO/cWcEdd5ylrMzGyy+Hcv/9/uj1nhPOH39SMvYePYWFCh6dYGTyZBMRYY7Hpykq\nmWY4RbFC5DZTEPcYQ/Bx4yPg998FbrtNS2amgnHjrMyebcaBh07G07gphurTTz+lS5cuJCQkVH02\ncuTIqn+3a9eOjh07kpiYyPfff8+wYcPcs2MP4vmpcgOmuNjI/v3ZHDmSj83mXkFQqYQaXVN8fNQo\nnTzlz50T+eMPJS+/bGPePBtpaUoKChzf+VFRej7//FqaNzcQH+/D++93IzDQ+SJWcbHITz+Vs3Nn\neY2gI0ckBYgsSyhn+TXldAtoGJGMEV4S2vJstwum0WjjuedyKCuzX5dnn83hzBnPZogvWqShsND+\nE16couPYMeeW42pNPsUK+99plTafswr31SIG+OYbBfeOE5k5y4LFAseOuXXzMu7kMqJnz5OXl8e6\ndetqWJkXIzw8nMjISE6ePAlAaGgooihS8LcSU7m5uYSGum6M4Wlk0XRAaamZN9/cy/XXf8l11y1n\n8+Z0t24/JsaHL78cQNu2/vToEcobb/TGYHAc2FBRIfDmm/Y72WqFlBQrJpPD4QD06RPK5s03sHx5\ne5KSgpyOraiw8fnn+QwdepihQw+zYkU+JpPjiYLVCl+vVTPgdm8G3ObNV/9Vuz0atiGhUgmEhVVP\ncry8BI82AAdqBHapVJLLWrWBUvXxKyTQ1NLVX1s6J8H7n3vxylt6zuar8NI37CjIJo0bRHP58uXo\ndDpGjRrldFxeXh6ZmZmEhdndIJ06dUKlUrFly5aqMRkZGRw9epSePXvW6XSuJLJ71gFnz5awcOFe\nACwWG6+8kkqfPtFuzdW85ppAXnutJ1qtirg4X6dj/f0VBAUJ5OTYH4yRkQK+vq7nPEFBWgoKKl2O\nO3PGwty5ZwB7AM3cuWfp18+PVq0unoCZmy8w6zUdkmR/MM6a78XAvlaiwhtvkIkzVCqB558PQRQl\nMjOtzJkTSsuWLpJTLxGLReLwYQulpRKtW6sIDXVuOT74kInCAoH0dCVPTDLSuaNz78BQcwB5Cgun\nlCbGGkNobnNvZPi2nWqKS+z3w/adasoqTMilZxoobggE+vzzzxk1ahR6fXUYeXl5OfPmzWPEiBGE\nhYWRnp7OnDlzCA0NrXLN+vr6MnbsWJ5//nmCg4Px9/dn1qxZJCYmVkXTNmRk0XSAl5caPz9tVVWg\n+PgA1Gr3GealpWZee+0XUlIOAvDee8ncdVcbhzlKkZEKVqzw4sUXTXh7w7PPajEY3DeT1+sVREVp\nOHbMnsAVHa3BYHB8vjqdREykjcIi+5hmUSI6rXsFs8wMB7OVWGxwTYhIkIdTPFq31vL559FYLDaH\n+bSXw6ZNRu66qxCbDYYN07JwoT/BwY730zFR4sMPKzmXWUSLWNdRN5GSlqmV0Zix4VUPQUBxLaoF\nUqmU8HPSYFzGw1ymaO7YsYOTJ0/y4Ycf1vhcqVRy+PBhVqxYQXFxMWFhYfTt25dPPvkEg6G6etO8\nefNQqVQ88MADGI1GkpOTWbx4cYPP0QQQioqK5DvbAampGbz99j4iI7159NFObi1wcOJEEUlJK6re\nt2rlx8aNt+Dv73z2L4oSgoDTdJC/k5aWRny8664fe/ZU8M47mSiVAo89FkFSkvPC2EeOK3jzAy02\nEZ581ERCvPuS5a02+GCfhhmb7cfwSBcTzyUb8a6FcVfb821I2GwSI0fms21b9Trjtm3BdOzo+oQb\nyvmeyxRYvlLN3l9VPDTORL/rRLemFZ2noZxvY8b/U9d9govGFV+BI2l8yJamA/LyKnnnnX3k5VWS\nnl5Mx46hbhVNg0FN8+Y+pKeXAtCxYwh6vetkbWfBQpdLt256Pvssrtbj27aysXi+a9dvXSgywqK9\n1YFLH/yiYWI3E94ax3O8wkL49VclpaUt0esFoqIaz3xQoRDo1k1TJZr+/gI+Pg1/1n0hkRESUyaZ\nAfcGGMnUA42shGJDQhZNB+TklPO//52ser906QFuu61NrYStNoSHG/jqqyF89dUx/Py03HprXK07\nnTQFDGroFmnlTInd0mofKuLt5NKLInz8sYYXX7RbpkOHWnj33QoCAq7E0bqH++83EBys4PRpkTvu\n8KJlS7nijUw9cRUH7dU3smg6wN9fS2ysH6dO2V0U/frF1EgRcQft2gXywgsNP1rME3ip4flkIz2j\nrVRYBIbGWwh2UqygpASWLat2Za5dq+bFFwUCAhqPtRkVpWT8+Fr0V7tClJaK7N1rIidHpEMHDe3a\nNbK6ezKOkeOz6owsmg6IjPRhxYqb2bbtNIGBOnr3jna5SH3iRBGpqVl4e6vp2TOc8HDnbYtOniwj\nNTUfvV5Jjx5BREZ6trnu6VKBnVkqFILEtWEizXw8KzjN/SUeSardlNjbGwYPtpKSYrfWk5Ks+Pk1\nHsFsiGzYUMkDD9hbcYWGKlm/PtLtEcMyHkJ2z9YZWTSd0KZNIG3a1G4dMzu7gnvv3cDvv9sTdidN\n6sjzz/dwGLCTm2vkwQf38OuvRQCMH9+SOXMS3RqheymUmGBaqhfrzthdgrfEmnm3b6VTl2hDQq2G\nJ54w0aOHlZISK9ddJ8jVaC6TzZvLq/6dkyOSnS3SsqUHD0jGfVxGl5OmjlzcwAmHD+czf/4+li49\nzNmzpU7HFhWZqgQT4IcfTlNe7thKKi62sH9/EbGxBiIidPzwQ3ZVnVhHpKUpeOMNDSkpGk6dqn2Q\niKoWIYwlFoGt56rHbTmnpsTcuAJRIiIkbrnFyrXXptGihWxlXi5DhlR7Spo1UxERIc+xrxostXjJ\nXBT5V+CAs2fLuO22/3HuXAUAEycm8vLL1zp00QYH6xgyJIazZ8uoqLByzz1t8XZipgUFafngg65s\n2ZKDwaCib98QfH0dj8/NFbj/fh02mwKLBX7+WcGiRUa8nHh0jx61sHGjEYUikEGDrMTFOf5z+2sl\n7mpt5qM/7OtWd8ebCXBz3qVM46JfPz3ffRdJXp5IQoKG2NhG4naQcY28pllnZNF0QGmpuUowAXbu\nzMRoFB0GAwUFefH001348MPfCQrSMWBAM6droCaTjRdf/J3Tp+0pG3l5JgYODEOpvHgEbUWFxL33\nlrJzZwF6vYLExEDKywWHopmXJ/Lzz+Xs21eARiPg6wthYT54e1/cueCthumdTQxpZkEAOgWLuDnu\nqdHz559WPv+8gnPnRMaPN9Cp09W9vmcwKOjTx7Pr7DL1hLymWWfkx6IDwsL03HdfW/z8tBQVGenV\nK9Jp9OzZs2Xcddf35ObaRTAnp5L3378eleriIlhebq0STIADB4qprBTRai8+XqGw8u67GZw+bb/b\n+/Uzcc89YeCgsktRkZWFC09z4oS9otGffxq5/vpWDkUTIMRLYmAzeQp6MURR4vU3Sli+zL4Y9MMP\nJrZuDSYmRv4JyTRCZNGsMw1+TXPevHkEBATUeLVt27bGmLlz59KuXTsiIiIYNmwYR44cuez9Bgbq\nGDasOT//fJrCwjLatHFeQaOiwlIlmAB//FGA0ehYgMLCtEycWF1I4KmnWuPn59j9JYo2CgtFbrpJ\nz4ABXqSnW5wWVFcoJE6frk4yT083oVA0Pner0QwVLgrTXwlMZhuHf6/+exYU2CgqbwAHJiNTF+Q1\nzTrTKKbJrVu3Zu3atUiS/aF/oQtz4cKFpKSksGjRIlq1asX8+fMZOXIke/furVHr8FI5eDCH++5b\nS1mZ/e4RRRtLl96EVnvxSxYZaWDChERSUg6iUAg89VRnvJ3UfPP2VjNqVBjNmqnQ6ZQkJXk7deeG\nhqp4//0QXn89H71e4I03ggkMdFwMQadTMWFCFG+/fRaAhx+OqlWe6fmWYLUpBl/f/H5KwfQlOsqN\nAvMfMdKtreesYI2XjYnTbXyzzAu9XkFotJGgaDNQ93tMpulhFqHUCr5q8FCgvB3ZoVRnGoVoKpVK\ngh3kD7z//vs8+eSTVRX0U1JSiI+PZ9WqVS77vDnDaBSrBBMgK6sCs1l0KJp5eZVkZhby7LOdUSgU\nbN36J8OHt3BY5efMmRJGjvyakhK7Ndi7dxT//vctDisOFRWJPP54VlUPTZMpl65dm+Hjc/Hti6KS\nQ4eCePZZbxQKgdRUHWPHOo+G3bPHyqRJ5SgUAm+/radLF8/dHqXl8Pg7XvxyzH4Mo+fo+fGtMiKD\nPWMtq1ATH+tPXnkAuekK/u+OYoIM8nRcpvZkGwXeOqFlbbaa26PMjI81EeypehGye7bOeN6cqAXp\n6elVHcAffPBBTp06BcCpU6fIzs6mX79+VWN1Oh29evVi9+7dl7XPFi38eOqpbgB4eal45plu+Pg4\nvsOtVhv/+U8aL7+8kzlzfuTAgRwsFscFzC0WWw1Rzs+vxGp1Nl6itFS8YLyIxeJYQMLC4NZbVbzy\nip65c724914FISEOh5OdbWPcuDIOH7Zx6JDIAw+Uk5fnvgLsl4pFhMLSapEvrRAwe3B2bLHAyy8H\nsGuPmhN/KnnwkQAy0uUgGZna83OhkkWntKRXKnj9uI5fij1os7ihn2ZTpcGLZrdu3Vi0aBFff/01\nb7/9NtnZ2QwZMoSioiJycnIQBIGQv6lBSEgIOTk5l7XfoiITZWVmPvnkJpYsGcyGDaewWBw/taOj\nfXjjjf6AvRj7yy8nO20qHR3tzVtv3YAg2EV53rzr8fV1LMqRkWreeScChQK0WoHXXw8jMNDxj06j\nEbj9doHUVAU//FDOTTcJTt2/VqtEeXUuOxUVEtZa/HDOnpU4e1aqcp27IiND4MwZAVfDA33h9fGV\naNUSCoXEO49XEhXkuTVZmw1Ky6rfWyzU6vrIyJzHZHP+/ooir2nWmQYvmjfccAM333wzCQkJJCcn\ns3LlSkRR5IsvvqjX/dpsEh9+eID77vsfY8eu5ejRAqcPep1Oxd13J7Bnz7389NM99OkT7XT7Go2K\nO+5oy88/jyM19R6uvz7G6Xi1WmDUKF9+/rklu3a1oH9/12tpWq1A27YCPj7ZqFTOXbORkQref1+P\nVgteXrBokZ7wcOe3x5YtEr162ejZ08amTbgUzu3blfTq7UPPa334/geVS+Hs31lk13tl/LyolFHX\nWVB7cGKu1cKcWUYC/G0oFBJvzq0kNqbxBVbJeI5uASJ9Ai2AxJBQC138POg6EWvxcoA7gjPNZjNT\npkwhLi6OqKgoxowZw7lz59x5hvVGo+ynOXz4cNq0acNjjz1G586d2bJlC506dar6fvTo0QQFBbFo\n0SKn20lLS3P4nUKhIjW1lClTthMYqOOjjwYSHGyptUXVGFEqvSgosLcFCQ4uwGJxXGvLag1k5Eh/\nsrLs7wMC4LvvitFo8i86XrQFcsftsZw+Yxdib2+J9evOotVmu/ckLgGlUklpZShWUcBXXwiS8zZn\nCoUCozkYUVSg1xUiSXL0rMylYdMHYFTq0FkrUFS67ldZX31D/cfWop/m5xc/vnnz5rFmzZp/BGcG\nBtpLji5cuJAFCxbUCM7ctWtXjeDMp556ivXr15OSkkJAQAAzZ86kuLiY7du3N/hG1I0iEOhCjEYj\naWlpJCcnExsbS1hYWA3RNBqNpKam8tJLL7nclqsbMiZG5PrrY1GrlYSFeT5KsrJS5M8/jSiVAnFx\nXi6tR6NR5ORJIxUVZXTsGOK0rq0oSnzzTQUPP5yHIMDHH4cwdKiXk9q5ElpttX9Jp4Pg4ADCwi5e\nq7egADQXVBjSaCQCA/2IjPR1eg51obZNirf/rGT0JAOVRpg/LYBxt5jROe8BfgE+l3WM7qSpNWW+\nOs7XGwj13O4vc2nhcoIzS0pKWLZsGSkpKSQnJwOwePFiEhMT2bp1a40YlYZIg3fPzp49m59++on0\n9HT27t3LuHHjqKio4M477wRgwoQJLFy4kG+//ZbDhw8zceJEvL29GTVq1GXvW61WEh3t2yAE02gU\nWbYsh169fqN379/4/vsCp1avxWJjxYocevXax+DBR1m7Nh+bzfH4rCyRyZPzEUX7Wt2TT+aTk+PY\nRxMSIvDhhwri4yEuDj7+WEFYmGMRDwyExYsraNNGpEULkc8/qyAy0nNWe3klzFrgRaVRAASmzddx\nJqthz3BlZNzGZa5pXk5w5q+//orVaq0xJioqijZt2lx2AOeVoMFbmufOnePhhx8mPz+f4OBgunbt\nysaNG4mOtq8ZTpo0CaPRyNSpUykqKiIpKYnVq1dfVo5mQyQry8L06X8C9qCdmTNP0bOnL0FBFw82\nysw0M3XqccDeoHnGjBP06uVHaOjFc0c1GoGAACUlJfYpaFCQAo3GuYh06ybwww8KJAkCA10LTlIX\nG9+vL0MUISjI5fB6RaWE0CAb5ysqeetBc5WXVpUkiT/+sFFSItGihYKwsAY/Z5apLy5jZeF8cGZ8\nfDy5ubm89tprDBkyhF27djkNzsz6ay0nNze3hjv3wjGXG8B5JWjwovnRRx+5HDNt2jSmTZt2BY7G\nvRQUmDhypBitVkFCgr/T4gNarUBwsJrsbPsUMDpai07n+KGn1SoIDdVw5oz91xEV5Xx8SIiSzz4L\nZsaMQhQKeOWVQKfFEwBKSyWOHrVbiwkJ4OvrWjj9/V0OuSJoNfDy00ZUKsgtEJjzpJHmUe61fM1m\nid9/N1NeLtG6tYrQUM/+3H76SWTUqEpMJrjxRiULF+pk4WyqXIZ79oYbbqjxvlu3bnTs2JEvvviC\nrl27XuaBNXzkX4yHKC01M3/+QW66aSM33PADX3+d7tTdGhGhZcWKdgwY4M8ttwTxxhstMRgci1pY\nmIblyxMYNCiAYcMCeeed1vj6On9od+yoZc2aUFavDqNDB+fFyM1miY8/FhkyxMyQIWaWLLFiNHo2\nSKpMglRR4GREDLm1COdv09LG529UsPbDcnp1cX8k4/ffV9C/fxbDhmUzbVoh+fmeLcPyyScWTH9Z\nGOvWiaSnX71BbTIucGPKiV6vp23btpw8eZLQ0FAkSSI3N7fGmNzcXEJD7Wu4oaGhiKJIQUGBwzEN\nGVk03UhaWiFff53GunV/kpNT4XRsdraRxYuPVb1/883DFBebnfwP6NTJmxUr2vHxx61p21bv8ng6\ndPDhq6/a88orvrRrVzt3tVbr2i0LkJcnsWBB9XR1wQKRvDwP5lFK8JVVyY1GLaMFP16wqCiuxeGo\nVaCrh6osZrPEu++WVqXVrFlj747iSfr2VTBnjoqZM5VMnarC1/0xWDKNhctIOfk754Mzw8PDawRn\nXvh9amoqPXv2BKBTp06oVKoaYzIyMjh69GjVmIZMg3fPNhbOnClh+vSdbNpkr/X6/PPdmTSpIwqF\ng1Zc3ipiYw2cOmWvKNC5cyB6ves/h1J5acEqCoWAyeT+1AiDQSAxUWDHDrsqtG8vYDB4LpCmWIIU\nS7Xlvcyq5Em1FT8PHZJGI9Ctm4bdu+3XPjhYUSv3dX0SECAxaZJdyNu3VzJu3NXd2kzGCZfhnp09\nezZDhgwhOjq6ak3z78GZCxYsoFWrVsTFxfH666/XCM709fVl7NixPP/88wQHB+Pv78+sWbNITEys\niqZtyMii6SaysyurBBPg3/8+zj33tCYk5OIWnkaj4I03urJhQyZ+fmp69Ai+ZEH0JH5+AgsXqvn6\naxGbDW67TUlAgHuPPzfXzN69pVgsNrp08SE62nE+iEGAngobJ0T7JKWNYPN4Usj48T40a6YiI8PK\nbbd507y580ij4mIb+/bZKCqS6NRJScuW7nUErVljqrJ8Dx0SyciwERXlfN1a5irlMkTTHcGZ8+bN\nQ6VS8cADD2A0GklOTmbx4sUNPkcTGmlxg4bIiRNFjB69nuPH7QnB99/fjldf7YXaQRmbo0cLeOKJ\nDWRklGEyidx8czwzZ15LYGCtEwVrTWPMazObbcyZc4p33rFPRIYMCSQlpQ0BAY6F54wNNopKCqxW\nhmsFWjeyxYdPPjEzebLdMm3bVuDrr/VERbk+idr+fT/5pILJk+21AAMDBTZsCCAurvHNmxvj/dzQ\n8O9ai+IGe10XX2iKNL5fTAMlLs6f99/vx48/nsPPT0O3bmEOBRPsBd53786ser95czozZvS4Eofa\nKCgpsbJmTXUwwfr1BRQVWZ2KZjMF3K8QOXH6JHFxcQ7HNURsNolVq6qn/0eOSOTkSERFuW8fw4dr\nCQ5WkJFho3dvdaMUTBk3IbcGqzPyr8ZNZGeX8/jjP5CdXU5FhZVHHulIu3a9USovbimEhxvo1SuK\nnTszABg+vBV+fu63MhsrPj4qRowIYtEiez3KgQMD8Pev3e1qs3myEnbdUCgERo5U8eOP9qdZfLxA\naKh7XVVBQUqGDZPdsTLIXUwuA1k03URRkYk//qiuu7px4ymmTOmBj8/Fgy2Cgrx4//1B7NuXhU6n\nIikpHJWqkfkT6xGtVsGkSc3o3dsfs1mia1cfp1bm1cCoUSqaNxcoKoJOnZS1cs3KyNQJWTTrjCya\nbiI42IvBg2P5/vtTAIwd2x5vb+cP+ZgYP2JiXK8tNFXCwrQMHeqpLr1XHn9/BQMGyEIpcwWQW3/V\nGVk03URQkBcLFtzAoUO5eHmp6dQptFFEgnkCSZLkayNThSSBfDtcYeQ1zToji6YbiYryISrK04kO\nDZcjR0p4442jVFaKTJvWlsTEBlJTT8YjZOYLfLZeTeohFQ+PMDOwq/Wqr//bYJDds3WYyAM3AAAQ\naElEQVRGFk2ZK0JJiYXHH/+FPXsKATh0qJgffkgmNFQOfmqqbNijYu4yLwC2H1Cx8c0yurRufEFc\njRJZNOuMLJoyVwSjUeTMmeomz+fOGTEa5QdkU+Z0TvX6rc0mUFYh+2ivGI77y8u4QI46kLkiBAdr\neeml9pyvKjhvXiLh4U0nyEfmn4zobSHQ1z5xGtTNQnwzeRJ1xZBq8ZK5KLKl2YiQJInMTDNKpUBY\nWOOqG6pQCNx8cxQJCb7YbNCqlQGNRs4ZbMp0iLOxaWEZxWUCUcESIQHyk1qm4SOLZiPBZpPYsKGY\nRx45iV6v4NNPW9G9u7enD+uSUKsVJCTIKTYy1bSIkM0amcaF7J5tJJw9a+a++05QXCySmWnh8cf/\npKhIXs2XkZGRuZLIlmYjQRDgwi5jCoUg57bJyMjUEbm6QV2RLc1GQnS0hs8+iyM8XE1srJZ3343F\nz0+e88jIyNQFay1eMhdDFs1GgiAI3HCDP9u2JbBxYzuSkhrXeqaMjExDwlKL18VZsGAB/fv3JyYm\nhlatWnHnnXfyxx9/1BgzceJEAgICarwGDRpUY4zZbGbKlCnExcURFRXFmDFjOHfunFvPsj6QRbOR\nERamIThYLpsiIyNzOdTd0ty5cycPP/wwP/zwA99++y0qlYpbbrmFoqKiGuP69etHWloax44d49ix\nY6xcubLG99OnT2ft2rUsXbqUdevWUVpayujRo5Gkhh0YJvv3ZGRkZJoctVnTvHhK2KpVq2q8X7x4\nMTExMezevZvBgwdXfa7RaAgODr7oNkpKSli2bBkpKSkkJydXbScxMZGtW7fSr1+/2p2GB5AtTRkZ\nGZkmR93ds3+ntLQUm82Gv3/NWtK7du0iPj6erl27MmnSJPLy8qq+279/P1artYY4RkVF0aZNG3bv\n3l3307oCyJamjIyMTJPDfYE+06dPp2PHjnTv3r3qs4EDBzJixAiaN2/O6dOnmTNnDiNGjGDbtm2o\n1WpycnJQKpUEBgbW2FZISAg5OTluO7b6QBZNGRkZmSaHe1JOZs6cyc8//8z69etrtPsbOXJk1b/b\ntWtHx44dSUxM5Pvvv2fYsGFu2benkN2zMjIyMk2Oy085mTFjBmvWrOHbb78lJibG6djw8HAiIyM5\nefIkAKGhoYiiSEFBQY1xubm5hIaGXvrpXEFk0ZSRkZFpclTW4uWYadOmVQlmXFycy73l5eWRmZlJ\nWFgYAJ06dUKlUrFly5aqMRkZGRw9epSePXvW7ZSuELJ7VkZGRqbJUXf37DPPPMPKlStZvnw5vr6+\nVWuQBoMBg8FAeXk58+bNY8SIEYSFhZGens6cOXMIDQ2tcs36+voyduxYnn/+eYKDg/H392fWrFkk\nJiZWRdM2VGTRlJGRkWly1D0Q6KOPPkIQBG6++eYan0+bNo1p06ahVCo5fPgwK1asoLi4mLCwMPr2\n7csnn3yCwWCoGj9v3jxUKhUPPPAARqOR5ORkFi9eXGNttCEii6aMjIxMk6PulmZhYaHT73U6HV9/\n/bXL7ajVaubPn8/8+fPrfCyeQBZNGRkZmSaHXFu2rsiiKSMjI9PkkLuc1BVZNGVkZGSaHLKlWVdk\n0ZSRkZFpcsiWZl2RRVNGRkamySGLZl2RRVNGRkamySG7Z+uKLJpOsEqQDWiAkIadOiQjIyNzCciW\nZl25qsroffjhh3Ts2JHw8HCuv/56UlNT67wtiwTfSNDHBkNscKBh90WVkZGRuQQuv/ZsU+WqEc3V\nq1czY8YMnnnmGXbs2EH37t25/fbbycjIqNP2TgH/kqAcgTMIPGcDsyycMjIyVwXu66fZ1LhqRHPR\nokXcc889jB07lvj4eF599VXCwsJYunRpnbYnUPPiqP/6zCnGChR/HkE4cwIkWWFlZGQaKrKlWVeu\nCtG0WCzs37+f66+/vsbn/f+/vfuPqbre4zj+PIKmdDmTGYJAYPxGZVBiuaQYQqH5Y+Jyi2I3zVyF\nd5GmgpDubsYgSQ6iWXkt2RqiucTfU1qXnAbOslaNlT8qW3cr5IdH7UxSD+f+4Tz3ng7qScHjOef1\n2Ng4n+/X832/eQ/efr/f8/18Jk686VXARwL/MsBwbIzCxj8HwMDrdc3uCwzasZG//X08gbMn4Hf0\nwE0dV0Sk/93aKie+zCuaZmdnJ1ar1WkdtltZBdzfAJMN8O8BsH0AjL7Baabh9H8YvLYUA2C42M2Q\ndcvhguWmji0i0r90efZm6dOz1zHAAK4uh2qLjOPcQXO/xnOz4uLi3B3CbaV8vZuv5dsfzOZ/uDsE\nj+UVZ5rDhg3Dz8/P6azSE1YBFxERz+EVTXPgwIGkpqby6aefOow3NTXd8auAi4iI5/Cay7Pz58/n\nxRdf5P7772f8+PG89957tLW1MXv2bHeHJiIiXsJrmmZubi5nzpxh1apVtLW1kZSUxNatW4mIiHB3\naCIi4iUMZrNZDxSKiIi4wCvuabqqL6fZu9NVVFQQFBTk8JWYmOjusPpMc3MzeXl5jBo1iqCgIOrr\n6532KS8vJykpiREjRjB16lS+//57N0TaN26Ub0FBgVO9H3/8cTdFe2uqqqqYOHEikZGRxMbG8tRT\nT/Hdd9857edN9XUlZ2+qsSfzmabZ19PseYL4+HhOnDjB8ePHOX78OM3Nze4Oqc9YLBZGjx5NRUUF\nAQEBTturq6t5++23qayspKmpieDgYHJzc7FYPPPZ2RvlC5CZmelQ7w8//PA2R9k3mpubmTdvHo2N\njezatQt/f39mzJiB2fy/R7q8rb6u5AzeU2NP5jOXZ7Ozs0lOTsZkMtnHxo4dy4wZM1i2bJkbI+sf\nFRUV7Ny506sa5bVERERQWVlJXl6efSwxMZEXXniBBQsWANDd3U1cXByvv/46zz77rLtC7RO95VtQ\nUEBXVxebN292Y2T9w2KxEBkZyaZNm8jJyQG8u77Qe87eXGNP4hNnmv0xzZ4n+Pnnn0lKSiIlJYW5\nc+dy6tQpd4d0W5w6dYq2tjYyMzPtY4MHD+bhhx/26nofPnyYuLg40tLSKCwspKOjw90h9Ynz58/T\n09PD0KFDAd+o759zvspba+xJfKJp9sc0e3e6cePGsW7dOj766CNqampoa2sjJyfH6XKPNzp9+jQG\ng4Hg4GCHcW+u92OPPcY777zDzp07KSsr4+jRo0yfPp1Llzx/OrTi4mJSUlJ48MEHAd+o759zBu+u\nsSfxmkdOxFFWVpbD63HjxpGSksKmTZsoKChwU1TSX3Jzc+3fX726kJyczP79+5k6daobI7s1JSUl\nHDlyhH379mEw+MZK8NfK2Vtr7Gl84kxT0+xBQEAAiYmJ/Pjjj+4Opd8NHz4cm81Ge3u7w7gv1Ts0\nNJSwsDCPrvfSpUtpaGhg165dREZG2se9ub7Xyrk33lBjT+QTTVPT7F35oMSJEycICQlxdyj9buTI\nkYSEhNDU1GQf6+7upqWlxWfq3dHRwa+//uqx9S4qKrI3j5iYGIdt3lrf6+XcG0+vsafyKy4u/qe7\ng7gdAgMDKS8vJyQkhCFDhrBy5UoOHz7M2rVrMRqN7g6vzy1btoy77roLm83GyZMnWbx4MT/99BPV\n1dVeka/FYuHYsWO0tbXxwQcfMHr0aIxGI5cuXcJoNGK1WjGZTMTGxmK1WiktLeX06dOYTCYGDRrk\n7vD/suvl6+fnx4oVKwgMDMRqtfLNN99QWFhIT08PlZWVHpfvokWL2LJlC7W1tYSHh2OxWOyPklzN\nxdvqe6OcLRaLV9XYk/nMIycA77//PqtXr7ZPs1deXu7R/zO9nrlz59LS0kJnZyf33HMPaWlplJaW\nEh8f7+7Q+sShQ4eYNm2a032uvLw83nrrLQDeeOMNamtrMZvNjB07ljfffNNjJ3i4Xr6rVq3imWee\n4dtvv+Xs2bOEhITw6KOPUlJSQlhYmJsivnlBQUG93r8sKiqiqKjI/tqb6nujnLu7u72qxp7Mp5qm\niIjIrfCJe5oiIiJ9QU1TRETERWqaIiIiLlLTFBERcZGapoiIiIvUNEVERFykpikiIuIiNU0REREX\nqWmKz5k+fTrR0dF0dXU5bbNYLIwZM4ZHHnmEnp4eN0QnIncyNU3xOdXV1Vy4cIGlS5c6bSsrK+O3\n335jzZo1DBigXw8RcaS/CuJzoqOjWbRoEVu3buXAgQP28a+//pr169czb948UlNTb1s8Fy5cuG3H\nEpFbo6YpPqmwsJDExEQWLFjAH3/8gc1mY+HChYSGhvLaa6/Z9zObzSxZsoQxY8YQEhLCAw88QHV1\nNTab45TNVVVV5OTkEBMTQ2hoKOnp6dTX1zsdNz4+nvz8fD755BMyMzMJDQ1l/fr1ABw9epSZM2cS\nExPDiBEjSE5O5qWXXsJqtfbvD0NEXKYJ28Vnff7550yaNInCwkLCwsJYsmQJ9fX15OTkAFfub2Zn\nZ9PR0cGcOXMIDw/nyJEj1NfX8/zzz7Ny5Ur7e8XGxpKbm0tCQgJWq5Xdu3dz6NAh1q1bR15enn2/\nhIQEAgMD6ezs5LnnniMqKoqoqCgSEhJ46KGHCAsLIz8/H6PRyC+//MLevXtpbGwkICDgtv98RMSZ\nmqb4tMWLF1NbW8uQIUPIyspi48aN9m1lZWW8++67HDx4kKioKIdxk8nEV199xb333gtcWQR58ODB\nDu89ZcoUzpw5Q3Nzs30sISGB9vZ2GhoayMjIsI83NDTYl3NLSEjor3RF5Bbp8qz4tOXLlzNs2DDg\nyvqM/2/Hjh1MmDCBwMBAurq67F8ZGRlYrVY+++wz+75XG+bly5cxm810dXWRnp7OsWPHuHjxosP7\nRkdHOzRMAKPRiM1mY+/evbocK3IH83d3ACLuFBgYSGxsLO3t7QwfPtxh2w8//MDJkyeJiYlx+ncG\ng4H29nb76+3bt2MymWhtbXVoegaDgfPnz9sbM8DIkSOd3m/ixIk88cQTrFixApPJRHp6OpMnT2bW\nrFlOZ7Ai4j5qmiK9uPpBn+zsbObPn9/rPleb6YEDB5gzZw4ZGRmsXr2a0NBQ/P392bNnDxs2bHB6\n3rO3JmgwGKirq+OLL75g//79NDU18fLLL1NTU8PHH3/M0KFD+zhDEbkZapoivTAYDERGRmKxWJwu\npf7Zjh07MBqNbNu2zeHZzsbGxr983LS0NNLS0igtLWXPnj3k5+dTV1d3zcYtIreX7mmKXMPMmTNp\naWlxeJbzqnPnztkvw/r5+WEwGLh8+bJ9e0dHB1u2bHH5WGaz2WksOTkZgLNnz/7V0EWkn+hMU+Qa\nFi5cSGNjI7NmzeLpp58mJSUFi8VCa2sru3fv5ssvvyQ4OJhJkyaxYcMGcnNzefLJJ+ns7KS2tpbw\n8PBep+rrTW1tLXV1dUyZMoX77ruP33//nbq6OgYNGsS0adP6OVMRcZWapghXLsf+2d13382+ffuo\nqqpi+/btbN682f7BoeLiYoKCggDIysqipqaGNWvWUFJSQkREBK+88gp+fn68+uqrTsfp7VgZGRm0\ntraybds22tvbMRqNpKamUlNTYz/jFBH303OaIiIiLtI9TRERERepaYqIiLhITVNERMRFapoiIiIu\nUtMUERFxkZqmiIiIi9Q0RUREXKSmKSIi4iI1TRERERepaYqIiLjov4lknfjcjSB2AAAAAElFTkSu\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# scatter plot of Years versus Hits colored by Salary\n", "hitters.plot(kind='scatter', x='Years', y='Hits', c='Salary', colormap='jet', xlim=(0, 25), ylim=(0, 250))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Index(['AtBat', 'Hits', 'HmRun', 'Runs', 'RBI', 'Walks', 'Years', 'League',\n", " 'Division', 'PutOuts', 'Assists', 'Errors', 'NewLeague'],\n", " dtype='object')" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# define features: exclude career statistics (which start with \"C\") and the response (Salary)\n", "feature_cols = hitters.columns[hitters.columns.str.startswith('C') == False].drop('Salary')\n", "feature_cols" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# define X and y\n", "X = hitters[feature_cols]\n", "y = hitters.Salary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Predicting salary with a decision tree\n", "\n", "Find the best **max_depth** for a decision tree using cross-validation:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# list of values to try for max_depth\n", "max_depth_range = range(1, 21)\n", "\n", "# list to store the average RMSE for each value of max_depth\n", "RMSE_scores = []\n", "\n", "# use 10-fold cross-validation with each value of max_depth\n", "from sklearn.model_selection import cross_val_score\n", "for depth in max_depth_range:\n", " treereg = DecisionTreeRegressor(max_depth=depth, random_state=1)\n", " MSE_scores = cross_val_score(treereg, X, y, cv=10, scoring='mean_squared_error')\n", " RMSE_scores.append(np.mean(np.sqrt(-MSE_scores)))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\np/n80QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot max_depth (x-axis) versus RMSE (y-axis)\n", "plt.plot(max_depth_range, RMSE_scores)\n", "plt.xlabel('max_depth')\n", "plt.ylabel('RMSE (lower is better)')" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(340.03416870475201, 2)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show the best RMSE and the corresponding max_depth\n", "sorted(zip(RMSE_scores, max_depth_range))[0]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DecisionTreeRegressor(criterion='mse', max_depth=2, max_features=None,\n", " max_leaf_nodes=None, min_impurity_split=1e-07,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, presort=False, random_state=1,\n", " splitter='best')" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# max_depth=2 was best, so fit a tree using that parameter\n", "treereg = DecisionTreeRegressor(max_depth=2, random_state=1)\n", "treereg.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featureimportance
0AtBat0.000000
2HmRun0.000000
3Runs0.000000
4RBI0.000000
5Walks0.000000
7League0.000000
8Division0.000000
9PutOuts0.000000
10Assists0.000000
11Errors0.000000
12NewLeague0.000000
6Years0.488391
1Hits0.511609
\n", "
" ], "text/plain": [ " feature importance\n", "0 AtBat 0.000000\n", "2 HmRun 0.000000\n", "3 Runs 0.000000\n", "4 RBI 0.000000\n", "5 Walks 0.000000\n", "7 League 0.000000\n", "8 Division 0.000000\n", "9 PutOuts 0.000000\n", "10 Assists 0.000000\n", "11 Errors 0.000000\n", "12 NewLeague 0.000000\n", "6 Years 0.488391\n", "1 Hits 0.511609" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute feature importances\n", "pd.DataFrame({'feature':feature_cols, 'importance':treereg.feature_importances_}).sort_values('importance')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Predicting salary with a Random Forest" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n", " max_features='auto', max_leaf_nodes=None,\n", " min_impurity_split=1e-07, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " n_estimators=10, n_jobs=1, oob_score=False, random_state=None,\n", " verbose=0, warm_start=False)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "rfreg = RandomForestRegressor()\n", "rfreg" ] }, { "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": 41, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# list of values to try for n_estimators\n", "estimator_range = range(10, 310, 10)\n", "\n", "# list to store the average RMSE for each value of n_estimators\n", "RMSE_scores = []\n", "\n", "# use 5-fold cross-validation with each value of n_estimators (WARNING: SLOW!)\n", "for estimator in estimator_range:\n", " rfreg = RandomForestRegressor(n_estimators=estimator, random_state=1, n_jobs=-1)\n", " MSE_scores = cross_val_score(rfreg, X, y, cv=5, scoring='mean_squared_error')\n", " RMSE_scores.append(np.mean(np.sqrt(-MSE_scores)))" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAckAAAEtCAYAAABj6pvlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtclFX+wPHPMzPcLwJyUUeRBBFRkvKConmrxbVcu5i5\n6lqtWdr6a7fa1HJxvbS72XazWjXLarclLRG1zM3N0lDRzEwrI5AVNUUDFIf7AHP5/YENDggOODAw\n832/Xr5g5nnmme8B5Mt5zjnfo+h0OjNCCCGEaEDl6ACEEEKI9kqSpBBCCNEISZJCCCFEIyRJCiGE\nEI2QJCmEEEI0QpKkEEII0QhJkkIIIUQjHJok165dy/DhwwkPDyc8PJykpCQ++eQTy/G//vWvDBky\nBK1WS0REBLfffjtffvml1TWqq6uZN28ekZGRaLVapk6dytmzZ9u6KUIIIZyQ4shiAh9//DHu7u5E\nRkZiMplYt24dL7/8Munp6cTGxpKamkpYWBg9e/ZEr9ezcuVKtmzZwtdff01wcDAAjz/+ONu3b2f1\n6tUEBgaycOFCiouL2b17N4qiOKppQgghnIBDk+SVXHfddSxZsoT77ruvwbHS0lLCw8PZtGkTY8aM\noaSkhKioKFavXs2kSZMAyMvLIy4ujrS0NMaMGdPW4QshhHAi7WZM0mQykZaWRkVFBUOGDGlwvKam\nhn/+85/4+/sTFxcHwJEjRzAYDFbJUKvV0qdPHw4cONBmsQshhHBOGkcHkJmZSVJSEnq9Hl9fX1JS\nUujbt6/l+H//+18eeOABKioq6Nq1K1u2bLHcai0oKECtVhMUFGR1zZCQEAoKCtq0HUIIIZyPw3uS\n0dHR7N27l88++4wHHniAOXPmkJWVZTk+cuRI9u7dy44dO7j55pu57777JAEKIYRoEw5PkhqNhoiI\nCAYMGMCiRYuIi4tj1apVluNeXl5EREQwcOBAXnnlFdzc3HjnnXcACA0NxWg0UlRUZHXNwsJCQkND\n27QdQgghnI/Dk2R9JpOJqqoqm47Hx8ej0WjYtWuX5XheXh7Z2dkMHTq01WPtaHJychwdgsNI212P\nq7YbXLvt9ubQMcmlS5eSlJSEVqulrKyM1NRUMjIySE1NpbS0lJdffpnx48cTFhbG+fPneeONNzh3\n7hx33nknAP7+/syYMYPFixcTHBxMQEAAycnJxMXFMWrUKEc2TQghhBNwaJLMz89n9uzZFBQU4O/v\nT79+/UhLS2P06NFUVlaSlZXFunXrKCoqIigoiBtuuIGPP/6Y2NhYyzWWL1+ORqNh5syZ6PV6Ro0a\nxZo1a2SNpBBCiGvW7tZJitaTk5ND7969HR2GQ0jbXa/trtpucO2221u7G5MUQggh2gtJkkIIIUQj\nJEkKIYQQjZAkKYQQQjRCkqQQQgjRCEmSQgghRCMkSQohhBCNkCQphBBCNEKSpBBCCNEISZJCCCFE\nIyRJCiGEEI2QJCmEEEI0QpKkEEII0QhJkkIIIUQjJEkKIYQQjZAkKYQQQjRCkqQQQgjRCEmSQggh\nRCMkSQohhBCNkCQphBBCNEKSpBBCCNEISZJCCCFEIzSODqC9M5jMXNCbKNSbCPVSEeqldnRIQggh\n2ojNSfLIkSN88cUXZGdnc+HCBRRFoXPnzkRHR5OQkMANN9zQ7Ddfu3Ytb7/9NqdPnwYgJiaGJ554\ngqSkJAwGA08//TSffvopJ0+exM/Pj5tuuonFixfTvXt3yzVuu+029u3bZ3msKAp33XUXa9eubXY8\n9a36vpTU45WYLz3+fX9f7urlfc3XFUII0TE0mSQLCwt54403WL9+PXl5eZjNZtzd3QkICMBsNlNc\nXEx1dTWKotCtWzemTp3Kgw8+SGhoqE1vrtVqWbZsGZGRkZhMJtatW8f06dNJT0+ne/fufPfdd8yf\nP5/+/ftTUlLCwoULmTx5MhkZGahUtXeKFUXhN7/5DYsXL8Zsrk1nnp6e1/hlqeWrUVkSJECh3mSX\n6wohhOgYGk2SS5Ys4Y033sDPz4+JEycyZswY4uPj6dq1q9V5586d48iRI+zcuZN///vfrFq1ioce\neojFixdf9c3Hjx9v9Tg5OZk333yTgwcPEhsby6ZNm6yOr1ixgqFDh5KdnU3fvn0tz3t5eREcHGxT\ng5sjxMt6yLaw0mj39xBCCNF+NZokd+/ezWuvvcaECRNQFKXRC3Tt2pWuXbsyfvx4/v73v7N161ZW\nrFjR7EBMJhObN2+moqKCIUOGXPGckpISFEUhICDA6vlNmzaRlpZGaGgot9xyCwsWLMDX17fZMdQX\n4mk9/ig9SSGEcC2NJsmdO3c2+2KKojBx4kQmTpxo82syMzNJSkpCr9fj6+tLSkqKVS/xZzU1NSQn\nJzN+/Hir3uw999xDjx496NKlC1lZWSxZsoTMzEzS0tKaHX990pMUQgjXZtPEncrKSl555RUGDx7M\n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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot n_estimators (x-axis) versus RMSE (y-axis)\n", "plt.plot(estimator_range, RMSE_scores)\n", "plt.xlabel('n_estimators')\n", "plt.ylabel('RMSE (lower is better)')" ] }, { "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": 43, "metadata": { "collapsed": false }, "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 RMSE for each value of max_features\n", "RMSE_scores = []\n", "\n", "# use 10-fold cross-validation with each value of max_features (WARNING: SLOW!)\n", "for feature in feature_range:\n", " rfreg = RandomForestRegressor(n_estimators=150, max_features=feature, random_state=1, n_jobs=-1)\n", " MSE_scores = cross_val_score(rfreg, X, y, cv=10, scoring='mean_squared_error')\n", " RMSE_scores.append(np.mean(np.sqrt(-MSE_scores)))" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nKI/E559/jpubG6+++ioODg5MmTKFjz76SNNh9dikSZMoKCigrKwMgB9++IGCgoI+/4Xsty5evEhl\nZaXKMpADBw7Ew8Pjibp+ANy8eROJRNKnryFtbW2EhoYSERHxwIsP9JqVah6nmpoa2traOk3UNzc3\n56uvvtJQVI/e3Uvf9VU7d+7k4sWLbN++XdOhPDId5xMWFsaqVauUTVUSiYTXXntN0+E9tJUrV3Lr\n1i0mTpyItrY2bW1thIeHs2jRIk2H9shUVVUhkUg6NW+bm5tz7do1DUX16HWM1vf29sba2lrT4Ty0\n+Ph4zMzMWLhw4QPv2y8SYn/Q1dJ3fdF///tf3nvvPf7xj3+gpfXkNGDI5XLc3NyUzfPOzs6Ul5ez\nbdu2Pp0QP/vsM3bv3k1mZiZOTk6UlpYSGRnJ8OHDCQ4O1nR4gpo6alUNDQ3s2bNH0+E8tIKCArKz\nszl58uRD7f/kXHHuw9TUFG1t7U6LfT8py7vdb+m7vub06dPU1tYyceJEzMzMMDMzo7CwkG3btmFu\nbk5LS4umQ3wolpaWODo6qpQ5Ojr2+hF93YmJieGvf/0rfn5+yGQyXn75ZZYtW6bSV9/XWVhYoFAo\nqK6uVil/Uq4fbW1tvPrqq3z//fccOnSoTzeXFhYWUllZiaOjo/L6cfnyZWJiYtQanNcvaoi6urq4\nurpy/PhxZs+erSzPz8/Hz89Pg5H1XGRkJLm5uRw+fPi+S9/1FT4+PowfP16lLCwsDHt7e8LDw9HV\nvf+dzHsrd3d3ZT9bh7KyMoYNG6ahiB6N27dvd6rJa2lp9epRig9qxIgRWFpakp+fj6urK9A+qKa4\nuJj169drOLqeaW1tZdGiRVy4cIEjR45gZmam6ZB6JDQ0tNM1fc6cOcydO1etwU/9IiECLFu2jNdf\nf51x48bh7u7O9u3bqaysfKh25t5CnaXv+hpjY2OMjY1VyvT19TExMcHJyUlDUfVcWFgY06dP5+9/\n/ztz5syhpKSEjIwM/va3v2k6tB6ZMWMG77//Pra2towaNYqSkhLS0tKYP3++pkN7II2Njfz0008o\nFArkcjlXrlyhtLQUqVSKjY0NS5cuJSkpCXt7e0aOHMnmzZsxNDRU3pS8t7rfeVlbW7NgwQJKSkrI\nzs5GoVAoryHGxsYMHDhQw9F3rbvPytTUVGV7HR0dLCws1Kow9JtpFwCZmZmkpKRQWVmJTCZjw4YN\nfXoBcHWWvnsS+Pr6IpPJ+vS0C4Avv/yS2NhYysvLsbGxYfHixYSGhmo6rB5pbGwkLi6Ow4cPc/36\ndSwtLQkICGDNmjUMGDBA0+Gp7eTJk/j6+nb6fwoKCiI1NRWAhIQEduzYQV1dHW5ubmzevJlRo0Zp\nIly13e+8IiMjcXFx6fIakpqaet/pGZqkzmf1Wy4uLoSGhqo17aJfJURBEARBuJd+MahGEARBELoj\nEqIgCIIgIBKiIAiCIAAiIQqCIAgCIBKiIAiCIAAiIQqCIAgCIBKiIAiCIAAiIQqCIAgCIBKiIPRJ\nX331FVOnTsXa2prBgwdz8+ZNTYckCH1ev1nLVBCeFLdu3WLhwoXY2dmRmJiInp7eY1m79tq1a+zY\nsQMfHx+17hQgCH2dSIiC0Md8++231NXVsWbNGmbMmPHYXufatWskJCQwfPhwkRCFfkE0mQpCH9Nx\nB3cjI6PH+joKxeNZ5lgul/PLL788lmMLQk+IhCj0exs2bEAqlfLjjz+yePFibG1tGTlyJO+99x4A\n//vf/3jllVewtbXF0dGRLVu2KPdtaWkhPj4eLy8vRowYgbW1NS+88AJHjhxReY1du3YhlUrZuXOn\nSnlGRgZSqZQDBw6oFauPj4/yvm4+Pj5IpVKWLVumfP7s2bMEBgZia2uLtbU13t7eFBQUqBzj8uXL\nrF69mokTJzJkyBCGDx/OvHnz+M9//qPc5uTJk3h5eSGRSAgLC0MqlSKVSklISABg1qxZ+Pr6dopv\n6dKljB07Vvn40qVLSKVSUlJS+Oijj3Bzc8PS0pIzZ84ot0lPT8fDwwMrKyscHBxYvnw5tbW1Ksct\nKSkhMDAQe3t7rKyscHZ2ZsmSJTQ3N6v1vgmCOkSTqdDvddxG5i9/+QtOTk7ExsbyxRdfkJycjImJ\nCVlZWUyePJnY2Fj27t1LTEwMrq6uTJkyhYaGBj755BPmzJlDcHAwTU1N5OTkEBISwr59+3jhhRcA\nmD9/PocPH2bt2rVMmzYNW1tbysvLiY2NJSAgAH9/f7VijYiIYMyYMWRkZBAeHo6TkxN2dnZAexKb\nO3cuY8eOJTIyEl1dXfbs2cOcOXM4ePAgkydPBtqTZnFxMbNnz8bGxkalr/Drr7/GwsICJycn3n77\nbeLj41m0aBGTJk0C4JlnnlF5z7p6L7t6bvfu3dy+fZuFCxdiaGiIlZUVAKtWrSIrK4v58+ezZMkS\nrly5Qnp6OmfPniU/P58BAwZQU1ODv78/ZmZmrFixAhMTEyoqKjh69Ci3b99GT09P3Y9aEO5L3P5J\n6Pc2btxIQkICCxYsICUlBWhv1hs7dixXr14lOjqaVatWAVBfX49MJsPX15f09HTkcjltbW3o6uoq\nj9fa2srzzz+PpaWlSs2vurqaSZMmIZPJOHDgADNnzuTy5csUFxdjYmKidry5ubksWrSIvLw8ZZID\nmDBhAjY2Nuzfv18llilTpjBo0CCOHTsGQHNzc6ck8vPPPzNx4kQiIiIIDw8H4Pz580ybNo20tLRO\n98bz8fFBIpGQl5enUh4WFkZhYSElJSVAew3RxcUFQ0NDzp49i7m5uXLbU6dOMWPGDNLT03n55Zc7\nlaekpLBgwQI+//xzgoODyc/Px8XFRe33SRAelGgyFQTaazYhISHKx1paWri6uqJQKAgODlaWDxo0\nCHt7e37++Wfldh3JsKWlhbq6Ourr6/Hw8OD8+fMqr2Fubk5ycjInT57E29ubb775hg8++OCBkuG9\nlJaWUlZWRkBAALW1tcqf+vp6PD09+eabb2hqagJQSYZ37tzhxo0bGBoaYm9v3ynmR2XWrFkqyRDg\nwIEDGBkZ4eXlpRKzvb09FhYWyqZeY2NjFAoFR48epbW19bHEJwggmkwFQcnGxkblsbGxMbq6up0u\n5MbGxly/fl35+JNPPmHr1q1cuHBBZSCKllbn75u+vr788Y9/5NChQwQFBfGHP/zhkcReXl4OcM+7\ngkskEmpraxkyZAjNzc3ExcWxb98+rl27prKNqanpI4nnbiNGjOhU9tNPP9HQ0ICDg0OX8VZXVwPw\n3HPP4efnx6ZNm0hLS8PDw4OZM2cyd+5c9PX1H0u8Qv8kEqIg/D9tbe1OZV0lNfh1BObevXtZsWIF\nM2fOZOXKlZibm6OtrU1WVhY5OTmd9quvr+ff//43EomEH3/8EYVCcc/+uAchl8sBWLduncqglt8y\nMzMD2vshd+3axZIlS5gwYQKDBg1CIpEQFRWlPE537hVzW1tbl+VPPfVUlzGbmpqSmZnZ5YjW39ac\nP/74Y86dO8exY8c4fvw4K1asIDk5mX/+85+PLYkL/Y9IiILQA7m5udjZ2ZGVlaVS/umnn3a5fURE\nBDU1NcTGxvLuu++SlJSk7LPriY6BNQYGBkydOrXbmIOCgoiLi1Mpr6urUzu5mJiYKJuNf+vy5ctq\nRtwe8/Hjx3n22WfVqumNGzeOcePGERUVxb/+9S/mzp3Lzp07efPNN9V+TUG4H9GHKAg90FWt8uLF\ni52mXQDk5eWxb98+3nnnHZYvX05ISAibNm3iu+++63Ecrq6uPP3006SmpnLr1q1Oz9fU1KjEfHdN\nMCcnh6tXr6qUdax+U1dX1+l4dnZ2lJWVqUyPKC0t5dSpU2rH7O/vT1tbG5s2ber0nFwuV75uV6/v\n7OwMtNe4BeFRETVEQegBb29v8vLymDdvHjNnzqSiooLMzEwcHBwoLS1Vbnf9+nXefPNN3N3dlf18\n8fHxHD9+nNdff538/Hx0dNT/d7y7iVEikbBlyxYCAwNxd3fnlVdeYejQoVy9epXCwkIADh06pIx5\nz549GBoaMnr0aEpLS9m/f7+yltnBzs4OExMTMjMzMTAwwNDQEJlMhkwmIzg4mNTUVPz9/QkJCaGq\nqoodO3Ygk8loaGhQ6xw8PDx47bXX+OCDD/j222/x8vJCT0+P8vJyDh06xDvvvENQUBDZ2dls27YN\nHx8f7OzsuHPnDllZWejo6DB79my13zNB6I5IiIJwH/ebbwcQFBTE9evXyczM5MSJE9jZ2bFhwwbK\ny8tVEmJ4eDhNTU1s3bpVWWZoaEhqaip+fn5s3LiR6OjoHsXl4eHBl19+SWJiIpmZmTQ0NGBhYcH4\n8eNZsGCBcruEhAQGDBjAwYMHycrKYty4cezfv5+1a9eqHFdHR4eMjAxiY2OJiIigpaWFyMhIZDIZ\njo6OpKenEx8fT3R0NE5OTmRkZLB3716Kioo6xXqv9zExMRFXV1c+/vhj4uLi0NbWxsbGhoCAAJ5/\n/nkAJk+ezLlz5zh48CBVVVUYGRkxduxYNm/ezPjx49V+zwShO2IeoiAIgiAg+hAFQRAEARBNpoLQ\na9TV1XW76LWFhcXvFI0g9D8iIQpCLxEcHKwcANOVjsn1giA8HiIhCkIvERcX1+UUA0EQfh9iUI0g\nCIIgIAbVCIIgCAIgEqIgCIIgACIhCoIgCAIgEqIgCIIgAPB/HAzSp0IHLZQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot max_features (x-axis) versus RMSE (y-axis)\n", "plt.plot(feature_range, RMSE_scores)\n", "plt.xlabel('max_features')\n", "plt.ylabel('RMSE (lower is better)')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(290.00785113284348, 10)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show the best RMSE and the corresponding max_features\n", "sorted(zip(RMSE_scores, feature_range))[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fitting a Random Forest with the best parameters" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n", " max_features=8, max_leaf_nodes=None, min_impurity_split=1e-07,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, n_estimators=150, n_jobs=1,\n", " oob_score=True, random_state=1, verbose=0, warm_start=False)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# max_features=8 is best and n_estimators=150 is sufficiently large\n", "rfreg = RandomForestRegressor(n_estimators=150, max_features=8, oob_score=True, random_state=1)\n", "rfreg.fit(X, y)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featureimportance
7League0.003603
12NewLeague0.004290
8Division0.005477
10Assists0.023842
11Errors0.028618
2HmRun0.044607
9PutOuts0.060063
3Runs0.071800
0AtBat0.094592
4RBI0.130965
5Walks0.139899
1Hits0.145264
6Years0.246980
\n", "
" ], "text/plain": [ " feature importance\n", "7 League 0.003603\n", "12 NewLeague 0.004290\n", "8 Division 0.005477\n", "10 Assists 0.023842\n", "11 Errors 0.028618\n", "2 HmRun 0.044607\n", "9 PutOuts 0.060063\n", "3 Runs 0.071800\n", "0 AtBat 0.094592\n", "4 RBI 0.130965\n", "5 Walks 0.139899\n", "1 Hits 0.145264\n", "6 Years 0.246980" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute feature importances\n", "pd.DataFrame({'feature':feature_cols, 'importance':rfreg.feature_importances_}).sort_values('importance')" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.52741870027692672" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute the out-of-bag R-squared score\n", "rfreg.oob_score_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparing Random Forests with decision trees\n", "\n", "**Advantages of Random Forests:**\n", "\n", "- Performance is competitive with the best supervised learning methods\n", "- Provides a more reliable estimate of feature importance\n", "- Allows you to estimate out-of-sample error without using train/test split or cross-validation\n", "\n", "**Disadvantages of Random Forests:**\n", "\n", "- Less interpretable\n", "- Slower to train\n", "- Slower to predict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Machine learning flowchart](https://raw.githubusercontent.com/justmarkham/DAT8/master/notebooks/images/driver_ensembling.png)\n", "\n", "*Machine learning flowchart created by the [second place finisher](http://blog.kaggle.com/2015/04/20/axa-winners-interview-learning-telematic-fingerprints-from-gps-data/) of Kaggle's [Driver Telematics competition](https://www.kaggle.com/c/axa-driver-telematics-analysis)*" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }