{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Model Pipelines in Sklearn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Main Idea

\n", "

Version control is a system that tracks changes to files over time.

\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# This code spits out lots of warnings. We turn them off for the purposes of this tutorial. \n", "# This is bad practice in general. Only use if you already know your code is correct. \n", "import warnings\n", "import os\n", "warnings.filterwarnings('ignore')\n", "warnings.simplefilter('ignore')\n", "os.environ['PYTHONWARNINGS']='ignore'" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "UJetBHbbmMaS" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.stats import t" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: scikit-learn in /home/dane2/.local/lib/python3.9/site-packages (1.2.2)\n", "Requirement already satisfied: joblib>=1.1.1 in /home/dane2/.local/lib/python3.9/site-packages (from scikit-learn) (1.2.0)\n", "Requirement already satisfied: numpy>=1.17.3 in /software/spackages/linux-rocky8-x86_64/gcc-9.5.0/anaconda3-2022.05-zyrazrj6uvrtukupqzhaslr63w7hj6in/lib/python3.9/site-packages (from scikit-learn) (1.21.5)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /software/spackages/linux-rocky8-x86_64/gcc-9.5.0/anaconda3-2022.05-zyrazrj6uvrtukupqzhaslr63w7hj6in/lib/python3.9/site-packages (from scikit-learn) (2.2.0)\n", "Requirement already satisfied: scipy>=1.3.2 in /software/spackages/linux-rocky8-x86_64/gcc-9.5.0/anaconda3-2022.05-zyrazrj6uvrtukupqzhaslr63w7hj6in/lib/python3.9/site-packages (from scikit-learn) (1.7.3)\n" ] } ], "source": [ "!pip install -U scikit-learn" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import sklearn\n", "assert sklearn.__version__ > '1.2'" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from sklearn import set_config\n", "set_config(transform_output = \"pandas\")" ] }, { "cell_type": "markdown", "metadata": { "id": "tSUqc72ZIH7F" }, "source": [ "## The Data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 408 }, "id": "P0brlJTfnl7g", "outputId": "b207ec53-1a38-4397-a770-357adae6217a" }, "outputs": [ { "data": { "text/plain": [ "(1460, 81)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('/zfs/citi/workshop_data/python_ml/ames_train.csv')\n", "df.shape" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "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", "
variabletypedescription
0SalePricenumericthe property's sale price in dollars. This is ...
1MSSubClasscategoricalThe building class
2MSZoningcategoricalThe general zoning classification
3LotFrontagenumericLinear feet of street connected to property
4LotAreanumericLot size in square feet
............
75MiscValnumeric$Value of miscellaneous feature
76MoSoldnumericMonth Sold
77YrSoldnumericYear Sold
78SaleTypecategoricalType of sale
79SaleConditioncategoricalCondition of sale
\n", "

80 rows × 3 columns

\n", "
" ], "text/plain": [ " variable type \\\n", "0 SalePrice numeric \n", "1 MSSubClass categorical \n", "2 MSZoning categorical \n", "3 LotFrontage numeric \n", "4 LotArea numeric \n", ".. ... ... \n", "75 MiscVal numeric \n", "76 MoSold numeric \n", "77 YrSold numeric \n", "78 SaleType categorical \n", "79 SaleCondition categorical \n", "\n", " description \n", "0 the property's sale price in dollars. This is ... \n", "1 The building class \n", "2 The general zoning classification \n", "3 Linear feet of street connected to property \n", "4 Lot size in square feet \n", ".. ... \n", "75 $Value of miscellaneous feature \n", "76 Month Sold \n", "77 Year Sold \n", "78 Type of sale \n", "79 Condition of sale \n", "\n", "[80 rows x 3 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "features = pd.read_csv('/zfs/citi/workshop_data/python_ml/ames_features.csv')\n", "features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exploratory Analysis" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[]], dtype=object)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# it's always a good idea to look at your response variable\n", "df.hist('SalePrice', bins=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It wouldn't be a bad idea to apply Box-Cox if using a linear model. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we should make sure that no SalePrice values are missing\n", "df.SalePrice.isna().any()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PoolQC 0.995205\n", "MiscFeature 0.963014\n", "Alley 0.937671\n", "Fence 0.807534\n", "FireplaceQu 0.472603\n", "LotFrontage 0.177397\n", "GarageYrBlt 0.055479\n", "GarageCond 0.055479\n", "GarageType 0.055479\n", "GarageFinish 0.055479\n", "GarageQual 0.055479\n", "BsmtFinType2 0.026027\n", "BsmtExposure 0.026027\n", "BsmtQual 0.025342\n", "BsmtCond 0.025342\n", "dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# it's also important to look at the degree of missingness in each of your features\n", "column_missingness = df.isna().sum().sort_values(ascending=False) / len(df)\n", "column_missingness.head(15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's go ahead and drop `PoolQC`, `MiscFeature`, and `Alley` as these are almost always missing. Note that some of these should be treated with more nuance. Take `Fence` for instance. I expect `Fence` takes the value NA when no fence is present. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1460, 78), (77, 3))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "features_to_drop = ['PoolQC', 'MiscFeature', 'Alley']\n", "df = df.drop(features_to_drop, axis=1)\n", "features = features[~features.variable.isin(features_to_drop)]\n", "df.shape, features.shape" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "39 0.153846\n", "533 0.153846\n", "520 0.153846\n", "1011 0.153846\n", "1218 0.153846\n", " ... \n", "860 0.000000\n", "51 0.000000\n", "1170 0.000000\n", "642 0.000000\n", "810 0.000000\n", "Length: 1460, dtype: float64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's see if any rows are missing a large portion of their data\n", "row_missingness = df.isna().sum(axis=1).sort_values(ascending=False) / len(df.columns)\n", "row_missingness" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "BsmtQual NaN\n", "BsmtCond NaN\n", "BsmtExposure NaN\n", "BsmtFinType1 NaN\n", "BsmtFinType2 NaN\n", "FireplaceQu NaN\n", "GarageType NaN\n", "GarageYrBlt NaN\n", "GarageFinish NaN\n", "GarageQual NaN\n", "GarageCond NaN\n", "Fence NaN\n", "Name: 39, dtype: object" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's take a closer look at some of these\n", "index=39\n", "df.loc[index, df.loc[index].isna()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nothing too concerning here. Most of these features are very niche." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(42, 34)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get lists of categorical and numeric features\n", "categorical_features = features.variable[features.type=='categorical'].tolist()\n", "numeric_features = features.variable[features.type=='numeric'].tolist()[1:]\n", "len(categorical_features), len(numeric_features)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['MSSubClass',\n", " 'MSZoning',\n", " 'Street',\n", " 'LotShape',\n", " 'LandContour',\n", " 'Utilities',\n", " 'LotConfig',\n", " 'LandSlope',\n", " 'Neighborhood',\n", " 'Condition1',\n", " 'Condition2',\n", " 'BldgType',\n", " 'HouseStyle',\n", " 'RoofStyle',\n", " 'RoofMatl',\n", " 'Exterior1st',\n", " 'Exterior2nd',\n", " 'MasVnrType',\n", " 'ExterQual',\n", " 'ExterCond',\n", " 'Foundation',\n", " 'BsmtQual',\n", " 'BsmtCond',\n", " 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2',\n", " 'Heating',\n", " 'HeatingQC',\n", " 'CentralAir',\n", " 'Electrical',\n", " 'KitchenQual',\n", " 'Functional',\n", " 'Fireplaces',\n", " 'FireplaceQu',\n", " 'GarageType',\n", " 'GarageFinish',\n", " 'GarageQual',\n", " 'GarageCond',\n", " 'PavedDrive',\n", " 'Fence',\n", " 'SaleType',\n", " 'SaleCondition']" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's take a look at our categorical features\n", "categorical_features" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAGoCAYAAABbtxOxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABykUlEQVR4nO3dd5xkVZ3+8c8DKCJBYRlY8qCCCgbUEQNmVMAEugYwoaK4ioq6uoL6W11cXMw5YcQEYkAwiwQTAg5BosgICCMIg4oiuCD4/P44p+jbNVXV1T1dqed5v1796q4b6p7qrr71ved+z/fINhERERERUawx6gZERERERIyTBMgREREREQ0JkCMiIiIiGhIgR0REREQ0JECOiIiIiGhIgBwRERER0ZAAOcaOpI9L+n99bvs5Sf/TY70l3W2e2vUCST+bj+fq41jz1u6IiABJl0l67KjbEZMhAXIMRD0RXS1p3cayF0s6eaZ9bf+77bcNtIERETFNpwBymB0DXdr0RkmXSvqbpOWSvtJYd7KkF4+qbbGwJUCOQVoLOHDUjZgPktYadRsiIlYnkvYFngc81vZ6wBLghNG2KlYXCZBjkN4FvE7SndtXSLqHpOMl/UnSRZKe2Vg3LW1C0n9KukrSlbUXuj39YENJ35F0vaTTJN217XBPkHSJpGslvUvSGvV515D0Zkm/k3SNpM9LulNdt7geZz9JlwMnNtrzbkl/rr0aezSWby7puPqalkl6SWPd2pLeX1/DlfXntRvrX994jS+aw+86ImKgJN2z9tpeJ+l8SU9prJvWm9vseVbxvnqe/YukcyTdq65bu55TL693HT8uaZ36NA8EfmD7twC2/2D78LrfocDDgQ/X3uUPS/qIpPe0tflbkl7d4bWsIekgSb+V9EdJR0vaaF5/YTHREiDHIC0FTgZe11xY0y6OB74MbALsA3xU0o7tTyBpd+C1wGOBuwGP7HCcfYD/BjYElgGHtq1/KqXn4f7AnkArAH1B/Xo0cBdgPeDDbfs+ErgnsFt9/CDgImBj4J3ApyWprjsSWA5sDjwdeLukXeu6NwEPBnYC7gvsDLy58RpfBzwO2K6+1oiIsSHpdsC3gB9SztuvBL4k6e597P544BHA9sCdgWcBf6zr3lGX70Q5x28B/Fdddyrw/NqBsETSmq0ntP0m4KfAK2yvZ/sVwBHAPo1OkI2BXSnn5navAvainOM3B/4MfKSP1xKriQTIMWj/BbxS0qLGsicBl9n+rO1bbJ8JfJ0SVLZ7JvBZ2+fbvpESCLf7hu3Tbd8CfIlyom16h+0/2b4ceD8loAZ4DvBe25fY/htwMLB3WzrFW23fYPvv9fHvbH/S9q2Uk/FmwKaStgIeBrzB9v/ZPhv4FOX2YOtYh9i+xvaK+jpa61qv8TzbNwBv7fAaIyKG4Zu1h/g6SdcBH63LH0zpRDjM9s22TwS+zdT5tJd/AOsD9wBk+0LbV9XOhZcAr6nn6OuBtwN7A9j+IiUQ3w34MXCNpIO6HcT26cBfKEEx9XlOtn11h81fCrzJ9nLbN1HOu09POl20JECOgbJ9HuUk2jypbQM8qO0k/BzgXzs8xebAFY3HV3TY5g+Nn2+knMSbmvv8rj5n67l/17ZuLWDTHse77Vg1YKceb3OgdYJvPt8WPY7VbEd7GyMiRmEv23dufQEvr8s3B66w/c/Gts1zXFc1mP4wpYf2akmHS9oAWATcETij8Vnw/bq8te+XbD+W0vP878AhknajuyOA59afnwt8oct22wDHNI57IXAr08//sRpLgBzD8BZKL0HrRHoF8OPmSbjeIntZh32vArZsPN5qDsdv7rM1cGX9+UrKSbK57hag2dvgPo9xJbCRpPXbnu/3PY7VasdVHdoYETFOrgS2aqUvVM1z3A2UYLdlWoeH7Q/afgCwIyWl4vXAtcDfgR0bnwV3qgPyaNv/H7a/CpwD3Ku1uEM7vwjsKem+lPS4b3Z5PVcAe7R9Dt3B9u+7bB+rmQTIMXC2lwFfoeR8QelR3l7S8yTdrn49UNI9O+x+NPDCOjjkjkzlps3G6yVtWNMgDqxtgZKX9hpJ20paj3Jr7ys1VWNWbF8BnAL8r6Q7SLoPsB8l5aN1rDdLWlTz4v6LciJvvcYXSNqhvsa3zOE1RkQM0mmUIPg/6zn7UcCTgaPq+rOBp0m6o8og6v1aO9bz+4NqHvMNwP8Bt9be6E8C75O0Sd12i1YPcR3o90RJ69dBdXtQAuzT6lNfTRk/chvby4FfUnqOv95Ij2v3ceBQSdvUYy2StOdcfzmx8CRAjmE5BFgXoKYhPJ6SH3YlJW3hHcDa7TvZ/h7wQeAkygC8X9RVN83i2McCZ1BO4N8BPl2Xf4ZyEv0JcCnlpP3KWTxvu32AxZTXdAzwFtvH13X/Qxm0eA5wLnBmXdZ6je+nVMpYRqNiRkTEOLB9M/AUYA9Kz+9Hgefb/nXd5H3AzZSg9QimOgcANqAEwn+mpGX8EXh3XfcGynnvVEl/BX4EtAb+/RV4I3A5cB1lYPTLbLfqMn+Akjf8Z0kfbBzvCODedE+vaO17HPBDSddTBgQ+qJ/fRaweZPd7Bzli9Gov83nA2nPp6Y2IiIVN0iMod+gWt+VMR/QtPcgx9iQ9VdLtJW1I6Wn+VoLjiIhoV9M4DgQ+leA4VkUC5JgELwVWAL+ljDLuNJgvIiJWY/UO43WU8pvvH2ljYuIlxSIiIiIioiE9yBERERERDWMxY8zGG2/sxYsXj7oZEREDdcYZZ1xre9HMW45ezssRsTrodl4eiwB58eLFLF26dNTNiIgYKEkTM0tizssRsTrodl5OikVEREREREMC5IiIiIiIhgTIERERERENCZAjIiIiIhoSIEdERERENIxFFYumxQd9p+u6yw574hBbEhERM+l1zp6LnOcjYhykBzkiIiIioiEBckREREREQwLkiIiIiIiGBMgREREREQ0JkCMiIiIiGhIgR0REREQ0JECOiIiIiGhIgBwRERER0ZAAOSIiIiKiYcYAWdJWkk6SdKGk8yUdWJdvJOl4SRfX7xs29jlY0jJJF0nabZAvICIiIiJiPvXTg3wL8B+27wk8GDhA0g7AQcAJtrcDTqiPqev2BnYEdgc+KmnNQTQ+IiIiImK+zRgg277K9pn15+uBC4EtgD2BI+pmRwB71Z/3BI6yfZPtS4FlwM7z3O6IiIiIiIGYVQ6ypMXA/YDTgE1tXwUliAY2qZttAVzR2G15Xdb+XPtLWipp6YoVK+bQ9IiIiIiI+dd3gCxpPeDrwKtt/7XXph2WeaUF9uG2l9hesmjRon6bERERERExUH0FyJJuRwmOv2T7G3Xx1ZI2q+s3A66py5cDWzV23xK4cn6aGxERERExWP1UsRDwaeBC2+9trDoO2Lf+vC9wbGP53pLWlrQtsB1w+vw1OSIiIiJicNbqY5tdgOcB50o6uy57I3AYcLSk/YDLgWcA2D5f0tHABZQKGAfYvnW+Gx4RERERMQgzBsi2f0bnvGKAXbvscyhw6Cq0KyIiepB0Z+BTwL0o4zxeBFwEfAVYDFwGPNP2n+v2BwP7AbcCr7L9g6E3OiJiQmQmvYiIyfQB4Pu27wHcl1KCM/XpIyLmQQLkiIgJI2kD4BGU8SHYvtn2daQ+fUTEvEiAHBExee4CrAA+K+ksSZ+StC6pTx8RMS8SIEdETJ61gPsDH7N9P+AGajpFF6lPHxExCwmQIyImz3Jgue3T6uOvUQLm1KePiJgHCZAjIiaM7T8AV0i6e120K6W0ZurTR0TMg37qIEdExPh5JfAlSbcHLgFeSOn0SH36iIhVlAA5ImIC2T4bWNJhVerTR0SsoqRYREREREQ0JECOiIiIiGhIgBwRERER0ZAAOSIiIiKiIQFyRERERERDAuSIiIiIiIYEyBERERERDQmQIyIiIiIaEiBHRERERDQkQI6IiIiIaEiAHBERERHRMGOALOkzkq6RdF5j2Vsl/V7S2fXrCY11B0taJukiSbsNquEREREREYPQTw/y54DdOyx/n+2d6td3ASTtAOwN7Fj3+aikNeersRERERERgzZjgGz7J8Cf+ny+PYGjbN9k+1JgGbDzKrQvIiIiImKo1lqFfV8h6fnAUuA/bP8Z2AI4tbHN8rpsJZL2B/YH2HrrrVehGbD4oO90XH7ZYU9cpeeNiIiIiNXPXAfpfQy4K7ATcBXwnrpcHbZ1pyewfbjtJbaXLFq0aI7NiIiIiIiYX3MKkG1fbftW2/8EPslUGsVyYKvGplsCV65aEyMiIiIihmdOAbKkzRoPnwq0KlwcB+wtaW1J2wLbAaevWhMjIiIiIoZnxhxkSUcCjwI2lrQceAvwKEk7UdInLgNeCmD7fElHAxcAtwAH2L51IC2PiIiIiBiAGQNk2/t0WPzpHtsfChy6Ko2KiIiIiBiVzKQXEREREdGwKmXeIiIixla3EqBzldKhEauP9CBHRERERDQkQI6IiIiIaEiAHBERERHRkAA5ImICSVpT0lmSvl0fbyTpeEkX1+8bNrY9WNIySRdJ2m10rY6ImAwJkCMiJtOBwIWNxwcBJ9jeDjihPkbSDsDewI7A7sBHJa055LZGREyUBMgRERNG0pbAE4FPNRbvCRxRfz4C2Kux/CjbN9m+FFgG7DykpkZETKQEyBERk+f9wH8C/2ws29T2VQD1+yZ1+RbAFY3tltdlK5G0v6SlkpauWLFi3hsdETEpEiBHREwQSU8CrrF9Rr+7dFjmThvaPtz2EttLFi1aNOc2RkRMukwUEhExWXYBniLpCcAdgA0kfRG4WtJmtq+StBlwTd1+ObBVY/8tgSuH2uKIiAmTHuSIiAli+2DbW9peTBl8d6Lt5wLHAfvWzfYFjq0/HwfsLWltSdsC2wGnD7nZERETJT3IERELw2HA0ZL2Ay4HngFg+3xJRwMXALcAB9i+dXTNjIgYfwmQIyImlO2TgZPrz38Edu2y3aHAoUNrWETEhEuKRUREREREw2rbg7z4oO90XH7ZYU8ccksiIiIiYpykBzkiIiIioiEBckREREREw4wBsqTPSLpG0nmNZRtJOl7SxfX7ho11B0taJukiSbsNquEREREREYPQTw/y54Dd25YdBJxgezvghPoYSTtQ6nLuWPf5qKQ15621EREREREDNmOAbPsnwJ/aFu8JHFF/PgLYq7H8KNs32b4UWAbsPD9NjYiIiIgYvLnmIG9q+yqA+n2TunwL4IrGdsvrsoiIiIiIiTDfZd7UYZk7bijtD+wPsPXWW89zM+ZfysJFRERErB7m2oN8taTNAOr3a+ry5cBWje22BK7s9AS2D7e9xPaSRYsWzbEZERERERHza64B8nHAvvXnfYFjG8v3lrS2pG2B7YDTV62JERERERHDM2OKhaQjgUcBG0taDrwFOAw4WtJ+wOXAMwBsny/paOAC4BbgANu3DqjtERERERHzbsYA2fY+XVbt2mX7Q4FDV6VRERERERGjkpn0IiIiIiIaEiBHRERERDTMd5m3aEhpuIiIiIjJkx7kiIiIiIiGBMgREREREQ0JkCMiIiIiGpKDPEa65SxD8pYjIiIihiUB8oTLQMCIiIiI+ZUUi4iIiIiIhvQgr4bS6xwRERHRXQLkmFEC6oiIiFidJMUiIiIiIqIhAXJExISRtJWkkyRdKOl8SQfW5RtJOl7SxfX7ho19Dpa0TNJFknYbXesjIsZfAuSIiMlzC/Aftu8JPBg4QNIOwEHACba3A06oj6nr9gZ2BHYHPippzZG0PCJiAiRAjoiYMLavsn1m/fl64EJgC2BP4Ii62RHAXvXnPYGjbN9k+1JgGbDzUBsdETFBEiBHREwwSYuB+wGnAZvavgpKEA1sUjfbAriisdvyuiwiIjpIgBwRMaEkrQd8HXi17b/22rTDMnd4vv0lLZW0dMWKFfPVzIiIiZMybzEQKQ0XMViSbkcJjr9k+xt18dWSNrN9laTNgGvq8uXAVo3dtwSubH9O24cDhwMsWbJkpQA6ImJ1kQA5xkK3gBoSVEe0kyTg08CFtt/bWHUcsC9wWP1+bGP5lyW9F9gc2A44fXgtjoiYLKsUIEu6DLgeuBW4xfYSSRsBXwEWA5cBz7T951VrZkRENOwCPA84V9LZddkbKYHx0ZL2Ay4HngFg+3xJRwMXUCpgHGD71qG3OiJiQsxHD/KjbV/beNwqM3SYpIPq4zfMw3EiIgKw/TM65xUD7Npln0OBQwfWqIiIBWQQg/S6lRmKiIiIiBh7q9qDbOCHkgx8og7wmFZmSNImnXaUtD+wP8DWW2+9is2I1VEGAkZERMQgrGqAvIvtK2sQfLykX/e7Y0ZLx7BlIGBERET0Y5UCZNtX1u/XSDqGMjNTtzJDERERUfW6aJ+tXORHzK855yBLWlfS+q2fgccD5zFVZgimlxmKiIiIiBh7q9KDvClwTCnHyVrAl21/X9Iv6VBmKCIiIiJiEsw5QLZ9CXDfDsv/SJcyQxGTJgMBIyIiVj+DKPMWERERETGxMtV0xDxLr3NERMRkS4AcMWIJqCMiIsZLUiwiIiIiIhoSIEdERERENCRAjoiIiIhoSA5yxARK3nJERMTgpAc5IiIiIqIhPcgRq4FuPc7Qvdc5vdQREbG6Sg9yRERERERDAuSIiIiIiIakWERERMQ0vdKy5iKpWTFp0oMcEREREdGQHuSImBfDGgiYwYMRETFo6UGOiIiIiGhIgBwRERER0ZAUi4hY0OaS+hER4ysDCGMYEiBHRLRJnnNExOotKRYREREREQ0DC5Al7S7pIknLJB00qONERMTMck6OiOjfQFIsJK0JfAR4HLAc+KWk42xfMIjjRUREdzknRwzHuOdHz2f7FnrK2aBykHcGltm+BEDSUcCeQE7GEbHgTMBAwJyTI2KsjdvFhWzPU1MaTyo9Hdjd9ovr4+cBD7L9isY2+wP714d3By7q8nQbA9fO4vCz3X5cjzGXfXKMwe6TYwx2n4VyjF77bGN70Syfa5X1c06uy/s9L8/FXH6Pw5K2zd04ty9tm7txbt98t63jeXlQPcjqsGxaJG77cODwGZ9IWmp7Sd8HnuX243qMcW3XQjnGuLZroRxjXNs1rq99CGY8J0P/5+U5NWD8fie3Sdvmbpzbl7bN3Ti3b1htG9QgveXAVo3HWwJXDuhYERHRW87JERGzMKgA+ZfAdpK2lXR7YG/guAEdKyIiess5OSJiFgaSYmH7FkmvAH4ArAl8xvb5c3y62d7um8vtwXE8xlz2yTEGu0+OMdh9Fsox5rrPwMzzOXmuxup30iZtm7txbl/aNnfj3L6htG0gg/QiIiIiIiZVZtKLiIiIiGhIgBwRERER0ZAAOWKeSFpT0hdH3Y6IiIhYNQmQB0jS2v0sW8VjPKOfZXX5mpLetYrH21DSfbqtW5XnnnS2bwUW1SoBA6Fiq5m3nLbPKv/d+zjG7Qb5/HMhaQ1Jzxx1O2I8Sdpo1G2I+ZVOitmTdGD9vsuo2zJuxnKQXv2DfRa4HvgUcD/gINs/7LDtGsA5tu81i+ffBXgrsA2lkocA275Lj33eCfwP8Hfg+8B9gVfb7vrPKOlM2/efaVlj3Ttsv2GmZat4jBOBXT2LP7ykk4GnUH5XZwMrgB/bfm3bdtfUdacAPwdOsf2bPo+xKfB2YHPbe0jaAXiI7U932HYuf/On9Vpv+xtd9hPwHOAutg+RtDXwr7ZP77L9J4D7U0po3dB4/vfOoq13B15n+yVd1p9h+wH9Pl/dp++/u6RvMX0SCVNmLTqp2/u9/u2PBY6s2/X1/qoXjP8GLKZRVcf2ITPstw2wne0fSVoHWMv29R22+4ntR/TTlrr9h+gwgUajXa/qse/2wMeATW3fq15IPsX2//R7/IVG0ka2/zTqdnQi6WLK+eyzwPdmc05cHa3K/8YwSfoB8GTbN4+6LS2SDrT9AUm72P75qNvTJOls2zv1ihvGhaSHsvJnxecHdbxBzaS3ql5U30y7AYuAF1JOYisFyLb/KelXkra2fXmfz/9p4DXAGcCtfe7zeNv/KemplKL7zwBOAlYKGCT9K7AFsI6k+zE1i9UGwB17HONxQHswvEeHZUjaA3gCsIWkDzZWbQDc0uMYZwHHSvoq0wO4jgFidSfbf5X0YuCztt8i6Zz2jWxvUoOEh9av10laBJwK/Nz2O3sc43OUv/Gb6uPfAF+h/K3ajzOXv/mTe6wz0O31fxT4J/AY4BDKRdvXgQd22f7K+rUGsH6vBtUA6t3A5sA3gQ/V4z0IeE+PXU+V9EDbv+z1/G1m83d/d4dlGwHPlXQv2wd1WH9P4OnA/wM+L+lrwJG2T5uhXccCf6H8L94088sASS+hTIe8EXBXyqQXHwd27bD58ZJeR3kvNV93t6BtaT9t6OKTwOuBT9RjnCPpy5QL69XVaZLOZjyD0O2BxwIvAj4k6SvA5/q9qB+GYQcEM1iV/41hugz4uaQ5d1IMwAuBD1DO8eMWhF4o6TLK3c/m53qr47DjHeNhk/QFyvn+bKbiNgOrXYDcCiifQAnIflV78rrZDDhf0ulM/4d4Spft/2L7e7NsU+sW8hMoH/x/6tGk3YAXUD6438PU67keeGP7xpJeBrwcuGvbG3R9Sk9sJ1dSgoqn1O8t11OC/242Av5ICfhaegWIAGtJ2gx4JlMBbEf1w+U3wOck3ZXy+zoQeDzQK0De2PbRkg6uz3OLpF4XL7P6m9t+Ya929/Ag2/eXdFZ9nj/3SqGw/d8Akta1fUO37apPUnocfwHsDpwJfBl4ju3/67Hfo4GXSvod5bX3cyLr++9u+8ednqB+4JwBrBQg2/4jJTD8hKTNKReQ75e0CXCU7W7vmy1t796j3Z0cAOwMnFaPfXE9TicvauxzW3OBjneLbB8xy7Y03dH26W3nhV4Xq6uDsQ1Ca7B+POUi6tGUzo6XS/oV5Y7lL0bZvlEEBL20/jck3c/2WaNoQ5/67qQYorENQm3vUzv1fkCJJ8bVEmCHYV5kj2uAfIakHwLbAgdLWp/Si9fNf8/y+U+qOZnfoNFrZfvMHvt8S9KvKSkWL689ox2DmHoiOULSv9n+eh/t+TLwPeB/mR58XN+tp8v2r4BfSfqi7b4/hOcYKB5C+ef5ue1fSroLcHH7RrW346HAQyjT2l5C6T1+LiX46+UGSf9CvYUn6cGUnsVuZvs3b7Wx71SO6h+S1my0axE93ouSHkLp9V4P2FrSfYGX2n55h83Xtv25+vNFtafzoJrL3MseM6xfySpcIDSf49be16m3bXelpE8DfwZeC7yY7hdWp0i6t+1zZ9GUm2zf3GqLpLXocuvX9razeN5O6SXtz9frA+TaelHYeq88HbhqNsdfaMY5CK3nm+cCzwOuBl5JSY3aCfgq5fNnlIYeEPTpvbXD5KuUi99hTzjT0yw7KYZi3INQ23+gpI2Os/OAf2WI59RxzUFeg3KSusT2dfVEtoXtc9q2uxsl3+/nbcsfAfze9m+7PP9JHRbb9mM6LG/utyHw1xoorAusX99Y3bZv5lJ/knJrZV5yqSWdS+8P8m4D6QaWJynpn5RA+L3AN23fOIt970+5/XQvyj/CIuDp7X/ztn02ZSrV4XTb1/RxnO9RUzls37cGV2fZvneX7Z8DPIvytzuCkkbwZttf7bL9aXWb42zfry47r9PftV5w7cPUHYYvAc9uPW6/YJP0QEpP+/falj8ZuNJ2805Ca90davv/DHyLkgLwCOC3wNtsX9thn06DlzYEng/czfZzurz2O1BSWfYBdqHk6h8F/LBb0C/pAuBuwKWUi9UZe1RUxgNcV9vzSsrdlws69VJLuiMlSN/a9v6StgPubvvbXZ77kd2OC9171+u+d6HM8PRQyu/7UsrdgN/1es6FrEMQ+mkaQehsL2DmuW2/Ab5AuUu5vG3dG2y/YzQtu60NXwVeZXvsLrJqsPdMyrllA+Ar8/EZMh+anRS2Z+qkiEpzGJs1TDVu2wk4nekdmwO74BjXALmvgVGSvg28sUPgvAR4i+1eeaf9tmVOg7vqvr+qQdhulFu8/49yMu42gO5LwMHuI69WZZASlDfxdyipDM12dfxQlvRjap7kTAFcY5++gup60mz1Iu9M+Sc7k5JC8Avbl8zwmtYC7l5f00W2/9Fj22cC7wJOrts/HHi97a/NcIxf2n6gpLMar/9s2zv12OcelPxWASfYvrDHtqfZflDb8//K9kpX510u1FpWumBTGSz5AtuXtS2/G3B4pws8SUcD/wDWpQS551EC5YcBO9l+Uod9LqVcfLUCd1PSM06mBNV/7bDPlym30n9KGaj3bfdOE2ntt02n5b2CynoxuR8lbUeUXplPdeppq7f0zwCeX9+761DeizvN1LbZkrSt7UvrxfMatq9vLZvvY02KcQ1C612hd7ltoPE4GUVAMFuS7g38J/As2wOr3jMbs+mkGLZxDkJrh81KY7Nc0udGrlvnRa9Oi1U1rikW/Q6MWtyph9H2UkmLuz25pN9Sbv3/FPiJ7Qt6tKUVZG9CCfxOrI8fTQkYeuXuDiyXuhlASLppFr1Uc8mT7GvwUe1N/0b9avXevYiSDrEtsGb7E/e4ANleUq8LkDcBD2z1GtfUhx8BPQNkZpnKUXtTr6EEfa1lt+sRvF+hkmpilVzlVwEdA2rbj56hre3+pT04rs+zrL6mTnaogeFawHLbrZPM9+tt7k7tmkuv3g8ovTQrVZKYwf/Yfl5zgUru5fO6bI/tf1Lek5/s4/nvavtZkvap+/691/+gpKNtP7PbHZpePduUc9T9Pf227teAWVUcWShqEPpt22/rtH6UPbT1LuC431J+66gb0Imke1J6jp9OuXA+CviPkTaqje0r2v7N+x2MP2hzKRAwLHMZmzU0gwyEuxnXALnfgVF36PEc6/RYtwOlUsDDgXfXHsJf2X5q+4auuZu1t3qH1u2umoP1kRlex6BzqediLnmSfQXVku5EyT9u9SLfD1hG6bHsNthwrhcga7SlVPyR/up6v5Zyi/eukn5OTeXosf2ZlHzqP1MueO4MXKVS1uwlHdIa/p0yWnkL4PeUwPEAZkHS44D/tP24tlW93tPrdll+M9w26PHKtnXd0h4eCFxRL3iQ9HxKKbbfAW91h7x4Tw3gmc3FJ8CObcdeky4BZbegtdGGTsHrzbXXuPV+vyu9q2W0SlWt1LPeTT1/7Ajcqe2CbwN6n6MWtAkIQs9WGXg6m4o+QzOKgKBPn6V0GDzedvs5ZRz03UkxAuMchM5lbNbASfqZ7YdJup7p5/9W7/sGgzr2uAbI/Q6M+qWkl9ie1pMkaT+mV3ZodyvltvOt9XmvpvQS9rK4LRfsasoI7Y5qL9V/UQKwS2zfWHv5ug6Wsv1jTa/vekc69LrW52+mabSXk+v1pj6Akid5D0m/p+ZJdmtT1W9QvYxa0g14GyUv+O+9nngVLkC+r1LvstWz+yzguzO8DmyfWW/V9JXKQcmjPcb2D2q7Hk+pOHE0UyXZms9/LTP/PqnP9RhKebJWmbe3U0aoCzi0wy4/knQoJQfajef5b6YuLNptqVIGUI2fqY+36LLPJyjpEq18/sMoub47Ud47vS4o+rr4VKlW8kbKe7eVsiFKQH94l+fuO2hteAvlb7iVSgrTLpQKM92cWLc7yl3GMHRw99q2OzO9nOD1QMda1quRcQ5C51LRZ+BGGRD0w/aD25dJ+ortZ42iPR00OymWU8rDzqqTYoDGMgitWp9lSxrLzPT/j1F4DoDtoVckGdcc5L4GRqkM0jqG8qHaCoiXALcHnuouA+gk3QicSxlM9qN+cmwkfRjYjhKQGdgbWGb7lT32mdWEDmrUd7V9V5UBRR+3vVJ9V80yf7Wx35qeGmS4Rj+3xNV58NFzO93urxc2h9l+/UzP27bftBwxdRm0KGlt2zfVn59GyaUVpbfymD6P1XdtUUlLbS/ptEwdcpfr7+oDwIMp75NfAK9xh/zreofkNXWbPSjB8f+z/YEubVmXMnHOzpTST1BGHi8FXmz7bx322bfTc7W4Q1kzNXKmJX0EWGH7rfXxTPnaa1FSoR5J+dv8C+Xv+NIu2/+v7YN7tXFV1BQZUf4eolzArd8tL7j2eO5NGYB0LeX//eh+esokPcQjLg02biR9tsNi235Rh+VBycufRcrcWJB0ue2tR90OKP/zne5yjYMun9tdP68D1JjARNLXbf/b0I49jgEyzHpg1KMp1Q8AzrfdrTettf2elA/vnSnB9SmUAOuEGfZ7KqUCAPQRkNXg4nPuc0IHlYL6OwOneWpwwbnuUmFhLlQGYH0N+Eyv32mXffsKqiWdONt/+H4vQFr/LJK+0J672udxOtYWdZdZoGqKzAmUPDsoF26Po/Qi/9Irz2J4KqXnu9WzvTfwStvTepqbr6Xx+Le27zpD+1sDEu9UF53fKfjusf+MpY8knUcZwHeLysCN/W3/pLWu/aKlbd9ZXXy23Qlp+QvwO3cpX6iSN/4hyuQkt6fcZbmhU89aTaPZw3VgoUr+5Fd7vYa24zyLkl6yjFL/vGves+Yw22aMjqQtKe+jXSjnnJ8BB7ptMOEI2jWygGCuxixAbs2Q+Bng+827bbEySe0DVVszp/6sW0fCMGn6gPfbfh7Kscf1vaNSUm0rpvfydbwNoc5lqa6f4dZ5KwjfA3g1sIntjjme3XozZ6JSwurulJl9ZpzQQW0VEGpv3Jndtq/7dBrk9hfgXHcoe6aSB703JdVjDcpJ5Ch3qEzQ2OfOlJJai5n+9+gWVL6HEuzO6rZqfS0Prw87XoDU4O1dlPSVlXqp+zjGhcyitqikjSm36Vs91T+j5Ir/hVI6bFnb9qe1B8OSTu1yW/IS4HWNRe9uPu72WmZ7Z6Lu03fpI0lvogwsvRbYmjLwzCrVMo6wvUuP48zq4rNeUNwfOIfy+7038CtKz/O/u3NJxKWU9/BXKXeMWuXnOpV5eyJllP0TgHtQeumfY/vsbq+hw3M8Cngf5X2zdo/tWlO2PhXYi3J34CR3qGCyuhjXIBRA0vGUGvRfqIueS3lvtOf+D9UoA4JeulzMQvm//bbtzYbZnm5qJ0JrcpqdKbNojnRymnEOQiW9pcPijSgTnr3V9lEd1g9N2wXjUKfDHssAWdLbKHmCv2UqB6vrbQiVGWpWGkhFySteaSCVpK9T8imXUU7YP6H02nYtS6VZlGBr7DOrElaaRX3Xxj7foQyMa926eRTlNvL2wCG2v9Bl11Z+6ZGU39fXKCW8lnXY7pT6nOfSyAXvdHu+bj+w26qSHkbJSXomZbDdrI6hAdUWbVyk/Sflb3gU5b37LMqEICuN5O/ye2rp+lpme2ei7jOr0ke193QzSg3jG+qy7SkB9oz5crO4+DyK8r47vz7egXLh8zbgG+6QztFIcTmndfEo6RTbD+1yjL0of5f1gafZXmmSmw77PJBSz/nfKBe4R1F6nleqG93Y53zbO0r6JPB1299XlxJ/q4txDUKhc7rQTClEwzDKgKCXmh7QXv7xttWefVWegdPU5DTrUi68RzI5zbgHoZ3Uz7Qfjfr9pzKjbquDcR2gNb/CwHPyxzVAvgi4t+2b+9z+43QfSPWBDj16D6T0zPZdZkXSiZTcyn6ns27t9zDKoLvPqgw2XK/bFaNmUd+1sc+3KPmnV9fHm1JqFr+Y0nPXnsO7JvBESg/yYsoH15coPbdvt73SwMNBnqQ1xwEpkvZz99nvOm3fmiFtffqoLapZzqimlWsHt22+cp1LSU+bqce7k3pnYntKVYm+pppuvztRl3Wrz9zpjsxt3CO/b7YXn72ClG7BiqSfUHqIPgX8gXIx/ILma5H0Iab//R5Dmdnxsvoaut39eDtTE6scRbm70ldvp6TDKD3Hf6f0XN2Z0rO2UnrN6mJcg9Dajh8Bn2MqHWof4IXuMOZjmEYZEMzQrp0p1W1aA6n3ZeoCsmN1m1HQGE9O025cgtBuxukOxiiMaxWL8ygfLjPOjFYtsf3vrQe2fyjp7bZfK6nTLdGzgQNqDyrAjymD4XqlZMy6BFu9alxCSbP4LHA7ytVsx1vUtv8p6QjgNMqH+0W9guNqcSs4rq4Btrf9J0mdXs/FlN7md9k+pbH8a43fR7svqAwg/DbTg8qOJ0TNYrY+2w+r32c7QvUFKgPifkqZAnumwYbvnuXzt7Z/GmV6y1Ye6T7UIKtpjifdNzO3EfOznmqa2ZU+OoMewT7Qq6j9Yczu4vMiSR9jeo73b+r/bbf/x+dR0oNeQUlj2IryQd20tO1xr6o2TTdRfr8Xt//vqTFAtBPbB0l6B1Ozbd4I7NnncReqayU9l+lB6FhMPEC5Bf9hSvqMKelAXasMDYvtjpWLxsDHmV7d5n/pv7rNMP2C0vGzV9vF7dLamTY26ud0r7kRRkalytKfR92OTjSkgZjj2oO8BDiWEijPOIOQZj+Q6lOUYLWVIvA84FbbL57Hl4HKoLv7UQKGVq/dbbeFO2z/RMpJ6LeU4GRbSp5o17qJkj5KyRNtVfj4N0ppm9dTeq8e3bb9Bu6Rb9zlGAdQyo5dx/SUl46BkmYxW59KKbt/tC5OJN2dki96mXsMgqzB8cMoPd8PprxPfmr7NTO8lm2Bq1o9mio1cjd1h4ocdf1PbD9ipmWNda0e+sVMz9d+b4dtV6lnXtImNOrsukf6j0ou9QcoH3CilD460PM8S5Kk2wEvY2owa8+Lz/r7fznTc7w/Cvwfpf72SpU56n6LAGyvmM/2N57/M26kuEhaDzi2V++iZjmt9epAZRbUD1PSwFpB6Kt6vVeHRdIutn8+07JxMKyAYIY2zLm6zTBJkm2rjLdxt3PIOKhB6Js9wioW6lxffiPgSsoMpL8efqumSHpzq3OtpuB9kxK/Cdjb9qmDOva49iAfAbyDtpzXHp5NGUj1TaY+ZJ9NGd3+zA7bP7Dt1vKJ6jKrWItmMXK+4eb6j9qqH9xtMoeW9wCPds0DVqk9/B2gV2HxAyhB8S6U1/55Sv6jgU45YWdKupo6kQOl97XrTHLVaymDoLrmX7aZzWx936eklVysMgjsF5SUjydJepDtgzrtZPsSSX+nDAS7mfJa79lH275KKVfXcmtd1j5LY8siSXdxrRRRA+xFPZ7/W5Tgrp/37j0krTQTJDOkTEh6CuW9sjnljsE2lN7gHTttD7Ouz/xNSi3rUygXmH2lOlUfo5y8PlofP4+plJ9O7fo75bW8p8PqaR9staflLZSeYwFrSLoF+JDtQ7q8lrlO7fp7SR+z/TKVAcPfYeaZ+z5L6aluvb+WU95bq22ADGzVIR1pF2DkATLlfN5+gdpp2VB1Cwjq+3+gAcEM1pS0lkt1mV0pJUlbximW2FGlWtFGlNPGCmBf2+eNqkEzBaHDb9E07fXlDfzRM1Q7GqKnMTVr77soHTvfqyk/72f65/m8Gqc3ddO1tj8482ZF/fDvVo/4tkFnjX/uWyXd1XUigNobOdMt4Q+z8sj57WbY52hJnwDuXFMUXkTvD9lrPH2Q3CXMkGZSA+GvMfMUy63t71Z7dR5O+cf4qKTrZrj6P5+pPLh+zGa2vg09NWhqX0oprVfWNIAzgI4BssqMbddSBgB9mlJKrZ+LqbWaAZ/tm9V5lsaW1wAnq1ScgNIz3LGmb7Vlt8C2g0uZPrFEv95G6TX/kUu1k0dTbl13VXtcX8LKPdudBgJ+inLSORS4j0qpt1bAfEpbSk+7WV18dghgW+3qFMC+mnIh+EDXPP76v/sxSa+x/b4O+8xpalfb/0/SO+ot2QdQant/fYbdZjWt9Wpi7IJQlYouD6Vc/DarC2xAl4mZhmxkAcEMjgR+LOlaSp79TwFqx8ZMnSzDdDjwWtsnAahUoWnV8R+VsQ1C3aFogEpu9Mjb1sHmrTvqtROu1+yyq2xcA+QzJP0vJbG+62wzmuVAKsrArPtTbv+fVIMeUT6cZ8w9s71MdaIN4LMq1R16bf9ulWmD/0rJQ/4v28e3b6epUm3nS/ouZXChgWcAHSsVaOVBbe3H7ja4bUtKkPFwSp3W8yk97r3cSpkR6ySm/z06DnRidrP1tQ+keld97psl9Qp4P0i5Lb8PJY3lxzX1YabZz1ZIeort4wBUypJ17Rl3qUSwHaVEGMCv3SMPFfiepMe7Q3myDm7udHLqwz9s/1HSGpLWsH2SSu5rL8dSPtB+xAyBYk0J+DbcljJyP0p1lHdR0n56BRGzvficTQD7fOBxzTsZ9U7CcykpI50C5FlN7arpZRNPB/5f/W7NPKhyttNaL1hjHoTeHliP8vnXHPvwV8Ynj7ZlqAFBL7YPlXQCU9VtWufuNejeQTUK67aCYwDbJ/dx93agxjkIneGOxbNsnzbK9gF3UZmNszUb7B1ttzrsbjfIA49rgNwaNdmsHdtpysPZDrwSgO0TWvmBddlMQQ/AjbWn8WyVcmxXUUrH9GT7eJUSW2tB11yyZi/i1ZRZyABWABt2ed716/MdQhnJ/4X6Wp7D9JN+u8spQffb3RjYOINv1q9pTeix/e9sP1b9TSxyjqR3A78H7kYJdFCpvdyVy2xzH1DJDX0hpRdyS2b+8P134EsqE5NAuQ2+0oQjkh5j+0StXGf6rpJ61Vs+FThGpSLJP+g98nyuuY7X1df9U8pruYbuKSwtd7T9hn4PoJKz/ND69WBKrvOPKCkwvcz24nM2AeztOqX52F6hkvvcyWyndm3v0T+LchJ+MjNPQzzbaa0XsrENQm3/mHJB/blW4FLTaK5rBH2jNLKAYCad0js8wvrCXVwi6f8xvbTgqGsNj3MQOq53LFraBzqvAaCpil0DM5aD9DqRtOkMt3b7eY7llBm+OnKHgVSNfbehBK+3p/R43Qn4qDvUDW7s81LgEMrtqH/Sf/5j39R5YoqVljXW3ZfS8/oIyuC+i4Efe3Yl07ai5MK9q8v6vmfrqz0iB1J6JT5j+1d1+UMpt6w71nFWmYzkYZQP4V9QgsWfeoZZ5SRta/vSGmDK9vWtZW3b/bftt2iWNZ1rYLgXZaKWGf+5JN2LUqN3B0oAdgHwHtudcpNb+6xLeU+tQbkguhPwJfcYcCfpfyjpEd/to00XU26Zfp0S8P/SsxjoolKBoq+LT5XSaGvSRwCrHoMau63THKd2lbRxp2B8Jiolpm6b1nouz7GQqDFt8rgEoZL+izJ9+K/re/V7lEoMtwDPtv2jEbfvkW2LzrD9txoQPN32R0bRrklR32f/Tfl8gDLW5r9tj6wig6bXtv4O8OFmEOouNdxH0Laz3Cjr1v54dTPWAbKkO1EGoD0buKftLdrWd0p8hy6DnCRdRbni6JgXaLtrKTeV0aanNq7k+2n/xcBDZvqQlNQz37pHKgM1zeMjTE1MsQ9wQK9/uBoctipAPLccwotnaOPGlJSPfYAtKHWnX9dl27nM1vcArzyhy5Ntf6vL9s+g1Hme1UVTp0BKc5iZrsfz/4AytfGM+dA1vePdlHJJSynvywcABwOvs31sj323odTX/pFK9YQ1e/XUq6TkrEsZ0NiqKNGxZ1vSwZQgbwvgN5QLkF8AZ7lL+bYOPe3TdOtxn00Aq+n1YdtrZt/B9ir3rkl6EmWw3T8oF7XP9PRyiL327VjZxHWa7tXJOAehks4H7mXbkvanfL7sSqktfoTtnUfVtpi7ZgqUpA1HGRC3G+cgVNJ1lIsIUc7727TiHPWYTGocSNrf9uGDev6xS7GoPYpPoZy07k+5PbcX5Q/Yrj3xfSZXucto9z68APi4pD9Seysp00T2+if8Lf0Nbuu3Rmsnz6aU7/oAJWj4eV3Wkco0vWtTBlz9DHiEu8/stz7w1Pp82wPHAHexvWWvBtVA7ZPAJzU1W9/7JHWdra9uu6/tc+ux96EMyuoYINv+qqQN6xV4s9RZx2BEZWa3HYE7tQVzGzT3b9tnTcogwmvr49tT3gevsd2tYsZVlEF932N6j2inuxOHUHJqL2ss+5XKpDTH1q9O7XoJZQT5RsBdKYHsxykf8h15FnWmbf9v41jbU26xvQR4uKQVttt7uGAqNWGTuv0JlBPuo4GT6ZKa4FnMvuU51IetvW5vp+Ry7lFvbz6kxx2TtwMPr4Hdg4B3MpXyNJPm1Od3oEwWcgYrp4atDp5FGUwKZfDtGpTqL9tTqhSNspf25kYv9m6UgcG3AhdKGrvPxKZBBwQTrllX/gRGXI2kzdimzTDCFIZ5MNBB0GN1Mqh5e4+g5KF+GDgRWGb75E7bNwO7+sdsleo63Xan6g9z/mXafn49zuaUHLqPUMps9fodHgycopKD3HVwm7tM2dxnuy5jdpMR7OH+a8deQxmg9GbKxYAlPXWmnbTybH3vYWq2vu9SPiTbPZ0yWclzKL3bz6fMKNjtGC+mpGZsSZn45cGUXs5uwcjdKRdUd2Z6nun1lOCv/fn3Bj4B3FDvBLyVktP2S3qXS7u0ft2+fvVyO3eov2z7MnXPqYUyCHJnyoQy2L5YpSZyTyrl4Vq9nCd7hvq8KgPsdgYeRPn9LqJUVlmJ7RfWfb4N7OCp2bY2o/yvdDvGnSl/68VMr2LRbaa7NYBzZtGr8TlKj3BruvbfAF+hDA7s5BbXup+2T6sXiX2xPS1/uaYivbPf/ReYcQ5Cb6qpTVdTLuCad8JGOpirD6t7VZRe1OXncTC2QahLTn6n5VfT49w9TLWDawvKrKzNdL+5DHLv26hPVO3uRZm55UJK7uKtqjWEe5H0TEpy+cmUf4wPSXq97fbSZ49Xj2l03XsK3edSArx7U6oefJha5qaHT1CC/J41cSW93/ar1aUqhztMkCLpP22/UytPqdvap2OA4TKg6YmU3tRmz2unnvU3UlIlPgZ8WdJXur2GNrOerc+lGsHelMELVwCPd6mR282BlAuiU20/uv4DdU2RqekKx0p6iO2ZBppBuSh4gEvlkvtTgu+93WPyknqc2cy4+A9JW7tt0oSaPtFr0N1NLlU+WtuvRe9Bk61c3wdSLlQADpT0MHeoMy3pGEpA/BfK6/458EHPkE9eLW4Fx9XVdL4gavkuJc+5r5rnLrNN/qrT762LjW0fXdNGsH1LTdXoZhNNr7ow7XGXOwHdLKec01ZH4xyEvpoyRmIR8D5PlQx8AtBt8Oa4mE1N8tXNOpLuRwk+71DP27dx94G5AzcJQWgn43DHQtKrKJ1CFwKflnRgI/3w7ZSB0QMxVgGy7fvWQOfZwI9URuevL+lfbf+hx65votRGvQZApebrj1i5NvDpTE2huzUlGBelV/FySgmrbt5PSZn4OHBSp56/Dm6x/dqZN7tttG2zKkcr4Ol2JdwKVtqn1O1Jpa7rHSkfWp+i9Nye3mlbl7qy76s9iftQgtfNJb2BkoPcbfTyTu6Sb9weuGvlPPKNKIO2TlOpFtGtpvD/2f4/SahMAfxrlVn4OmpdUADPrukbPdtF6QFbVtedKenSXsGxpA/bfsVsLnIoVQ9+JOntTE3v/EBK7edeFSd+LOmNlA+Ex1FmouuYitLwBMrf5Z+1vUdQKjR0qjN9FmUk8+V1232BwyT9DnhrrwtJSnrJDyhpNaZcYHXKM265Q5//I02bUUoink6jTFKX3/ENKgPnWqXXWoF/N59ketWF9sddtV2srkHJue05AdECdiBjGoTaPrXeCduCcnHWWv5d9S4tOQ7+m3JHJFZ2FeVupSiVndqrXI1lqtM4BKE9jENP/EsonVV/k7SY0tG22KWS1UDbN+6D9JZQguWnA8vdZeCZpHNt37vxeA3gV81lbdt/HDjOdUS/pD2Ax9r+jxnasyPlFvXDKJOEXGR7pRJhje0PpdwC+BbTUyz+1LbdnpQJJj5SH59O+WAx8AbbX6WDmspwmO3Xd1rfZZ9zbN+n8X094Bu2u6YztO1/b0qw/Czbd+2yzTJKz9GMs/XV3tKu3D0/+hhKCserKSe+P1NSFp7QZfsn2/5WDfY6HeeItu3bK568tvm4vSdR0l9tb6CVR6C3tu/Yg6BSVeQ/KD36otSlfrdrNY8u+6xBmX3w8XWfHwCfco9/ZpUZ+x7Veu/VOyknd7oAkXQm5f/hT7XH/yhKndOdKINle5bpUsnxfnh9+JMZLixeQ5kx79v0+B9p26fv33HtRfoQpSf3PMr/1dPdo0rIXLW9t26hTJc+dtMWj5qkF9oeWZBXe6ReDvya8p6+rUdKqzj9+3xQ59k1ofyvb2977WG2Z1KojEe5opHetS9lkP9lzHxhPzKSXmr7EyNuQ8cUBkm72x5YD20/JF1ge4fG4/UoF98XAI/xAKc4H+sAuUXlXvIjegQZ7wLuQ+m1gjJA5Bx3qfuqDlULJC21vaRHGzag1DV9JOXDf2PK7f2OAVfdp1PtRbutzJukn1Nu319RH59NGXC1LvBZ210HX0k60bOYx121BJykUyn1D/9EKUm20qyAKgMST6UM6Ps5Jbe7ryoempqtbxdK72XX2fo0+7zS9v0fSSl19n3PblrkXs/5ll7r21MpNOblcGqv+WGU3lxRLvTeaPvIDtue3fpbSfoIsML2W9vXzVO7DqDM2HcdU72vK/2P9Nh/Y8qMVL0uDtZiquzcRbb/0WPb/+pxONt+W4/10QdJl9veeoTHP5cyUPO2HingC7Y/MA7/x5KupuRttw8AF6VU4+bDb9X4W9UL+1EZkwvGVgrDTozfBeOJlJkRz24sW4tSHes5nsPg7X6NVYrFDB9OANMCZJUpLje1/fraa/UwyknkF0zlWnZyraQ3A1+kfCg/F+haQ7b6WePrw7aXz7A9tnulbDTdvhUct47lUtP2j5p5BqCzVEbHfpXpt5u7TWjwbZWBUe9kqnrGp7psuy0lF/WhlHzkB6jU+T2F0it8dKedNMvZ+jzLvNL2gLrbhVPbPsf1Wt9+e749AO5D+4xh7c/fMXe19nK8iqmZ+i6k5Pt+vsO23coato7RdYpr20dKOpmSwiHKnYluaUtraWpa9l0pFTNuW9ftGLWND6b02N6TMkhxTeAGd5nZkdIzfzf3US+4PvdhlIu6t1FSkzYG1pD0/E49HSol8F5LKV30EknbSbq7uw9Q7DSz1bqUHvt/YaoyQ/MYsyo3uTqYoRd002G2pYM1W71kLgNiH0W5bbsN43FL+dvAes2AoKX+D0dnazZ6iZ8FHO4yPfzXa6fTuBp12szIUhj69HzaxuTUz6bnSxpoz/tYBcjM/OHUPpDs/ZTArRUQtmogLqnr2mfFatmHkv/ZuvX7k7qsq7l8yKlUIngZjcoBwCc69GBNmy3P9isaDxfNcJiNKMF9sxd5pRm/JD2QcvvpbfXxepSBUb+m8xS9uOQR/5Cp2e3WZSqt4RWUKbE7mctsfX3nlc42oK4eQhn8dySl+kNf//g12P8QJeA3JdA/sMMF0pqUSUv6PqFIej7ld/laSl6mKKWJ3qWSf90eJD+NElxc0bZ8G+DKGY51Qr0TcVyHZe2OpOQ5X0uZkOSndfu70Tt/F8rg1b0pF2xLKCe3u/XY/nz6K4XYeu43Uu4WnEipyHJqvT14JJ0Ha3yWciH4kPp4eW1bxwDZ9ntaP6tUsDiQ8p4/ipLf2Mlsy02uDjalRy/o8JszzR8k7dQKQGtg8CRKj1THtLxhsr1fj3VdS3gGa871wn7QcsE4d706Iwedwja2KRaND6f9KIHYe9xWuk09ilirLS95FdrRcdBVS6cArrHvpyg1Dlv5rc8DbrX94rbtvkTJB/1k2/KXUvJGewbv/ZjL7SeVknat6YZbJfTOoKRd/MLd84NnPVvfbPJK6/Yn1jb1M1Crla/9OMqF0H2A71BKT53frU11v+OBLzN92tLn2H5c23azvhVV01z2dtuAz3oVf5TtB7ct/zYlLeKctuVLgLe4rcxYXXcHyqDMk4BHMXXC2wD4nrvUc669tZsBP7R9Q122PaVnq+sgq1aqkmqOe112iruPHziGkn99Ej1KIdZtm6kfFzbb3u3WeKM9t62X9Cvb9+3xGjaiXLQ8h/K/+wHPctKBflI/FjJJn6akh61050jSl0cZ6NWL3ls63UGRtMugP3RjMCS9iZLOdy3lc+f+tl0v7I+wvcsI2za2aTOjTGEYd+PWg9zpw+n+PT6cOk7wUK3T4bnnEuy2RsI+DfhXSloGlEDrsh7Hh1JZo/lBfKKkToOvXgN8U9KzmRrh/QDKhB57dXriOeRKzuX20/LanvcBB7nP/F7bv5L0W0rVj9ZsfY+ge+3ZaYFwr+CilVbDyiXdHgn8vsfz30rpYfy+ysxe+1AqLhxi+0M9Xs4iT88P+5ykV3fYbi5X2hu0B8e1rZep5Ly3W9weHNftl9agupOXUnqpN2f6hDTX06O8kO1TOyzrVrWk6UaVCVXOlvROysjyXmlC36xf/WhWGGgvAdjt//pmlcmHWlUs7kojEG+nMp7hacDhwL3dxxTbc0n9WOjGuRd0lD1SMTi2D5V0AlMX9s2KMq8cXcuA8U6bGVkKw7gbqx7ktg+nj8z04STpSODEDj2v+1Hq6D6rbXmrl/KOlNu+/6QEcX+H3rmskn5i+xEzLWtbfybwDNu/rY/vAnytW0+jynTWO9aH59s+scdzd6q4cVs6iu312rY/j1Lm6xZJvwb2d511rltPvKSHUG5NP5SSj3wZU9MOL7XdMdDQyrP1/aRHb3PX4AJYKbiYSy9qY5u1KROY7EOZmOI44DO2uwbWkn5EmWyiNZhtH+CF7akJkjbyLEdJq8cU153WSVpmu2O6Qrd1NbVmOaVyw4c04JHd9bbc1ZT849dQ0iE+6s6zJ872uZtTTa/DVGrGSlNNS/ow5W+2LqUM5A6UVKFdgBe4y+RDKmW+bqJ8YLRPZ213npp7KVOpH4fTlvrRqWc7IiLG27gFyLP6cFKZheYYSvH0Vu/YEsqH81Pbb6HVnOBDgRdR8mRFmYntc5Sgq9fo9guBJ9q+pD7eFvhut1vUdZtdKTmQrdnHFlOCq151YWetz3SUVb79VHspn1yPtaXtblM0L3Kfs/XNNriYa1qNSt3fewHfo6QvnNdn+7am5L4+hPKePIWSg7zKM/hIuhHoFDiKMqX3um3bz+qCsK4b+sju2mO7te2Lemwz5wGHfbbhQEou9GaUfOVLKPWdT3MfAwJneaxZp35ERMR4G6sAea4kPZqpGau69rxKeh9lINVrbV9fl21ASaO40farexxjd0oA1wx2X2r7Bx22bQ2I+0PttXwp8FhK8fKD5qvXbra5knPJK62BaisPeRfKgMJfUKpYtBdib+7X12x9sw0u5tKLWtf9k6lc5b56BgdNs6wBPdsLwrrPbfm2GnDJtvqcT6b8P93e9raSdgIOaU9fmu1rX4X2bEMJlPemvBe/DHylz3SRfo9xW/652nLR2x9HRMRkWBABcr8kXUwptO625WtSprZeqRZw23ZrM1WO69c9UgwG3ms323SUOR7jWkoO6SlMlXab8Va5uszW1ykvcbbBxVx6UediDjneQ9PvBWHddtapNavYtjMoFVVO9tSguNsG7M2w70AHtqlMQ/sZ4D6ex4Ens0n9iIiIybC6Bci/sb39bNZpaopiJD3DjVntJL3d9hs77DPwXru55ErO4Rh3cpcZ8GbYr+/Z+mYbXMylF3UuZpvjPcdjXE/v+rnz8Tcc6shuTU1Ec1avAHm2ueer0J7bAbtTepB3pdRSP9L2N+fj+SMiYmEauyoWA3aByqjyafVlJT2XUg+4k70pk2oAHEypodqyO7UOc5uB12O0vcZ8PM8MDpS6Fmfo1YvaqjBwo0qpuD9RBvl1epJZ9eTZvhp4aFsv6nd69aLOhedWD3e2x1h/Pp5nhmMMe2T3eSrVWNaUtB1lEpROdW/nUtO4b5JaJf2eSCkFeBSl97xTrfWIiIhpVrcA+QDgG5JeROl9NKWW7jrAU7vsoy4/d3rcsioTLYyTTsHEHYEX02VWsWo2s/XNictAx3kd7NiuQ453r5KDY8tzL9k2F6+kVI24ifJ/8AM6v0/Wst2agOaQVhtt/7rHRdlsvJGSb/y6+cr5j4iI1cdqFSC7lPN6kKbKqYkyWcIJvXbr8nOnx63jjHM9xr516UV9EV16UTWH2frGleZQDzfA9o2UAPlNM2w6l5rGs2nHo1f1OSIiYvW1WuUgz8XqPgBnNpUyRlFSbFCGkeO9kEg6rtf6DlUsVuv/q4iIGG+rVQ/yXMznaPdJM4de1LnM1jeWhpTjvZA8BLiCklZxGt3Tj4DV+/8qIiLGX3qQo6vZ9qIOu6RYjI9aKrE1MO4+wHco1SLOH2nDIiIi5iA9yNHVHHpRF8rgxJgl27dSKk98v9YL3wc4uQ7A+9BoWxcRETE76UGOeTWX2fpiYaiB8RMpwfFi4DjgM3VwbERExMRIgBwRq0zSEZS61N8DjrJ93oibFBERMWcJkCNildV89Vbd7FT9iIiIiZYAOSIiIiKiIaWsIiIiIiIaEiBHRERERDQkQI6IiIiIaEiAHBERERHRkAA5IiIiIqIhAXJEREREREMC5IiIiIiIhgTIERERERENCZAjIiIiIhoSIEdERMRASLpM0mNH3Y6I2UqAHEMnaW9Jp0m6QdI19eeXS9Ko29Yi6XuS/la//iHp5sbjj4+6fRERwyTpYZJOkfQXSX+S9HNJD5yn53544/x6gyQ3Hv9N0tbzcZyI2Vhr1A2I1Yuk/wD+EzgA+AHwN2An4HXAp4GbZvFca9m+ZQDNxPYejeN8Dlhu+82DOFZExDiTtAHwbeBlwNHA7YGHM4vzdS+2fwqsV4+1GLgUuPOgzu8R/UgPcgyNpDsBhwAvt/0129e7OMv2c2zfJOmJks6S9FdJV0h6a2P/xbVnYT9JlwMn1uVflfSH2rPxE0k7Nvb5F0nfqs/3S0n/I+lnjfX3kHR87RG5SNIzZ3gN35H0yrZl50jaq/5sSa+SdImkayW9S9IajW1fJOlCSX+W9ANJ26zSLzUiYvC2B7B9pO1bbf/d9g9tnyPprpJOlPTHes77kqQ7d3oSSWtIOkjSb+v2R0vaqNtBJT1Q0tWS1mos+zdJZ9ef3yrpa5K+Iul6SWdKum9j280lfV3SCkmXSnrVfP1CYuFLgBzD9BBgbeDYHtvcADwfuDPwROBlreCz4ZHAPYHd6uPvAdsBmwBnAl9qbPuR+pz/CuxbvwCQtC5wPPDluu8+wEebAXYHRwDPbTzHfYEtgO82tnkqsAS4P7An8KK67V7AG4GnAYuAnwJH9jhWRMQ4+A1wq6QjJO0hacPGOgH/C2xOOS9vBby1y/O8CtiLcg7fHPgz5Rzdke1fAn8EHtdY/FzgC43HewJfBTainMu/Kel2tWPiW8CvKOfoXYFXS9qNiD4kQI5h2hi4tnnbrOa0XSfp75IeYftk2+fa/qftcygB5CPbnuettm+w/XcA25+pvdE3UU7M95V0J0lrAv8GvMX2jbYvoAS4LU8CLrP9Wdu32D4T+Drw9B6v4VhgO0nb1cfPA75i++bGNu+w/SfblwPvpwTeAC8F/tf2hfV38HZgp/QiR8Q4s/1X4GGAgU8CKyQdJ2lT28tsH2/7JtsrgPey8jm75aXAm2wvb5yvn97sIe7gtk6J2tu8GyUQbjmj3pH8Rz32HYAHAw8EFtk+xPbNti+pbd97Tr+EWO0kQI5h+iOwcfNkaPuhtu9c160h6UGSTqq3xP4C/DslsG66ovWDpDUlHVZv2f0VuKyu2pjSS7tWc/u2n7cBHlQD9OskXQc8h9Lb3FE9qR8NPLf2UOzD9N6M9mP8jtJT0jreBxrH+hOl92WLbseLiBgH9cL+Bba3BO5FOa+9X9Imko6S9Pt6Dv4iK5+zW7YBjmmcAy8EbgU27XHoLwJPlrQe8Ezgp7avaqy/7Xxr+5/A8tq2bYDN287vb5zhWBG3SYAcw/QLyqCOPXts82XgOGAr23cCPk4JIpvc+PnZ9fkeC9wJWFyXC1gB3AJs2dh+q8bPVwA/tn3nxtd6tl82w+s4ghJI7wrcaPsXbeubx9gauLJxvJe2HW8d26fMcLyIiLFh+9fA5yiB8v9Szsn3sb0Bpbe3W0WiK4A92s6Bd7D9+x7H+j3ls+OplDt27R0St51va6fFlpRz7hXApW3HWt/2E+bwkmM1lAA5hsb2dcB/U/J8ny5pvTpoYydg3brZ+sCfbP+fpJ0pAXAv61OC7j8Cd6SkLbSOdyvwDeCtku4o6R6U/OaWbwPbS3pezVm7XR0Ucs8ZXscvgH8C72HlkzXA6yVtKGkr4EDgK3X5x4GDWznONQ3kGTO8voiIkaqDmf9D0pb18VaUu2enUs7BfwOuk7QF8PoeT/Vx4NBWWpmkRZJ6dZi0fJ5S/ejewDFt6x4g6Wn1zuSrKZ8HpwKnA3+V9AZJ69S7jffSPJWmi4UvAXIMle13Aq+lnOyuAa4GPgG8ATgFeDlwiKTrgf+ipDP08nlKGsPvgQsoJ8amV1B6lv9ACWaPpJYmsn098HhKTtqVdZt3UAYSzuTzlJP1FzusOxY4Azgb+A6lfB22j6nPf1S9FXkesEeH/SMixsn1wIOA0yTdQDnPngf8B6XT4/7AXyjnu2/0eJ4PUO4Q/rCe40+tzzuTY6jpGbZvaFt3LPAsyoC/5wFPs/2P2kHyZEoZ0UuBa4FPUT4PImYk2zNvFbFASHoH8K+2951x497P83xgf9sPa1tuYDvby1bl+SMiYoqk31JS1H7UWPZW4G62n9t1x4g5Sg9yLGj11uB9VOwM7MfKt+hm+5x3pPR0Hz4fbYyIiO4k/Rslz/nEUbclVh+ZSS8WuvUpaRWbU1I63kPvOsw91Rqa3wB+xPRSQxERMc8knQzsADyvVqmIGIqkWERERERENCTFIiIiIiKiYSxSLDbeeGMvXrx41M2IiBioM84441rbi0bdjn7kvBwRq4Nu5+WxCJAXL17M0qVLR92MiIiBkvS7UbehXzkvR8TqoNt5OSkWERERERENCZAjIiIiIhoSIEdERERENCRAjogYU5I+I+kaSec1lr1L0q8lnSPpGEl3rssXS/q7pLPr18cb+zxA0rmSlkn6oCSN4OVEREyMsRikNxeLD/rO0I512WFPHNqxIiIaPgd8GPh8Y9nxwMG2b6lTpx8MvKGu+63tnTo8z8eA/YFTge8CuwPfW9XGzcd5OOfXiBhH6UGOiBhTtn8C/Klt2Q9t31Ifngps2es5JG0GbGD7Fy4zQ30e2GsAzY2IWDASIEdETK4XMb0neFtJZ0n6saSH12VbAMsb2yyvy1YiaX9JSyUtXbFixWBaHBExARIgR0RMIElvAm4BvlQXXQVsbft+wGuBL0vaAOiUb+xOz2n7cNtLbC9ZtGgi5jOJiBiIic1BjohYXUnaF3gSsGtNm8D2TcBN9eczJP0W2J7SY9xMw9gSuHK4LY6ImCzpQY6ImCCSdqcMynuK7RsbyxdJWrP+fBdgO+AS21cB10t6cK1e8Xzg2BE0PSJiYqQHOSJiTEk6EngUsLGk5cBbKFUr1gaOr9XaTrX978AjgEMk3QLcCvy77dYAv5dRKmKsQ8lZXuUKFhERC1lfAbKk1wAvpuStnQu8ELgj8BVgMXAZ8Ezbf67bHwzsRzlJv8r2D+a74RERC53tfTos/nSXbb8OfL3LuqXAveaxaRERC9qMKRaStgBeBSyxfS9gTWBv4CDgBNvbASfUx0jaoa7fkVJr86Ot234REREREeOu3xzktYB1JK1F6Tm+EtgTOKKuP4Kpupp7AkfZvsn2pcAyYOd5a3FERERExADNGCDb/j3wbuByShmhv9j+IbBpHfxB/b5J3WUL4IrGU3SsuZl6mxERERExjvpJsdiQ0iu8LbA5sK6k5/bapcOylWpupt5mRERERIyjflIsHgtcanuF7X8A3wAeClxdpzBtTWV6Td1+ObBVY//U3IyIiIiIidFPgHw58GBJd6w1NHcFLgSOA/at2+zLVF3N44C9Ja0taVtKLc7T57fZERERERGDMWOZN9unSfoacCZlWtOzgMOB9YCjJe1HCaKfUbc/X9LRwAV1+wNs3zqg9kdEREREzKu+6iDbfgulQH3TTZTe5E7bHwocumpNi4iIiIgYvkw1HRERERHRkAA5IiIiIqIhAXJEREREREMC5IiIiIiIhgTIERERERENCZAjIiIiIhoSIEdERERENCRAjogYU5I+I+kaSec1lm0k6XhJF9fvGzbWHSxpmaSLJO3WWP4ASefWdR+ss6JGREQXCZAjIsbX54Dd25YdBJxgezvghPoYSTsAewM71n0+KmnNus/HgP2B7epX+3NGRERDAuSIiDFl+yfAn9oW7wkcUX8+Atirsfwo2zfZvhRYBuwsaTNgA9u/sG3g8419IiKigwTIERGTZVPbVwHU75vU5VsAVzS2W16XbVF/bl++Ekn7S1oqaemKFSvmveEREZMiAXJExMLQKa/YPZavvNA+3PYS20sWLVo0r42LiJgkCZAjIibL1TVtgvr9mrp8ObBVY7stgSvr8i07LI+IiC4SIEdETJbjgH3rz/sCxzaW7y1pbUnbUgbjnV7TMK6X9OBaveL5jX0iIqKDtUbdgIiI6EzSkcCjgI0lLQfeAhwGHC1pP+By4BkAts+XdDRwAXALcIDtW+tTvYxSEWMd4Hv1KyIiukiAHBExpmzv02XVrl22PxQ4tMPypcC95rFpERELWlIsIiIiIiIaEiBHRERERDQkQI6IiIiIaEiAHBERERHR0FeALOnOkr4m6deSLpT0EEkbSTpe0sX1+4aN7Q+WtEzSRZJ2G1zzIyIiIiLmV789yB8Avm/7HsB9gQuBg4ATbG8HnFAfI2kHYG9gR2B34KOS1pzvhkdEREREDMKMAbKkDYBHAJ8GsH2z7euAPYEj6mZHAHvVn/cEjrJ9k+1LgWXAzvPb7IiIiIiIweinB/kuwArgs5LOkvQpSesCm9YZmqjfN6nbbwFc0dh/eV02jaT9JS2VtHTFihWr9CIiIiIiIuZLPwHyWsD9gY/Zvh9wAzWdogt1WOaVFtiH215ie8miRYv6amxERERExKD1EyAvB5bbPq0+/holYL5a0mYA9fs1je23auy/JXDl/DQ3IiIiImKwZgyQbf8BuELS3euiXYELgOOAfeuyfYFj68/HAXtLWlvStsB2wOnz2uqIiIiIiAFZq8/tXgl8SdLtgUuAF1KC66Ml7QdcDjwDwPb5ko6mBNG3AAfYvnXeWx4RERERMQB9Bci2zwaWdFi1a5ftDwUOnXuzIiIiIiJGIzPpRUREREQ0JECOiIiIiGhIgBwRERER0ZAAOSJiwki6u6SzG19/lfRqSW+V9PvG8ic09jlY0jJJF0nabZTtj4gYd/1WsYiIiDFh+yJgJwBJawK/B46hVBh6n+13N7eXtAOwN7AjsDnwI0nbp8JQRERn6UGOiJhsuwK/tf27HtvsCRxl+ybblwLLgJ2H0rqIiAmUADkiYrLtDRzZePwKSedI+oykDeuyLYArGtssr8umkbS/pKWSlq5YsWJwLY6IGHMJkCMiJlSdvOkpwFfroo8Bd6WkX1wFvKe1aYfdvdIC+3DbS2wvWbRo0fw3OCJiQiRAjoiYXHsAZ9q+GsD21bZvtf1P4JNMpVEsB7Zq7LclcOVQWxoRMUESIEdETK59aKRXSNqsse6pwHn15+OAvSWtLWlbYDvg9KG1MiJiwqSKRUTEBJJ0R+BxwEsbi98paSdK+sRlrXW2z5d0NHABcAtwQCpYRER0lwA5ImIC2b4R+Je2Zc/rsf2hwKGDbldExEKQFIuIiIiIiIYEyBERERERDQmQIyIiIiIaEiBHRERERDQkQI6IiIiIaEiAHBERERHRkAA5IiIiIqKh7wBZ0pqSzpL07fp4I0nHS7q4ft+wse3BkpZJukjSboNoeERERETEIMymB/lA4MLG44OAE2xvB5xQHyNpB2BvYEdgd+Cjktacn+ZGRERERAxWXwGypC2BJwKfaizeEzii/nwEsFdj+VG2b7J9KbAM2HleWhsRERERMWD99iC/H/hP4J+NZZvavgqgft+kLt8CuKKx3fK6bBpJ+0taKmnpihUrZtvuiIiIiIiBmDFAlvQk4BrbZ/T5nOqwzCstsA+3vcT2kkWLFvX51BERERERg7VWH9vsAjxF0hOAOwAbSPoicLWkzWxfJWkz4Jq6/XJgq8b+WwJXzmejF6rFB31nKMe57LAnDuU4EREREZNoxh5k2wfb3tL2YsrguxNtPxc4Dti3brYvcGz9+Thgb0lrS9oW2A44fd5bHhERERExAP30IHdzGHC0pP2Ay4FnANg+X9LRwAXALcABtm9d5ZZGRERERAzBrAJk2ycDJ9ef/wjs2mW7Q4FDV7FtERHRhaTLgOuBW4FbbC+RtBHwFWAxcBnwTNt/rtsfDOxXt3+V7R+MoNkRERMhM+lFREyuR9veyfaS+jj16SMi5kEC5IiIhSP16SMi5kEC5IiIyWTgh5LOkLR/XZb69BER82BVBulFRMTo7GL7SkmbAMdL+nWPbfuuTw8cDrBkyZKV1kdErC7SgxwRMYFsX1m/XwMcQ0mZuLrWpSf16SMi5i4BckTEhJG0rqT1Wz8DjwfOI/XpIyLmRVIsIiImz6bAMZKgnMe/bPv7kn5J6tNHRKyyBMgRERPG9iXAfTssT336iIh5kBSLiIiIiIiGBMgREREREQ0JkCMiIiIiGhIgR0REREQ0JECOiIiIiGhIgBwRERER0ZAAOSIiIiKiIQFyRERERERDAuSIiIiIiIYEyBERERERDQmQIyIiIiIaEiBHRERERDTMGCBL2krSSZIulHS+pAPr8o0kHS/p4vp9w8Y+B0taJukiSbsN8gVERERERMynfnqQbwH+w/Y9gQcDB0jaATgIOMH2dsAJ9TF13d7AjsDuwEclrTmIxkdEREREzLcZA2TbV9k+s/58PXAhsAWwJ3BE3ewIYK/6857AUbZvsn0psAzYeZ7bHRERERExELPKQZa0GLgfcBqwqe2roATRwCZ1sy2AKxq7La/L2p9rf0lLJS1dsWLFHJoeERERETH/+g6QJa0HfB14te2/9tq0wzKvtMA+3PYS20sWLVrUbzMiIlZ7PcaGvFXS7yWdXb+e0NgnY0MiIvq0Vj8bSbodJTj+ku1v1MVXS9rM9lWSNgOuqcuXA1s1dt8SuHK+GhwREbeNDTlT0vrAGZKOr+veZ/vdzY3bxoZsDvxI0va2bx1qqyMiJkQ/VSwEfBq40PZ7G6uOA/atP+8LHNtYvrektSVtC2wHnD5/TY6IWL31GBvSTcaGRETMQj8pFrsAzwMe03bb7jDgcZIuBh5XH2P7fOBo4ALg+8AB6aWIiBiMtrEhAK+QdI6kzzTKb2ZsSETELMyYYmH7Z3TOKwbYtcs+hwKHrkK7IiJiBu1jQyR9DHgbZdzH24D3AC9iFmNDgMMBlixZstL6iIjVRWbSi4iYQJ3Ghti+2vattv8JfJKpNIqMDYmImIUEyBERE6bb2JA6YLrlqcB59eeMDYmImIW+qlhERMRYaY0NOVfS2XXZG4F9JO1ESZ+4DHgplLEhklpjQ24hY0MiInpKgBwRMWF6jA35bo99MjYkIqJPSbGIiIiIiGhIgBwRERER0ZAAOSIiIiKiIQFyRERERERDAuSIiIiIiIYEyBERERERDSnzFgOz+KDvDOU4lx32xKEcJyIiIlYPCZAjImLizccFeS62I6IlKRYREREREQ0JkCMiIiIiGhIgR0REREQ0JECOiIiIiGhIgBwRERER0ZAAOSIiIiKiIWXeIiIi5lFKzkVMvoH1IEvaXdJFkpZJOmhQx4mIiJnlnBwR0b+B9CBLWhP4CPA4YDnwS0nH2b5gEMeLGJbMDhiTKOfkiIjZGVSKxc7AMtuXAEg6CtgTyMk4Yowk4F9t5JwcETELgwqQtwCuaDxeDjxoQMeKiLhNgv6Ock5eTY1TPnTa0tm4tGW+zp0LpS2yPS+NmPak0jOA3Wy/uD5+HrCz7Vc2ttkf2L8+vDtw0bw3pLONgWuHdKxhyOsZfwvtNS201wPDe03b2F40hONM0885uS4fxHl5nN4v49KWcWkHpC3dpC2dLcS2dDwvD6oHeTmwVePxlsCVzQ1sHw4cPqDjdyVpqe0lwz7uoOT1jL+F9poW2uuBhfma2sx4TobBnJfH6Xc7Lm0Zl3ZA2tJN2tLZ6tSWQVWx+CWwnaRtJd0e2Bs4bkDHioiI3nJOjoiYhYH0INu+RdIrgB8AawKfsX3+II4VERG95ZwcETE7A5soxPZ3ge8O6vlXwdDTOgYsr2f8LbTXtNBeDyzM1zTNCM/J4/S7HZe2jEs7IG3pJm3pbLVpy0AG6UVERERETKqBzaQXERERETGJEiBHRERERDQkQI6IiIiIaEiAPEEkbdTra9TtWxWStpD0UEmPaH2Nuk2rQtLa/SybFJIO7GdZxLiR9BhJdxx1O2L8SXqRpO1G3Y5xJGlNSZtL2rr1Neo2DdqCHaQn6Vyg64uzfZ8hNmdeSLqU8poEbA38uf58Z+By29uOrnVzJ+kdwLOAC4Bb62LbfsroWrVqJJ1p+/4zLZsUXV7PWbbvN6o2rYoa3H8WuB74FHA/4CDbPxxpwyacpH2BAymz8AFcCHzQ9udH2KbPAw8G/gj8tH79zPafh9iGu1NmKLxHXXQh8Enbw5pBttmWRwOvZPrf6MO2Tx5yO75F78/ooZ//JR0CPAzYBjiD+n6xffaQ2zEWf6NGe14JvAW4GvhnXexRxVGSHgosplGJbRDnmIGVeRsDT6rfD6jfv1C/Pwe4cfjNWXWtAFjSx4HjatkmJO0BPHaUbVtFewF3t33TqBuyqiT9K7AFsI6k+1EuYAA2ACauF0vSPsCzgbtIak4ssT4l4JhUL7L9AUm7AYuAF1IC5gTIcyTp+cCrgdcCZ1Le+/cH3iVpIB9g/bD9/Nq+zYGnAx8BNmdIn3+SHgJ8A/gEpSyVKBdkJ0l6mu1Th9GO2pYnAh8GDgH+m6m/0WckvaL1mTIk7x7isfpi+78AJK0DvAR4PfB+Su3woRizv1HLgZTP6JGf8yV9AbgrcDaNDjVg3s8vC7YHuUXSz23vMtOySSLpDNsPaFs2NtM/zpak7wHPsP23UbdlVdUetBcAS4CljVXXA5+z/Y1RtGuuJG0DbAv8L3BQY9X1wDm2bxlJw1aRpHNs30fSB4CTbR8zyT3i40DSqcDeti9rW74YOMr2g0fUrucCDwfuDVwL/IzSK/iLIR3/e8A72nv/JD2Sctdij2G0ox7zZOBA279qW34f4EO2HzmstvQi6Su2nzWC474Z2AVYDziLqffKVUNsw8mM2d9I0knA48bhfC/pQmAHDyF4Xcg9yC3rSnqY7Z/BbV3z6464Tavq2vqP/EXKldNzmezevBuBsyWdANzWi2z7VaNr0tzYPgI4QtK/2f76qNuzqmz/TtJy4AbbPx51e+bRGZJ+SAn+D5a0PlO3DmNuNmgPjgFsXyZpgxG0p+X9wG+BjwMndWrjgN21061x2z+WNOxJF/61PfCqbTlH0qZDbksvDxnRcZ8G3AJ8B/gxcKrt/xtyG8bmbyTptfXHS4CTJX2H6Z/R7x1me6rzgH8FBn7RsjoEyPtRbk3cqT6+DnjR6JozL/ah5AMdUx//pC6bVMfVr4Xk25Kezcp5UoeMrEVzZPtWSTdKupPtv4y6PfNkP2An4BLbN0r6F0qaRczd3+e4bqBsbyxpR+ARwKF1ENZFtp83pCZc32PdDUNqQz/HG3Zbxo7t+9eL5YcBjwM+Kelq2w8bYjPG6W+0fv1+ef26ff2CHvnjA7YxcIGk05kerM97zvqCD5BtnwHct/ZgaCF8wNv+EyUnaEGova4LzbHAXygDPSY+txr4P+BcScfTOElPYi9/ZWAHyliFQyh3le4w0hZNvntKOqfDcgF3GXZjbjt4OfdvTRl4tRi4E8O9W7CVpA92ahplvMIw3bVtLEGzLUP9G0nqNmBZwO2G2ZbbDizdi5KO80hKmtwVlIF6wzQ2fyPb/w0g6Rm2vzqtMdIzhtmWhrcO60CrQw7y2sC/sQB68lokbQ+8jpVf02NG1aa5WIiVRloknWf7XqNux3ypudUrmdSLG0kfowRJj7F9T0kbAj+0/cARN21iSXoNJWfzz8A/2tfb/t3QG0XJN6e062fAT2wvH/LxO/7vtAzzf6jmPfdqy9DSqGpea6+2PHpYbWmpKQQ/prxXfml7pffxENowNn+jlnGrylRTTVrn6tNtXzOI4yz4HmQWXk8ewFcp+XSfYmoU5yR60sybTKxTJN3b9rmjbsh8sH2EpNsD29dFF43iw2MePajeTj0LwPaf6+uLudsC+ACllNk5wCnAz4Ff1LteI9G60Ja0ru2hpxE0A2BJ65VFw29HbUvX4ErSVyjB4bDaMvQAeCa2n9i+bAQDBjcEThlU0DcbtULWE4At2u6CbEDJ1R5Fm54JvAs4mdKr/iFJr7f9tXk/1mrQg7ygevKgcxWLSSbpHbbfMNOySSLpAuBuwKWUCzMxwrqRq0rSo4AjgMsor2UrYF/bPxldq+ZO0mnAQym9RPeXtIjSg5wqFquoXmgsofx+H1K/rrO9w4ja8xDg08B6treWdF/gpbZfPsQ2vAw4mKkB4n+jVLb46LDaMBNJl9seyeQPw6prOxfD/r1I+hrlf+ZGygXmKcDPbZ8/rDY02nJfyliNdwD/Q7njeyulHvLJHmIt8UabfkWpqHFNfbwI+JHt+873sVaHHuQF05OnqdnyviXp5ZRBes0k9ZH10qyixwHtwfAeHZZNkqGVbhqS9wCPd53YoKb5HAlM6oXaByn/P5tKOpRSH/fNo23SgrEOpYfpTvXrSmCU59/3A7tRBwLb/pWGOFNnrTj0UOBRti+py+4CfEDSRrb/Z1htGUfDrGs7CWw/HW4rj/jQ+vVSlZnrfmn7CUNszgWUuSNuTylu0Ooc+Szw7SG2o2mNtt71PzKgWaEXbIDcyG9dC3ihpEuY/J68M5iaSQ9KEfMWM8KBMHNRe1VeTpmEojm4Z33KlfPEquXRHgZsZ/uz9Sp3vVG3axXczo1Zv2z/RtJIBtLMB9tfknQGsGtdtJftC0fZpklXS5btSKnacBql5+u9o+hlamf7CknNRcNMTXsecN9muTDbl9Rbxb+i9MwNxTgOjKPcbRhKXdtuxvH3Ussj3oFywbkOZRDxOkNuxjspn1vb2L4ebhv0+u76NYpiAd+X9ANKBw2UWXgHMnnKgg2QWYD5rZ7QqaR7+DLwPTpMQjHBveEASHoL5cR/d8rV9u0odasndYKaMyR9mukzUp4xwvbMhztSZsgyw//gWYi2BtYGLgZ+DyynlNUctSvqLXzX9I9XUabuHZpOtXRt/13SsGtvv6fHul8PrRXTDa2ubQ9j83uR9EZKisUi4CLgVMrMevvbHvaYoycB2zcvXmz/tXZu/ZohBsiS7gZsavv1kp5GKcUn4BfAlwZyzNUgB/nBwPmNq5/1KVerp422ZXMn6QDgS7avq483BPYZp3y2fjRSRjqa5CBZ0tmU6WTPbOW1qs7eNtKGzVGtBnMAUyelnwAf9YRODy7pv4BnAF+nvJ69gK+u7re7V5VKN+2OTN0avhfwJ8pAvbeMqE0bUwYPPpbyt/4hZaayoUyupDIB0tttn9C2fFfgzeM4WG2YajWLnYCB17WdBJJ+TclR/zblLsxpoypPK+k3tref7boBteXbwBttn9O2fAnwFttPnvdjrgYB8lnA/VtXQJLWAJaOqjzJfJB0tu2d2padNWkDjCRdylSZN7Wttu2JShlpknS67Z1bpXAkrUsJEiYqQJa0CfBGyoDDc4H/tf3X0bZq1alMV3q/Vs+epHUoFzP3HG3LFgZJW1LuljyU0gv1L7bvPNJGjYjKJCXHUkqHtdLkHkj5/ew5isFXtV1jMTCuW1mzUZQzg/H4vdTOo9ZF5oMpaQ6/olS3+OwQ2/FN4Bvtr19l+vZnDvMiplfBBUnn2r73fB9zIadYtKjt9sA/JU36615DkhpB/5pMzW4zMRZgykjT0ZI+AdxZ0ksoAxw+OeI2zcXnKR/qH6IEOh9gYcw4dxklp69163ttynTEMUeSXkX5QN+FUgf555Tbn59hBIP06l2Cbmz7bUNqyk3ACyglEndk6g7Mp5l6/w3VOA2Mc5lyeyh1bWcyLr+Xevf025K+TxkI/QjgpZTPkaEFyJS7ht+Q9CKmX9ytAzx1iO2A3hM5DSRFbnXoQf4GpV7ex+qilwOPtr3XqNq0qiS9mzIr1Mcpb9h/B66w/R8jbdgsSbqH7V93GyBh+8xht2k+SXoc8HjKB+IPbB8/4ibNWvvdCo2wOPx8qj0jDwSOp/wPPY7Sw3cNTPQMgSMj6b1MlaQaZT5pqz2dzofrUqYZ/xfbQxk0O4pbw3206UJGPDCu0Zb2urYPBwZS17aPtoz89yLpKUxdaO4InE/5vzqF0oO8YgRtegxTF3fnt6cLDakNRwIn2v5k2/L9KBWW5r1W9eoQIG9CKen0GMoH4QmU/LOhv8nmS00T2Z/pOXWftD3sAR+rRNLhtvdX5xmV7AmbGbCTOuK3eatuovKqa83JRzGVAnNS8/GkvZ4WjdHsZjF4dezJgZTg+GjgPcPqpRzFreE+2vRV4FVjciEztLq2fbRl5L+X2ql3BnAicIbtm+vyRwC/t71a3umqdxmOAW5maoD4Esrd86fa/sN8H3PSUw36sZ3tvZsLJO0CTGyADLzS9gcoPcgASDqQcvt7Ytjev35fcINUJL0UOAT4O2VKYzGBpfgodWzPYHqOeKtnfxJfT8sfge9O2kVlzE7N5XwtperKEZTxKMMuOzf0W8N92Bi4QNI4DIwbWl3bPozD72Vt4FvtdxwoE4e8Hxj6HYdxYPtq4KGSHk0Z/AvwHdsnDuqYq0MP8ljNIT4furymiRuk1yLp+Z2Wj2LAyHyRdDHwENvXjrotq6pWJtjK9uWjbst8kfRFSimlrwOfdWogLziS3gU8DTgc+Ijtv42oHUO/NdxHm8ZmYFz9O92H6XVtz/EIZlIdh9/LON5xWF0t2ABZZXrRhwKvBt7XWLUBpTt+6LdvVpWkfYBnU0pt/bSxan3gVtuPHUnDVpGkDzUe3oEyecOZrjMKTaI6uOJptm8cdVvmgxbY9OZwW/rLPpRBh6YMfjnStSRkTLZaY/gm4BamquUAt00WtcGQ2jH0W8OzaNfIBsY16tr+vK2u7Z8pZUxHkkowBr+XZbbvNtt1Mf8WcorF7SmlUdaiBJAtf6VMKzuJTqEUU9+Y6YXNrwfab8dMDNuvbD6WdCemJqSYVAdTpjk/jem36iZ18Nepkh5o+5ejbsh8cSl4/3XKbe5XU0Zlv17SB21/qOfOMfZsj+o2/TSjuDU8kw4D4z4kadgD495PKSGJ7W8A36htW8KIUgnG5PfyS0kv6XLHYdInZ5ooC7YHuUXSf9p+Z9uyZ9j+6qjaNB8kbUPJr/5RreG61kLp+VKZwvgcT3BN2prD9jNKeavb8lwndfCXpAsoZap+B9wAkzllu6Sn2f6GpCdTSibdlXIxdoTtayTdEbjQ9jYjbWjEAI3DwLhxTCUYk9/LWN5xWB0t5B7klr0p84k3HQxMbIBc6+ruD2xE+YDfkjJgb9dRtmuuJH2LqVugawA7UEaaT7JbbL921I2YR3uMugHz5M2UnqpnAO+z/ZPmSts31pqfEQvZOAyMG8fBiyP/vYzjHYfV1YINkCXtATwB2ELSBxur1qcUsZ9kBwA7A6cB2L64lrObVO9u/HwL8Dvby0fVmHlykqT9gW8xPcViIsui2f4d3FY2sdcH20Sw3XFgaF039BqfEUP2fUk/YPrAuO8OuQ3jmEowDr8XAGyfRCmrGSOyYANk4ErKP9lTmP7Ptg2lXMoku8n2zaW4AKjMDDixuTLNEcKSNqZctU+6Z9fvBzeWTWxZtFq8/j3A5pTJNLYBLqQUj58k95DUKV9/IlNGImajMTDu9W0D434BfGnIzXk1cIyk59AhlWCYDRmz30uMidUhB/l2lA/xZwPPBC4Fvm77wyNt2CqQ9E7gOuD5wCspswNeYPtNo2zXbEl6MHAY8CfgbZRc0I0pt7Seb/v7I2xeNNTcvMdQ8vHuV2//7dOqZT0pJJ1PubPUUaunPGIhGtNZ/ZqpBOePIpVgHH8vMXoLNkCWtD0l/3gfSo/kV4DXLYTBN3Umvf1oTGMMfMoT9seUtJQyivlOlFqle9g+VdI9KOW2JrKuM5SBoMD3bV8v6c3A/YG32T5rxE2bE0lLbS+pgfL9bP9T0um2dx5122ZjkuuFR6yqcRwYNw7ye4lOFnKKxa8ptYKfbHsZgKTXjLZJ86MGJ98EvukJnjKbUnnjhwCSDrF9KoDtX7fSRybY/7P9VUkPA3aj5Fl/HHjQaJs1Z9dJWg/4CfAlSddQ8sUnzc/rBdgWwGnNySMk7Z67FrHAjePAuHGQ30usZCzqRA7IvwF/oAyW+qSkXZk+Xe7EUfFWSddSLgAukrRC0n+Num1z1Jzm9+9t6yaqN7yDW+v3JwIfs30sJbduoki6m8rU7HtScvdfA3yfclfmlb32HVO/AY6ltP08SXs21r19NE2KGJpf1ipI06TGbn4vsbIFm2LRImldYC9KqsVjgCOAY1o9l5Ok9oA/Adjf9qV12V2Aj1Fu57+v1/7jRtKtTNXUXYepwZMC7mD7dqNq26qqOW2/Bx4LPIByAXD6pM3guNBy8ySdS5kC/G+SFgNfA75g+wNJv4iFLjV2O8vvJTpZ8AFyk6SNKPVPn2X7MaNuz2xJOotSxPzatuWLgB/mw3181AkndgfOrWX4NgPuPWkXZgstN0/SBbZ3aDxejxIkXwA8xvZOo2pbxLCMw8C4cZTfSzStVgHypJshWOm6LkanvW6w7ctH2JxZk7TM9t1mu25cSToReK3tsxvL1gI+AzzH9pqjaltERIyPhZyDvBDdPMd1MWSSniLpYkpZwR/X798bbavmZKHl5j2fMjbhNrZvqROHPGI0TYqIiHGTHuQJ0sjZXWkVE56zu9AsoLrByc2LiIjVTgLkiAFYKHWDW5KbFxERq5OFXAc5YpQWSt1gAGyfBJw06nZEREQMQ3qQIwaglhf8OyXP/zmU2QK/ZPuPI21YREREzCgBcsSASdoY+OOkTQUeERGxukoVi4h5JOnBkk6W9A1J95N0HnAecLWk3UfdvoiIiJhZepAj5pGkpcAbKSkVhwN72D5V0j2AIzOZS0RExPhLD3LE/FrL9g9tfxX4g+1TAWz/esTtioiIiD4lQI6YX/9s/Pz3tnW5XRMRETEBkmIRMY8ak7kIWAe4sbWKTOYSERExERIgR0REREQ0JMUiIiIiIqIhAXJEREREREMC5IiIiIiIhgTIEREREREN/x9+8E2JKto0UgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Let's look at the distribution of features\n", "plot_features = ['Neighborhood', 'HouseStyle', 'GarageType', 'SaleType']\n", "fig, axes = plt.subplots(2,2)\n", "fig.set_size_inches(10,6)\n", "axes = axes.flatten()\n", "for ix, feature in enumerate(plot_features):\n", " df[feature].value_counts().plot(kind='bar', ax=axes[ix])\n", " axes[ix].set_title(feature)\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['LotFrontage',\n", " 'LotArea',\n", " 'OverallQual',\n", " 'OverallCond',\n", " 'YearBuilt',\n", " 'YearRemodAdd',\n", " 'MasVnrArea',\n", " 'BsmtFinSF1',\n", " 'BsmtFinSF2',\n", " 'BsmtUnfSF',\n", " 'TotalBsmtSF',\n", " '1stFlrSF',\n", " '2ndFlrSF',\n", " 'LowQualFinSF',\n", " 'GrLivArea',\n", " 'BsmtFullBath',\n", " 'BsmtHalfBath',\n", " 'FullBath',\n", " 'HalfBath',\n", " 'BedroomAbvGr',\n", " 'KitchenAbvGr',\n", " 'TotRmsAbvGrd',\n", " 'GarageYrBlt',\n", " 'GarageCars',\n", " 'GarageArea',\n", " 'WoodDeckSF',\n", " 'OpenPorchSF',\n", " 'EnclosedPorch',\n", " '3SsnPorch',\n", " 'ScreenPorch',\n", " 'PoolArea',\n", " 'MiscVal',\n", " 'MoSold',\n", " 'YrSold']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's take a look at our categorical features\n", "numeric_features" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LotFrontageLotAreaOverallQualOverallCondYearBuiltYearRemodAddMasVnrAreaBsmtFinSF1BsmtFinSF2BsmtUnfSF...GarageAreaWoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSold
count1201.0000001460.0000001460.0000001460.0000001460.0000001460.0000001452.0000001460.0000001460.0000001460.000000...1460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.000000
mean70.04995810516.8280826.0993155.5753421971.2678081984.865753103.685262443.63972646.549315567.240411...472.98013794.24452146.66027421.9541103.40958915.0609592.75890443.4890416.3219182007.815753
std24.2847529981.2649321.3829971.11279930.20290420.645407181.066207456.098091161.319273441.866955...213.804841125.33879466.25602861.11914929.31733155.75741540.177307496.1230242.7036261.328095
min21.0000001300.0000001.0000001.0000001872.0000001950.0000000.0000000.0000000.0000000.000000...0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000001.0000002006.000000
25%59.0000007553.5000005.0000005.0000001954.0000001967.0000000.0000000.0000000.000000223.000000...334.5000000.0000000.0000000.0000000.0000000.0000000.0000000.0000005.0000002007.000000
50%69.0000009478.5000006.0000005.0000001973.0000001994.0000000.000000383.5000000.000000477.500000...480.0000000.00000025.0000000.0000000.0000000.0000000.0000000.0000006.0000002008.000000
75%80.00000011601.5000007.0000006.0000002000.0000002004.000000166.000000712.2500000.000000808.000000...576.000000168.00000068.0000000.0000000.0000000.0000000.0000000.0000008.0000002009.000000
max313.000000215245.00000010.0000009.0000002010.0000002010.0000001600.0000005644.0000001474.0000002336.000000...1418.000000857.000000547.000000552.000000508.000000480.000000738.00000015500.00000012.0000002010.000000
\n", "

8 rows × 34 columns

\n", "
" ], "text/plain": [ " LotFrontage LotArea OverallQual OverallCond YearBuilt \\\n", "count 1201.000000 1460.000000 1460.000000 1460.000000 1460.000000 \n", "mean 70.049958 10516.828082 6.099315 5.575342 1971.267808 \n", "std 24.284752 9981.264932 1.382997 1.112799 30.202904 \n", "min 21.000000 1300.000000 1.000000 1.000000 1872.000000 \n", "25% 59.000000 7553.500000 5.000000 5.000000 1954.000000 \n", "50% 69.000000 9478.500000 6.000000 5.000000 1973.000000 \n", "75% 80.000000 11601.500000 7.000000 6.000000 2000.000000 \n", "max 313.000000 215245.000000 10.000000 9.000000 2010.000000 \n", "\n", " YearRemodAdd MasVnrArea BsmtFinSF1 BsmtFinSF2 BsmtUnfSF ... \\\n", "count 1460.000000 1452.000000 1460.000000 1460.000000 1460.000000 ... \n", "mean 1984.865753 103.685262 443.639726 46.549315 567.240411 ... \n", "std 20.645407 181.066207 456.098091 161.319273 441.866955 ... \n", "min 1950.000000 0.000000 0.000000 0.000000 0.000000 ... \n", "25% 1967.000000 0.000000 0.000000 0.000000 223.000000 ... \n", "50% 1994.000000 0.000000 383.500000 0.000000 477.500000 ... \n", "75% 2004.000000 166.000000 712.250000 0.000000 808.000000 ... \n", "max 2010.000000 1600.000000 5644.000000 1474.000000 2336.000000 ... \n", "\n", " GarageArea WoodDeckSF OpenPorchSF EnclosedPorch 3SsnPorch \\\n", "count 1460.000000 1460.000000 1460.000000 1460.000000 1460.000000 \n", "mean 472.980137 94.244521 46.660274 21.954110 3.409589 \n", "std 213.804841 125.338794 66.256028 61.119149 29.317331 \n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "25% 334.500000 0.000000 0.000000 0.000000 0.000000 \n", "50% 480.000000 0.000000 25.000000 0.000000 0.000000 \n", "75% 576.000000 168.000000 68.000000 0.000000 0.000000 \n", "max 1418.000000 857.000000 547.000000 552.000000 508.000000 \n", "\n", " ScreenPorch PoolArea MiscVal MoSold YrSold \n", "count 1460.000000 1460.000000 1460.000000 1460.000000 1460.000000 \n", "mean 15.060959 2.758904 43.489041 6.321918 2007.815753 \n", "std 55.757415 40.177307 496.123024 2.703626 1.328095 \n", "min 0.000000 0.000000 0.000000 1.000000 2006.000000 \n", "25% 0.000000 0.000000 0.000000 5.000000 2007.000000 \n", "50% 0.000000 0.000000 0.000000 6.000000 2008.000000 \n", "75% 0.000000 0.000000 0.000000 8.000000 2009.000000 \n", "max 480.000000 738.000000 15500.000000 12.000000 2010.000000 \n", "\n", "[8 rows x 34 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# since these are numeric, we can compute some basic stats:\n", "df[numeric_features].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Probably, most of these should be rescaled with standard scaling. " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Let's look at the distribution of features\n", "plot_features = ['LotFrontage', 'BsmtFinSF1', '1stFlrSF', 'ScreenPorch']\n", "fig, axes = plt.subplots(2,2)\n", "fig.set_size_inches(10,6)\n", "axes = axes.flatten()\n", "for ix, feature in enumerate(plot_features):\n", " df[feature].value_counts().plot(kind='hist', ax=axes[ix], bins=20, logy=True)\n", " axes[ix].set_title(feature)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some of these features have very low variance. They should probably be removed. Others should possibly be transformed using Box-Cox or similar. " ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Let's check to see if any of our numeric features are highly correlated with one another\n", "import seaborn as sns\n", "plt.gcf().set_size_inches(10,8)\n", "sns.clustermap(df[numeric_features].corr())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overall, our features are relatively uncorrelated. Some features are highly correlated. For instance: \n", "* TotalBsmtSF, 1stFlrSF\n", "* GarageCars, GarageArea\n", "* BsmtFnSF1, BsmtFullBath\n", "\n", "We could consider removing some of these near duplicate features. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## First pass\n", "It's usually a good idea to first perform a quick and dirty analysis ignoring the subtleties that we discussed above. We can then try to incorporate these ideas to improve our results. " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1460, 76), (1460,))" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# define input/target\n", "inputs = features.variable.iloc[1:].tolist()\n", "X, y = df[inputs], df['SalePrice']\n", "X.shape, y.shape" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1168, 76), (292, 76))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# split the data\n", "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=42)\n", "X_train.shape, X_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Preprocessing numeric and categorical features\n", "We will use scikit-learn's pipeline feature to streamline the model fitting and evaluation process. " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ColumnTransformer(transformers=[('numeric',\n",
       "                                 Pipeline(steps=[('fill_na',\n",
       "                                                  SimpleImputer(strategy='median')),\n",
       "                                                 ('scale', StandardScaler())]),\n",
       "                                 ['LotFrontage', 'LotArea', 'OverallQual',\n",
       "                                  'OverallCond', 'YearBuilt', 'YearRemodAdd',\n",
       "                                  'MasVnrArea', 'BsmtFinSF1', 'BsmtFinSF2',\n",
       "                                  'BsmtUnfSF', 'TotalBsmtSF', '1stFlrSF',\n",
       "                                  '2ndFlrSF', 'LowQualFinSF', 'GrLivArea',\n",
       "                                  'BsmtFullBath', 'BsmtHal...\n",
       "                                  'LotShape', 'LandContour', 'Utilities',\n",
       "                                  'LotConfig', 'LandSlope', 'Neighborhood',\n",
       "                                  'Condition1', 'Condition2', 'BldgType',\n",
       "                                  'HouseStyle', 'RoofStyle', 'RoofMatl',\n",
       "                                  'Exterior1st', 'Exterior2nd', 'MasVnrType',\n",
       "                                  'ExterQual', 'ExterCond', 'Foundation',\n",
       "                                  'BsmtQual', 'BsmtCond', 'BsmtExposure',\n",
       "                                  'BsmtFinType1', 'BsmtFinType2', 'Heating',\n",
       "                                  'HeatingQC', 'CentralAir', 'Electrical', ...])],\n",
       "                  verbose_feature_names_out=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale', StandardScaler())]),\n", " ['LotFrontage', 'LotArea', 'OverallQual',\n", " 'OverallCond', 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1', 'BsmtFinSF2',\n", " 'BsmtUnfSF', 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF', 'GrLivArea',\n", " 'BsmtFullBath', 'BsmtHal...\n", " 'LotShape', 'LandContour', 'Utilities',\n", " 'LotConfig', 'LandSlope', 'Neighborhood',\n", " 'Condition1', 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle', 'RoofMatl',\n", " 'Exterior1st', 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond', 'Foundation',\n", " 'BsmtQual', 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1', 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir', 'Electrical', ...])],\n", " verbose_feature_names_out=False)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.compose import make_column_transformer, ColumnTransformer\n", "\n", "# preprocessing pipeline for numeric quantities\n", "preproc_numeric = Pipeline([\n", " ('fill_na', SimpleImputer(strategy='median')),\n", " ('scale', StandardScaler())\n", "])\n", "\n", "# preprocessing pipeline for categorical quantities\n", "preproc_categorical = Pipeline([\n", " ('fill_na', SimpleImputer(strategy='most_frequent')),\n", " ('encode', OneHotEncoder(sparse_output=False, drop='first', min_frequency=5, handle_unknown='infrequent_if_exist'))\n", "])\n", "\n", "# full preprocessing pipeline\n", "preproc = ColumnTransformer(\n", " transformers=[\n", " ('numeric', preproc_numeric, numeric_features),\n", " ('categorical', preproc_categorical, categorical_features)\n", "], verbose_feature_names_out=False)\n", "\n", "preproc.fit(X_train)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LotFrontageLotAreaOverallQualOverallCondYearBuiltYearRemodAddMasVnrAreaBsmtFinSF1BsmtFinSF2BsmtUnfSF...Fence_MnWwSaleType_ConLDSaleType_NewSaleType_WDSaleType_infrequent_sklearnSaleCondition_AllocaSaleCondition_FamilySaleCondition_NormalSaleCondition_PartialSaleCondition_infrequent_sklearn
892-0.012468-0.211594-0.0889342.165000-0.2597890.873470-0.5978890.472844-0.285504-0.391317...0.00.00.01.00.00.00.01.00.00.0
11051.2345200.1456431.374088-0.5241740.7512220.4874651.4985671.276986-0.285504-0.312872...0.00.00.01.00.00.00.01.00.00.0
413-0.635963-0.160826-0.8204450.372217-1.433867-1.683818-0.597889-0.971996-0.2855040.980347...0.00.00.01.00.00.00.01.00.00.0
522-0.903175-0.529035-0.0889341.268609-0.781602-1.683818-0.597889-0.102477-0.2855040.077111...0.00.00.01.00.00.00.01.00.00.0
10360.8337030.2053382.105599-0.5241741.1751951.114724-0.1924971.255193-0.2855040.061422...0.00.00.01.00.00.00.01.00.00.0
..................................................................
479-0.903175-0.443026-1.5519551.268609-1.1077340.7287181.921333-0.605882-0.2855040.377443...0.00.00.01.00.01.00.00.00.00.0
13612.3924390.5084590.642577-0.5241741.1099680.969972-0.5052281.804363-0.285504-0.705096...0.00.00.01.00.00.00.01.00.00.0
802-0.324216-0.2315850.642577-0.5241741.1099680.969972-0.5978890.440155-0.285504-1.099561...0.00.00.01.00.00.00.01.00.00.0
651-0.457822-0.149296-1.551955-0.524174-1.009895-1.683818-0.597889-0.971996-0.2855040.413303...0.00.00.01.00.00.00.01.00.00.0
722-0.012468-0.238931-1.5519551.268609-0.031496-0.718804-0.597889-0.555760-0.2855040.229518...0.00.00.01.00.00.00.01.00.00.0
\n", "

292 rows × 226 columns

\n", "
" ], "text/plain": [ " LotFrontage LotArea OverallQual OverallCond YearBuilt \\\n", "892 -0.012468 -0.211594 -0.088934 2.165000 -0.259789 \n", "1105 1.234520 0.145643 1.374088 -0.524174 0.751222 \n", "413 -0.635963 -0.160826 -0.820445 0.372217 -1.433867 \n", "522 -0.903175 -0.529035 -0.088934 1.268609 -0.781602 \n", "1036 0.833703 0.205338 2.105599 -0.524174 1.175195 \n", "... ... ... ... ... ... \n", "479 -0.903175 -0.443026 -1.551955 1.268609 -1.107734 \n", "1361 2.392439 0.508459 0.642577 -0.524174 1.109968 \n", "802 -0.324216 -0.231585 0.642577 -0.524174 1.109968 \n", "651 -0.457822 -0.149296 -1.551955 -0.524174 -1.009895 \n", "722 -0.012468 -0.238931 -1.551955 1.268609 -0.031496 \n", "\n", " YearRemodAdd MasVnrArea BsmtFinSF1 BsmtFinSF2 BsmtUnfSF ... \\\n", "892 0.873470 -0.597889 0.472844 -0.285504 -0.391317 ... \n", "1105 0.487465 1.498567 1.276986 -0.285504 -0.312872 ... \n", "413 -1.683818 -0.597889 -0.971996 -0.285504 0.980347 ... \n", "522 -1.683818 -0.597889 -0.102477 -0.285504 0.077111 ... \n", "1036 1.114724 -0.192497 1.255193 -0.285504 0.061422 ... \n", "... ... ... ... ... ... ... \n", "479 0.728718 1.921333 -0.605882 -0.285504 0.377443 ... \n", "1361 0.969972 -0.505228 1.804363 -0.285504 -0.705096 ... \n", "802 0.969972 -0.597889 0.440155 -0.285504 -1.099561 ... \n", "651 -1.683818 -0.597889 -0.971996 -0.285504 0.413303 ... \n", "722 -0.718804 -0.597889 -0.555760 -0.285504 0.229518 ... \n", "\n", " Fence_MnWw SaleType_ConLD SaleType_New SaleType_WD \\\n", "892 0.0 0.0 0.0 1.0 \n", "1105 0.0 0.0 0.0 1.0 \n", "413 0.0 0.0 0.0 1.0 \n", "522 0.0 0.0 0.0 1.0 \n", "1036 0.0 0.0 0.0 1.0 \n", "... ... ... ... ... \n", "479 0.0 0.0 0.0 1.0 \n", "1361 0.0 0.0 0.0 1.0 \n", "802 0.0 0.0 0.0 1.0 \n", "651 0.0 0.0 0.0 1.0 \n", "722 0.0 0.0 0.0 1.0 \n", "\n", " SaleType_infrequent_sklearn SaleCondition_Alloca SaleCondition_Family \\\n", "892 0.0 0.0 0.0 \n", "1105 0.0 0.0 0.0 \n", "413 0.0 0.0 0.0 \n", "522 0.0 0.0 0.0 \n", "1036 0.0 0.0 0.0 \n", "... ... ... ... \n", "479 0.0 1.0 0.0 \n", "1361 0.0 0.0 0.0 \n", "802 0.0 0.0 0.0 \n", "651 0.0 0.0 0.0 \n", "722 0.0 0.0 0.0 \n", "\n", " SaleCondition_Normal SaleCondition_Partial \\\n", "892 1.0 0.0 \n", "1105 1.0 0.0 \n", "413 1.0 0.0 \n", "522 1.0 0.0 \n", "1036 1.0 0.0 \n", "... ... ... \n", "479 0.0 0.0 \n", "1361 1.0 0.0 \n", "802 1.0 0.0 \n", "651 1.0 0.0 \n", "722 1.0 0.0 \n", "\n", " SaleCondition_infrequent_sklearn \n", "892 0.0 \n", "1105 0.0 \n", "413 0.0 \n", "522 0.0 \n", "1036 0.0 \n", "... ... \n", "479 0.0 \n", "1361 0.0 \n", "802 0.0 \n", "651 0.0 \n", "722 0.0 \n", "\n", "[292 rows x 226 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preproc.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model fitting" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='median')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   'GrLivAr...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=1))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " 'GrLivAr...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=1))])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create the model pipeline\n", "from sklearn.linear_model import Ridge\n", "\n", "pipe = Pipeline([\n", " ('preproc', preproc), \n", " ('estimator', Ridge(alpha=1))\n", "])\n", "\n", "# fit\n", "pipe.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model evaluation" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train R^2: 0.9028881797596011\n", "Test R^2: 0.8714648323729995\n" ] } ], "source": [ "# evaluate\n", "# For random forest regressor, score returns the R^2 value\n", "print(\"Train R^2:\", pipe.score(X_train, y_train))\n", "print(\"Test R^2:\", pipe.score(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train MAE: 15288.339516024189\n", "Test MAE: 20544.401602914677\n" ] } ], "source": [ "# MAE is a more intuitive metric for price estimation\n", "from sklearn.metrics import mean_absolute_error\n", "y_train_pred_1stpass = pipe.predict(X_train)\n", "y_test_pred_1stpass = pipe.predict(X_test)\n", "print(\"Train MAE:\", mean_absolute_error(y_train, y_train_pred_1stpass))\n", "print(\"Test MAE:\", mean_absolute_error(y_test, y_test_pred_1stpass))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'fit_time': array([0.16545057, 0.14652419, 0.1494379 , 0.14467359, 0.12987018]),\n", " 'score_time': array([0.03685045, 0.03611279, 0.03650355, 0.03635812, 0.03367758]),\n", " 'test_score': array([-18480.22849655, -20702.55584883, -20390.70685371, -17442.23199009,\n", " -19762.00113844]),\n", " 'train_score': array([-15920.87447649, -14995.07168281, -15245.2950543 , -15810.8980323 ,\n", " -13704.36598872])}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# more robust classification with cross validation\n", "from sklearn.model_selection import KFold, cross_validate\n", "cv = KFold(n_splits=5, shuffle=True, random_state=42)\n", "cv_scores = cross_validate(pipe, X, y, n_jobs=4, return_train_score=True, scoring='neg_mean_absolute_error')\n", "cv_scores" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(19355.544865524786, (17657.804810833954, 21053.284920215618))" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import scipy\n", "def mean_confidence_interval(data, confidence=0.95):\n", " a = 1.0 * np.array(data)\n", " n = len(a)\n", " m, se = np.mean(a), scipy.stats.sem(a)\n", " h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)\n", " return m, (m-h, m+h)\n", "\n", "mean_confidence_interval(-cv_scores['test_score'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optimizing the pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many things we can try to improve the fit of our model. For example, we could experiment with the following: \n", "* apply some of the observations from our exploratory data analysis\n", "* different imputation strategies\n", "* add a dimension reduction step like PCA\n", "* try different estimators\n", "* try hyperparameters within different estimators\n", "\n", "How do we start testing various approaches in scikit-learn? One way is to manually change the pipeline we defined above, fit/evaluate the model, and compare with our results above. This can be a tedious and error-prone process. Let's see how do this efficiently using scikit-learn's APIs. \n", "\n", "To introduce the ideas, let's consider the alpha regularization parameter used in Ridge regression." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Tuning estimator parameters" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='median')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   'GrLivAr...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=1))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " 'GrLivAr...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=1))])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='median')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   'GrLivAr...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=21.544346900318846))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " 'GrLivAr...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=21.544346900318846))])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "alphas = np.logspace(-2,3,10)\n", "param_grid = {\n", " 'estimator__alpha': alphas\n", "}\n", "cv = KFold(10, shuffle=True)\n", "gs = GridSearchCV(pipe, param_grid, cv=cv, n_jobs=10, scoring='neg_mean_absolute_error', verbose=False)\n", "\n", "gs.fit(X_train, y_train)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'mean_fit_time': array([0.21524832, 0.12929206, 0.14147673, 0.13001094, 0.12876217,\n", " 0.12753346, 0.12873785, 0.12855723, 0.12965353, 0.1284827 ]),\n", " 'std_fit_time': array([0.03227405, 0.00410048, 0.0115528 , 0.00307046, 0.00154043,\n", " 0.00228009, 0.00147471, 0.00239597, 0.00322923, 0.00289472]),\n", " 'mean_score_time': array([0.03430345, 0.03392034, 0.03475215, 0.03282845, 0.03321393,\n", " 0.03305686, 0.03315287, 0.03283639, 0.03680825, 0.03171299]),\n", " 'std_score_time': array([0.00137619, 0.00102129, 0.00133493, 0.00081006, 0.00101256,\n", " 0.00059905, 0.00092702, 0.00072003, 0.00701796, 0.00133118]),\n", " 'param_estimator__alpha': masked_array(data=[0.01, 0.03593813663804628, 0.1291549665014884,\n", " 0.464158883361278, 1.6681005372000592,\n", " 5.994842503189409, 21.544346900318846,\n", " 77.42636826811278, 278.2559402207126, 1000.0],\n", " mask=[False, False, False, False, False, False, False, False,\n", " False, False],\n", " fill_value='?',\n", " dtype=object),\n", " 'params': [{'estimator__alpha': 0.01},\n", " {'estimator__alpha': 0.03593813663804628},\n", " {'estimator__alpha': 0.1291549665014884},\n", " {'estimator__alpha': 0.464158883361278},\n", " {'estimator__alpha': 1.6681005372000592},\n", " {'estimator__alpha': 5.994842503189409},\n", " {'estimator__alpha': 21.544346900318846},\n", " {'estimator__alpha': 77.42636826811278},\n", " {'estimator__alpha': 278.2559402207126},\n", " {'estimator__alpha': 1000.0}],\n", " 'split0_test_score': array([-20423.13827829, -20300.08239561, -20006.86387591, -19474.39388573,\n", " -18550.24891054, -17352.5317766 , -16262.56092082, -15829.96244455,\n", " -16998.77404589, -20154.59224233]),\n", " 'split1_test_score': array([-21134.44446939, -21041.43167909, -20813.88308617, -20383.39950686,\n", " -19741.47199681, -19035.29561157, -18429.03015027, -18519.18961014,\n", " -18802.3504061 , -19750.8974826 ]),\n", " 'split2_test_score': array([-21359.14792024, -21318.79576546, -21181.76938699, -20759.19222816,\n", " -20017.03123303, -19265.01444707, -18866.57488933, -18898.58752783,\n", " -19840.54997481, -22240.82282471]),\n", " 'split3_test_score': array([-16215.82422144, -16165.71300515, -16009.92907957, -15550.51162626,\n", " -14902.56891045, -14224.68764814, -14080.82716967, -14585.37627633,\n", " -16005.19557452, -18755.50445943]),\n", " 'split4_test_score': array([-20572.76015233, -20554.29563496, -20448.60425832, -20150.60752661,\n", " -19523.02605861, -18717.88201158, -18341.84138676, -19199.52470833,\n", " -20694.08099187, -22360.81927817]),\n", " 'split5_test_score': array([-22422.67103868, -22194.15170299, -21789.64016355, -21122.89650665,\n", " -20545.06228844, -19923.82378969, -19456.43283809, -19705.32368485,\n", " -20822.52847941, -22857.00430144]),\n", " 'split6_test_score': array([-20644.3925863 , -20509.2302733 , -20175.79674405, -19487.9008511 ,\n", " -18828.08109322, -18199.96520091, -17669.65230276, -17849.52831649,\n", " -18778.54675768, -21355.37693723]),\n", " 'split7_test_score': array([-21914.69307171, -21907.41248813, -21830.14252256, -21500.09999228,\n", " -20885.81482072, -20067.96059518, -19213.33300651, -18493.30959239,\n", " -18566.22147926, -19910.78227227]),\n", " 'split8_test_score': array([-21055.49087205, -21005.26491197, -20866.78602588, -20607.30434511,\n", " -20285.52475287, -19972.25539463, -19994.69035467, -20819.55284724,\n", " -21696.29477714, -23211.57963544]),\n", " 'split9_test_score': array([-24802.52242674, -24697.42185984, -24372.73862675, -23594.76068099,\n", " -22330.42876448, -21144.65673797, -20988.27076951, -21941.85250029,\n", " -22279.78880423, -21872.73786844]),\n", " 'mean_test_score': array([-21054.50850372, -20969.37997165, -20749.61537698, -20263.10671498,\n", " -19560.92588292, -18790.40732133, -18330.32137884, -18584.22075084,\n", " -19448.43312909, -21247.01173021]),\n", " 'std_test_score': array([2024.11365696, 2007.83580036, 1975.2723976 , 1928.5376014 ,\n", " 1855.26088174, 1827.79694374, 1869.50307669, 2052.64854701,\n", " 1901.68797941, 1432.0601566 ]),\n", " 'rank_test_score': array([ 9, 8, 7, 6, 5, 3, 1, 2, 4, 10], dtype=int32)}" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# look at the grid search outcome\n", "gs.cv_results_" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='median')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   'GrLivAr...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=21.544346900318846))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " 'GrLivAr...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=21.544346900318846))])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# visualize the search grid\n", "def plot_cv_results(res, confidence=0.95):\n", " n = len(res['mean_test_score'])\n", " sem = scipy.stats.sem(res['mean_test_score'])\n", " t = scipy.stats.t.ppf((1 + confidence) / 2., n-1)\n", " plt.errorbar(x=range(n), y=-res['mean_test_score'], yerr=t*sem, linetype=None)\n", " plt.xlabel('param group')\n", " plt.ylabel('MAE')\n", " \n", "plot_cv_results(gs.cv_results_)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter group 0: {'estimator__alpha': 0.01}\n", "\tMean score: 21054.51\n", "\t95% CI: (19528.22, 22580.80)\n", "------------------------------\n", "Parameter group 1: {'estimator__alpha': 0.03593813663804628}\n", "\tMean score: 20969.38\n", "\t95% CI: (19455.37, 22483.39)\n", "------------------------------\n", "Parameter group 2: {'estimator__alpha': 0.1291549665014884}\n", "\tMean score: 20749.62\n", "\t95% CI: (19260.16, 22239.07)\n", "------------------------------\n", "Parameter group 3: {'estimator__alpha': 0.464158883361278}\n", "\tMean score: 20263.11\n", "\t95% CI: (18808.89, 21717.33)\n", "------------------------------\n", "Parameter group 4: {'estimator__alpha': 1.6681005372000592}\n", "\tMean score: 19560.93\n", "\t95% CI: (18161.96, 20959.89)\n", "------------------------------\n", "Parameter group 5: {'estimator__alpha': 5.994842503189409}\n", "\tMean score: 18790.41\n", "\t95% CI: (17412.15, 20168.66)\n", "------------------------------\n", "Parameter group 6: {'estimator__alpha': 21.544346900318846}\n", "\tMean score: 18330.32\n", "\t95% CI: (16920.62, 19740.02)\n", "------------------------------\n", "Parameter group 7: {'estimator__alpha': 77.42636826811278}\n", "\tMean score: 18584.22\n", "\t95% CI: (17036.42, 20132.03)\n", "------------------------------\n", "Parameter group 8: {'estimator__alpha': 278.2559402207126}\n", "\tMean score: 19448.43\n", "\t95% CI: (18014.46, 20882.41)\n", "------------------------------\n", "Parameter group 9: {'estimator__alpha': 1000.0}\n", "\tMean score: 21247.01\n", "\t95% CI: (20167.16, 22326.86)\n" ] } ], "source": [ "# print stats for each parameter group\n", "def analyze_cv_results(cv_results):\n", " split_results = np.vstack([val for key, val in cv_results.items() if 'split' in key])\n", " \n", " for ix, p in enumerate(cv_results['params']): \n", " if ix>0:\n", " print('-'*30)\n", " print(f\"Parameter group {ix}:\", p)\n", " mu, (lo, hi) = mean_confidence_interval(-split_results[:,ix])\n", " print(f\"\\tMean score: {mu:0.2f}\")\n", " print(f\"\\t95% CI: ({lo:0.2f}, {hi:0.2f})\")\n", "\n", "analyze_cv_results(gs.cv_results_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get the best mean performance for parameter group 6 with alpha=21.54." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Searching over multiple parameters simultaneously" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Often we will want to search over multiple parameters at the same time. This is easy." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 10 folds for each of 15 candidates, totalling 150 fits\n" ] }, { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   '...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=21.54))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " '...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=21.54))])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "param_grid = {\n", " 'preproc__numeric__fill_na__strategy': ['mean', 'median', 'most_frequent'],\n", " 'preproc__categorical__encode__min_frequency': [1, 2, 3, 4, 5],\n", " 'estimator__alpha': [21.54]\n", "}\n", "cv = KFold(10, shuffle=True)\n", "gs = GridSearchCV(pipe, param_grid, cv=cv, n_jobs=10, scoring='neg_mean_absolute_error', verbose=True)\n", "gs.fit(X_train, y_train)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_cv_results(gs.cv_results_)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter group 0: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 1, 'preproc__numeric__fill_na__strategy': 'mean'}\n", "\tMean score: 18340.20\n", "\t95% CI: (16399.35, 20281.04)\n", "------------------------------\n", "Parameter group 1: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 1, 'preproc__numeric__fill_na__strategy': 'median'}\n", "\tMean score: 18326.99\n", "\t95% CI: (16385.40, 20268.58)\n", "------------------------------\n", "Parameter group 2: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 1, 'preproc__numeric__fill_na__strategy': 'most_frequent'}\n", "\tMean score: 18295.73\n", "\t95% CI: (16332.00, 20259.46)\n", "------------------------------\n", "Parameter group 3: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na__strategy': 'mean'}\n", "\tMean score: 18296.74\n", "\t95% CI: (16344.75, 20248.73)\n", "------------------------------\n", "Parameter group 4: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na__strategy': 'median'}\n", "\tMean score: 18283.10\n", "\t95% CI: (16330.26, 20235.94)\n", "------------------------------\n", "Parameter group 5: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na__strategy': 'most_frequent'}\n", "\tMean score: 18253.03\n", "\t95% CI: (16278.90, 20227.17)\n", "------------------------------\n", "Parameter group 6: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 3, 'preproc__numeric__fill_na__strategy': 'mean'}\n", "\tMean score: 18321.84\n", "\t95% CI: (16400.77, 20242.91)\n", "------------------------------\n", "Parameter group 7: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 3, 'preproc__numeric__fill_na__strategy': 'median'}\n", "\tMean score: 18310.43\n", "\t95% CI: (16388.60, 20232.26)\n", "------------------------------\n", "Parameter group 8: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 3, 'preproc__numeric__fill_na__strategy': 'most_frequent'}\n", "\tMean score: 18284.16\n", "\t95% CI: (16345.99, 20222.33)\n", "------------------------------\n", "Parameter group 9: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 4, 'preproc__numeric__fill_na__strategy': 'mean'}\n", "\tMean score: 18341.43\n", "\t95% CI: (16408.15, 20274.72)\n", "------------------------------\n", "Parameter group 10: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 4, 'preproc__numeric__fill_na__strategy': 'median'}\n", "\tMean score: 18329.76\n", "\t95% CI: (16396.56, 20262.96)\n", "------------------------------\n", "Parameter group 11: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 4, 'preproc__numeric__fill_na__strategy': 'most_frequent'}\n", "\tMean score: 18301.13\n", "\t95% CI: (16352.43, 20249.83)\n", "------------------------------\n", "Parameter group 12: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 5, 'preproc__numeric__fill_na__strategy': 'mean'}\n", "\tMean score: 18360.32\n", "\t95% CI: (16429.25, 20291.39)\n", "------------------------------\n", "Parameter group 13: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 5, 'preproc__numeric__fill_na__strategy': 'median'}\n", "\tMean score: 18348.10\n", "\t95% CI: (16416.62, 20279.58)\n", "------------------------------\n", "Parameter group 14: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 5, 'preproc__numeric__fill_na__strategy': 'most_frequent'}\n", "\tMean score: 18320.57\n", "\t95% CI: (16373.19, 20267.95)\n" ] } ], "source": [ "analyze_cv_results(gs.cv_results_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It looks like the model prefers 'most_frequent' imputation with a OneHotEncoder min frequency of 2. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Searching over different transformers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try something a little more drastic. What if we were to replace the imputation approach altogether with a the KNNImputer that we saw earlier in the workshop?\n", "\n", "Before, we used GridSearchCV to scan possible values for a parameter in one of our transforms. We can also scan over different transform objects. " ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='median')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   'GrLivAr...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=1))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " 'GrLivAr...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=1))])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 10 folds for each of 2 candidates, totalling 20 fits\n" ] }, { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   '...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', Ridge(alpha=21.54))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " '...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', Ridge(alpha=21.54))])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.impute import KNNImputer\n", "param_grid = {\n", " # before: 'preproc__numeric__fill_na__strategy': ['mean', 'median', 'most_frequent'],\n", " 'preproc__numeric__fill_na': [SimpleImputer(strategy='most_frequent'), KNNImputer(n_neighbors=20, weights=\"uniform\")],\n", " 'preproc__categorical__encode__min_frequency': [2],\n", " 'estimator__alpha': [21.54]\n", "}\n", "\n", "gs = GridSearchCV(pipe, param_grid, cv=cv, n_jobs=10, scoring='neg_mean_absolute_error', verbose=True)\n", "gs.fit(X_train, y_train)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_cv_results(gs.cv_results_)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter group 0: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 18322.53\n", "\t95% CI: (15369.93, 21275.13)\n", "------------------------------\n", "Parameter group 1: {'estimator__alpha': 21.54, 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': KNNImputer(n_neighbors=20)}\n", "\tMean score: 18340.86\n", "\t95% CI: (15379.45, 21302.27)\n" ] } ], "source": [ "analyze_cv_results(gs.cv_results_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can't distinguish between these two approaches. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Searching different estimators\n", "Just like we could search over different transforms, we can search over different estimators. " ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 10 folds for each of 3 candidates, totalling 30 fits\n" ] }, { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   '...\n",
       "                                                   'Neighborhood', 'Condition1',\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('estimator', GradientBoostingRegressor())])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " '...\n", " 'Neighborhood', 'Condition1',\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('estimator', GradientBoostingRegressor())])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n", " \n", "param_grid = {\n", " 'preproc__numeric__fill_na': [SimpleImputer(strategy='most_frequent')],\n", " 'preproc__categorical__encode__min_frequency': [2],\n", " 'estimator': [Ridge(alpha=21.54), RandomForestRegressor(), GradientBoostingRegressor()]\n", "}\n", "\n", "gs = GridSearchCV(pipe, param_grid, cv=cv, n_jobs=10, scoring='neg_mean_absolute_error', verbose=True)\n", "gs.fit(X_train, y_train)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_cv_results(gs.cv_results_)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter group 0: {'estimator': Ridge(alpha=21.54), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 17885.12\n", "\t95% CI: (16272.11, 19498.13)\n", "------------------------------\n", "Parameter group 1: {'estimator': RandomForestRegressor(), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 17662.02\n", "\t95% CI: (16542.67, 18781.37)\n", "------------------------------\n", "Parameter group 2: {'estimator': GradientBoostingRegressor(), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 16056.59\n", "\t95% CI: (15043.17, 17070.01)\n" ] } ], "source": [ "analyze_cv_results(gs.cv_results_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Random Forest and Gradient boosting might have an edge, but there's a lot of overlap in the CIs. At this point, one might want to focus on tuning the hyperparameters for the tree-based models." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For now, though, let's see how to implement dimension reduction in our pipeline. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dimension reduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can insert a PCA step into our pipeline. " ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='median')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   'GrLivAr...\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('feature_selection', PCA(n_components=10)),\n",
       "                ('estimator', Ridge(alpha=1))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='median')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " 'GrLivAr...\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('feature_selection', PCA(n_components=10)),\n", " ('estimator', Ridge(alpha=1))])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.decomposition import PCA\n", "\n", "pipe = Pipeline([\n", " ('preproc', preproc),\n", " ('feature_selection', PCA(n_components=10)),\n", " ('estimator', Ridge(alpha=1))\n", "])\n", "\n", "pipe" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 10 folds for each of 11 candidates, totalling 110 fits\n" ] }, { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   '...\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('feature_selection', 'passthrough'),\n",
       "                ('estimator', Ridge(alpha=21.54))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " '...\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('feature_selection', 'passthrough'),\n", " ('estimator', Ridge(alpha=21.54))])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# now lets fit new pipeline and see how it does\n", "# we add a \"passthrough\" to the parameter search\n", "param_grid = {\n", " 'preproc__numeric__fill_na': [SimpleImputer(strategy='most_frequent')],\n", " 'preproc__categorical__encode__min_frequency': [2],\n", " 'feature_selection': [\"passthrough\"] + [PCA(n) for n in range(1,100,10)],\n", " 'estimator__alpha': [21.54]\n", "}\n", "\n", "gs = GridSearchCV(pipe, param_grid, cv=cv, n_jobs=10, scoring='neg_mean_absolute_error', verbose=True)\n", "gs.fit(X_train, y_train)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_cv_results(gs.cv_results_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The passthrough variant outperforms all of the PCA variants. Let's try a different feature selection approach. " ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_selection import SelectKBest\n", "from sklearn.feature_selection import f_classif" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 10 folds for each of 6 candidates, totalling 60 fits\n" ] }, { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   '...\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('feature_selection', 'passthrough'),\n",
       "                ('estimator', Ridge(alpha=21.54))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " '...\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('feature_selection', 'passthrough'),\n", " ('estimator', Ridge(alpha=21.54))])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# now lets fit new pipeline and see how it does\n", "# we add a \"passthrough\" to the parameter search\n", "param_grid = {\n", " 'preproc__numeric__fill_na': [SimpleImputer(strategy='most_frequent')],\n", " 'preproc__categorical__encode__min_frequency': [2],\n", " 'feature_selection': [\"passthrough\"] + [SelectKBest(f_classif, k=k) for k in range(1, 200, 40)],\n", " 'estimator__alpha': [21.54]\n", "}\n", "\n", "gs = GridSearchCV(pipe, param_grid, cv=cv, n_jobs=10, scoring='neg_mean_absolute_error', verbose=True)\n", "gs.fit(X_train, y_train)\n", "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter group 0: {'estimator__alpha': 21.54, 'feature_selection': 'passthrough', 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 18313.82\n", "\t95% CI: (15610.21, 21017.43)\n", "------------------------------\n", "Parameter group 1: {'estimator__alpha': 21.54, 'feature_selection': SelectKBest(k=1), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 56349.52\n", "\t95% CI: (52760.24, 59938.79)\n", "------------------------------\n", "Parameter group 2: {'estimator__alpha': 21.54, 'feature_selection': SelectKBest(k=41), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 21874.57\n", "\t95% CI: (19566.05, 24183.08)\n", "------------------------------\n", "Parameter group 3: {'estimator__alpha': 21.54, 'feature_selection': SelectKBest(k=81), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 19809.51\n", "\t95% CI: (17204.10, 22414.92)\n", "------------------------------\n", "Parameter group 4: {'estimator__alpha': 21.54, 'feature_selection': SelectKBest(k=121), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 19531.81\n", "\t95% CI: (17051.55, 22012.07)\n", "------------------------------\n", "Parameter group 5: {'estimator__alpha': 21.54, 'feature_selection': SelectKBest(k=161), 'preproc__categorical__encode__min_frequency': 2, 'preproc__numeric__fill_na': SimpleImputer(strategy='most_frequent')}\n", "\tMean score: 19106.24\n", "\t95% CI: (16654.09, 21558.40)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEGCAYAAABPdROvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAp3klEQVR4nO3deXxV9Z3/8dcnC2HfwyJBg7LJUheig9W2KlVBVLAPHXGmlf6GGRx1pnaZaVFqq61YnS4u7WiltRXtotS6MFbccK+IDVZliUjYJIAkgEDYQpbP74/7jdyEkAD33pzc5P18PO7jnvu553vO52jIJ2f9mLsjIiJytDKiTkBERNKbComIiCREhURERBKiQiIiIglRIRERkYRkRZ1Ac+vdu7fn5+dHnYaISFpZvHjxFnfPbei7NldI8vPzKSwsjDoNEZG0YmbrDvWdDm2JiEhCVEhERCQhKiQiIpIQFRIREUmIComIiCREhURERBKiQiIiIglRIRERkYSokMghXXH/Qq64f2HUaYhIC6dCIiIiCVEhERGRhKSskJjZMDN7N+6108y+bmY9zewFM1sZ3nvEjbnBzIrNbIWZXRAXH2NmS8J395iZhXiOmT0a4ovMLD9V2yMiIg1LWSFx9xXufrK7nwyMAfYATwAzgAXuPgRYED5jZiOAKcBIYDxwr5llhsXdB0wHhoTX+BCfBnzi7oOBO4E7UrU9IiLSsOY6tDUOWOXu64BJwJwQnwNMDtOTgEfcvcLd1wDFwOlm1h/o6u4L3d2Bh+qNqV3WY8C42r0VERFpHs1VSKYAfwzTfd19E0B47xPiA4D1cWNKQmxAmK4frzPG3auAHUCv+is3s+lmVmhmhWVlZUnZIBERiUl5ITGzdsAlwJ+amrWBmDcSb2xM3YD7bHcvcPeC3NwG+7KIiMhRao49kgnAO+6+OXzeHA5XEd5LQ7wEGBg3Lg/YGOJ5DcTrjDGzLKAbsC0F2yAiIofQHIXkSg4c1gKYB0wN01OBp+LiU8KVWIOInVR/Oxz+KjezseH8x1X1xtQu6zLgpXAeRUREmklKW+2aWUfgPODquPDtwFwzmwZ8BFwO4O7LzGwusByoAq5z9+ow5hrgQaADMD+8AB4AHjazYmJ7IlNSuT0iInKwlBYSd99DvZPf7r6V2FVcDc0/C5jVQLwQGNVAfB+hEImISDR0Z7uIiCREhURERBKiQiIiIglRIRERkYSokIiISEJUSEREJCEqJCIikhAVEhERSYgKiYiIJESFREREEqJCIiIiCVEhERGRhKiQiIhIQlRIREQkISokIiKSEBUSERFJiAqJiIgkRIVEREQSokIiIiIJSWkhMbPuZvaYmX1gZkVmdoaZ9TSzF8xsZXjvETf/DWZWbGYrzOyCuPgYM1sSvrvHzCzEc8zs0RBfZGb5qdweERE5WKr3SO4GnnX34cBJQBEwA1jg7kOABeEzZjYCmAKMBMYD95pZZljOfcB0YEh4jQ/xacAn7j4YuBO4I8XbIyIi9aSskJhZV+DzwAMA7r7f3bcDk4A5YbY5wOQwPQl4xN0r3H0NUAycbmb9ga7uvtDdHXio3pjaZT0GjKvdWxERkeaRyj2S44Ey4Ldm9ncz+7WZdQL6uvsmgPDeJ8w/AFgfN74kxAaE6frxOmPcvQrYAfRKzeaIiEhDUllIsoBTgfvc/RRgN+Ew1iE0tCfhjcQbG1N3wWbTzazQzArLysoaz1pERI5IKgtJCVDi7ovC58eIFZbN4XAV4b00bv6BcePzgI0hntdAvM4YM8sCugHb6ifi7rPdvcDdC3Jzc5OwaSIiUitlhcTdPwbWm9mwEBoHLAfmAVNDbCrwVJieB0wJV2INInZS/e1w+KvczMaG8x9X1RtTu6zLgJfCeRQREWkmWSle/n8CvzezdsBq4P8RK15zzWwa8BFwOYC7LzOzucSKTRVwnbtXh+VcAzwIdADmhxfETuQ/bGbFxPZEpqR4e0REpJ6UFhJ3fxcoaOCrcYeYfxYwq4F4ITCqgfg+QiESEZFo6M52ERFJiAqJiIgkRIVEREQSokIiIiIJSfVVW5LGPtmzn/J9Vbg7evKMiByK9kikQTv2VrK6bDebduzjyXc3RJ2OiLRgKiTSoP99uZiqGqd9dga3Pl3E9j37o05JRFooFRI5yLqtu3nwr2vp3bkdg3M7s31vJXc8+0HUaYlIC6VCIge549kPyMwwBvboSKecLP7lzHz++PZ6Ctce9BgzEREVEqnrb2u38cySj/n3L5xAu6zYj8fXvziUY7q1Z+YTS6msrok4QxFpaVRI5FM1Nc6tTy+nX9f2/NvnB30a75STxS2TRrFiczm/fn1NhBmKSEukQiKfmvfeRt4r2cF/XzCMju3qXhl+3oi+nD+iL3cv+JD12/ZElKGItEQqJALA3v3V3PHsB4wa0JVLTxnQ4Dw3XzKSTDO+99RS9LR+EamlQiIAPPDGajbt2Md3J44gI6Phmw+P6d6Bb5w3lJdXlDF/6cfNnKGItFQqJEJp+T7ufWUVF4zsy9jjG295/9XP5jOif1du+b9llO+rbKYMRaQlUyERfvb8h1RW1zBjwolNzpuVmcFtXxpNaXkFP33+w2bITkRaOhWSNm75xp08Wrieq87IZ1DvToc15uSB3fnK2OOYs3At75dsT22CItLiqZC0Ye7OrGeW061DNl87d8gRjf2vC4aR2zmHG59YQpXuLRFp01RI2rCXV5Ty1+KtXD9uCN06Zh/R2K7ts/nexSNYumEnDy1cl6IMRSQdqJC0UZXVNdz6lyKO792JL4897qiWMXF0f74wNJefPr+CTTv2JjlDEUkXKS0kZrbWzJaY2btmVhhiPc3sBTNbGd57xM1/g5kVm9kKM7sgLj4mLKfYzO6x0BzDzHLM7NEQX2Rm+ancntbkD4s+YnXZbm688ESyM4/ux8DM+OGkUVTVOLfMW57kDEUkXTTHHsk57n6yuxeEzzOABe4+BFgQPmNmI4ApwEhgPHCvmWWGMfcB04Eh4TU+xKcBn7j7YOBO4I5m2J60t2NPJXe9+CGfPaEX407sk9Cyju3Vka+NG8Kzyz5mQdHmJGUoIukkikNbk4A5YXoOMDku/oi7V7j7GqAYON3M+gNd3X2hx26nfqjemNplPQaMM7Xya9IvXl7J9r2VzJx4YlI6H/7b545nSJ/OfO+pZezZX5WEDEUknaS6kDjwvJktNrPpIdbX3TcBhPfaP4kHAOvjxpaE2IAwXT9eZ4y7VwE7gIPuqDOz6WZWaGaFZWVlSdmwdLVu624efHMtl4/JY+Qx3ZKyzHZZsXtLNmzfy90LViZlmSKSPlJdSM5091OBCcB1Zvb5RuZt6E9jbyTe2Ji6AffZ7l7g7gW5ublN5dyq3T7/A7IzM/jW+cOSutzT8ntyRcFAHnh9DR98vDOpyxaRli2lhcTdN4b3UuAJ4HRgczhcRXgvDbOXAAPjhucBG0M8r4F4nTFmlgV0A9R96RDeXrON+UtjvUb6dm2f9OXPmDCcrh2yufHxJdTU6KGOIm1FygqJmXUysy6108D5wFJgHjA1zDYVeCpMzwOmhCuxBhE7qf52OPxVbmZjw/mPq+qNqV3WZcBLrsfSNqimxrn1L6HXyOeOT8k6enRqx8wLT+Sdj7bzyN/WNz1ARFqFrKZnOWp9gSfCydws4A/u/qyZ/Q2Ya2bTgI+AywHcfZmZzQWWA1XAde5eHZZ1DfAg0AGYH14ADwAPm1kxsT2RKSncnrT21HsbeL9kBz/7x5Po0C6z6QFH6UunDuBPi9dz+/wizhvRl9wuOSlbl4i0DCkrJO6+GjipgfhWYNwhxswCZjUQLwRGNRDfRyhEcmh791fzP8+uYPSAbkw+ueFeI8liZtw6eTQT7n6NWX9Zzl1TTknp+kQkerqzvQ349eu1vUZOPGSvkWQa3Kcz13zhBJ58dyNvrNyS8vWJSLRUSFq50p37uO/VVYwf2Y9/aKLXSDJde85g8nt15KanlrKvsrrpASKStlRIWrmfhl4jN1w4vFnX2z47k1snj2bNlt3c+8qqZl23iDQvFZJWbPnGncxdvJ6vfjaf43odXq+RZDprSG8mnXwMv3xlFavKdjX7+kWkeaiQtFLusct9u3fI5j+OsNdIMn134gjaZ2cw84kl6MpskdZJhaSVWlBUypurtvL1Lw6lW4cj6zWSTLldcvjOhOG8tXobj7+zIbI8RCR1VEhaocrqGm57pojjczvxT/9wbNTpcOVpx3Lqsd2Z9UwRn+zeH3U6IpJkKiSt0O/fWsfqLbuZmUCvkWTKyDBmXTqaHXsruX3+B1GnIyJJFv1vGUmqHXsquWvBSs4c3ItzhyfWaySZTuzflX89axCPFq7n7TV6HJpIa6JC0sr8/KWV7NhbycwLRySl10gyXf/FIQzo3oGZTyxhf1VN1OmISJKokLQia7fsZs7CtfzjmIGMOKZr1OkcpGO7LH4waSQrS3fxq9dXR52OiCSJCkkrcqDXyNCoUzmkcSf2ZfzIftyzYCUfbd0TdToikgQqJK3EotVbeXbZx1zzhRPok4JeI8n0/UtGkJVh3PTUUt1bItIKqJC0ArFeI0X079aef01Rr5Fk6t+tA986fxivfljGX5ZsijodEUmQCkkr8OS7G1iyYQffGT88pb1GkmnqZ/MZNaArt/zfcnbuq4w6HRFJgApJmqvtNXJSXjcuOemYqNM5bJkZxm2Xjmbrrgp++tyKqNMRkQSokKS5X72+mo937uO7F41oll4jyfSZvO5cdUY+D721jvfWb486HRE5SiokaWzzzn3c98oqLhzdj9Pye0adzlH51vlD6dMlhxufWEJVte4tEUlHKiRp7CfPraC6xvnO+ObtNZJMXdpn8/2LR7Js407mLFwXdToichRSXkjMLNPM/m5mT4fPPc3sBTNbGd57xM17g5kVm9kKM7sgLj7GzJaE7+6xcMu2meWY2aMhvsjM8lO9PS3F0g07eOydEr56ZjS9RpJpwqh+nDMsl589v4JNO/ZGnY6IHKHm2CO5HiiK+zwDWODuQ4AF4TNmNgKYAowExgP3mlntJUj3AdOBIeE1PsSnAZ+4+2DgTuCO1G5Ky+DuzPpLEd07ZHPdOYOjTidhZsYPJo2i2p2b5y2LOh0ROUIpLSRmlgdMBH4dF54EzAnTc4DJcfFH3L3C3dcAxcDpZtYf6OruCz1299pD9cbULusxYJy1tAdMpcCLRaUsXL2Vb5yX2l4jj159Bo9efUbKlh9vYM+OfG3cEJ5btpkXl29ulnWKSHI0WkjM7JAPbDKzw2l0cRfwbSD+LGpfd98EEN5rH1E7AFgfN19JiA0I0/Xjdca4exWwA+jVQK7TzazQzArLysoOI+2Wa39VrNfICbmduPL06HuNJNO/fe54hvbtzPfnLWPP/qqo0xGRw9TUHskrtRNmtqDed082NtDMLgJK3X3xYebS0J6ENxJvbEzdgPtsdy9w94Lc3NzDTKdl+v2idazZspuZE1tGr5Fkys7M4LZLR7Nh+17uenFl1OmIyGFq6jdR/C/q+teXNnUI6UzgEjNbCzwCnGtmvwM2h8NVhPfSMH8JMDBufB6wMcTzGojXGWNmWUA3oNU2u9i+Zz93vbiSswb35pxhLafXSDIV5PdkymkDeeCNNSzfuDPqdETkMDRVSPwQ0w19rvul+w3unufu+cROor/k7l8G5gFTw2xTgafC9DxgSrgSaxCxk+pvh8Nf5WY2Npz/uKremNplXRbW0WqfAvjzl4op31fJzIkntrheI8k0Y8JwunfIZuaTS6ipabX/O0Vajawmvu9jZt8ktvdRO034fLTHiG4H5prZNOAj4HIAd19mZnOB5UAVcJ27V4cx1wAPAh2A+eEF8ADwsJkVE9sTmXKUObV4a7bs5qGFa7nitIGc2L/l9RpJpu4d2zFz4ol8c+57/OHtj/jy2OOiTklEGmGN/QFvZt9vbLC735L0jFKsoKDACwsLo07jiF39cCFvrNzCy/99Nn26tOzHxCeDu/PPv17Ekg07WPCtL7SJbRZpycxssbsXNPRdo3skjRUKMzst0cTk8Ly1eivPLdvMf18wrM38QjUzfjh5FBPuep1bny7initPiTolETmEI7rsx8xGmNkPzGwlsZsEJcVivUaWc0y39kw7a1DU6TSrE3I7c83ZJzDvvY289mHzXLZ9xf0LueL+hc2yLpHWoslCYmbHmdkMM3sPeBi4FjjvULs4klxP/H0DSzfs5DsThtM+Oz16jSTTNWefwKDenbjpqaXsq6xueoCINLumbkh8E3gGyAYuc/cxQLm7r22G3Nq8Pfur+J/nPuCkgd25+DPp02skmdpnZzJr8ijWbd3D/75cHHU6ItKApvZIyoAuQF8OXKWl6zGbyezXVrN5ZwU3TTwx7XqNJNNnB/fm0lMG8MtXV1FcWh51OiJST6OFxN0nAaOBd4BbzGwN0MPMTm+O5Nqyj3fs4/5XVzNxdH8K0rTXSDLNnHgiHdtlMfOJpbTiW4VE0lKT50jcfYe7/8bdzwPGAt8H7jKz9U0MlQT85Pn07zWSTL075zBjwnAWrdnGY4tLmh4gIs3miK7acvfN7n6Pu38WOCtFObV5Szfs4M/vlPD/zszn2F4do06nxbiiYCAFx/XgtmeK2LZ7f9TptBq6Uk0S1eh9JGY2r4nxlyQxFyF2I96tf1lOj47tuO7c9O81kkwZGcasS0cz8Z7X+dEzRfz48pOiTknSVG3hbK42Ca1dU49IOYPYY9r/CCyi6Qc1SoJeWL6Zt1Zv44eTR9G1fep6jaSrYf268K+fO55fvrqKy8bk8Q/HH9Q1QEQakMri2dShrX7AjcAo4G7gPGCLu7/q7q8mPZs2bn9VDT+a/wGD+3TmytMGNj2gjbp+3BDyenRg5pNL2V9V0/QAEUmppq7aqnb3Z919KrET7cXAK2b2n82SXQvSHMeRf/fWgV4jWa2s10gydWiXyQ8njaK4dBe/en111OmItHmHc2d7jpl9CfgdcB1wD/B4qhNra7bv2c/dC1byuSG9OXtoejffag7nDO/DhaP7cc+ClazbujvqdETatKbubJ8DvAmcCtzi7qe5+w/dfUOzZNeG3LOgbfQaSabvXzyS7MwMbnpqme4tEYlQU3skXwGGAtcDb5rZzvAqNzO1r0uS1WW7Qq+RYxner3X3Gkmmvl3b81/nD+W1D8t4+v1NUacj0mY1dY4kw927hFfXuFcXd9dvvCS5ff4H5GRl8M3zhkadStr5yhn5jB7QjR88vZwdeyujTkekTdIZ3YgtXLWV55dv5tpzBpPbJSfqdNJOZoZx26Wj2bqrgp88tyLqdETaJBWSCFWHXiMDundoc71Gkml0XjeuOiOf3y1ax7vrt0edjkibo0ISocffKWHZxp18e/ywNtlrJJm+df5Q+nTJ4cbHl1BVrXtLRJqTCklE9uyv4sfPreDkgd255KS22Wskmbq0z+bmi0eyfNNOHnxzbdTpiLQpKSskZtbezN42s/fMbJmZ3RLiPc3sBTNbGd57xI25wcyKzWyFmV0QFx9jZkvCd/dYuD423OPyaIgvMrP8VG1Pst3/6mpKyyu46SJd7pss40f149zhffjZCx+yYfveqNMRaTNSuUdSAZzr7icBJwPjzWwsMANY4O5DgAXhM2Y2ApgCjATGA/eaWe3xnvuA6cCQ8Bof4tOAT9x9MHAncEcKtydpPt6xj/tfW8VFn+nPmOPUayRZzIxbLhlJjTs3z1sWdToibUbKConH7Aofs8PLgUnAnBCfA0wO05OAR9y9wt3XEHscy+lm1h/o6u4LPXbX2UP1xtQu6zFgnKXBn/c/fm4FNY56jaTAwJ4d+foXh/LC8s08v+zjqNMRaRNSeo7EzDLN7F2gFHjB3RcBfd19E0B47xNmH0DsScO1SkJsQJiuH68zxt2rgB3AQY+DNbPpZlZoZoVlZWVJ2rqjs6Qk1mvkX84cxMCe6jWSCtPOGsTwfl24ed4ydldURZ2OSKuX0kISHvp4MpBHbO9iVCOzN7Qn4Y3EGxtTP4/Z7l7g7gW5udE9x6q210ivTu249pwTIsujtcvOzGDWpaPYuGMfd77wYdTpiLR6zXLVlrtvB14hdm5jczhcRXgvDbOVAPHPTs8DNoZ4XgPxOmPMLAvoBmxLxTYkw/PLN7NozTa+cd5Q9RpJsTHH9eTK04/lt2+uZdnGHVGnI9KqpfKqrVwz6x6mOwBfBD4A5gFTw2xTgafC9DxgSrgSaxCxk+pvh8Nf5WY2Npz/uKremNplXQa85C306X37q2r40TNFDOnTmSnqNdIsZowfTo+O2dz4xFKqa1rkj4VIq5DKPZL+wMtm9j7wN2LnSJ4GbgfOM7OVxBpl3Q7g7suAucBy4FngOnevDsu6Bvg1sRPwq4D5If4A0MvMioFvEq4Aa4kefmsda7fuUa+RZtStYzbfnTiC99Zv5w+L1kWdjkir1VSr3aPm7u8DpzQQ3wqMO8SYWcCsBuKFxLo01o/vAy5PONkU275nP/csWMnnh+Zy9rA+TQ+QpJl08jE8triE/3l2BReM7Eefru2jTkmk1dGfxs3g7gUrY71GLjwx6lTaHDPjh5NHUVFdww+eXh51OiKtkgpJiq0q28XDC9cx5fRjGdavS9TptEmDenfiurMH8/T7m3j1w2gv/xZpjVRIUuxHz3xA++xMvvFF9RqJ0r+ffTzH53bipieXsq+yuukBInLYVEhS6M3iLbxYtJlrzzlBvUYilpOVya2TR/HRtj384qXiqNMRaVVUSFIk1mukiAHdO/AvZ6rXSEvw2RN686VTB3D/a6soLi2POh2RVkOFJEX+/E4JyzftZMaE4eo10oLMvPBEOuVkceMTS2mhtxyJpB0VkhTYXVHFT55bwSnHdueiz/SPOh2J06tzDjdMGM7ba7bxp8UlTQ8QkSapkKTA/a/V9hoZoV4jLdDlYwZyWn4PfvRMEdt27486HZG0p0KSZJt27GX2a6u4+KRjOPXYHk0PkGaXkWHMunQ05fuquO2ZoqjTEUl7KiRJVttr5NsXDIs6FWnE0L5dmP7543lscQlvrd4adToiaU2FJIneL9nO4+9sYNpZ6jWSDv7z3CEM7NmBmU8soaJK95aIHC0VkiSJ9RopivUaOVu9RtJBh3aZ/GDSKFaV7Wb2q6ujTkckbamQJMlzyzbz9pptfPP8oXRRr5G0cc6wPkwc3Z+fv1zM2i27o05HJC2pkCTB/qoafjS/iKF9O3NFgXqNpJvvXTyCnMwMbnpK95aIHA0VkiR4aOFa1m3dw8yJI9RrJA317dqe/7pgGK+v3MJWXQ4scsT0Wy9Bn+yO9Ro5e1guXxgaXT94ScyXxx7HZ/K68dG2PVRV10SdjkhaSVljq7bi7gUr2b2/Wr1G0lxmhnHbpaO56Odv8MHH5dz05FL6dMmhT9cccrvk0KdLe/p0yaFX5xwyM3STqUg8FZIEFJfu4uG31nHl6QMZ0le9RtLdqAHdOK5nR0rLK5j33kZ27K08aJ4Mg56dcg4Umc6x9z5d2oeCc2C6Qzs9Y03aBhWSBNw+v4iO2Zl8Xb1GWo1+3drTr1t7Hr36DPZVVrNlVwWl5RWU7qygbFcFZTv3UVpeQVl5LF60aSdbdu2nuubgk/RdcrLI/bTYtA9FJm4PJ3zXvWO2HqUjaS1lhcTMBgIPAf2AGmC2u99tZj2BR4F8YC3wj+7+SRhzAzANqAa+5u7PhfgY4EGgA/AMcL27u5nlhHWMAbYCV7j72lRtU7y/Fm/hxaJSZkwYTu/O6jXSGrXPziSvR0fyejR+c2lNjbNtz35Kd1ZQWr7v0yJT9mnB2cf7Jdsp3VnB3gaaarXLzCC3Sw69P92jqXs4LTfs/fTunEO2LuaQFiiVeyRVwLfc/R0z6wIsNrMXgK8CC9z9djObAcwAvmNmI4ApwEjgGOBFMxvq7tXAfcB04C1ihWQ8MJ9Y0fnE3Qeb2RTgDuCKFG4TcKDXSF6PDnz1s/mpXp20cBkZRu/OsV/0I+ja6Ly7Kqoo3Xmg2JSWHyg+ZeUVfLR1D4vXfdLgwyTNoGfHduTGFZpPD6fV2/PplKODDdJ8UvbT5u6bgE1hutzMioABwCTg7DDbHOAV4Dsh/oi7VwBrzKwYON3M1gJd3X0hgJk9BEwmVkgmATeHZT0G/MLMzFN8M8CfF5dQtGknv/inU9RrRI5I55wsOud25vjczo3Ot7+qhi27KuIKTlzx2VlBWfk+VpXuomxXBZXVB/+4d2yXeeB8zSHP5eTQo2O7VG2qtCHN8meLmeUDpwCLgL6hyODum8ysT5htALE9jlolIVYZpuvHa8esD8uqMrMdQC9gS731Tye2R8Oxxx6b0Lbsrqjix8+v4NRjuzNxtHqNSGq0y8rgmO4dOKZ7h0bnq6lxtu+t/PQQWu25nPjDbEUbd/JqeQW7KqoOGp+VYZjFrlo7/85XyczIIDMDMs3IzIi9MszIyoy9Z2ZY3e8yjKwQq53OqDfPp6+4eT5d7qfzQ2ZmRhjHQevMyohbf8ah86gzfyN5VFXXYGbsr6ohO9N0jipBKS8kZtYZ+DPwdXff2cj/sIa+8EbijY2pG3CfDcwGKCgoSGhv5f5XV1FWXsH9XxmjHz6JXEaG0bNTO3p2asewfo1fObhnf9VBezWl5RXMLVxPjcPxvTtTVePUuFNdE/dyp6Ky5pDf1U7X1HideapCrM48LezBAUO/Ox/g0+KTnZlBVqaRlZFBdmasmGVnZpCdEeKZGWRnHIhnZYTYp58PjDswXTsmtozs+HiYL3558Tm0y2r8+9rlZGUY7TIzyIjo0vSUFhIzyyZWRH7v7o+H8GYz6x/2RvoDpSFeAsQ/XyQP2BjieQ3E48eUmFkW0A3YlpKNASqqqpn9+mouUa8RSUMd22VxXK8sjuvVqU588bpPAPjlV8akPAf3WDGpqqmhpoZYkamuW2yq/UBRqg6Fqaq6XoFqoKDVHKJ4NTTPb/+6FnfnitMGUlntVNXUUFXtn05XVjtV1TVUVtdQWRObrqr2OtO7qqrCmFiRraydp97n2uU1hwyjTuGKL1RbyivI69H4Hu7RSuVVWwY8ABS5+8/ivpoHTAVuD+9PxcX/YGY/I3ayfQjwtrtXm1m5mY0ldmjsKuDn9Za1ELgMeCmV50dKPtkb6zUyXr1GRI6GWTiMlRHtucVnl34MwH+cO6RZ1udxRXB/bYGJK1J1i9mBQnSgoB38fXy8sjqukNUcvPyqaufVD8tS9ginVO6RnAl8BVhiZu+G2I3ECshcM5sGfARcDuDuy8xsLrCc2BVf14UrtgCu4cDlv/PDC2KF6uFwYn4bsau+UmJXRRVbdu3n2rNPaPJyUBGReBbO+WRlEtkFOlfcvzBly07lVVtv0PA5DIBxhxgzC5jVQLwQGNVAfB+hEKXarooqsjONa88Z3ByrExFJG7rY/DD169qe3M45dNb1+SIideg22SOgh/WJiBxMhURERBKiQiIiIglRIRERkYSokIiISEJUSEREJCEqJCIikhAVEhERSYgKiYiIJESFREREEqJCIiIiCVEhERGRhKiQiIhIQlRIREQkISokIiKSEBUSERFJiAqJiIgkRIVEREQSokIiIiIJSVkhMbPfmFmpmS2Ni/U0sxfMbGV47xH33Q1mVmxmK8zsgrj4GDNbEr67x8wsxHPM7NEQX2Rm+anaFhERObRU7pE8CIyvF5sBLHD3IcCC8BkzGwFMAUaGMfeaWWYYcx8wHRgSXrXLnAZ84u6DgTuBO1K2JSIickgpKyTu/hqwrV54EjAnTM8BJsfFH3H3CndfAxQDp5tZf6Cruy90dwceqjemdlmPAeNq91ZERKT5NPc5kr7uvgkgvPcJ8QHA+rj5SkJsQJiuH68zxt2rgB1Ar4ZWambTzazQzArLysqStCkiIgIt52R7Q3sS3ki8sTEHB91nu3uBuxfk5uYeZYoiItKQ5i4km8PhKsJ7aYiXAAPj5ssDNoZ4XgPxOmPMLAvoxsGH0kREJMWau5DMA6aG6anAU3HxKeFKrEHETqq/HQ5/lZvZ2HD+46p6Y2qXdRnwUjiPIiIizSgrVQs2sz8CZwO9zawE+D5wOzDXzKYBHwGXA7j7MjObCywHqoDr3L06LOoaYleAdQDmhxfAA8DDZlZMbE9kSqq2RUREDi1lhcTdrzzEV+MOMf8sYFYD8UJgVAPxfYRCJCIi0WkpJ9tFRCRNqZCIiEhCVEhERCQhKiQiIpIQFRIREUlIyq7aEklHj159RtQpiKQd7ZGIiEhCVEhERCQhKiQiIpIQFRIREUmIComIiCREV22JtHFt8Uq1trjNqaQ9EhERSYj2SERE2oBU7oVpj0RERBKiPZLDpGOqIiIN0x6JiIgkRIVEREQSokIiIiIJSftCYmbjzWyFmRWb2Yyo8xERaWvSupCYWSbwv8AEYARwpZmNiDYrEZG2Ja0LCXA6UOzuq919P/AIMCninERE2pR0LyQDgPVxn0tCrA4zm25mhWZWWFZW1mzJiYi0BeleSKyBmB8UcJ/t7gXuXpCbm9sMaYmItB3pXkhKgIFxn/OAjRHlIiLSJpn7QX/Apw0zywI+BMYBG4C/Af/k7ssaGVMGrDvKVfYGthzl2HSlbW4btM1tQyLbfJy7N3hIJ60fkeLuVWb2H8BzQCbwm8aKSBhz1Me2zKzQ3QuOdnw60ja3DdrmtiFV25zWhQTA3Z8Bnok6DxGRtirdz5GIiEjEVEiOzOyoE4iAtrlt0Da3DSnZ5rQ+2S4iItHTHomIiCREhURERBKiQnKY2tpThs3sN2ZWamZLo86luZjZQDN72cyKzGyZmV0fdU6pZGbtzextM3svbO8tUefUXMws08z+bmZPR51LczCztWa2xMzeNbPCpC9f50iaFp4y/CFwHrG76f8GXOnuyyNNLIXM7PPALuAhdx8VdT7Nwcz6A/3d/R0z6wIsBia31v/PZmZAJ3ffZWbZwBvA9e7+VsSppZyZfRMoALq6+0VR55NqZrYWKHD3lNyAqT2Sw9PmnjLs7q8B26LOozm5+yZ3fydMlwNFNPAQ0NbCY3aFj9nh1er/sjSzPGAi8Ouoc2ktVEgOz2E9ZVhaDzPLB04BFkWcSkqFQzzvAqXAC+7eqrc3uAv4NlATcR7NyYHnzWyxmU1P9sJVSA7PYT1lWFoHM+sM/Bn4urvvjDqfVHL3anc/mdgDT083s1Z9GNPMLgJK3X1x1Lk0szPd/VRiTQCvC4euk0aF5PDoKcNtRDhX8Gfg9+7+eNT5NBd33w68AoyPNpOUOxO4JJwzeAQ418x+F21KqefuG8N7KfAEscP1SaNCcnj+Bgwxs0Fm1g6YAsyLOCdJsnDy+QGgyN1/FnU+qWZmuWbWPUx3AL4IfBBpUinm7je4e5675xP7d/ySu3854rRSysw6hYtHMLNOwPlAUq/GVCE5DO5eBdQ+ZbgImNvUU4bTnZn9EVgIDDOzEjObFnVOzeBM4CvE/kp9N7wujDqpFOoPvGxm7xP7Y+kFd28Tl8O2MX2BN8zsPeBt4C/u/mwyV6DLf0VEJCHaIxERkYSokIiISEJUSEREJCEqJCIikhAVEhERSYgKiYiIJESFRCRJzCyrLaxTpD7dRyIShAc1PkvsQY2nEGsdcJW77zGz7wEXAx2AN4Gr3d3N7JXw+UxiTzv4EPgu0A7YCvyzu282s5uBQcRuAhwKfBMYS+zZRxuAi929sl4+pxG70343sUe8T3D3UWb2VWJPr20PdAIuA34DHA/sAaa7+/thnbvc/SdheUuB2kemN7idCf9HlDZJeyQidQ0DZrv7Z4CdwLUh/gt3Py30ZunAgV/IAN3d/Qvu/lNiv/DHuvspxJ7l9O24+U4gVgAmAb8DXnb30cDeEK/vt8C/u/sZQHW9784Aprr7ucAtwN9DzjcCDyWwnSJHTIVEpK717v7XMP074KwwfY6ZLTKzJcC5wMi4MY/GTecBz4X5/rvefPPDXscSIJPYXgHhc358EuEZWF3c/c0Q+kO9PF9w99p+MWcBDwO4+0tALzPrdpTbKXLEVEhE6qp/rNfNrD1wL3BZ2IP4FbHDSrV2x03/nNjey2jg6nrzVQC4ew1Q6QeOK9cA9c91NNS6IF78Og/V5qCKuv/G29f7vv78IkdFhUSkrmPN7IwwfSWxQ1W1v4C3hF4llzUyvhuxcx4AU482CXf/BCg3s7EhNKWR2V8D/hnAzM4GtoQ+KmuBU0P8VGLnaGo1tJ0iR0WFRKSuImBqeCJuT+C+0KvjV8QOQT1J7Em5h3Iz8Cczex1ItD/2NGC2mS0kttexo5F1FoScb+dAAfsz0DN0QLyG2En1WgdtZ4K5Shumq7ZEgnDV1tPhhHrkzKxzbU91M5sB9Hf365Ow3Hxa0HZK+tM16CIt10Qzu4HYv9N1wFejTUekYdojERGRhOgciYiIJESFREREEqJCIiIiCVEhERGRhKiQiIhIQv4/Io7mInpLZWQAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_cv_results(gs.cv_results_)\n", "analyze_cv_results(gs.cv_results_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"passthrough\" wins again, though we retain most of the performance using only 41 features. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Final Evaluation\n", "We can view the best estimator from the search and evaluate it on the test set. This estimator was selected using cross validation then retrained on the entire train set. " ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preproc',\n",
       "                 ColumnTransformer(transformers=[('numeric',\n",
       "                                                  Pipeline(steps=[('fill_na',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('scale',\n",
       "                                                                   StandardScaler())]),\n",
       "                                                  ['LotFrontage', 'LotArea',\n",
       "                                                   'OverallQual', 'OverallCond',\n",
       "                                                   'YearBuilt', 'YearRemodAdd',\n",
       "                                                   'MasVnrArea', 'BsmtFinSF1',\n",
       "                                                   'BsmtFinSF2', 'BsmtUnfSF',\n",
       "                                                   'TotalBsmtSF', '1stFlrSF',\n",
       "                                                   '2ndFlrSF', 'LowQualFinSF',\n",
       "                                                   '...\n",
       "                                                   'Condition2', 'BldgType',\n",
       "                                                   'HouseStyle', 'RoofStyle',\n",
       "                                                   'RoofMatl', 'Exterior1st',\n",
       "                                                   'Exterior2nd', 'MasVnrType',\n",
       "                                                   'ExterQual', 'ExterCond',\n",
       "                                                   'Foundation', 'BsmtQual',\n",
       "                                                   'BsmtCond', 'BsmtExposure',\n",
       "                                                   'BsmtFinType1',\n",
       "                                                   'BsmtFinType2', 'Heating',\n",
       "                                                   'HeatingQC', 'CentralAir',\n",
       "                                                   'Electrical', ...])],\n",
       "                                   verbose_feature_names_out=False)),\n",
       "                ('feature_selection', 'passthrough'),\n",
       "                ('estimator', Ridge(alpha=21.54))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('preproc',\n", " ColumnTransformer(transformers=[('numeric',\n", " Pipeline(steps=[('fill_na',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('scale',\n", " StandardScaler())]),\n", " ['LotFrontage', 'LotArea',\n", " 'OverallQual', 'OverallCond',\n", " 'YearBuilt', 'YearRemodAdd',\n", " 'MasVnrArea', 'BsmtFinSF1',\n", " 'BsmtFinSF2', 'BsmtUnfSF',\n", " 'TotalBsmtSF', '1stFlrSF',\n", " '2ndFlrSF', 'LowQualFinSF',\n", " '...\n", " 'Condition2', 'BldgType',\n", " 'HouseStyle', 'RoofStyle',\n", " 'RoofMatl', 'Exterior1st',\n", " 'Exterior2nd', 'MasVnrType',\n", " 'ExterQual', 'ExterCond',\n", " 'Foundation', 'BsmtQual',\n", " 'BsmtCond', 'BsmtExposure',\n", " 'BsmtFinType1',\n", " 'BsmtFinType2', 'Heating',\n", " 'HeatingQC', 'CentralAir',\n", " 'Electrical', ...])],\n", " verbose_feature_names_out=False)),\n", " ('feature_selection', 'passthrough'),\n", " ('estimator', Ridge(alpha=21.54))])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gs.best_estimator_" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First-pass performance:\n", "Train MAE: 15288.339516024189\n", "Test MAE: 20544.401602914677\n", "Train R^2: 0.9028881797596011\n", "Test R^2: 0.8714648323729995\n", "\n", "Fine tuned performance:\n", "Train MAE: 15485.129766251588\n", "Test MAE: 18672.381852407823\n", "Train R^2: 0.8875868898505703\n", "Test R^2: 0.8765177538936448\n" ] } ], "source": [ "# MAE is a more intuitive metric for price estimation\n", "from sklearn.metrics import mean_absolute_error, r2_score\n", "\n", "print(\"First-pass performance:\")\n", "print(\"Train MAE:\", mean_absolute_error(y_train, y_train_pred_1stpass))\n", "print(\"Test MAE:\", mean_absolute_error(y_test, y_test_pred_1stpass))\n", "print(\"Train R^2:\", r2_score(y_train, y_train_pred_1stpass))\n", "print(\"Test R^2:\", r2_score(y_test, y_test_pred_1stpass))\n", "\n", "y_train_pred = gs.best_estimator_.predict(X_train)\n", "y_test_pred = gs.best_estimator_.predict(X_test)\n", "print(\"\\nFine tuned performance:\")\n", "print(\"Train MAE:\", mean_absolute_error(y_train, y_train_pred))\n", "print(\"Test MAE:\", mean_absolute_error(y_test, y_test_pred))\n", "print(\"Train R^2:\", r2_score(y_train, y_train_pred))\n", "print(\"Test R^2:\", r2_score(y_test, y_test_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Assignment\n", "If you didn't already, apply the methodology described above to your own dataset. Explore additional ways to improve the model. For instance, \n", "we saw that [GradientBoostingRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) had an edge on Ridge regression without any hyperparameter tuning. Explore the hyperparameters for GradientBoostingRegressor on the sklearn documentation page. Define a hyperparameter search using GridSearchCV and use our evaluation methodology to compare the two methods. " ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.12" } }, "nbformat": 4, "nbformat_minor": 4 }