{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Chapter 6: Feature Selection ##" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from __future__ import division\n", "import pandas as pd\n", "import numpy as np\n", "import scipy as sp\n", "import matplotlib.pyplot as plt\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.linear_model import Ridge\n", "from sklearn.linear_model import Lasso\n", "from sklearn.feature_selection import SelectKBest\n", "from sklearn.feature_selection import f_regression\n", "from sklearn.metrics import mean_squared_error\n", "from sklearn.cross_validation import KFold\n", "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "hitters_df = pd.read_csv(\"../data/Hitters.csv\")\n", "hitters_df.dropna(inplace=True)\n", "hitters_df.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AtBatHitsHmRunRunsRBIWalksYearsCAtBatCHitsCHmRunCRunsCRBICWalksLeagueDivisionPutOutsAssistsErrorsSalaryNewLeague
1 315 81 7 24 38 39 14 3449 835 69 321 414 375 N W 632 43 10 475.0 N
2 479 130 18 66 72 76 3 1624 457 63 224 266 263 A W 880 82 14 480.0 A
3 496 141 20 65 78 37 11 5628 1575 225 828 838 354 N E 200 11 3 500.0 N
4 321 87 10 39 42 30 2 396 101 12 48 46 33 N E 805 40 4 91.5 N
5 594 169 4 74 51 35 11 4408 1133 19 501 336 194 A W 282 421 25 750.0 A
\n", "

5 rows \u00d7 20 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ " AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns \\\n", "1 315 81 7 24 38 39 14 3449 835 69 321 \n", "2 479 130 18 66 72 76 3 1624 457 63 224 \n", "3 496 141 20 65 78 37 11 5628 1575 225 828 \n", "4 321 87 10 39 42 30 2 396 101 12 48 \n", "5 594 169 4 74 51 35 11 4408 1133 19 501 \n", "\n", " CRBI CWalks League Division PutOuts Assists Errors Salary NewLeague \n", "1 414 375 N W 632 43 10 475.0 N \n", "2 266 263 A W 880 82 14 480.0 A \n", "3 838 354 N E 200 11 3 500.0 N \n", "4 46 33 N E 805 40 4 91.5 N \n", "5 336 194 A W 282 421 25 750.0 A \n", "\n", "[5 rows x 20 columns]" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Objective is to predict the hitter's salary given other variables. Because this is a regression problem, we first need to convert the non-numeric input variables to factors." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Converting non-numeric input variables to factors.\n", "hitters_df[\"League\"] = pd.factorize(hitters_df[\"League\"])[0]\n", "hitters_df[\"Division\"] = pd.factorize(hitters_df[\"Division\"])[0]\n", "hitters_df[\"NewLeague\"] = pd.factorize(hitters_df[\"NewLeague\"])[0]\n", "hitters_df.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AtBatHitsHmRunRunsRBIWalksYearsCAtBatCHitsCHmRunCRunsCRBICWalksLeagueDivisionPutOutsAssistsErrorsSalaryNewLeague
1 315 81 7 24 38 39 14 3449 835 69 321 414 375 0 0 632 43 10 475.0 0
2 479 130 18 66 72 76 3 1624 457 63 224 266 263 1 0 880 82 14 480.0 1
3 496 141 20 65 78 37 11 5628 1575 225 828 838 354 0 1 200 11 3 500.0 0
4 321 87 10 39 42 30 2 396 101 12 48 46 33 0 1 805 40 4 91.5 0
5 594 169 4 74 51 35 11 4408 1133 19 501 336 194 1 0 282 421 25 750.0 1
\n", "

5 rows \u00d7 20 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ " AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns \\\n", "1 315 81 7 24 38 39 14 3449 835 69 321 \n", "2 479 130 18 66 72 76 3 1624 457 63 224 \n", "3 496 141 20 65 78 37 11 5628 1575 225 828 \n", "4 321 87 10 39 42 30 2 396 101 12 48 \n", "5 594 169 4 74 51 35 11 4408 1133 19 501 \n", "\n", " CRBI CWalks League Division PutOuts Assists Errors Salary NewLeague \n", "1 414 375 0 0 632 43 10 475.0 0 \n", "2 266 263 1 0 880 82 14 480.0 1 \n", "3 838 354 0 1 200 11 3 500.0 0 \n", "4 46 33 0 1 805 40 4 91.5 0 \n", "5 336 194 1 0 282 421 25 750.0 1 \n", "\n", "[5 rows x 20 columns]" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# construct a baseline regressor with all features\n", "collist = [col for col in hitters_df.columns if col != \"Salary\"]\n", "X = hitters_df[collist]\n", "y = hitters_df[\"Salary\"]\n", "reg = LinearRegression()\n", "reg.fit(X, y)\n", "ypred = reg.predict(X)\n", "np.sqrt(mean_squared_error(ypred, y))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "303.34447253531613" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Best Subset Regression ###\n", "\n", "R's leap package allows for multiple ways to find the best K features for a model - by exhaustive search and forward (greedy) search. Scikit-Learn offers the SelectKBest method to find the best features, presumably using a greedy search." ] }, { "cell_type": "code", "collapsed": false, "input": [ "mses = []\n", "nfeatures = range(1, len(collist))\n", "for nfeature in nfeatures:\n", " # compute MSE for different values of k (top features)\n", " selector = SelectKBest(f_regression, k=nfeature)\n", " selector.fit(X, y)\n", " selected = selector.get_support()\n", " feats = [col for (col,sel) in zip(collist, selected) if sel]\n", " reg = LinearRegression()\n", " X_r = hitters_df[feats]\n", " reg.fit(X_r, y)\n", " ypred = reg.predict(X_r)\n", " mses.append(np.sqrt(mean_squared_error(ypred, y)))\n", "plt.plot(nfeatures, mses)\n", "plt.xlabel(\"k\")\n", "plt.ylabel(\"RMSE\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nrZkxSAEAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model Selection by Cross-Validation ###\n", "\n", "The RMSE falls as the number of features increase - this is expected because we are computing the RMSE off the training set (overfitting). We will now use 10-fold cross validation on each model to calculate a cross-validation MSE which will give us a better idea of the best feature size to use for the problem." ] }, { "cell_type": "code", "collapsed": false, "input": [ "cv_errors = []\n", "kfold = KFold(len(hitters_df), n_folds=10)\n", "nfeatures = range(1, len(collist))\n", "for nfeature in nfeatures:\n", " # build model with varying number of features\n", " selector = SelectKBest(f_regression, k=nfeature)\n", " selector.fit(X, y)\n", " selected = selector.get_support()\n", " feats = [col for (col,sel) in zip(collist, selected) if sel]\n", " X_r = hitters_df[feats].values\n", " y = hitters_df[\"Salary\"].values\n", " rmses = []\n", " for train, test in kfold:\n", " # each model is cross validated 10 times\n", " Xtrain, ytrain, Xtest, ytest = X_r[train], y[train], X_r[test], y[test] \n", " reg = LinearRegression()\n", " reg.fit(Xtrain, ytrain)\n", " ypred = reg.predict(Xtest)\n", " rmses.append(np.sqrt(mean_squared_error(ypred, ytest)))\n", " cv_errors.append(np.mean(rmses))\n", "plt.plot(nfeatures, cv_errors)\n", "plt.xlabel(\"k\")\n", "plt.ylabel(\"RMSE\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEPCAYAAACp/QjLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X1clHW+//HXjGCKmuBNqIyKiaYjygymaGENoWF5dF1z\nTd2QY7W7J892dsP6uWzrXZ1SM7dWW8s2S7s7tntOhrtrpYmErGuoiKZWokICooYmrQlxM9fvj69M\nEqAgc801N5/n4zGPYJi55o0Pms98702apmkIIYQQlzEbHUAIIYT3keIghBCiASkOQgghGpDiIIQQ\nogEpDkIIIRqQ4iCEEKIB3YpDZWUlcXFx2Gw2rFYraWlprp+tWrWKwYMHEx0dzbx58wAoLCykffv2\n2O127HY7c+bM0SuaEEKIqwjS68Lt2rVj+/bthISEUFNTQ3x8PNnZ2VRXV7Np0yYOHDhAcHAwX331\nles5UVFR7Nu3T69IQgghmknXbqWQkBAAqqqqqK2tJSwsjJdeeom0tDSCg4MB6N69u54RhBBCXANd\ni4PT6cRmsxEeHk5CQgJDhgzhyJEjZGVlMWrUKBwOB3v27HE9vqCgALvdjsPhIDs7W89oQgghrkC3\nbiUAs9lMXl4e5eXlJCUlkZmZSU1NDV9//TW7du1i9+7dTJs2jePHj9OrVy+KiooICwsjNzeXyZMn\nc+jQITp16qRnRCGEEI3QtTjU6dy5MxMmTGDPnj1YLBamTJkCwIgRIzCbzZw9e5auXbvStm1bAGJj\nY+nfvz/5+fnExsbWu1ZUVBTHjh3zRGwhhPAb/fv35+jRo81+vG7dSmVlZZw/fx6AiooKtm7dit1u\nZ/LkyWRkZABw5MgRqqqq6Nq1K2VlZdTW1gJw/Phx8vPzufHGGxtc99ixY2iaZtitulpj/36NtWs1\nHnpIY8QIjcjIhbz6qkZ5uXG5fnhbuHCh4Rl8IZO35pJMksndt5Z+qNat5VBaWkpKSgpOpxOn00ly\ncjKJiYncdttt3H///QwdOpS2bdvy+uuvA5CVlcWCBQsIDg7GbDazZs0aQkND9YrXLLW18PnnsGfP\n97cDB6B3b7j5ZnWbMQNeeAHS0+GRR2DCBJg1C8aOhTZtDI0vhBDXTLfiMHToUHJzcxvcHxwczBtv\nvNHg/ilTpri6m4zgdMKRI/ULwf790KPH94Vg6lSw2+H66+s/d9s2WLQIyspgwwaYPx9mz4af/hRS\nUiA62pBfSQghrplHxhy8jdMJx47VLwT79kH37jB8uCoETzwBsbHQnMaLw+EAoFs3+OUv1e2zz+CN\nN+Cuu9R1Z81SrYzwcH1/tx9m8ibemAm8M5dkah7JpB+Tpmk+ddiPyWSitZG/+QZiYtSbf12rIDYW\nunZ1U8jL1NZCZia8/rrqeoqPV4Vi0iRo1879ryeEEI1p6XtnQBYHo1y4ABs3qkKxd6/qpkpJgVtu\nAZPJ6HRCCH8mxcFHFBfDW2/B+vXw3XeqNZGcDI1M0BJCiFaT4uBjNA1yc1VrYv16yMmBgQONTiWE\n8Dctfe8MyAFpb2IyqUHw4cPh/HnIyJDiIIQwnpzn4EXGjAHZUkoI4Q2kOHiR+HjYscPoFEIIIcXB\nq9x0E1RUwIkTRicRQgQ6KQ5exGSS1oMQwjtIcfAyY8ZIcRBCGE+Kg5eR4iCE8AayzsHL1NRAly5Q\nUKDPdh5CiMDU0vdOaTl4maAgGDVKprQKIYwlxcELyXoHIYTRpDh4IRl3EEIYTcYcvNDFi+oMiDNn\noEMHo9MIIfyBjDn4gZAQGDYMPvnE6CRCiEAlxcFLSdeSEMJIuhWHyspK4uLisNlsWK1W0tLSXD9b\ntWoVgwcPJjo6mnnz5rnuX7JkCQMGDGDQoEFs2bJFr2g+QYqDEMJIum3Z3a5dO7Zv305ISAg1NTXE\nx8eTnZ1NdXU1mzZt4sCBAwQHB/PVV18BcPjwYd555x0OHz5MSUkJY8eO5ciRI5jNgdm4ufVWmDkT\nqqshONjoNEKIQKPrO29ISAgAVVVV1NbWEhYWxksvvURaWhrBl97xunfvDkB6ejozZswgODiYyMhI\noqKiyMnJ0TOeV+vSBSIjYd8+o5MIIQKRrsXB6XRis9kIDw8nISGBIUOGcOTIEbKyshg1ahQOh4M9\ne/YAcPLkSSwWi+u5FouFkpISPeN5PVnvIIQwiq7FwWw2k5eXR3FxMVlZWWRmZlJTU8PXX3/Nrl27\nWL58OdOmTWvy+SaTSc94Xk/GHYQQRvHIMaGdO3dmwoQJ7NmzB4vFwpQpUwAYMWIEZrOZsrIyIiIi\nKCoqcj2nuLiYiIiIRq+3aNEi19cOhwOHw6FnfMOMGQP/9V/qnOkAr5NCiBbKzMwkMzPzmp+v2yK4\nsrIygoKCCA0NpaKigqSkJBYuXMjRo0c5efIkixcv5siRI4wdO5YTJ05w+PBhZs6cSU5OjmtA+ujR\now1aD4GwCO5ykZHw/vsweLDRSYQQvqyl7526tRxKS0tJSUnB6XTidDpJTk4mMTGR2267jfvvv5+h\nQ4fStm1bXn/9dQCsVivTpk3DarUSFBTE6tWrA75bCb7vWpLiIITwJNk+w8u9/LIqDm+8YXQSIYQv\nk+0z/IwMSgshjCDFwcsNGgTffguXjdULIYTupDh4OZMJ4uNlvYMQwrOkOPgA6VoSQniaFAcfIMVB\nCOFpMlvJB9TUQFgYfPml2nNJCCFaSmYr+aGgIIiLg3/8w+gkQohAIcXBR0jXkhDCk6Q4+AgpDkII\nT5IxBx9x8SJ07w5ffaXOmBZCiJaQMQc/FRICQ4fCJ58YnUQIEQikOPgQOfxHCOEpUhx8iIw7CCE8\nRcYcfMjZs9CvH5w7p6a3CiFEc8mYgx/r2hX69IG8PKOTCCH8nRQHHxMfL11LQgj9SXHwMTLuIITw\nBBlz8DEnTsDNN8Pp02o7byGEaA4Zc/BzffpA+/bwxRdGJxFC+DPdikNlZSVxcXHYbDasVitpaWkA\nLFq0CIvFgt1ux26388EHHwBQWFhI+/btXffPmTNHr2g+T9Y7CCH0ptuEyHbt2rF9+3ZCQkKoqakh\nPj6e7OxsTCYTqamppKamNnhOVFQU+/bt0yuS36gbd3jwQaOTCCH8la7dSiGXNgGqqqqitraWsLAw\ngIAeM3AHXxyULiiAJ54wOoUQorl0LQ5OpxObzUZ4eDgJCQkMGTIEgFWrVhETE8MDDzzA+fPnXY8v\nKCjAbrfjcDjIln6TJg0eDN98AyUlRidpnvfeU+dRLF8OR48anUYI0Rwema1UXl5OUlISS5cuxWq1\n0r17dwDmz59PaWkpa9eupaqqim+//ZawsDByc3OZPHkyhw4dolOnTvUDm0wsXLjQ9b3D4cDhcOj9\nK3idH/0IZsyA6dONTtK0qir4zW/g3XfhnXfg5ZfBZoOHHzY6mRD+LzMzk8zMTNf3ixcvblGvjcem\nsj755JO0b9+eRx991HVfYWEhEydO5NNPP23w+ISEBFasWEFsbGy9+wN9KmudZ59VXTV//KPRSRp3\n4gRMm6a2GV+/Xh1v+pe/wLp18Pe/G51OiMDjNVNZy8rKXF1GFRUVbN26FbvdzqlTp1yP2bhxI0OH\nDnU9vra2FoDjx4+Tn5/PjTfeqFc8n+fN4w5//zuMGAH33APp6d+fez12rMpcWWlsPiHE1ek2W6m0\ntJSUlBScTidOp5Pk5GQSExOZNWsWeXl5mEwm+vXrx5o1awDIyspiwYIFBAcHYzabWbNmDaGhoXrF\n83mxsarl8PXXcGmc33DV1fC738Hbb6uupFtvrf/zsDAYNgyysuDOO43JKIRoHlkh7cMSEyE1FSZM\nMDqJGhyfPh06dIA33lDdSY357/9Wu8s+95xn8wkR6LymW0noz1u6lj78EIYPh7vugs2bmy4MoB5z\nad2jEMKLSXHwYUYXh9pamD8f7r8fNmyA3/4WzFf5i7Lb1XkUhYUeiSiEuEZSHHzYqFHqbIeKCs+/\ndmmpGmDeuRNyc6G5s4nNZkhKktaDEN5OioMP69ABoqMhJ8ezr5uRobqRbr8dtmyB8PCWPX/8eCkO\nQng7KQ4+zpOH/9TWqi0wfvpTtXZh0SJo06bl17nzTti+XS2SE0J4JykOPs5T4w5nzqhP/Nu2wd69\nMG7ctV+rWzcYNAj+8Q/35RNCuJcUBx8XHw///CfU1Oj3GllZal3FiBGqOPTq1fpr3nUXvP9+668j\nhNCHFAcf160bWCxw4IA+13/+ebUNxp/+BE8/DUFuWjYp4w5CeDcpDn5Ar66lZ56B1avVgPddd7n3\n2iNGqIVzxcXuva4Qwj2kOPgBPYrDs8+q1sL27epoUndr00YNTH/4ofuvLYRoPSkOfqCuOLhrV5Hf\n/x5eekkVhogI91yzMePHy7iDEN5KioMf6NsXrrsO8vNbf63nn1fbgG/frsYy9JSUpAa4q6v1fR0h\nRMtJcfAT7uhaWrUKVq5Ui9x693ZPrivp0QP69YNdu/R/LSFEy0hx8BOtXQz3xz+q7qSMDNUS8RTZ\niE8I7yTFwU+0puWwerU63zkjAyIj3RrrqmTcQQjvJOc5+AmnU22V/emnLVuktmaNWr+wfTsYcfBe\nTY3K/dlnqptJCKEPOc8hQJnN6uS17OzmP+dPf4KnnlItBqNOZA0KUocWbdlizOsLIRonxcGPtKRr\nae1atYleRgb0769vrquRriUhvI8UBz/S3OLw6quwcKEqDFFR+ue6mvHjYetWteurEMI76FYcKisr\niYuLw2azYbVaSUtLA2DRokVYLBbsdjt2u533L/vIuGTJEgYMGMCgQYPYIv0MLRYbC8eOwfnzTT9m\n/XpYsECtLxgwwHPZrsRigZ49Yfduo5MIIeq4aRu1htq1a8f27dsJCQmhpqaG+Ph4srOzMZlMpKam\nkpqaWu/xhw8f5p133uHw4cOUlJQwduxYjhw5gvlq504Kl7Zt1Z5FO3fC3Xc3/Pkbb6ijPLdtg5tu\n8ny+K6mb0jpqlNFJhBCgc7dSSEgIAFVVVdTW1hIWFgbQ6Ih5eno6M2bMIDg4mMjISKKiosjx9BFn\nfqCprqU334Tf/AY++kidpeBtZNxBCO+ia3FwOp3YbDbCw8NJSEhgyJAhAKxatYqYmBgeeOABzl/q\nAzl58iSWy/ZrsFgslJSU6BnPLzW2GO7tt+H//T/Vrz94sDG5riY+Hj7/HMrKjE4ihAAdu5UAzGYz\neXl5lJeXk5SURGZmJg899BALFiwAYP78+cydO5e1a9c2+nyTydTo/YsWLXJ97XA4cDT3dPsAMHo0\n7NsHlZXQrh1s2ABz56rCYLUana5pbduCw6GmtM6caXQaIXxfZmYmmZmZ1/x8XYtDnc6dOzNhwgT2\n7NlT7438wQcfZOLEiQBERERQVFTk+llxcTERTWwJenlxEPV17KiKwO7dUFoKjzyi3nCjo41OdnV1\n4w5SHIRovR9+cF68eHGLnq9bt1JZWZmry6iiooKtW7dit9s5deqU6zEbN25k6NChAEyaNIkNGzZQ\nVVVFQUEB+fn5jBw5Uq94fm3MGFi0CH71K3VewqV/Yq+XlKTyOp1GJxFC6NZyKC0tJSUlBafTidPp\nJDk5mcTERGbNmkVeXh4mk4l+/fqxZs0aAKxWK9OmTcNqtRIUFMTq1aub7FYSV3bHHWrKakYGDBtm\ndJrm69cPwsJUt9jw4UanESKwyd5KfkjT4MIF6NTJ6CQt98gj0LUr/O53RicRwr/I3koCk8k3CwOo\nKa2yhbcQxpOWg/AqlZVwww3w5Zeqi0kI4R7SchA+rV07tebho4+MTiJEYJPiILyOnA4nhPGkW0l4\nnfx8tSCuuFiNnwghWk+6lYTPGzAA2rdXp9oJIYwhxUF4JdmITwhjSXEQXknGHYQwlow5CK/07bfQ\noweUlMD11xudRgjfJ2MOwi906KAO/snIMDqJEIFJioPwWnfdJeMOQhilyeKQcdlHtoKCgno/e/fd\nd/VLJMQldVtpSC+iEJ7XZHGYO3eu6+spU6bU+9mTTz6pXyIhLqk7te6zz4zNIUQgkm4l4bVMJtmI\nTwijSHEQXk2mtAphjCansnbu3Jnbb78dTdPYsWMHY8aMcf1sx44drlPePE2msgaWb76BiAg4dUrN\nYBJCXJuWvnc2WRyudjD15WeTepIUh8CTkACPPgoTJhidRAjf5bbi8ENVVVUcOnSIiIgIbrjhhmsO\n2FpSHALPsmVQVAQvvGB0EiF8l9sWwf3iF7/g4MGDAJSXlxMTE8OsWbOw2Wy8/fbbrU8qRDPJoLQQ\nntdkcdixYwfR0dEAvPbaa9x00018+umn5Obm8swzz1z1wpWVlcTFxWGz2bBaraSlpdX7+YoVKzCb\nzZw7dw6AwsJC2rdvj91ux263M2fOnNb8XsKPDBsGFy+qrbyFEJ4R1NQPrrvuOtfXW7Zs4Sc/+QkA\nPXr0aNaF27Vrx/bt2wkJCaGmpob4+Hiys7OJj4+nqKiIrVu30rdv33rPiYqKYt++fdfyewg/dvmU\n1gEDjE4jRGBosuXQuXNn/vrXv5Kbm8vOnTsZP348ANXV1VRWVjbr4iEhIYAar6itraVLly4ApKam\nNqv1IUQd2UpDCM9qsjisWbOGF154gdmzZ/P888/Ts2dPALZt28aEZk4bcTqd2Gw2wsPDSUhIwGq1\nkp6ejsViYdiwYQ0eX1BQgN1ux+FwkJ2dfY2/kvBHY8dCdjZUVBidRIjA0GS30k033cSHH37Y4P7x\n48e7WhFXYzabycvLo7y8nKSkJDZv3sySJUvYsmWL6zF1o+e9evWiqKiIsLAwcnNzmTx5MocOHaJT\np04Nrrto0SLX1w6Hw7BptcJzwsLU2ENWFiQlGZ1GCO+XmZl51SUJV9LkVNaHH364yalPJpOJlStX\ntuiFnnzySUwmE6tWrXJ1NxUXFxMREUFOTk6D6bEJCQmsWLGC2NjYBq8tU1kD03//N5w9C889Z3QS\nIXyP29Y5BAcHEx0dzbRp0+jVqxfw/ad8k8lESkrKFS9cVlZGUFAQoaGhVFRUkJSUxMKFC0lMTHQ9\npl+/fuzdu5cuXbpQVlZGWFgYbdq04fjx49x2220cPHiQ0NDQVv2Cwn/s3Qv33Scb8QlxLVr63tlk\nt1JpaSl/+ctf+POf/0ybNm249957+clPftLgzfpKz09JScHpdOJ0OklOTq5XGOrC1snKymLBggUE\nBwdjNptZs2ZNs19LBAa7XbUcCgshMtLoNEL4t2atkC4uLmbDhg38/ve/Z9myZSQnJ3siW6Ok5RDY\nkpPh1lvhP/7D6CRC+Ba3HxO6d+9e/vCHP/Dmm29y1113MXz48FYFFKI1ZEqrEJ7RZMth/vz5bN68\nmcGDBzN9+nSSkpIIDg72dL4GpOUQ2MrKoH9/+OoraNvW6DRC+A63DUibzWb69evnmln0wxc5cODA\ntadsBSkOIi4OliyBO+4wOokQvsNtA9LHjx+/4osIYZS6rTSkOAihn2Zv2V1H0zT+/Oc/c++99+qV\n6Yqk5SB27oSHHoL9+41OIoTvcNuA9IULF1ixYgVz5sxh9erVOJ1ONm7cyJAhQ3jrrbfcElaIazFy\nJJw4AaWlRicRwn812XKYMmUK119/PaNHj2bLli0UFRXRrl07Vq5cic1m83ROF2k5CIB77oEf/Qhm\nzTI6iRC+wW0D0sOGDXMNOtfW1tKzZ0++/PJL2rdv756k10iKgwB4+WW1z9KbbxqdRAjf4LZupTZt\n2tT7OiIiwvDCIESdO++ELVvA6TQ6iRD+qcmWQ5s2bepNY62oqHAVB5PJxDfffOOZhD8gLQdR56ab\nYMMGta2GEOLK3DaVtba21i2BhNBLXetBioMQ7nfV7TOE8FZJSdDIkSNCCDdo8ToHo0m3kqhz4QL0\n7AmnTkGHDkanEcK7uX3jPSG8VceOcPPN0IrDroQQTZDiIHxa3biDEMK9pDgInybjDkLoQ4qD8Gk2\nmzod7ssvjU4ihH+R4iB8mtkM48ZJ15IQ7ibFQfi8pCQpDkK4m27FobKykri4OGw2G1arlbS0tHo/\nX7FiBWazmXPnzrnuW7JkCQMGDGDQoEFskf/bRTONGwfbtkFNjdFJhPAfTa6Qbq127dqxfft2QkJC\nqKmpIT4+nuzsbOLj4ykqKmLr1q307dvX9fjDhw/zzjvvcPjwYUpKShg7dixHjhzBbJbGjbiyXr3A\nYoE9e2DUKKPTCOEfdH3nrdubqaqqitraWrp06QJAamoqzzzzTL3HpqenM2PGDIKDg4mMjCQqKoqc\nnBw94wk/cuedMmtJCHfStTg4nU5sNhvh4eEkJCRgtVpJT0/HYrEwbNiweo89efIkFovF9b3FYqGk\npETPeMKPyLiDEO6lW7cSgNlsJi8vj/LycpKSkti8eTNLliypN55wpeXcTZ1VvWjRItfXDocDh8Ph\nrsjCR8XHw4EDcP48hIYanUYI42VmZpLZiu0DdC0OdTp37syECRPIzc2loKCAmJgYAIqLixk+fDif\nfPIJERERFBUVuZ5TXFxMREREo9e7vDgIAdC+Pdx6K2RkwJQpRqcRwng//OC8ePHiFj1ft26lsrIy\nzp8/D6izILZu3cro0aM5ffo0BQUFFBQUYLFYyM3NJTw8nEmTJrFhwwaqqqooKCggPz+fkSNH6hVP\n+CEZdxDCfXRrOZSWlpKSkoLT6cTpdJKcnExiYmK9x1zebWS1Wpk2bRpWq5WgoCBWr17dZLeSEI1J\nSoKVK0HTQP50hGgd2bJb+A1Ng969VdfSwIFGpxHCu8iW3SJgmUyyS6sQ7iLFQfgVKQ5CuId0Kwm/\nUlYG/fvDV19B27ZGpxHCe0i3kgho3bqp8YZ//tPoJEL4NikOwu/IAUBCtJ4UB+F3ZNxBiNaTMQfh\nd6qrVffS0aPQvbvRaYTwDjLmIAJecDA4HPDRR0YnMZbTCZ9/bnQK4aukOAi/FOjjDgcPwpgxcPPN\nMHUqnD5tdCLha6Q4CL9UN+4QaD2QFy/Cb38LCQmQnAxnzkBUFAwbBhs2BN6/h7h2UhyEX4qKUju1\nHjxodBLP+fBDGDoUjh9X25f/x39ASAgsXQp//Ss8+STccw+cOmV0UuELpDgIvxUos5ZOn4aZM1Ux\neOEF1ULo2bP+Y0aOhNxcGDwYYmLgrbekFSGuTIqD8Fv+Pu7gdMKf/qRaC717w6FDcNddTT/+uuvg\nqadg82bVmpg8GUpLPZcXVOY9e9R/hXeT4iD8VkKCWildUWF0Evc7dAhuuw3WrlWzspYtU11IzTF8\nuHqDjolRtzfe0L8VUVKiurVuvFGd2vfee/q+nmg9KQ7Cb3XuDDYbZGUZncR9Kirg8cfVVN2f/hT+\n8Q812NxS110HTzwBH3wAzz4LEyeqN3B3qqmBTZvUtYcOhZMn4d13VTFascK9ryXcT4qD8Gv+NO6w\ndat6k83Ph/374aGHoE2b1l0zNhZ271ZTXu12WLeu9a2IwkKYPx8iI1X31ZQpUFQEL76oXu/HP1bd\nWbL/lXeTFdLCr+XkwP33+/aspTNnIDUVsrPhj3+ECRP0eZ28PJg9Ww1mv/wyWCzNf25VlZoR9fLL\nsHevatX87GcQHd3441euVC26//1f92QXVycrpIW4zPDh6lOqu7tMPMHphFdeUW+wPXuqcQa9CgOo\nLricHBg9WrUi1q69eisiPx/mzYM+fdQbfnKyaiX84Q9NFwZQBTszE44dc+uvINxIWg7C7917L4wf\nrz4V+4rDh9XU1O++gzVr1Bu3Jx04oP69unVTM6L69Pn+Z5WVsHGjaiUcPgyzZsGDD8JNN7XsNdLS\n4MIFWLXKvdlF47ym5VBZWUlcXBw2mw2r1UpaWhoA8+fPJyYmBpvNRmJiIkVFRQAUFhbSvn177HY7\ndrudOXPm6BVNBBhfGneorFT99bffrorazp2eLwygBrl37VI5hg9XheDQIXjkETVt9tVX1ZjHiROw\nfHnLCwPAww/Dm2/CuXPuzy9aT9eWw8WLFwkJCaGmpob4+HieffZZYmJi6NSpEwCrVq1i//79vPLK\nKxQWFjJx4kQ+/fTTKweWloNooaIiNRB6+jSYvbgjNTMTfv5zNei8ciVERBidSDl4UHUDFRWp/z7w\ngJqS6g7//u+qsFz67Ch01NL3ziAdsxByaeJ1VVUVtbW1dOnSxVUYAC5cuEC3bt30jCAEvXurrbtz\nc9WsHG9z7hw89piajbRqFfzoR0Ynqi86Gj75RI0/uLu4pqaqLr/UVDW9VngPXT9HOZ1ObDYb4eHh\nJCQkYLVaAXj88cfp06cP69ev5ze/+Y3r8QUFBdjtdhwOB9nZ2XpGEwEmKcn7upY0Dd5+G4YMgQ4d\n1Cd0bysMdUwmfVpdw4ap4vM//+P+a4vW8ciAdHl5OUlJSSxduhSHw+G6f+nSpXzxxRe89tprVFVV\n8e233xIWFkZubi6TJ0/m0KFD9VoaoJpGCxcudH3vcDjqXVOIxrz/vppz//HHRidRCgpUn31pqerP\nj4szOpFxtmyBuXPVILjJZHQa/5GZmUlmZqbr+8WLF7eoW8ljs5WefPJJ2rdvz6OPPuq678SJE9x9\n990cbGQSekJCAitWrCA2Nrbe/TLmIK7FxYsQHq5W6f7g84ZH1dTA88+rQvXYY6o7JTjYuDzeQNPU\nNh7Ll6sWntCH18xWKisr4/z58wBUVFSwdetW7HY7R48edT0mPT0du93uenxtbS0Ax48fJz8/nxvd\nNeolAl5IiPp0vn27cRn27IERI9RmgJ98otYHBHphANVaSE2VLTW8jW4D0qWlpaSkpOB0OnE6nSQn\nJ5OYmMjUqVP54osvaNOmDf379+fFF18EICsriwULFhAcHIzZbGbNmjWEhobqFU8EoLoprZMmefZ1\nL1xQ01P/53/Up+P77pPukx+aMUMdUrR/v2pFCOPJIjgRMPbvV0dm5ud77jX//neYM0ftEPvss2pR\nmWjckiXqzOv1641O4p9a+t4pxUEEDKcTevVSC8v07rE8dQp+9Su1z9CaNZCYqO/r+YNz56B/fzVr\ny1vWePgTrxlzEMLbmM36r5auO4Bn2DD1Rvfpp1IYmqtLF7U3k2yn4R2k5SACyptvqjMF3n3X/df+\n7DP4xS9KcPsxAAAQ3UlEQVTUDqV1J7SJljl+XB1pWlgIHTsanca/SMtBiCsYNw4yMqC62n3XrKyE\nhQvVyWz33qsO4JHCcG1uvFEdZPTqq0YnEVIcREAJD4d+/dTW1O5QdwDPoUPqPIT//M/WH8AT6B59\nFJ57Tq0JEcaR4iACTlKSWmvQGqdOwcyZaqO8559Xh9bIIKp7jBqlJg5s3Gh0ksAmxUEEnNYMStfW\nwurVqrUQGan/ATyB6tFH1dRfGV40jgxIi4Dz3Xdql9bCQjVDprn27VMH8LRtCy+9pDbME/qorVVb\nea9bB/HxRqfxDzIgLcRVXHcdjBkD27Y17/H/+pc65Gb8eFUcPv5YCoPe2rRR/+aypYZxpDiIgNSc\ncQdNU1NerVYoL1ddSLNne/eBQf7k3/8dsrM9u6JdfE+6lURA+vxzNfbw5ZeN73NUWAi//KWad//S\nS2qaqvC83/1OrZxevdroJL5PupWEaIabblJF4Ysv6t9fXQ3LlqkT4269VU1PlcJgnF/+Um1YePas\n0UkCjxQHEZBMJtVyuLxrKTsb7HY1ppCTo841btvWuIwCevSAKVPg0ubNwoOkOIiAVXd06Nmz8OCD\nMH06LFqkdlKVo0S8R2oqvPCCWokuPEeKgwhYiYnfzzzq2BEOH1ZbestZC95lyBDVonvrLaOTBBYZ\nkBYBbcUKtZfP8OFGJxFXsm0bPPyw2s5bZotdGznPQQjhdzRNtR6efhruvtvoNL5JZisJIfyOyQRz\n58qiOE/SrThUVlYSFxeHzWbDarWSlpYGwPz584mJicFms5GYmEhRUZHrOUuWLGHAgAEMGjSILXqe\nyCKE8Dn33qumHu/bZ3SSwKBrt9LFixcJCQmhpqaG+Ph4nn32WWJiYujUqRMAq1atYv/+/bzyyisc\nPnyYmTNnsnv3bkpKShg7dixHjhzB/IMORulWEiJwPfMMHDigDm0SLeNV3UohISEAVFVVUVtbS5cu\nXVyFAeDChQt0u3Tienp6OjNmzCA4OJjIyEiioqLIcdem+0IIv/Dzn8PmzXBZh4PQia7Fwel0YrPZ\nCA8PJyEhAavVCsDjjz9Onz59WLdunau76eTJk1gsFtdzLRYLJSUlesYTQviY0FBISYGVK41O4v90\nLQ5ms5m8vDyKi4vJysoiMzMTgKeeeooTJ04we/Zsfv3rXzf5fJNMOBdC/MCvfqWOEf3mG6OT+Lcg\nT7xI586dmTBhAnv27MHhcLjunzlzJndfmpcWERFRb3C6uLiYiCaO1lq0aJHra4fDUe+aQgj/Fhmp\nzgJfu1Zt6y0al5mZ6fpAfi1Hruo2IF1WVkZQUBChoaFUVFSQlJTEwoUL6du3L1FRUYAakM7JyeGN\nN95wDUjn5OS4BqSPHj3aoPUgA9JCiN271Wr2Y8cgyCMfcX3PuXNqK5hNm9RZ5+XlLXvv1O2ftbS0\nlJSUFJxOJ06nk+TkZBITE5k6dSpffPEFbdq0oX///rx4aUctq9XKtGnTsFqtBAUFsXr1aulWEkI0\nasQI6NtXnd09fbrRabzH8eOQnq4KQm4u3HEH/OhHasvzG25o2bVkhbQQwif9/e/w61/DJ5+07LhX\nf+J0qlbUpk2qKJSVwcSJqiAkJkL79t8/VrbPEEIEjEcfVdurb9kC7doZncYzKivVXlObNsFf/wph\nYTBpkioII0c2vfeUFAchRMBwOtXK6aAgtWurv27KV1amWkrp6aow2GyqIEyaBAMGNO8aUhyEEAGl\nokJ1odx+OyxZYnQa93A61RbyH36oCsL+/TB2rGod3H03XFo73CJSHIQQAaesDG65RW3O94tfGJ2m\n5Sor1dhBdra67dypCkDdgPIdd7S+20yKgxAiIB09CmPGqPUP3r6td1mZKgB1xWD/foiOVueWx8er\n/4aHu/c1pTgIIQLWP/+p+uE//BBiY41Oo2iaWo/xj398XwxOnoTRo78vBiNHQocO+uaQ4iCECGj/\n939qi42dO6FPH8+/fnU15OXVLwZBQapVU1cMhg6FNm08m0uKgxAi4D33nOpeys5Wm/V5gqap13zs\nMejdWxWBui6iPn2MP5tcioMQIuBpmmo9HDoE778Pbdvq+3pnz8LPfqa6j95+G4YM0ff1roVXnecg\nhBBGMJlU66FTJ/WmrefnyW3bICZGbQiYk+OdheFaSMtBCOG3Ll6EhAQYPx4WL3bvtauq4He/U4vv\nXnsN7rzTvdd3t5a+d8p+hkIIvxUSoraYGD1afbKfPds91/38c5g5U40t5OVB9+7uua43kW4lIYRf\nu+EGdbRoWhp89FHrrqVpsGaNGmj++c/hvff8szCAdCsJIQLEjh1wzz1qjGDo0JY/v6wMHnwQvvxS\nDToPHuz+jHqSAWkhhGjEmDHq7OkJE6Clx9N/9JHa7C4qCnbt8r3CcC1kzEEIETCmT1ef/CdMgKws\nuP76Kz/+u+/g8cdhwwZYt05tfhcopFtJCBFQNA0eeggKC9VgdXBw44/77DM16Ny3L7zyyrXthOpN\npFtJCCGuwGSCF15Q21fMmdNwDYSmwUsvwW23qSKycaPvF4ZrIS0HIURAunBBnQFxzz3w29+q+776\nSg06Fxer9QuDBhmb0Z28puVQWVlJXFwcNpsNq9VKWloaAI899hiDBw8mJiaGKVOmUF5eDkBhYSHt\n27fHbrdjt9uZM2eOXtGEEIKOHeFvf4OXX1azj7ZsUYPOgwap3V39qTBcE01H3377raZpmlZdXa3F\nxcVpO3bs0LZs2aLV1tZqmqZp8+bN0+bNm6dpmqYVFBRo0dHRV72mzpGvyfbt242O0IBkaj5vzCWZ\nmscdmQ4e1LRu3TTNYtG0bdu8I5MeWvreqeuYQ0hICABVVVXU1tbSpUsXxo0bh/nSQa9xcXEUFxfr\nGcEjMjMzjY7QgGRqPm/MJZmaxx2ZhgxR22vv369OXPOGTN5A1+LgdDqx2WyEh4eTkJCA1Wqt9/NX\nX32Vuy87sqmgoAC73Y7D4SA7O1vPaEII4TJwIHTpYnQK76LrOgez2UxeXh7l5eUkJSWRmZmJw+EA\n4KmnnqJt27bMnDkTgF69elFUVERYWBi5ublMnjyZQ4cO0alTJz0jCiGEaIxO3VsNPPHEE9ry5cs1\nTdO01157Tbvlllu0ioqKJh/vcDi0vXv3Nri/f//+GiA3uclNbnJrwa1///4tes/WbSprWVkZQUFB\nhIaGUlFRQVJSEgsXLqS6upq5c+fy8ccf0+2yycNlZWWEhYXRpk0bjh8/zm233cbBgwcJ9dQxTkII\nIVx061YqLS0lJSUFp9OJ0+kkOTmZxMREBgwYQFVVFePGjQNg9OjRrF69mo8//piFCxcSHByM2Wxm\nzZo1UhiEEMIgPrcITgghhP58ZvuMDz74gEGDBjFgwACWLVtmdBwAioqKSEhIYMiQIURHR7Ny5Uqj\nI7nU1tZit9uZOHGi0VEAOH/+PFOnTmXw4MFYrVZ27dpldCSWLFnCkCFDGDp0KDNnzuS7777zeIb7\n77+f8PBwhl62h/S5c+cYN24cAwcO5M477+T8+fNekaupBaxGZqqzYsUKzGYz586d84pMq1atYvDg\nwURHRzNv3jzDM+Xk5DBy5EjsdjsjRoxg9+7dV79Qi0YoDFJTU6P1799fKygo0KqqqrSYmBjt8OHD\nRsfSSktLtX379mmapmn/+te/tIEDB3pFLk3TtBUrVmgzZ87UJk6caHQUTdM0bdasWdratWs1TVOL\nIs+fP29onoKCAq1fv35aZWWlpmmaNm3aNG3dunUez5GVlaXl5ubWWwD62GOPacuWLdM0TdOWLl3q\nWihqdK6mFrAamUnTNO3EiRNaUlKSFhkZqZ09e9bwTBkZGdrYsWO1qqoqTdM07cyZM4Znuv3227UP\nPvhA0zRN27x5s+ZwOK56HZ9oOeTk5BAVFUVkZCTBwcFMnz6d9PR0o2PRo0cPbDYbAB07dmTw4MGc\nPHnS4FRQXFzM5s2befDBB71iH6ry8nJ27NjB/fffD0BQUBCdO3c2NNP1119PcHAwFy9epKamhosX\nLxIREeHxHGPGjCEsLKzefZs2bSIlJQWAlJQU3nvvPa/IZfQC1sYyAaSmpvLMM894NEudxjK9+OKL\npKWlEXxpu9fuHj4qrrFMPXv2dLX0zp8/36y/dZ8oDiUlJfTu3dv1vcVioaSlp3XorLCwkH379hEX\nF2d0FB555BGWL1/u+h/ZaAUFBXTv3p3Zs2cTGxvLz372My5evGhopi5dujB37lz69OlDr169CA0N\nZayXbNZ/+vRpwsPDAQgPD+f06dMGJ2rohwtYjZKeno7FYmHYsGFGR3HJz88nKyuLUaNG4XA42LNn\nj9GRWLp0qevv/bHHHmPJkiVXfY53vHtchclkMjrCFV24cIGpU6fyhz/8gY4dOxqa5W9/+xs33HAD\ndrvdK1oNADU1NeTm5jJnzhxyc3Pp0KEDS5cuNTTTsWPHeP755yksLOTkyZNcuHCBt956y9BMjTGZ\nTF739//DBaxGuXjxIk8//TSLFy923ecNf/M1NTV8/fXX7Nq1i+XLlzNt2jSjI/HAAw+wcuVKTpw4\nwXPPPedqxV+JTxSHiIgIioqKXN8XFRVhsVgMTPS96upq7rnnHu677z4mT55sdBx27tzJpk2b6Nev\nHzNmzCAjI4NZs2YZmslisWCxWBgxYgQAU6dOJTc319BMe/bs4ZZbbqFr164EBQUxZcoUdu7caWim\nOuHh4Zw6dQpQU8JvuOEGgxN9b926dWzevNkrCumxY8coLCwkJiaGfv36UVxczPDhwzlz5oyhuSwW\nC1OmTAFgxIgRmM1mzp49a2imnJwcfvzjHwPq/7+cnJyrPscnisPNN99Mfn4+hYWFVFVV8c477zBp\n0iSjY6FpGg888ABWq5Vf//rXRscB4Omnn6aoqIiCggI2bNjAHXfcweuvv25oph49etC7d2+OHDkC\nwEcffcSQIUMMzTRo0CB27dpFRUUFmqbx0UcfNdj7yyiTJk1i/fr1AKxfv94rPnSAmjG4fPly0tPT\nadeundFxGDp0KKdPn6agoICCggIsFgu5ubmGF9PJkyeTkZEBwJEjR6iqqqJr166GZoqKiuLjjz8G\nICMjg4EDB179SXqMluth8+bN2sCBA7X+/ftrTz/9tNFxNE3TtB07dmgmk0mLiYnRbDabZrPZtPff\nf9/oWC6ZmZleM1spLy9Pu/nmm7Vhw4ZpP/7xjw2fraRpmrZs2TLNarVq0dHR2qxZs1yzSzxp+vTp\nWs+ePbXg4GDNYrFor776qnb27FktMTFRGzBggDZu3Djt66+/NjzX2rVrtaioKK1Pnz6uv/WHHnrI\nkExt27Z1/Vtdrl+/fh6frdRYpqqqKu2+++7ToqOjtdjYWI9v4d3Y39Tu3bu1kSNHajExMdqoUaO0\n3Nzcq15HFsEJIYRowCe6lYQQQniWFAchhBANSHEQQgjRgBQHIYQQDUhxEEII0YAUByGEEA1IcRCi\nlQoLCxvdRloIXybFQQghRANSHIRwo+PHjxMbG8vevXuNjiJEq+h2hrQQgeaLL75gxowZrF+/XrqZ\nhM+T4iCEG5w5c4bJkyezceNGBg0aZHQcIVpNupWEcIPQ0FD69u3Ljh07jI4ihFtIy0EIN2jbti3v\nvvsuSUlJdOzYkRkzZhgdSYhWkeIghBuYTCZCQkL429/+xrhx4+jUqRP/9m//ZnQsIa6ZbNkthBCi\nARlzEEII0YAUByGEEA1IcRBCCNGAFAchhBANSHEQQgjRgBQHIYQQDUhxEEII0YAUByGEEA38f+JY\n40y57ijuAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ridge Regression and the Lasso ###\n", "\n", "These two methods improve the model by using all features but shrinking the coefficients. Ridge regression uses the L2-norm and Lasso regression uses the L1-norm. Here we use cross validation to compute the RMSE for a baseline model, a model regularized by Ridge regression and one regularized using Lasso." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def cross_validate(X, y, nfolds, reg_name):\n", " rmses = []\n", " kfold = KFold(X.shape[0], n_folds=nfolds)\n", " for train, test in kfold:\n", " Xtrain, ytrain, Xtest, ytest = X[train], y[train], X[test], y[test]\n", " reg = None\n", " if reg_name == \"ridge\":\n", " reg = Ridge()\n", " elif reg_name == \"lasso\":\n", " reg = Lasso()\n", " else:\n", " reg = LinearRegression()\n", " reg.fit(Xtrain, ytrain)\n", " ypred = reg.predict(Xtest)\n", " rmses.append(np.sqrt(mean_squared_error(ytest, ypred)))\n", " return np.mean(rmses)\n", "\n", "collist = [col for col in hitters_df.columns if col != \"Salary\"]\n", "X = hitters_df[collist].values\n", "y = hitters_df[\"Salary\"].values\n", "rmse_baseline = cross_validate(X, y, 10, \"baseline\")\n", "rmse_ridge = cross_validate(X, y, 10, \"ridge\")\n", "rmse_lasso = cross_validate(X, y, 10, \"lasso\")\n", "(rmse_baseline, rmse_ridge, rmse_lasso)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "(331.00425667935832, 330.72572506106593, 330.00460161612779)" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we attempt to find an optimum value of alpha for the Lasso regressor using cross-validation." ] }, { "cell_type": "code", "collapsed": false, "input": [ "cv_errors = []\n", "alphas = [0.1 * alpha for alpha in range(1, 200, 20)]\n", "kfold = KFold(X.shape[0], n_folds=10)\n", "for alpha in alphas:\n", " rmses = []\n", " for train, test in kfold:\n", " Xtrain, ytrain, Xtest, ytest = X[train], y[train], X[test], y[test]\n", " reg = Lasso(alpha=alpha)\n", " reg.fit(Xtrain, ytrain)\n", " ypred = reg.predict(Xtest)\n", " rmses.append(np.sqrt(mean_squared_error(ytest, ypred)))\n", " cv_errors.append(np.mean(rmses))\n", "plt.plot(alphas, cv_errors)\n", "plt.xlabel(\"alpha\")\n", "plt.ylabel(\"RMSE\")" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 9 } ], "metadata": {} } ] }