{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4 Pre-Processing and Training Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.1 Contents\n",
"* [4 Pre-Processing and Training Data](#4_Pre-Processing_and_Training_Data)\n",
" * [4.1 Contents](#4.1_Contents)\n",
" * [4.2 Introduction](#4.2_Introduction)\n",
" * [4.3 Imports](#4.3_Imports)\n",
" * [4.4 Load Data](#4.4_Load_Data)\n",
" * [4.5 Extract Big Mountain Data](#4.5_Extract_Big_Mountain_Data)\n",
" * [4.6 Train/Test Split](#4.6_Train/Test_Split)\n",
" * [4.7 Initial Not-Even-A-Model](#4.7_Initial_Not-Even-A-Model)\n",
" * [4.7.1 Metrics](#4.7.1_Metrics)\n",
" * [4.7.1.1 R-squared, or coefficient of determination](#4.7.1.1_R-squared,_or_coefficient_of_determination)\n",
" * [4.7.1.2 Mean Absolute Error](#4.7.1.2_Mean_Absolute_Error)\n",
" * [4.7.1.3 Mean Squared Error](#4.7.1.3_Mean_Squared_Error)\n",
" * [4.7.2 sklearn metrics](#4.7.2_sklearn_metrics)\n",
" * [4.7.2.0.1 R-squared](#4.7.2.0.1_R-squared)\n",
" * [4.7.2.0.2 Mean absolute error](#4.7.2.0.2_Mean_absolute_error)\n",
" * [4.7.2.0.3 Mean squared error](#4.7.2.0.3_Mean_squared_error)\n",
" * [4.7.3 Note On Calculating Metrics](#4.7.3_Note_On_Calculating_Metrics)\n",
" * [4.8 Initial Models](#4.8_Initial_Models)\n",
" * [4.8.1 Imputing missing feature (predictor) values](#4.8.1_Imputing_missing_feature_(predictor)_values)\n",
" * [4.8.1.1 Impute missing values with median](#4.8.1.1_Impute_missing_values_with_median)\n",
" * [4.8.1.1.1 Learn the values to impute from the train set](#4.8.1.1.1_Learn_the_values_to_impute_from_the_train_set)\n",
" * [4.8.1.1.2 Apply the imputation to both train and test splits](#4.8.1.1.2_Apply_the_imputation_to_both_train_and_test_splits)\n",
" * [4.8.1.1.3 Scale the data](#4.8.1.1.3_Scale_the_data)\n",
" * [4.8.1.1.4 Train the model on the train split](#4.8.1.1.4_Train_the_model_on_the_train_split)\n",
" * [4.8.1.1.5 Make predictions using the model on both train and test splits](#4.8.1.1.5_Make_predictions_using_the_model_on_both_train_and_test_splits)\n",
" * [4.8.1.1.6 Assess model performance](#4.8.1.1.6_Assess_model_performance)\n",
" * [4.8.1.2 Impute missing values with the mean](#4.8.1.2_Impute_missing_values_with_the_mean)\n",
" * [4.8.1.2.1 Learn the values to impute from the train set](#4.8.1.2.1_Learn_the_values_to_impute_from_the_train_set)\n",
" * [4.8.1.2.2 Apply the imputation to both train and test splits](#4.8.1.2.2_Apply_the_imputation_to_both_train_and_test_splits)\n",
" * [4.8.1.2.3 Scale the data](#4.8.1.2.3_Scale_the_data)\n",
" * [4.8.1.2.4 Train the model on the train split](#4.8.1.2.4_Train_the_model_on_the_train_split)\n",
" * [4.8.1.2.5 Make predictions using the model on both train and test splits](#4.8.1.2.5_Make_predictions_using_the_model_on_both_train_and_test_splits)\n",
" * [4.8.1.2.6 Assess model performance](#4.8.1.2.6_Assess_model_performance)\n",
" * [4.8.2 Pipelines](#4.8.2_Pipelines)\n",
" * [4.8.2.1 Define the pipeline](#4.8.2.1_Define_the_pipeline)\n",
" * [4.8.2.2 Fit the pipeline](#4.8.2.2_Fit_the_pipeline)\n",
" * [4.8.2.3 Make predictions on the train and test sets](#4.8.2.3_Make_predictions_on_the_train_and_test_sets)\n",
" * [4.8.2.4 Assess performance](#4.8.2.4_Assess_performance)\n",
" * [4.9 Refining The Linear Model](#4.9_Refining_The_Linear_Model)\n",
" * [4.9.1 Define the pipeline](#4.9.1_Define_the_pipeline)\n",
" * [4.9.2 Fit the pipeline](#4.9.2_Fit_the_pipeline)\n",
" * [4.9.3 Assess performance on the train and test set](#4.9.3_Assess_performance_on_the_train_and_test_set)\n",
" * [4.9.4 Define a new pipeline to select a different number of features](#4.9.4_Define_a_new_pipeline_to_select_a_different_number_of_features)\n",
" * [4.9.5 Fit the pipeline](#4.9.5_Fit_the_pipeline)\n",
" * [4.9.6 Assess performance on train and test data](#4.9.6_Assess_performance_on_train_and_test_data)\n",
" * [4.9.7 Assessing performance using cross-validation](#4.9.7_Assessing_performance_using_cross-validation)\n",
" * [4.9.8 Hyperparameter search using GridSearchCV](#4.9.8_Hyperparameter_search_using_GridSearchCV)\n",
" * [4.10 Random Forest Model](#4.10_Random_Forest_Model)\n",
" * [4.10.1 Define the pipeline](#4.10.1_Define_the_pipeline)\n",
" * [4.10.2 Fit and assess performance using cross-validation](#4.10.2_Fit_and_assess_performance_using_cross-validation)\n",
" * [4.10.3 Hyperparameter search using GridSearchCV](#4.10.3_Hyperparameter_search_using_GridSearchCV)\n",
" * [4.11 Final Model Selection](#4.11_Final_Model_Selection)\n",
" * [4.11.1 Linear regression model performance](#4.11.1_Linear_regression_model_performance)\n",
" * [4.11.2 Random forest regression model performance](#4.11.2_Random_forest_regression_model_performance)\n",
" * [4.11.3 Conclusion](#4.11.3_Conclusion)\n",
" * [4.12 Data quantity assessment](#4.12_Data_quantity_assessment)\n",
" * [4.13 Save best model object from pipeline](#4.13_Save_best_model_object_from_pipeline)\n",
" * [4.14 Summary](#4.14_Summary)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.2 Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In preceding notebooks, we performed preliminary assessments of data quality and refined the question to be answered. We found a small number of observations that clearly indicated whether to replace values or drop a whole row. We determined that predicting the adult weekend ticket price was our primary aim. We threw away records with missing price data, but not before making the most of the other available data to look for any patterns among the states. We didn't see any and decided to treat all states equally; the state label didn't seem to be particularly useful.\n",
"\n",
"In this notebook, we'll start to build machine learning models. Before diving into a machine learning model, however, we'll start by considering how useful the mean value is as a predictor. We never want to go to stakeholders with a machine learning model only to have the CEO point out that it performs worse than just guessing the average! Our first model is always a baseline performance comparitor for any subsequent model. Next, we'll build up the process of efficiently creating robust models to compare to our baseline forecast. We can validate steps with our own functions for checking expected equivalences between, say, pandas and sklearn implementations."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.3 Imports"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import os\n",
"import pickle\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sklearn import __version__ as sklearn_version\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import scale\n",
"from sklearn.model_selection import train_test_split, cross_validate, GridSearchCV, learning_curve\n",
"from sklearn.preprocessing import StandardScaler, MinMaxScaler\n",
"from sklearn.dummy import DummyRegressor\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error\n",
"from sklearn.pipeline import make_pipeline\n",
"from sklearn.impute import SimpleImputer\n",
"from sklearn.feature_selection import SelectKBest, f_regression\n",
"import datetime\n",
"\n",
"from library.sb_utils import save_file"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.4 Load Data"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" 124\n",
"Name Big Mountain Resort\n",
"Region Montana\n",
"state Montana\n",
"summit_elev 6817\n",
"vertical_drop 2353\n",
"base_elev 4464\n",
"trams 0\n",
"fastSixes 0\n",
"fastQuads 3\n",
"quad 2\n",
"triple 6\n",
"double 0\n",
"surface 3\n",
"total_chairs 14\n",
"Runs 105.0\n",
"TerrainParks 4.0\n",
"LongestRun_mi 3.3\n",
"SkiableTerrain_ac 3000.0\n",
"Snow Making_ac 600.0\n",
"daysOpenLastYear 123.0\n",
"yearsOpen 72.0\n",
"averageSnowfall 333.0\n",
"AdultWeekend 81.0\n",
"projectedDaysOpen 123.0\n",
"NightSkiing_ac 600.0\n",
"resorts_per_state 12\n",
"resorts_per_100kcapita 1.122778\n",
"resorts_per_100ksq_mile 8.161045\n",
"resort_skiable_area_ac_state_ratio 0.140121\n",
"resort_days_open_state_ratio 0.129338\n",
"resort_terrain_park_state_ratio 0.148148\n",
"resort_night_skiing_state_ratio 0.84507\n",
"total_chairs_runs_ratio 0.133333\n",
"total_chairs_skiable_ratio 0.004667\n",
"fastQuads_runs_ratio 0.028571\n",
"fastQuads_skiable_ratio 0.001"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"big_mountain.T"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(278, 36)"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ski_data.shape"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"ski_data = ski_data[ski_data.Name != 'Big Mountain Resort']"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(277, 36)"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ski_data.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.6 Train/Test Split"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So far, we've treated ski resort data as a single entity. In machine learning, when we train our model on all of our data, we end up with no data set aside to evaluate model performance. We could keep making more and more complex models that fit the data better and better and not realise we are overfitting the model. By partitioning the data into training and testing splits, without letting a model (or missing-value imputation) learn anything about the test split, we have a somewhat independent assessment of how our model might perform in the future. An often overlooked subtlety here is that people all too frequently use the test set to assess model performance _and then compare multiple models to pick the best_. This means their overall model selection process is flawed: The engineer picks the model sans help from the test set. Instead we use held-out data and/or k-fold cross-validation to simulate additional test sets and assess model performance. The formal test set is very useful as a final check on expected future performance."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What partition sizes would we have with a 70/30 train/test split?"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(193.89999999999998, 83.1)"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(ski_data) * .7, len(ski_data) * .3"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [],
"source": [
"# Generate test and train sets for X and Y variables; set random state to get reproducable results\n",
"X_train, X_test, y_train, y_test = train_test_split(ski_data.drop(columns='AdultWeekend'), \n",
" ski_data.AdultWeekend, test_size=0.3, \n",
" random_state=47)"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((193, 35), (84, 35))"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the shapes of X train and test sets\n",
"X_train.shape, X_test.shape"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((193,), (84,))"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the shapes of train Y train and test sets\n",
"y_train.shape, y_test.shape"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((193, 32), (84, 32))"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"names_list = ['Name', 'state', 'Region']\n",
"names_train = X_train[names_list]\n",
"names_test = X_test[names_list]\n",
"X_train.drop(columns=names_list, inplace=True)\n",
"X_test.drop(columns=names_list, inplace=True)\n",
"X_train.shape, X_test.shape"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"summit_elev int64\n",
"vertical_drop int64\n",
"base_elev int64\n",
"trams int64\n",
"fastSixes int64\n",
"fastQuads int64\n",
"quad int64\n",
"triple int64\n",
"double int64\n",
"surface int64\n",
"total_chairs int64\n",
"Runs float64\n",
"TerrainParks float64\n",
"LongestRun_mi float64\n",
"SkiableTerrain_ac float64\n",
"Snow Making_ac float64\n",
"daysOpenLastYear float64\n",
"yearsOpen float64\n",
"averageSnowfall float64\n",
"projectedDaysOpen float64\n",
"NightSkiing_ac float64\n",
"resorts_per_state int64\n",
"resorts_per_100kcapita float64\n",
"resorts_per_100ksq_mile float64\n",
"resort_skiable_area_ac_state_ratio float64\n",
"resort_days_open_state_ratio float64\n",
"resort_terrain_park_state_ratio float64\n",
"resort_night_skiing_state_ratio float64\n",
"total_chairs_runs_ratio float64\n",
"total_chairs_skiable_ratio float64\n",
"fastQuads_runs_ratio float64\n",
"fastQuads_skiable_ratio float64\n",
"dtype: object"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check the `dtypes` attribute of `X_train` to verify all features are numeric\n",
"X_train.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"summit_elev int64\n",
"vertical_drop int64\n",
"base_elev int64\n",
"trams int64\n",
"fastSixes int64\n",
"fastQuads int64\n",
"quad int64\n",
"triple int64\n",
"double int64\n",
"surface int64\n",
"total_chairs int64\n",
"Runs float64\n",
"TerrainParks float64\n",
"LongestRun_mi float64\n",
"SkiableTerrain_ac float64\n",
"Snow Making_ac float64\n",
"daysOpenLastYear float64\n",
"yearsOpen float64\n",
"averageSnowfall float64\n",
"projectedDaysOpen float64\n",
"NightSkiing_ac float64\n",
"resorts_per_state int64\n",
"resorts_per_100kcapita float64\n",
"resorts_per_100ksq_mile float64\n",
"resort_skiable_area_ac_state_ratio float64\n",
"resort_days_open_state_ratio float64\n",
"resort_terrain_park_state_ratio float64\n",
"resort_night_skiing_state_ratio float64\n",
"total_chairs_runs_ratio float64\n",
"total_chairs_skiable_ratio float64\n",
"fastQuads_runs_ratio float64\n",
"fastQuads_skiable_ratio float64\n",
"dtype: object"
]
},
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Repeat this check for the test split in `X_test`\n",
"X_test.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have only numeric features in X now!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.7 Initial Not-Even-A-Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll begin by determining how good the mean is as a predictor. In other words, what if we simply say our best guess is the average price?"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"63.84730569948186"
]
},
"execution_count": 102,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Calculate the mean of `y_train`\n",
"train_mean = y_train.mean()\n",
"train_mean"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`sklearn`'s `DummyRegressor` easily does this:"
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[63.8473057]])"
]
},
"execution_count": 103,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Sanity Check\n",
"dumb_reg = DummyRegressor(strategy='mean')\n",
"dumb_reg.fit(X_train, y_train)\n",
"dumb_reg.constant_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having established the grand mean, we need to determine how closely it matches, or explains, the actual values. There are many ways of assessing how good one set of values agrees with another, which brings us to the subject of metrics."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.7.1 Metrics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.7.1.1 R-squared, or coefficient of determination"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One measure is $R^2$, the [coefficient of determination](https://en.wikipedia.org/wiki/Coefficient_of_determination). This is a measure of the proportion of variance in the dependent variable (our ticket price) that is predicted by our \"model\". The linked Wikipedia articles gives a nice explanation of how negative values can arise. This is frequently a cause of confusion for newcomers who, reasonably, ask how can a squared value be negative?\n",
"\n",
"Recall the mean can be denoted by $\\bar{y}$, where\n",
"\n",
"$$\\bar{y} = \\frac{1}{n}\\sum_{i=1}^ny_i$$\n",
"\n",
"and where $y_i$ are the individual values of the dependent variable.\n",
"\n",
"The total sum of squares (error), can be expressed as\n",
"\n",
"$$SS_{tot} = \\sum_i(y_i-\\bar{y})^2$$\n",
"\n",
"The above formula should be familiar as it's simply the variance without the denominator to scale (divide) by the sample size.\n",
"\n",
"The residual sum of squares is similarly defined to be\n",
"\n",
"$$SS_{res} = \\sum_i(y_i-\\hat{y})^2$$\n",
"\n",
"where $\\hat{y}$ are our predicted values for the depended variable.\n",
"\n",
"The coefficient of determination, $R^2$, here is given by\n",
"\n",
"$$R^2 = 1 - \\frac{SS_{res}}{SS_{tot}}$$\n",
"\n",
"Putting it into words, it's one minus the ratio of the residual variance to the original variance. Thus, the baseline model here, which always predicts $\\bar{y}$, should give $R^2=0$. A model that perfectly predicts the observed values would have no residual error and so give $R^2=1$. Models that do worse than predicting the mean will have increased the sum of squares of residuals and so produce a negative $R^2$."
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {},
"outputs": [],
"source": [
"#Calculate the R^2 as defined above\n",
"def r_squared(y, ypred):\n",
" \"\"\"R-squared score.\n",
" \n",
" Calculate the R-squared, or coefficient of determination, of the input.\n",
" \n",
" Arguments:\n",
" y -- the observed values\n",
" ypred -- the predicted values\n",
" \"\"\"\n",
" ybar = np.mean(y)\n",
" sum_sq_tot = np.sum((y - ybar)**2)\n",
" sum_sq_res = np.sum((y - ypred)**2)\n",
" R2 = 1.0 - sum_sq_res / sum_sq_tot\n",
" return R2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We make our predictions by creating an array of length the size of the training set with the single value of the mean."
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([63.8473057, 63.8473057, 63.8473057, 63.8473057, 63.8473057])"
]
},
"execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_tr_pred_ = train_mean * np.ones(len(y_train))\n",
"y_tr_pred_[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Remember the `sklearn` dummy regressor? "
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([63.8473057, 63.8473057, 63.8473057, 63.8473057, 63.8473057])"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_tr_pred = dumb_reg.predict(X_train)\n",
"y_tr_pred[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that `DummyRegressor` produces exactly the same results and saves us from having to broadcast the mean (or whichever other statistic we used - check out the [documentation](https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyRegressor.html) to see what's available) to an array of the appropriate length. It also gives us an object with `fit()` and `predict()` methods as well, so we can use them as conveniently as any other `sklearn` estimator."
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0"
]
},
"execution_count": 107,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r_squared(y_train, y_tr_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exactly as expected, if we use the average value as our prediction, we get an $R^2$ of zero _on our training set_. What if we use this \"model\" to predict unseen values from the test set? Remember, of course, that our \"model\" is trained on the training set; we still use the training set mean as our prediction."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Make predictions by creating an array of length the size of the test set with the single value of the (training) mean."
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-0.0015364646867073173"
]
},
"execution_count": 108,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_te_pred = train_mean * np.ones(len(y_test))\n",
"r_squared(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Generally, you can expect performance on a test set to be slightly worse than on the training set. As you are getting an $R^2$ of zero on the training set, there's nowhere to go but negative!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$R^2$ is a common metric, and interpretable in terms of the amount of variance explained, it's less appealing if we want an idea of how \"close\" our predictions are to the true values. Metrics that summarise the difference between predicted and actual values are _mean absolute error_ and _mean squared error_."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.7.1.2 Mean Absolute Error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is very simply the average of the absolute errors:\n",
"\n",
"$$MAE = \\frac{1}{n}\\sum_i^n|y_i - \\hat{y}|$$"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [],
"source": [
"def mae(y, ypred):\n",
" \"\"\"Mean absolute error.\n",
" \n",
" Calculate the mean absolute error of the arguments\n",
"\n",
" Arguments:\n",
" y -- the observed values\n",
" ypred -- the predicted values\n",
" \"\"\"\n",
" abs_error = np.abs(y - ypred)\n",
" mae = np.mean(abs_error)\n",
" return mae"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"18.149503610835193"
]
},
"execution_count": 110,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mae(y_train, y_tr_pred)"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"18.672179249938317"
]
},
"execution_count": 111,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mae(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mean absolute error is arguably the most intuitive of all the metrics, this essentially tells you that, on average, you might expect to be off by around \\\\$19 if you guessed ticket price based on an average of known values."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.7.1.3 Mean Squared Error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Another common metric (and an important one internally for optimizing machine learning models) is the mean squared error. This is simply the average of the square of the errors:\n",
"\n",
"$$MSE = \\frac{1}{n}\\sum_i^n(y_i - \\hat{y})^2$$"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# Calculate the MSE as defined above\n",
"def mse(y, ypred):\n",
" \"\"\"Mean square error.\n",
" \n",
" Calculate the mean square error of the arguments\n",
"\n",
" Arguments:\n",
" y -- the observed values\n",
" ypred -- the predicted values\n",
" \"\"\"\n",
" sq_error = (y - ypred)**2\n",
" mse = np.mean(sq_error)\n",
" return mse"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"616.9493046578431"
]
},
"execution_count": 113,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mse(y_train, y_tr_pred)"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"574.1671108060107"
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mse(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So here, we get a slightly better MSE on the test set than we did on the train set. And what does a squared error mean anyway? To convert this back to our measurement space, we often take the square root, to form the _root mean square error_ thus:"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([24.83846422, 23.96178438])"
]
},
"execution_count": 115,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sqrt([mse(y_train, y_tr_pred), mse(y_test, y_te_pred)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.7.2 sklearn metrics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Functions are good, but you don't want to have to define functions every time we want to assess performance. `sklearn.metrics` provides many commonly used metrics, included the ones above."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.7.2.0.1 R-squared"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0, -0.0015364646867073173)"
]
},
"execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r2_score(y_train, y_tr_pred), r2_score(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.7.2.0.2 Mean absolute error"
]
},
{
"cell_type": "code",
"execution_count": 117,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(18.149503610835193, 18.672179249938317)"
]
},
"execution_count": 117,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_train, y_tr_pred), mean_absolute_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.7.2.0.3 Mean squared error"
]
},
{
"cell_type": "code",
"execution_count": 118,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(616.9493046578431, 574.1671108060107)"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_squared_error(y_train, y_tr_pred), mean_squared_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.7.3 Note On Calculating Metrics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In a Jupyter code cell, running `r2_score?` will bring up the docstring for the function, and `r2_score??` will bring up the actual code of the function! Here we try it and compare the source for `sklearn`'s function with ours."
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0, -3.054984985780873e+30)"
]
},
"execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# train set - sklearn\n",
"# correct order, incorrect order\n",
"r2_score(y_train, y_tr_pred), r2_score(y_tr_pred, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(-0.0015364646867073173, -2.8431378228302645e+30)"
]
},
"execution_count": 120,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test set - sklearn\n",
"# correct order, incorrect order\n",
"r2_score(y_test, y_te_pred), r2_score(y_te_pred, y_test)"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0, -3.054984985780873e+30)"
]
},
"execution_count": 121,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# train set - using our homebrew function\n",
"# correct order, incorrect order\n",
"r_squared(y_train, y_tr_pred), r_squared(y_tr_pred, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(-0.0015364646867073173, -2.8431378228302645e+30)"
]
},
"execution_count": 122,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test set - using our homebrew function\n",
"# correct order, incorrect order\n",
"r_squared(y_test, y_te_pred), r_squared(y_te_pred, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can get very different results swapping the argument order. It's worth highlighting this because data scientists do this too much in the real world! Frequently the argument order doesn't matter, but it will bite when we do it with a function that does care. It's sloppy, bad practice and if we don't make a habit of putting arguments in the right order, we stand to forget!\n",
"\n",
"Remember:\n",
"* argument order matters,\n",
"* check function syntax with `func?` in a code cell"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.8 Initial Models"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.8.1 Imputing missing feature (predictor) values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall when performing EDA, we imputed (filled in) some missing values in Pandas. We can impute missing values using scikit-learn, but we will prioritize imputation from a train split and apply that to the test split to then assess how well our imputation worked."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.1.1 Impute missing values with median"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have missing values. Recall from our data exploration that many distributions were skewed. Our first thought might be to impute missing values using the median."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.1.1 Learn the values to impute from the train set"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"summit_elev 2175.000000\n",
"vertical_drop 750.000000\n",
"base_elev 1280.000000\n",
"trams 0.000000\n",
"fastSixes 0.000000\n",
"fastQuads 0.000000\n",
"quad 0.000000\n",
"triple 1.000000\n",
"double 1.000000\n",
"surface 2.000000\n",
"total_chairs 6.000000\n",
"Runs 29.000000\n",
"TerrainParks 2.000000\n",
"LongestRun_mi 1.000000\n",
"SkiableTerrain_ac 170.000000\n",
"Snow Making_ac 96.500000\n",
"daysOpenLastYear 107.000000\n",
"yearsOpen 57.000000\n",
"averageSnowfall 120.000000\n",
"projectedDaysOpen 112.000000\n",
"NightSkiing_ac 70.000000\n",
"resorts_per_state 15.000000\n",
"resorts_per_100kcapita 0.248243\n",
"resorts_per_100ksq_mile 24.428973\n",
"resort_skiable_area_ac_state_ratio 0.050000\n",
"resort_days_open_state_ratio 0.070595\n",
"resort_terrain_park_state_ratio 0.069444\n",
"resort_night_skiing_state_ratio 0.066804\n",
"total_chairs_runs_ratio 0.200000\n",
"total_chairs_skiable_ratio 0.040323\n",
"fastQuads_runs_ratio 0.000000\n",
"fastQuads_skiable_ratio 0.000000\n",
"dtype: float64"
]
},
"execution_count": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# These are the values we'll use to fill in any missing values\n",
"X_defaults_median = X_train.median()\n",
"X_defaults_median"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.1.2 Apply the imputation to both train and test splits"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [],
"source": [
"X_tr = X_train.fillna(X_defaults_median)\n",
"X_te = X_test.fillna(X_defaults_median)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.1.3 Scale the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we have features measured in many different units, with numbers that vary by orders of magnitude, start off by scaling them to put them all on a consistent scale. The [StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) scales each feature to zero mean and unit variance."
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [],
"source": [
"#Call the StandardScaler`s fit method on `X_tr` to fit the scaler\n",
"#then use it's `transform()` method to apply the scaling to both the train and test split\n",
"#data (`X_tr` and `X_te`), naming the results `X_tr_scaled` and `X_te_scaled`, respectively\n",
"scaler = StandardScaler()\n",
"scaler.fit(X_tr)\n",
"X_tr_scaled = scaler.transform(X_tr)\n",
"X_te_scaled = scaler.transform(X_te)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.1.4 Train the model on the train split"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [],
"source": [
"lm = LinearRegression().fit(X_tr_scaled, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.1.5 Make predictions using the model on both train and test splits"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {},
"outputs": [],
"source": [
"#Call the `predict()` method of the model (`lm`) on both the (scaled) train and test data\n",
"#Assign the predictions to `y_tr_pred` and `y_te_pred`, respectively\n",
"y_tr_pred = lm.predict(X_tr_scaled)\n",
"y_te_pred = lm.predict(X_te_scaled)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.1.6 Assess model performance"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.8237204449411376, 0.7251410286259974)"
]
},
"execution_count": 128,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# r^2 - train, test\n",
"median_r2 = r2_score(y_train, y_tr_pred), r2_score(y_test, y_te_pred)\n",
"median_r2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall that we estimated ticket prices by simply using a known average. As expected, this produced an $R^2$ of zero for both the training and test set, because $R^2$ tells us how much of the variance we've explaining beyond that of using just the mean. Here, we see that our simple linear regression model explains over 80% of the variance on the train set and over 70% on the test set. Clearly, we are onto something, although the much lower value for the test set is indicative of overfitting. This isn't a surprise as we've made no effort to select a parsimonious set of features or deal with multicollinearity in our data."
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8.495768235382354, 9.696652536263656)"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Now calculate the mean absolute error scores using `sklearn`'s `mean_absolute_error` function as we did above for R^2\n",
"# MAE - train, test\n",
"median_mae = mean_absolute_error(y_train, y_tr_pred), mean_absolute_error(y_test, y_te_pred)\n",
"median_mae"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using this model, then, on average we'd expect to estimate a ticket price within \\\\$9 or so of the real price. This is much, much better than the \\\\$19 from just guessing using the average. There may be something to this machine learning lark after all!"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(108.75554891895914, 157.57287631288543)"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# And also do the same using `sklearn`'s `mean_squared_error`\n",
"# MSE - train, test\n",
"median_mse = mean_squared_error(y_train, y_tr_pred), mean_squared_error(y_test, y_te_pred)\n",
"median_mse"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.1.2 Impute missing values with the mean"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We chose to use the median for filling missing values because of the skew of many of our predictor feature distributions, let's try the mean."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.2.1 Learn the values to impute from the train set"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"summit_elev 4042.036269\n",
"vertical_drop 1057.264249\n",
"base_elev 2975.487047\n",
"trams 0.103627\n",
"fastSixes 0.093264\n",
"fastQuads 0.673575\n",
"quad 0.948187\n",
"triple 1.414508\n",
"double 1.746114\n",
"surface 2.476684\n",
"total_chairs 7.455959\n",
"Runs 41.387435\n",
"TerrainParks 2.447205\n",
"LongestRun_mi 1.301579\n",
"SkiableTerrain_ac 458.691099\n",
"Snow Making_ac 128.935294\n",
"daysOpenLastYear 109.761290\n",
"yearsOpen 56.895833\n",
"averageSnowfall 160.112903\n",
"projectedDaysOpen 114.900621\n",
"NightSkiing_ac 84.843478\n",
"resorts_per_state 16.523316\n",
"resorts_per_100kcapita 0.442984\n",
"resorts_per_100ksq_mile 42.862331\n",
"resort_skiable_area_ac_state_ratio 0.096680\n",
"resort_days_open_state_ratio 0.121639\n",
"resort_terrain_park_state_ratio 0.113116\n",
"resort_night_skiing_state_ratio 0.150272\n",
"total_chairs_runs_ratio 0.266321\n",
"total_chairs_skiable_ratio 0.070053\n",
"fastQuads_runs_ratio 0.010619\n",
"fastQuads_skiable_ratio 0.001700\n",
"dtype: float64"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# As we did for the median above, calculate mean values for imputing missing values\n",
"# These are the values we'll use to fill in any missing values\n",
"X_defaults_mean = X_train.mean()\n",
"X_defaults_mean"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By eye, we can immediately tell that our replacement values are much higher than those from using the median."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.2.2 Apply the imputation to both train and test splits"
]
},
{
"cell_type": "code",
"execution_count": 194,
"metadata": {},
"outputs": [],
"source": [
"X_tr = X_train.fillna(X_defaults_mean)\n",
"X_te = X_test.fillna(X_defaults_mean)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.2.3 Scale the data"
]
},
{
"cell_type": "code",
"execution_count": 195,
"metadata": {},
"outputs": [],
"source": [
"scaler = StandardScaler()\n",
"scaler.fit(X_tr)\n",
"X_tr_scaled = scaler.transform(X_tr)\n",
"X_te_scaled = scaler.transform(X_te)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.2.4 Train the model on the train split"
]
},
{
"cell_type": "code",
"execution_count": 196,
"metadata": {},
"outputs": [],
"source": [
"lm = LinearRegression().fit(X_tr_scaled, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.2.5 Make predictions using the model on both train and test splits"
]
},
{
"cell_type": "code",
"execution_count": 197,
"metadata": {},
"outputs": [],
"source": [
"y_tr_pred = lm.predict(X_tr_scaled)\n",
"y_te_pred = lm.predict(X_te_scaled)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### 4.8.1.2.6 Assess model performance"
]
},
{
"cell_type": "code",
"execution_count": 198,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.8221207605475709, 0.7290195691422242)"
]
},
"execution_count": 198,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r2_score(y_train, y_tr_pred), r2_score(y_test, y_te_pred)"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8.510780313012354, 9.565093916371973)"
]
},
"execution_count": 137,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_train, y_tr_pred), mean_absolute_error(y_test, y_te_pred)"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(109.74247309324214, 155.34936226136)"
]
},
"execution_count": 138,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_squared_error(y_train, y_tr_pred), mean_squared_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These results don't seem very different to when the one's we used with the median for imputing missing values. Perhaps it doesn't make much difference here. Maybe our overtraining is worse than we thought. Maybe other feature transformations, such as taking the log, would help. We could try with just a subset of features rather than using all of them as inputs.\n",
"\n",
"To perform the median/mean comparison, we copied and pasted a lot of code just to change the function for imputing missing values. It would make more sense to write a function that performed the sequence of steps:\n",
"1. impute missing values\n",
"2. scale the features\n",
"3. train a model\n",
"4. calculate model performance\n",
"\n",
"These are common steps, and `sklearn` provides something much better than writing custom functions."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.8.2 Pipelines"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One of the most important and useful components of `sklearn` is the [pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html). In place of Pandas's `fillna` DataFrame method, there is `sklearn`'s `SimpleImputer`. Remember the first linear model above performed the steps:\n",
"\n",
"1. replace missing values with the median for each feature\n",
"2. scale the data to zero mean and unit variance\n",
"3. train a linear regression model\n",
"\n",
"and all these steps were trained on the `train split` and then applied to the `test split` for assessment.\n",
"\n",
"The pipeline below defines exactly those same steps. Crucially, the resultant `Pipeline` object has a `fit()` method and a `predict()` method, just like the `LinearRegression()` object itself. Just as we might create a linear regression model and train it with `.fit()` and predict with `.predict()`, we can wrap the entire process of imputing and feature scaling and regression in a single object you can train with `.fit()` and predict with `.predict()`. And that's basically a pipeline: a model on steroids."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.2.1 Define the pipeline"
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {},
"outputs": [],
"source": [
"pipe = make_pipeline(\n",
" SimpleImputer(strategy='median'), \n",
" StandardScaler(), \n",
" LinearRegression()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"sklearn.pipeline.Pipeline"
]
},
"execution_count": 140,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(pipe)"
]
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(True, True)"
]
},
"execution_count": 141,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hasattr(pipe, 'fit'), hasattr(pipe, 'predict')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.2.2 Fit the pipeline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here, a single call to the pipeline's `fit()` method combines the steps of learning the imputation (determining what values to use to fill the missing ones), the scaling (determining the mean to subtract and the variance to divide by), and then training the model. It does this all in the one call with the training data as arguments."
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Pipeline(steps=[('simpleimputer', SimpleImputer(strategy='median')),\n",
" ('standardscaler', StandardScaler()),\n",
" ('linearregression', LinearRegression())])"
]
},
"execution_count": 142,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Call the pipe's `fit()` method with `X_train` and `y_train` as arguments\n",
"pipe.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.2.3 Make predictions on the train and test sets"
]
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {},
"outputs": [],
"source": [
"y_tr_pred = pipe.predict(X_train)\n",
"y_te_pred = pipe.predict(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.2.4 Assess performance"
]
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.8237204449411376, 0.7251410286259974)"
]
},
"execution_count": 144,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r2_score(y_train, y_tr_pred), r2_score(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And compare with our earlier (non-pipeline) result:"
]
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.8237204449411376, 0.7251410286259974)"
]
},
"execution_count": 145,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"median_r2"
]
},
{
"cell_type": "code",
"execution_count": 146,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8.495768235382354, 9.696652536263656)"
]
},
"execution_count": 146,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_train, y_tr_pred), mean_absolute_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compare with our earlier result:"
]
},
{
"cell_type": "code",
"execution_count": 147,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(8.495768235382354, 9.696652536263656)"
]
},
"execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"median_mae"
]
},
{
"cell_type": "code",
"execution_count": 148,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(108.75554891895914, 157.57287631288543)"
]
},
"execution_count": 148,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_squared_error(y_train, y_tr_pred), mean_squared_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compare with our earlier result:"
]
},
{
"cell_type": "code",
"execution_count": 149,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(108.75554891895914, 157.57287631288543)"
]
},
"execution_count": 149,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"median_mse"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These results confirm the pipeline is doing exactly what's expected, and results are identical to our earlier steps. This allows we to move faster but with confidence."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.9 Refining The Linear Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We suspected the model was overfitting. This is no real surprise given the number of features we blindly used. It's likely a judicious subset of features would generalize better. `sklearn` has a number of feature selection functions available. The one we'll use here is `SelectKBest` which, as we might guess, selects the k best features. We can read about SelectKBest \n",
"[here](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html#sklearn.feature_selection.SelectKBest). `f_regression` is just the [score function](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html#sklearn.feature_selection.f_regression) We're using because we're performing regression. It's important to choose an appropriate one for our machine learning task."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.1 Define the pipeline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Redefine our pipeline to include this feature selection step:"
]
},
{
"cell_type": "code",
"execution_count": 150,
"metadata": {},
"outputs": [],
"source": [
"pipe = make_pipeline(\n",
" SimpleImputer(strategy='median'), \n",
" StandardScaler(),\n",
" SelectKBest(score_func=f_regression),\n",
" LinearRegression()\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.2 Fit the pipeline"
]
},
{
"cell_type": "code",
"execution_count": 151,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Pipeline(steps=[('simpleimputer', SimpleImputer(strategy='median')),\n",
" ('standardscaler', StandardScaler()),\n",
" ('selectkbest',\n",
" SelectKBest(score_func=)),\n",
" ('linearregression', LinearRegression())])"
]
},
"execution_count": 151,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pipe.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.3 Assess performance on the train and test set"
]
},
{
"cell_type": "code",
"execution_count": 152,
"metadata": {},
"outputs": [],
"source": [
"y_tr_pred = pipe.predict(X_train)\n",
"y_te_pred = pipe.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.760478965339582, 0.681569974499793)"
]
},
"execution_count": 153,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r2_score(y_train, y_tr_pred), r2_score(y_test, y_te_pred)"
]
},
{
"cell_type": "code",
"execution_count": 154,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(9.757130441228263, 10.585905291034962)"
]
},
"execution_count": 154,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_train, y_tr_pred), mean_absolute_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This has made things worse! Clearly selecting a subset of features has an impact on performance. `SelectKBest` defaults to k=10. Let's create a new pipeline with a different value of k:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.4 Define a new pipeline to select a different number of features"
]
},
{
"cell_type": "code",
"execution_count": 155,
"metadata": {},
"outputs": [],
"source": [
"# Modify the `SelectKBest` step to use a value of 15 for k\n",
"pipe15 = make_pipeline(\n",
" SimpleImputer(strategy='median'), \n",
" StandardScaler(),\n",
" SelectKBest(score_func=f_regression, k=15),\n",
" LinearRegression()\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.5 Fit the pipeline"
]
},
{
"cell_type": "code",
"execution_count": 156,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Pipeline(steps=[('simpleimputer', SimpleImputer(strategy='median')),\n",
" ('standardscaler', StandardScaler()),\n",
" ('selectkbest',\n",
" SelectKBest(k=15,\n",
" score_func=)),\n",
" ('linearregression', LinearRegression())])"
]
},
"execution_count": 156,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pipe15.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.6 Assess performance on train and test data"
]
},
{
"cell_type": "code",
"execution_count": 157,
"metadata": {},
"outputs": [],
"source": [
"y_tr_pred = pipe15.predict(X_train)\n",
"y_te_pred = pipe15.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 158,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.7922946911681397, 0.66079117939879)"
]
},
"execution_count": 158,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r2_score(y_train, y_tr_pred), r2_score(y_test, y_te_pred)"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(9.214834764542976, 10.496823817105572)"
]
},
"execution_count": 159,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_train, y_tr_pred), mean_absolute_error(y_test, y_te_pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We could keep going, trying different values of k, training a model, measuring performance on the test set, and then picking the model with the best test set performance. There's a fundamental problem with this approach: _we're tuning the model to the arbitrary test set_! If we continue this way we'll end up with a model works well on the particular quirks of our test set _but fails to generalize to new data_. The whole point of keeping a test set is for it to be a set of unseen data on which to test performance.\n",
"\n",
"The way around this is a technique called _cross-validation_. We partition the training set into k folds, train our model on k-1 of those folds, and calculate performance on the fold not used in training. This procedure then cycles through k times with a different fold held back each time. Thus we end up building k models on k sets of data with k estimates of how the model performs on unseen data but without having to touch the test set."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.7 Assessing performance using cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"outputs": [],
"source": [
"# Run 5-Fold Cross validation\n",
"cv_results = cross_validate(pipe15, X_train, y_train, cv=5)"
]
},
{
"cell_type": "code",
"execution_count": 161,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.60510478, 0.67731713, 0.75047442, 0.58935004, 0.50041885])"
]
},
"execution_count": 161,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# get scores\n",
"cv_scores = cv_results['test_score']\n",
"cv_scores"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Without using the same random state for initializing the CV folds, our actual numbers will be different."
]
},
{
"cell_type": "code",
"execution_count": 162,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.6245330431201284, 0.08445948393083175)"
]
},
"execution_count": 162,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(cv_scores), np.std(cv_scores)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These results highlight that assessing model performance in inherently open to variability. We'll get different results depending on the quirks of which points are in which fold. An advantage of this is that you can also obtain an estimate of the variability, or uncertainty, in our performance estimate."
]
},
{
"cell_type": "code",
"execution_count": 163,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.46, 0.79])"
]
},
"execution_count": 163,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.round((np.mean(cv_scores) - 2 * np.std(cv_scores), np.mean(cv_scores) + 2 * np.std(cv_scores)), 2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9.8 Hyperparameter search using GridSearchCV"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pulling the above together, we have:\n",
"* a pipeline that\n",
" * imputes missing values\n",
" * scales the data\n",
" * selects the k best features\n",
" * trains a linear regression model\n",
"* a technique (cross-validation) for estimating model performance\n",
"\n",
"Now we will use cross-validation for multiple values of k, and then use cross-validation to pick the value of k that gives the best performance. `make_pipeline` automatically names each step in lowercase. Parameters of each step are then accessed by appending a double underscore followed by the parameter name. We know the name of the step will be 'selectkbest', and we know the parameter is 'k'."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also list the names of all the parameters in a pipeline as follows:"
]
},
{
"cell_type": "code",
"execution_count": 164,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['memory', 'steps', 'verbose', 'simpleimputer', 'standardscaler', 'selectkbest', 'linearregression', 'simpleimputer__add_indicator', 'simpleimputer__copy', 'simpleimputer__fill_value', 'simpleimputer__missing_values', 'simpleimputer__strategy', 'simpleimputer__verbose', 'standardscaler__copy', 'standardscaler__with_mean', 'standardscaler__with_std', 'selectkbest__k', 'selectkbest__score_func', 'linearregression__copy_X', 'linearregression__fit_intercept', 'linearregression__n_jobs', 'linearregression__normalize', 'linearregression__positive'])"
]
},
"execution_count": 164,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Call `pipe`'s `get_params()` method to get a dict of available parameters and print their names\n",
"# using dict's `keys()` method\n",
"pipe.get_params().keys()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The above can be particularly useful as our pipelines becomes more complex (we can even nest pipelines within pipelines)."
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [],
"source": [
"k = [k+1 for k in range(len(X_train.columns))]\n",
"grid_params = {'selectkbest__k': k}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we have a range of `k` to investigate. Is 1 feature best? 2? 3? 4? All of them? We could write a for loop and iterate over each possible value, doing all the housekeeping ourselves to track the best value of k. But this is a common task, so there's a built in function in `sklearn`. This is [`GridSearchCV`](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html).\n",
"\n",
"This takes the pipeline object, in fact it takes anything with a `.fit()` and `.predict()` method. In simple cases with no feature selection or imputation or feature scaling etc. we may see the classifier or regressor object itself directly passed into `GridSearchCV`. The other key input is the set of parameters and values to search over. Optional parameters include the cross-validation strategy and number of CPUs to use."
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [],
"source": [
"lr_grid_cv = GridSearchCV(pipe, param_grid=grid_params, cv=5, n_jobs=-1)"
]
},
{
"cell_type": "code",
"execution_count": 167,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"GridSearchCV(cv=5,\n",
" estimator=Pipeline(steps=[('simpleimputer',\n",
" SimpleImputer(strategy='median')),\n",
" ('standardscaler', StandardScaler()),\n",
" ('selectkbest',\n",
" SelectKBest(score_func=)),\n",
" ('linearregression',\n",
" LinearRegression())]),\n",
" n_jobs=-1,\n",
" param_grid={'selectkbest__k': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,\n",
" 12, 13, 14, 15, 16, 17, 18, 19, 20,\n",
" 21, 22, 23, 24, 25, 26, 27, 28, 29,\n",
" 30, ...]})"
]
},
"execution_count": 167,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_grid_cv.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 168,
"metadata": {},
"outputs": [],
"source": [
"score_mean = lr_grid_cv.cv_results_['mean_test_score']\n",
"score_std = lr_grid_cv.cv_results_['std_test_score']\n",
"cv_k = [k for k in lr_grid_cv.cv_results_['param_selectkbest__k']]"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'selectkbest__k': 6}"
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Print the `best_params_` attribute of `lr_grid_cv`\n",
"lr_grid_cv.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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7ty5mspoV65ceeRrlMdUWTWzyuTm5gpz5swR2rdvL9jY2AgSiURo2rSp8J///Ec4ePBgpfssWbJEACAEBgZW6zUEQRCSkpKEYcOGCd7e3oJMJhOcnJyEbt26CZs3b9ba7t69e8JHH30k+Pn5CVKpVHBychJ69uwpHDp0SGub//u//xO8vb0FiUQieHh4CK+99ppw584drWNV9fMRhOq/F5W5ePGiIBKJKlTuEwRBuHLlivDyyy8LjRs3FiQSieDi4iKEh4cLn3zyiWab8t/j//3vfxX2r+r3TBDUVSgnTpwoeHh4CObm5oK3t7cQExNToeJj+bVYXeU/p19//VUICgoSpFKp0KxZM2HRokUVtp03b57QrFkzQSaTCa1atRK+++67Sq+1qmL44YcfhB49eghubm6CVCoVPD09hREjRggnTpyodrzlyv+/qsquXbsEAMLly5d1PvbDyqs4VrasXLlSEARByMzMFMaMGSMEBAQI1tbWgo2NjdCmTRth8eLFglKp1ByrpKREePfddwVXV1fBwsJC6NKli5CUlCR4e3tXqBZ48eLFSqucEpFhiAShGtOSExHVApFIhNdffx1fffWVsUMhMrjyqpO///67sUOhKkyaNAl///03jh49auxQamzGjBlYvXo1Ll26VGU1QSLSH15lRERERjB37ly0a9cOhw8f1vtwNtKPuLg4Y4fwRHJzc/H111/jyy+/ZGJFVEtYip2IiMgIgoODsXLlSs49RAZz5coVxMTEYNSoUcYOhajB4LBAIiIiIiIiPWDPFRERERERkR4wuSIiIiIiItIDoydXcXFx8PHxgYWFBUJDQ7F///5Hbr9mzRqEhITAysoKHh4eGDt2bIUZydevX4/AwEDIZDIEBgZiw4YNhjwFIiIiIiIi495zFR8fj9GjRyMuLg4RERH49ttv8f333yMlJQVNmzatsP2BAwfQrVs3LF68GIMGDcKNGzcwceJE+Pn5aRKopKQkREZGYs6cORg2bBg2bNiAjz76CAcOHEDnzp2rFVdpaSlu3rwJW1tbTrhHRERERNSACYKAgoICeHp6wszsMX1TRpxjS+jUqZMwceJErbaAgABh6tSplW6/cOFCoXnz5lptX3zxhdCkSRPN4xEjRgj9+vXT2qZv377Cc889V+240tLSqpzojwsXLly4cOHChQsXLg1vSUtLe2weYbRJD+RyOY4ePYqpU6dqtUdFReHQoUOV7hMeHo7p06cjISEB0dHRyMrKwq+//ooBAwZotklKSsI777yjtV/fvn0RGxtbZSwlJSUoKSnRPBbKOvPS0tJgZ2en66kRaRMEIC9PvW5vD7A3lIiIiKjeyM/Ph5eXF2xtbR+7rdGSq+zsbKhUKri5uWm1u7m5VTnnR3h4ONasWYORI0eiuLgYSqUSgwcPxpdffqnZJiMjQ6djAuqJHGfNmlWh3c7OjskVPTm5HFi8WL0+bRoglRo3HiIiIiLSWXVuFzJ6QYuHgxQEocrAU1JS8NZbb+Gjjz7C0aNHsX37dly5cgUTJ06s8TEBICYmBnl5eZolLS2thmdDREREREQNldF6rpydnSEWiyv0KGVlZVXoeSo3d+5cRERE4P333wcAtGnTBtbW1oiMjMQnn3wCDw8PuLu763RMAJDJZJDJZE94RkRERERE1JAZredKKpUiNDQUiYmJWu2JiYkIDw+vdJ+ioqIKFTrEYjGA+/dJhYWFVTjmzp07qzwmERERERGRPhit5woApkyZgtGjR6NDhw4ICwvDsmXLkJqaqhnmFxMTgxs3bmD16tUAgEGDBuGVV17B0qVL0bdvX6Snp2Py5Mno1KkTPD09AQBvv/02unbtivnz52PIkCHYtGkTdu3ahQMHDhjtPImIiIiIyPQZNbkaOXIkcnJyMHv2bKSnpyM4OBgJCQnw9vYGAKSnpyM1NVWz/ZgxY1BQUICvvvoK7777LhwcHNCzZ0/Mnz9fs014eDjWrVuHDz/8EDNmzICvry/i4+OrPccVERERERFRTRh1EuG6Kj8/H/b29sjLy2O1QHpycjnw6afqdVYLJCIiIqpXdMkNjNpzRdQgmJkBHTveXyciIiIik8TkisjQzM2BBya6JiIiIiLTxK/RiYiIiIiI9IA9V0SGJghAUZF63coKqMbs3kRERERU/7DnisjQFApg4UL1olAYOxoiIiIiMhAmV0RERERERHrA5IqIiIiIiEgPmFwRERERERHpAZMrIiIiIiITVSRXotnUbWg2dRuK5Epjh2PymFwREREREVGdUZ8TQiZXRERERESkk/qcABkS57kiMjQzM6Bt2/vrRERERA8okisR+NEOAEDK7L6wkvIjen3Fd47I0MzNgaFDjR0FERGRyWOSQsbGr9GJiIiIwGFORPTkmM4TGZogAAqFel0iAUQi48ZDRERERAbBnisiQ1MogE8/VS/lSRYREVEDVh97CetjzFT7mFwRERERGRg/mBM1DEyuiIiIiIiI9IDJFREREVE9xR4xorqFyRUREREREZEeMLkiIiIiIiLSAyZXREREVG9wGBwR1WWc54rI0MzMgMDA++tERDookisR+NEOAEDK7L6wkvJPN9UO/u4R6Y5XCZGhmZsDI0YYOwoiogr44ZmISL/4NToRERHpFYfuEVFDxeSKiIiIiIhID9j/T2Rocjnw6afq9WnTAKnUuPEQERERkUGw54qIiIiIiEgPmFwRERERERHpAZMrIiIiIiIiPWByRUREREREpAdMroiIiIiIiPSAyRUREREREZEeGD25iouLg4+PDywsLBAaGor9+/dXue2YMWMgEokqLEFBQZptVq1aVek2xcXFtXE6RBWZmQF+furFzOiXHBEREREZiFE/6cXHx2Py5MmYPn06jh07hsjISERHRyM1NbXS7ZcsWYL09HTNkpaWBkdHRzz77LNa29nZ2Wltl56eDgsLi9o4JaKKzM2BF15QL+acWo6IiIjIVBk1uVq0aBHGjRuH8ePHo1WrVoiNjYWXlxeWLl1a6fb29vZwd3fXLEeOHMGdO3cwduxYre1EIpHWdu7u7rVxOkRERERE1IAZLbmSy+U4evQooqKitNqjoqJw6NChah1j+fLl6N27N7y9vbXa7969C29vbzRp0gQDBw7EsWPHHnmckpIS5Ofnay1ERERERES6MFpylZ2dDZVKBTc3N612Nzc3ZGRkPHb/9PR0/P777xg/frxWe0BAAFatWoXNmzdj7dq1sLCwQEREBC5cuFDlsebOnQt7e3vN4uXlVbOTIqqMXA7897/qRS43djREREREZCBGv7teJBJpPRYEoUJbZVatWgUHBwcMHTpUq71Lly74z3/+g5CQEERGRuKXX35By5Yt8eWXX1Z5rJiYGOTl5WmWtLS0Gp0LUZUUCvVCRERERCbLaHfXOzs7QywWV+ilysrKqtCb9TBBELBixQqMHj0aUqn0kduamZmhY8eOj+y5kslkkMlk1Q+eiIiIiIjoIUbruZJKpQgNDUViYqJWe2JiIsLDwx+57969e3Hx4kWMGzfusa8jCAKSk5Ph4eHxRPESERERERE9ilHrQk+ZMgWjR49Ghw4dEBYWhmXLliE1NRUTJ04EoB6ud+PGDaxevVprv+XLl6Nz584IDg6ucMxZs2ahS5cu8PPzQ35+Pr744gskJyfj66+/rpVzIiIiIiKihsmoydXIkSORk5OD2bNnIz09HcHBwUhISNBU/0tPT68w51VeXh7Wr1+PJUuWVHrM3NxcTJgwARkZGbC3t0e7du2wb98+dOrUyeDnQ0REREREDZfRZzSdNGkSJk2aVOlzq1atqtBmb2+PoqKiKo+3ePFiLF68WF/hERERERERVYvRkysikycSAc2a3V8nIqMokisR+NEOAEDK7L6wkvJPIBER6Rf/shAZmkQCjBlj7CiIiIiIyMCMPs8VERERERGRKWByRURE9ISK5Eo0m7oNzaZuQ5FcaexwiIjISJhcUb1SLz/AyOXAggXqRS43djREREREZCC854qoNjyiwiURERERmQb2XBEREREREekBkysiIiIiIiI9YHJFRERERESkB0yuiIiIiIiI9IDJFRERERERkR6wWiCRoYlEgKfn/XUiIiIiMklMrogMTSIBJkwwdhREREREZGAcFkgEw05OXC8nPiYiIiIinTG5IiIiIiIi0gMOCyQyNIUCLx/eVLbeE5DysiMiIiIyRfyUR2RoggC7kruadSIiIiIyTRwWSEREREREpAdMroiIiIiIiPSAyRUREREREZEeMLkiIpPBsvdERERkTEyuiIiIiIiI9IDVAokMTSRCjpW9Zp2IiIiITBOTKyJDk0jwY/uBAIAYicTIwRARERGRoXBYIBERERERkR4wuSIiIiIiItIDDgskMjSFAqP/3Vq23hOQ8rIjIiIiMkX8lEdkaIIAp6I8zToRERERmSYOCyQiIiIiItIDJldERFSncDJoIiKqr5hcEVGl+AGXiIiISDdMroiIjMxQiawhE2Qm30RERBUxuSIiIiIiItIDoydXcXFx8PHxgYWFBUJDQ7F///4qtx0zZgxEIlGFJSgoSGu79evXIzAwEDKZDIGBgdiwYYOhT4OoaiIR8mU2yJfZACKRsaMhIiIiIgMxanIVHx+PyZMnY/r06Th27BgiIyMRHR2N1NTUSrdfsmQJ0tPTNUtaWhocHR3x7LPParZJSkrCyJEjMXr0aBw/fhyjR4/GiBEj8Pfff9fWaRFpk0iwouMQrOg4BJBIjB0N1RCHwREREdHjGDW5WrRoEcaNG4fx48ejVatWiI2NhZeXF5Yu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yCGBRERERER1gdF7rkh3W8p6rbr6ucDeSmLkaOixzMyAjh3vrxMRERGRSWJyVc8IgqCZOHhgCIcE1gvm5sAA3nxNREREZOqYXNUzZ9ILcPlWIaTmZujdqvrzgRERERHVFaz6SKaKyVU9s61s4uDuLV1ga8EhgfWCIABFRep1KytAJDJuPERERERkELwBpB5RDwksqxIYovvEwWQkCgWwcKF6USiMHQ0RERERGQiTq3okJT0f13KKYCExQ68AV2OHQ0RERERED+CwwHrk95MZAIBeAW6wlvGtIyIiIqJH4/1ttYuf0OuR7afVyRUnDiYiItI/fggloifFYYH1yM3cYlhLxejBIYFERERERHUOk6t6pnegGywkYmOHQURERERED+GwwHpmQGsOCSQiIiIyJRySajqYXNUjNjJzdPN3MXYYpCszM6Bt2/vrRERERGSSmFzVI71auUJmziGB9Y65OTB0qLGjICIiIiID49fodZyqVNCs9wt2N2IkRERERET0KOy5quOOXL2tWQ9r7mTESKjGBAFQKNTrEgkgEhk3HiIiIiIyCPZc1XG/n8rQrEvN+XbVSwoF8Omn6qU8ySIiIiIik8NP63Vcf1YHJCIiIiKqF5hc1XGdfByNHQIREREREVUD77kiIiIiIiKdcG6uyrHnioiIiIiISA/Yc0VEREREFbBngkh37LkiIiIiIiLSA/ZcERmamRkQGHh/nYiIGhxD9QKxd4mobmFyRWRo5ubAiBHGjoKIiIiIDIxfoxMREREREekBkysiIiIiIiI94LBAIkOTy4FPP1WvT5sGSKXGjYeIiIiIDII9V0RERERERHrA5IqIiIiIiEgPOCyQiIiIiIjqjPo8xQB7roiIiIiIiPSAyRUREREREZEeGD25iouLg4+PDywsLBAaGor9+/dXa7+DBw/C3Nwcbdu21WpftWoVRCJRhaW4uNgA0RMREREREakZNbmKj4/H5MmTMX36dBw7dgyRkZGIjo5GamrqI/fLy8vDiy++iF69elX6vJ2dHdLT07UWCwsLQ5wC0eOZmQF+furFzOjfZxARERGRgRj1k96iRYswbtw4jB8/Hq1atUJsbCy8vLywdOnSR+736quvYtSoUQgLC6v0eZFIBHd3d62FyGjMzYEXXlAv5qwhQ0RERGSqjJZcyeVyHD16FFFRUVrtUVFROHToUJX7rVy5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1NRUTJw40dihUTW99957GDRoEJo2bYqsrCx88sknyM/Px0svvWTs0OgR7t69i4sXL2oeX7lyBcnJyXB0dETTpk0xefJkfPrpp/Dz84Ofnx8+/fRTWFlZYdSoUUaMmh70qPfQ0dERH3/8MZ555hl4eHjg6tWrmDZtGpydnTFs2DAjRk0Pev311/Hzzz9j06ZNsLW11Xwrbm9vD0tLS4hEIl6L9cDj3se7d+/yeqwHpk2bhujoaHh5eaGgoADr1q3Dnj17sH37dl6LtclodQpNyNdffy14e3sLUqlUaN++vVbpUqr7Ro4cKXh4eAgSiUTw9PQUnn76aeH06dPGDoseY/fu3QKACstLL70kCIK6BPTMmTMFd3d3QSaTCV27dhVOnjxp3KBJy6Pew6KiIiEqKkpwcXERJBKJ0LRpU+Gll14SUlNTjR02PaCy9w+AsHLlSs02vBbrvse9j7we64eXX35Z83nUxcVF6NWrl7Bz507N87wWa4dIEAShNpM5IiIiIiIiU8R7roiIiIiIiPSAyRUREREREZEeMLkiIiIiIiLSAyZXREREREREesDkioiIiIiISA+YXBEREREREekBkysiIiIiIiI9YHJFRERERESkB0yuiIiIHtK9e3dMnjzZ2GEQEVE9w+SKiIiIiIhID5hcERERERER6QGTKyIiosfYvn077O3tsXr1amOHQkREdRiTKyIiokdYt24dRowYgdWrV+PFF180djhERFSHMbkiIiKqQlxcHCZOnIhNmzZhyJAhxg6HiIjqOHNjB0BERFQXrV+/HpmZmThw4AA6depk7HCIiKgeYM8VERFRJdq2bQsXFxesXLkSgiAYOxwiIqoHmFwRERFVwtfXF7t378amTZvw5ptvGjscIiKqBzgskIiIqAotW7bE7t270b17d5ibmyM2NtbYIRERUR3G5IqIiOgR/P398eeff6J79+4Qi8X4/PPPjR0SERHVUSKBA8mJiIiIiIieGO+5IiIiIiIi0gMmV0RERERERHrA5IqIiIiIiEgPmFwRERERERHpAZMrIiIiIiIiPWByRUREREREpAdMroiIiIiIiPSAyRUREREREZEeMLkiIiIiIiLSAyZXREREREREesDkioiIiIiISA/+Hwqun4q350mZAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Assign the value of k from the above dict of `best_params_` and assign it to `best_k`\n",
"best_k = lr_grid_cv.best_params_['selectkbest__k']\n",
"plt.subplots(figsize=(10, 5))\n",
"plt.errorbar(cv_k, score_mean, yerr=score_std)\n",
"plt.axvline(x=best_k, c='r', ls='--', alpha=.5)\n",
"plt.xlabel('k')\n",
"plt.ylabel('CV score (r-squared)')\n",
"plt.title('Pipeline mean CV score (error bars +/- 1sd)');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The above suggests a good value for k is 8. There was an initial rapid increase with k, followed by a slow decline. Also noticeable is the variance of the results greatly increase above k=8. As we increasingly overfit, expect greater swings in performance as different points move in and out of the train/test folds."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Which features were most useful? Step into our best model, shown below. Starting with the fitted grid search object, you get the best estimator, then the named step 'selectkbest', for which you can its `get_support()` method for a logical mask of the features selected."
]
},
{
"cell_type": "code",
"execution_count": 171,
"metadata": {},
"outputs": [],
"source": [
"selected = lr_grid_cv.best_estimator_.named_steps.selectkbest.get_support()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarly, instead of using the 'selectkbest' named step, we access the named step for the linear regression model and, from that, grab the model coefficients via its `coef_` attribute:"
]
},
{
"cell_type": "code",
"execution_count": 172,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"vertical_drop 10.333065\n",
"Snow Making_ac 6.376653\n",
"fastQuads 4.980331\n",
"total_chairs 3.416636\n",
"Runs 3.233735\n",
"SkiableTerrain_ac -3.259420\n",
"dtype: float64"
]
},
"execution_count": 172,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get the linear model coefficients from the `coef_` attribute and store in `coefs`,\n",
"# get the matching feature names from the column names of the dataframe,\n",
"# and display the results as a pandas Series with `coefs` as the values and `features` as the index,\n",
"# sorting the values in descending order\n",
"coefs = lr_grid_cv.best_estimator_.named_steps.linearregression.coef_\n",
"features = X_train.columns[selected]\n",
"pd.Series(coefs, index=features).sort_values(ascending=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These results suggest that vertical drop is our biggest positive feature. This makes intuitive sense and is consistent with what you saw during the EDA work. Also, we see the area covered by snow making equipment is a strong positive as well. People like guaranteed skiing! The skiable terrain area is negatively associated with ticket price! This seems odd. People will pay less for larger resorts? There could be all manner of reasons for this. It could be an effect whereby larger resorts can host more visitors at any one time and so can charge less per ticket. \n",
"\n",
"As has been mentioned previously, the data are missing information about visitor numbers. Bear in mind, the coefficient for skiable terrain is negative _for this model_. For example, if you kept the total number of chairs and fastQuads constant, but increased the skiable terrain extent, you might imagine the resort is worse off because the chairlift capacity is stretched thinner."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.10 Random Forest Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A model that can work very well in a lot of cases is the random forest. For regression, this is provided by `sklearn`'s `RandomForestRegressor` class.\n",
"\n",
"Time to stop the bad practice of repeatedly checking performance on the test split. Instead, go straight from defining the pipeline to assessing performance using cross-validation. `cross_validate` will perform the fitting as part of the process. This uses the default settings for the random forest so you'll then proceed to investigate some different hyperparameters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.10.1 Define the pipeline"
]
},
{
"cell_type": "code",
"execution_count": 173,
"metadata": {},
"outputs": [],
"source": [
"# Define a pipeline comprising the steps:\n",
"# SimpleImputer() with a strategy of 'median'\n",
"# StandardScaler(),\n",
"# and then RandomForestRegressor() with a random state of 47\n",
"RF_pipe = make_pipeline(\n",
" SimpleImputer(strategy='median'),\n",
" StandardScaler(),\n",
" RandomForestRegressor(random_state=47)\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.10.2 Fit and assess performance using cross-validation"
]
},
{
"cell_type": "code",
"execution_count": 174,
"metadata": {},
"outputs": [],
"source": [
"# Call `cross_validate` to estimate the pipeline's performance.\n",
"# Pass it the random forest pipe object, `X_train` and `y_train`,\n",
"# and get it to use 5-fold cross-validation\n",
"rf_default_cv_results = cross_validate(RF_pipe, X_train, y_train, cv=5)"
]
},
{
"cell_type": "code",
"execution_count": 175,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.6711019 , 0.78433505, 0.75960138, 0.59978811, 0.56699816])"
]
},
"execution_count": 175,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rf_cv_scores = rf_default_cv_results['test_score']\n",
"rf_cv_scores"
]
},
{
"cell_type": "code",
"execution_count": 176,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.6763649193918256, 0.08536820259910885)"
]
},
"execution_count": 176,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(rf_cv_scores), np.std(rf_cv_scores)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.10.3 Hyperparameter search using GridSearchCV"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Random forest has a number of hyperparameters that can be explored, however, here we'll limit ourselves to exploring some different values for the number of trees. We'll try it with and without feature scaling, and try both the mean and median as strategies for imputing missing values."
]
},
{
"cell_type": "code",
"execution_count": 177,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'randomforestregressor__n_estimators': [10,\n",
" 12,\n",
" 16,\n",
" 20,\n",
" 26,\n",
" 33,\n",
" 42,\n",
" 54,\n",
" 69,\n",
" 88,\n",
" 112,\n",
" 143,\n",
" 183,\n",
" 233,\n",
" 297,\n",
" 379,\n",
" 483,\n",
" 615,\n",
" 784,\n",
" 1000],\n",
" 'standardscaler': [StandardScaler(), None],\n",
" 'simpleimputer__strategy': ['mean', 'median']}"
]
},
"execution_count": 177,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_est = [int(n) for n in np.logspace(start=1, stop=3, num=20)]\n",
"grid_params = {\n",
" 'randomforestregressor__n_estimators': n_est,\n",
" 'standardscaler': [StandardScaler(), None],\n",
" 'simpleimputer__strategy': ['mean', 'median']\n",
"}\n",
"grid_params"
]
},
{
"cell_type": "code",
"execution_count": 178,
"metadata": {},
"outputs": [],
"source": [
"# Call `GridSearchCV` with the random forest pipeline, passing in the above `grid_params`\n",
"# dict for parameters to evaluate, 5-fold cross-validation, and all available CPU cores (if desired)\n",
"rf_grid_cv = GridSearchCV(RF_pipe, param_grid=grid_params, cv=5, n_jobs=-1)"
]
},
{
"cell_type": "code",
"execution_count": 179,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"GridSearchCV(cv=5,\n",
" estimator=Pipeline(steps=[('simpleimputer',\n",
" SimpleImputer(strategy='median')),\n",
" ('standardscaler', StandardScaler()),\n",
" ('randomforestregressor',\n",
" RandomForestRegressor(random_state=47))]),\n",
" n_jobs=-1,\n",
" param_grid={'randomforestregressor__n_estimators': [10, 12, 16, 20,\n",
" 26, 33, 42, 54,\n",
" 69, 88, 112,\n",
" 143, 183, 233,\n",
" 297, 379, 483,\n",
" 615, 784,\n",
" 1000],\n",
" 'simpleimputer__strategy': ['mean', 'median'],\n",
" 'standardscaler': [StandardScaler(), None]})"
]
},
"execution_count": 179,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Now call the `GridSearchCV`'s `fit()` method with `X_train` and `y_train` as arguments\n",
"# to actually start the grid search. This may take a minute or two.\n",
"rf_grid_cv.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 180,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'randomforestregressor__n_estimators': 233,\n",
" 'simpleimputer__strategy': 'mean',\n",
" 'standardscaler': None}"
]
},
"execution_count": 180,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Print the best params (`best_params_` attribute) from the grid search\n",
"rf_grid_cv.best_params_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It looks like imputing with the median helps, but scaling the features doesn't."
]
},
{
"cell_type": "code",
"execution_count": 181,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.67199826, 0.78788539, 0.7776494 , 0.61844222, 0.60114645])"
]
},
"execution_count": 181,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rf_best_cv_results = cross_validate(rf_grid_cv.best_estimator_, X_train, y_train, cv=5)\n",
"rf_best_scores = rf_best_cv_results['test_score']\n",
"rf_best_scores"
]
},
{
"cell_type": "code",
"execution_count": 182,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.691424343745292, 0.07822193232981417)"
]
},
"execution_count": 182,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.mean(rf_best_scores), np.std(rf_best_scores)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We've marginally improved upon the default CV results. Random forest has many more hyperparameters you could tune, but we won't dive into that here."
]
},
{
"cell_type": "code",
"execution_count": 183,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAK2CAYAAACirWZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd1gU1/s28HvpvagIqEjRgGJXYsFY0FixxkSjRrEkxhK7ifo1RrF3scQWC/beu1gj9obGXhEsxN4bwvP+wbv7c11Q2ZkFjffnuuZSzg7POTvDzs4zZ+YcjYgIiIiIiIiISBGzzG4AERERERHRfwGTKyIiIiIiIhUwuSIiIiIiIlIBkysiIiIiIiIVMLkiIiIiIiJSAZMrIiIiIiIiFTC5IiIiIiIiUgGTKyIiIiIiIhUwuSIiIiIiIlIBkyui/7jIyEhoNBq9xc3NDRUrVsS6detMVu+zZ8/Qv39/7Ny502R1mEKLFi3g4+OT2c3Qs3jxYhQoUAC2trbQaDSIiYnJ7CYZGDJkCFatWpXZzfhsbdu2DUFBQbC3t4dGozHZvviY93PFihVRsWLFzG6G0W7cuIH+/ft/lJ9vIvpwTK6IPhOzZs3Cvn37sHfvXkybNg3m5uaoXbs21q5da5L6nj17hvDw8E8uufrY3L59G82aNUOePHmwadMm7Nu3D/7+/pndLAMf80n3f52IoGHDhrC0tMSaNWuwb98+VKhQwSR1fcz7edKkSZg0aVJmN8NoN27cQHh4OJMrok+cRWY3gIgyRsGCBREUFKT7uXr16nB1dcXChQtRu3btTGxZ2hITE6HRaGBh8fkeqs6fP4/ExET88MMPqp0wP3v2DHZ2dqrEUktSUhJev34Na2vrDKnv+fPnsLW1zZC61PCufXbjxg3cu3cP9evXR+XKlTO4ZepQY38EBgaq1JqMpf3bJ6L/BvZcEX2mbGxsYGVlBUtLS73yV69eYdCgQciXLx+sra3h5uaGli1b4vbt23rrbd++HRUrVkTWrFlha2uL3Llzo0GDBnj27BliY2Ph5uYGAAgPD9fdjtiiRYs027Nz505oNBrMnTsX3bt3R86cOWFtbY2LFy/i9u3baN++PQIDA+Hg4IDs2bOjUqVK2L17t16M2NhYaDQajBo1CmPGjIGvry8cHBxQpkwZ7N+/36DOyMhIBAQEwNraGvnz58ecOXNSbdu9e/fQvn175MyZE1ZWVvDz80OfPn3w8uVLvfU0Gg1++eUXzJo1CwEBAbC1tUVQUBD2798PEcHIkSN1bapUqRIuXryY5vYAUm5R/OqrrwAAjRo1gkaj0bvtac2aNShTpgzs7Ozg6OiIKlWqYN++fXox+vfvD41Gg6NHj+Lbb7+Fq6sr8uTJAyClx2PSpEkoWrQobG1t4erqim+//RaXL1/Wi3Hs2DHUqlUL2bNnh7W1NXLkyIHQ0FBcu3ZN976fPn2K2bNn6/b1u27P0u6nESNGYNCgQfD19YW1tTV27NgBADh8+DDq1KmDLFmywMbGBsWKFcOSJUsM4kRHR6NMmTKwsbFBzpw50bdvX0yfPh0ajQaxsbG69Xx8fFCrVi2sWLECxYoVg42NDcLDwwEACQkJ+Pnnn5ErVy5YWVnB19cX4eHhBie7kydPRpEiReDg4ABHR0fky5cP//vf/3SvP3v2DD169ICvry9sbGyQJUsWBAUFYeHChXpxlO6zt/Xv3x+5cuUCAPTs2RMajUbvttYLFy6gSZMmun2XP39+/Pnnn3oxXrx4ge7du6No0aJwdnZGlixZUKZMGaxevVpvvXftZ22b36a9LVnt/ZGat28L1P6djRw5EsOHD4ePjw9sbW1RsWJF3UWLXr16IUeOHHB2dkb9+vVx69YtvZjatq5cuRKFCxeGjY0N/Pz8MH78eIP64+Li8MMPP+ht69GjRyM5OdmgTan97X/55ZcAgJYtW+q2b//+/QGkfCa+//573Xvw8fFB48aNcfXq1VS3944dO9CuXTtky5YNWbNmxTfffIMbN24YtHnBggUoU6YMHBwc4ODggKJFi2LGjBl662zduhWVK1eGk5MT7OzsULZsWWzbtk1vndu3b6NNmzbw8vLSfW+ULVsWW7dufe9+I/rPESL6T5s1a5YAkP3790tiYqK8evVK4uPjpVOnTmJmZiabNm3SrZuUlCTVq1cXe3t7CQ8Pl6ioKJk+fbrkzJlTAgMD5dmzZyIicuXKFbGxsZEqVarIqlWrZOfOnTJ//nxp1qyZ3L9/X168eCGbNm0SANK6dWvZt2+f7Nu3Ty5evJhmO3fs2CEAJGfOnPLtt9/KmjVrZN26dXL37l05e/astGvXThYtWiQ7d+6UdevWSevWrcXMzEx27Nihi3HlyhUBID4+PlK9enVZtWqVrFq1SgoVKiSurq7y4MEDg+1St25dWbt2rcybN0/y5s0rXl5e4u3trVvv+fPnUrhwYbG3t5dRo0bJli1bpG/fvmJhYSE1a9bUew8AxNvbW4KDg2XFihWycuVK8ff3lyxZskjXrl2lbt26sm7dOpk/f764u7tL4cKFJTk5Oc1tcvHiRfnzzz8FgAwZMkT27dsnp06dEhGR+fPnCwCpWrWqrFq1ShYvXiwlSpQQKysr2b17ty5Gv379dO3q2bOnREVFyapVq0RE5KeffhJLS0vp3r27bNq0SRYsWCD58uUTd3d3SUhIEBGRJ0+eSNasWSUoKEiWLFkiu3btksWLF0vbtm3l9OnTIiKyb98+sbW1lZo1a+r2tbadqdHup5w5c0pISIgsW7ZMtmzZIleuXJHt27eLlZWVlCtXThYvXiybNm2SFi1aCACZNWuWLsbx48fFxsZGChcuLIsWLZI1a9ZIzZo1xcfHRwDIlStXdOt6e3uLp6en+Pn5ycyZM2XHjh1y8OBBuXnzpm5/T506VbZu3SoDBw4Ua2tradGihe73Fy5cKACkY8eOsmXLFtm6datMmTJFOnXqpFvn559/Fjs7OxkzZozs2LFD1q1bJ8OGDZMJEybo1lFjn70tPj5eVqxYoWvfvn375OjRoyIicurUKXF2dpZChQrJnDlzZMuWLdK9e3cxMzOT/v3762I8ePBAWrRoIXPnzpXt27fLpk2bpEePHmJmZiazZ8/Wrfeu/axt89u0nzM190daKlSoIBUqVND9rP078/b2ltq1a8u6detk3rx54u7uLv7+/tKsWTNp1aqVbNy4UaZMmSIODg5Su3ZtvZje3t6SM2dOyZ07t8ycOVM2bNggTZs2FQAycuRI3Xq3bt2SnDlzipubm0yZMkU2bdokv/zyiwCQdu3aGbTp7b/948eP67bV77//rtu+8fHxIiKydOlS+eOPP2TlypWya9cuWbRokVSoUEHc3Nzk9u3bBtvbz89POnbsKJs3b5bp06eLq6urhISE6L23vn37CgD55ptvZOnSpbJlyxYZM2aM9O3bV7fO3LlzRaPRSL169WTFihWydu1aqVWrlpibm8vWrVt161WrVk3c3Nxk2rRpsnPnTlm1apX88ccfsmjRovfuN6L/GiZXRP9x2i/btxdra2uZNGmS3rrak8jly5frlR86dEgA6NZftmyZAJCYmJg06719+7YAkH79+n1QO7XJVfny5d+77uvXryUxMVEqV64s9evX15VrT1wKFSokr1+/1pUfPHhQAMjChQtFJCWJzJEjhxQvXlwvuYmNjRVLS0u95GrKlCkCQJYsWaLXhuHDhwsA2bJli64MgHh4eMiTJ090ZatWrRIAUrRoUb26IiIiBICcOHHig7bL0qVLdWXa9hcqVEiSkpJ05Y8fP5bs2bNLcHCwrkx70vvHH3/oxd23b58AkNGjR+uVx8fHi62trfz2228iInL48GEBkObJvZa9vb2EhYW9cx0t7X7KkyePvHr1Su+1fPnySbFixSQxMVGvvFatWuLp6al7v999953Y29vrnVgmJSVJYGBgqifz5ubmcu7cOb2YP//8szg4OMjVq1f1ykeNGiUAdInDL7/8Ii4uLu98TwULFpR69eql+boa+ywt2u355sm+SMoJb65cueThw4d65b/88ovY2NjIvXv3Uo2n/Xy1bt1aihUrpvdaWvs5vcmVkv2RlrSSqyJFiuhtc+1nr06dOnq/36VLFwGgt728vb1Fo9EYHOuqVKkiTk5O8vTpUxER6dWrlwCQAwcO6K3Xrl070Wg0uvf6rr997XH2zYsIaXn9+rU8efJE7O3tZdy4cbpy7fZu37693vojRowQAHLz5k0REbl8+bKYm5tL06ZN06zj6dOnkiVLFoOEMykpSYoUKSIlS5bUlTk4OEiXLl3e226izwFvCyT6TMyZMweHDh3CoUOHsHHjRoSFhaFDhw6YOHGibp1169bBxcUFtWvXxuvXr3VL0aJF4eHhoRucomjRorCyskKbNm0we/Zsg9vIlGjQoEGq5VOmTEHx4sVhY2MDCwsLWFpaYtu2bThz5ozBuqGhoTA3N9f9XLhwYQDQ3UJz7tw53LhxA02aNNG7lcnb2xvBwcF6sbZv3w57e3t8++23euXaWxzfvj0mJCQE9vb2up/z588PAKhRo4ZeXdryt2/r+RDa9jdr1gxmZv93GHdwcECDBg2wf/9+PHv2TO933t6u69atg0ajwQ8//KC3rz08PFCkSBHdvs6bNy9cXV3Rs2dPTJkyBadPn053e9NSp04dvdtSL168iLNnz6Jp06YAoNeumjVr4ubNmzh37hwAYNeuXahUqRKyZcum+30zMzM0bNgw1boKFy5sMBDIunXrEBISghw5cujVVaNGDV0dAFCyZEk8ePAAjRs3xurVq3Hnzh2D+CVLlsTGjRvRq1cv7Ny5E8+fP9d7XY19lh4vXrzAtm3bUL9+fdjZ2RlsyxcvXujdKrt06VKULVsWDg4Ous/XjBkzUv18qUHJ/kivmjVr6m1z7WcvNDRUbz1teVxcnF55gQIFUKRIEb2yJk2a4NGjRzh69CiAlONEYGAgSpYsqbdeixYtICLYvn27Xvnbf/vv8+TJE/Ts2RN58+aFhYUFLCws4ODggKdPn6a6j+rUqaP389vHwKioKCQlJaFDhw5p1rl3717cu3cPYWFhevsjOTkZ1atXx6FDh/D06VMAKX//kZGRGDRoEPbv34/ExMQPfm9E/zVMrog+E/nz50dQUBCCgoJQvXp1TJ06FVWrVsVvv/2GBw8eAAD+/fdfPHjwQPcs1ptLQkKC7qQyT5482Lp1K7Jnz44OHTogT548yJMnD8aNG6e4nZ6engZlY8aMQbt27VCqVCksX74c+/fvx6FDh1C9enWDk1gAyJo1q97P2kEStOvevXsXAODh4WHwu2+X3b17Fx4eHgbPk2TPnh0WFha6WFpZsmTR+9nKyuqd5S9evDBow/to60xtW+XIkQPJycm4f/++Xvnb6/77778QEbi7uxvs6/379+v2tbOzM3bt2oWiRYvif//7HwoUKIAcOXKgX79+ik+gUmsTAPTo0cOgTe3btwcAXbvu3r0Ld3d3g5iplaVWl7a+tWvXGtRVoEABvbqaNWuGmTNn4urVq2jQoAGyZ8+OUqVKISoqShdr/Pjx6NmzJ1atWoWQkBBkyZIF9erVw4ULF3TtTasdH7rP0uPu3bt4/fo1JkyYYPD+atasqff+VqxYgYYNGyJnzpyYN28e9u3bh0OHDqFVq1ZG/X1+CCX7I72UfibfdZzQ7te7d++muW/fXE8rvfu2SZMmmDhxIn788Uds3rwZBw8exKFDh+Dm5mbUMVD7DK32eb3UaD+P3377rcE+GT58OEQE9+7dA5AyXURYWBimT5+OMmXKIEuWLGjevDkSEhLS9T6J/gs+3yG4iAiFCxfG5s2bcf78eZQsWVL38POmTZtSXd/R0VH3/3LlyqFcuXJISkrC4cOHMWHCBHTp0gXu7u74/vvvjW5Tag/Fz5s3DxUrVsTkyZP1yh8/fmxUHdoTj9S++N8uy5o1Kw4cOAAR0WvbrVu38Pr1a72ek4yibf/NmzcNXrtx4wbMzMzg6uqqV/72ds2WLRs0Gg12796d6gh9b5YVKlQIixYtgojgxIkTiIyMxIABA2Bra4tevXoZ/T5SaxMA9O7dG998802qvxMQEAAgZRtoT/7elNbJXGp/V9myZUPhwoUxePDgVH9He2IMpAwy0LJlSzx9+hR///03+vXrh1q1auH8+fPw9vaGvb09wsPDER4ejn///VfXi1W7dm2cPXtWlX2WHq6urjA3N0ezZs3S7J3w9fUFkPL58vX1xeLFi/XqfHvAlnexsbHR/c6bfztpJURK90dGetdxQrtfs2bNmua+BWBwnEjPvn348CHWrVuHfv366X3eXr58qUtu0ks74NC1a9fg5eWV6jraNk+YMAGlS5dOdR3txYxs2bIhIiICERERiIuLw5o1a9CrVy/cunUrze8Tov8qJldEnzHtfCraL9patWph0aJFSEpKQqlSpT4ohrm5OUqVKoV8+fJh/vz5OHr0KL7//nuDK6VKaDQagwTgxIkT2LdvX5onBu8SEBAAT09PLFy4EN26ddOd6Fy9ehV79+7VO4mrXLkylixZglWrVqF+/fq6cu3Igpkx9HVAQABy5syJBQsWoEePHrr2P336FMuXL9eNRvcutWrVwrBhw3D9+vU0b6V7m0ajQZEiRTB27FhERkbqbokCUpIxpfs6ICAAX3zxBY4fP44hQ4a8c90KFSpgw4YNuHPnju4kMDk5GUuXLv3g+mrVqoUNGzYgT548BolNWuzt7VGjRg28evUK9erVw6lTp+Dt7a23jru7O1q0aIHjx48jIiICz549U2WfpYednR1CQkJw7NgxFC5cWNcrkxqNRgMrKyu9E/6EhASD0QKBtPezdoTCEydO6Ea9A5CuefSM2R8Z4dSpUzh+/LjerYELFiyAo6MjihcvDiDlODB06FAcPXpUVwakHCc0Gg1CQkLeW09ax0yNRgMRMTgGTp8+HUlJSUa9p6pVq8Lc3ByTJ09GmTJlUl2nbNmycHFxwenTp/HLL798cOzcuXPjl19+wbZt27Bnzx6j2kf0KWNyRfSZOHnypG4447t372LFihWIiopC/fr1dVewv//+e8yfPx81a9ZE586dUbJkSVhaWuLatWvYsWMH6tati/r162PKlCnYvn07QkNDkTt3brx48QIzZ84EAHz99dcAUnq5vL29sXr1alSuXBlZsmRB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IiIiIlIBkysiIiIiIiIVMLkiIiIiIiJSAZMrIiIiIiIiFTC5IiIiIiIiUoFFZjfgU+PTa3261o8dFmqilhARERER0ceEPVdEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCrI9ORq0qRJ8PX1hY2NDUqUKIHdu3enue6KFStQpUoVuLm5wcnJCWXKlMHmzZv11omMjIRGozFYXrx4Yeq3QkREREREn7FMTa4WL16MLl26oE+fPjh27BjKlSuHGjVqIC4uLtX1//77b1SpUgUbNmzAkSNHEBISgtq1a+PYsWN66zk5OeHmzZt6i42NTUa8JSIiIiIi+kxZZGblY8aMQevWrfHjjz8CACIiIrB582ZMnjwZQ4cONVg/IiJC7+chQ4Zg9erVWLt2LYoVK6Yr12g08PDwMGnbiYiIiIiI3pRpPVevXr3CkSNHULVqVb3yqlWrYu/evR8UIzk5GY8fP0aWLFn0yp88eQJvb2/kypULtWrVMujZetvLly/x6NEjvYWIiIiIiCg9Mi25unPnDpKSkuDu7q5X7u7ujoSEhA+KMXr0aDx9+hQNGzbUleXLlw+RkZFYs2YNFi5cCBsbG5QtWxYXLlxIM87QoUPh7OysW7y8vIx7U0RERERE9NnK9AEtNBqN3s8iYlCWmoULF6J///5YvHgxsmfPrisvXbo0fvjhBxQpUgTlypXDkiVL4O/vjwkTJqQZq3fv3nj48KFuiY+PN/4NERERERHRZynTnrnKli0bzM3NDXqpbt26ZdCb9bbFixejdevWWLp0Kb7++ut3rmtmZoYvv/zynT1X1tbWsLa2/vDGExERERERvSXTeq6srKxQokQJREVF6ZVHRUUhODg4zd9buHAhWrRogQULFiA0NPS99YgIYmJi4OnpqbjNREREREREacnU0QK7deuGZs2aISgoCGXKlMG0adMQFxeHtm3bAki5Xe/69euYM2cOgJTEqnnz5hg3bhxKly6t6/WytbWFs7MzACA8PBylS5fGF198gUePHmH8+PGIiYnBn3/+mTlvkoiIiIiIPguZmlw1atQId+/exYABA3Dz5k0ULFgQGzZsgLe3NwDg5s2benNeTZ06Fa9fv0aHDh3QoUMHXXlYWBgiIyMBAA8ePECbNm2QkJAAZ2dnFCtWDH///TdKliyZoe+NiIiIiIg+LxoRkcxuxMfm0aNHcHZ2xsOHD+Hk5KT3mk+v9emKFTvs/bcuEhERERHRx+lducHbMn20QCIiIiIiov8CJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpIJMT64mTZoEX19f2NjYoESJEti9e3ea665YsQJVqlSBm5sbnJycUKZMGWzevNlgveXLlyMwMBDW1tYIDAzEypUrTfkWiIiIiIiIMje5Wrx4Mbp06YI+ffrg2LFjKFeuHGrUqIG4uLhU1//7779RpUoVbNiwAUeOHEFISAhq166NY8eO6dbZt28fGjVqhGbNmuH48eNo1qwZGjZsiAMHDmTU2yIiIiIios+QRkQksyovVaoUihcvjsmTJ+vK8ufPj3r16mHo0KEfFKNAgQJo1KgR/vjjDwBAo0aN8OjRI2zcuFG3TvXq1eHq6oqFCxd+UMxHjx7B2dkZDx8+hJOTk95rPr3Wf1AMrdhhoelan4iIiIiIPh7vyg3elmk9V69evcKRI0dQtWpVvfKqVati7969HxQjOTkZjx8/RpYsWXRl+/btM4hZrVq1d8Z8+fIlHj16pLcQERERERGlR6YlV3fu3EFSUhLc3d31yt3d3ZGQkPBBMUaPHo2nT5+iYcOGurKEhIR0xxw6dCicnZ11i5eXVzreCRERERER0UcwoIVGo9H7WUQMylKzcOFC9O/fH4sXL0b27NkVxezduzcePnyoW+Lj49PxDoiIiIiIiACLzKo4W7ZsMDc3N+hRunXrlkHP09sWL16M1q1bY+nSpfj666/1XvPw8Eh3TGtra1hbW6fzHRAREREREf2fTOu5srKyQokSJRAVFaVXHhUVheDg4DR/b+HChWjRogUWLFiA0FDDwSLKlCljEHPLli3vjElERERERKRUpvVcAUC3bt3QrFkzBAUFoUyZMpg2bRri4uLQtm1bACm3612/fh1z5swBkJJYNW/eHOPGjUPp0qV1PVS2trZwdnYGAHTu3Bnly5fH8OHDUbduXaxevRpbt25FdHR05rxJIiIiIiL6LGTqM1eNGjVCREQEBgwYgKJFi+Lvv//Ghg0b4O3tDQC4efOm3pxXU6dOxevXr9GhQwd4enrqls6dO+vWCQ4OxqJFizBr1iwULlwYkZGRWLx4MUqVKpXh74+IiIiIiD4fmTrP1ceK81wRERERERHwicxzRURERERE9F/C5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUyuiIiIiIiIVMDkioiIiIiISAVMroiIiIiIiFTA5IqIiIiIiEgFTK6IiIiIiIhUwOSKiIiIiIhIBUYnV7t378YPP/yAMmXK4Pr16wCAuXPnIjo6WrXGERERERERfSqMSq6WL1+OatWqwdbWFseOHcPLly8BAI8fP8aQIUNUbSAREREREdGnwKjkatCgQZgyZQr++usvWFpa6sqDg4Nx9OhR1RpHRERERET0qTAquTp37hzKly9vUO7k5IQHDx4obRMREREREdEnx6jkytPTExcvXjQoj46Ohp+fn+JGERERERERfWqMSq5+/vlndO7cGQcOHIBGo8GNGzcwf/589OjRA+3bt1e7jURERERERB89C2N+6bfffsPDhw8REhKCFy9eoHz58rC2tkaPHj3wyy+/qN1GIiIiIiKij55RyRUADB48GH369MHp06eRnJyMwMBAODg4qNk2IiIiIiKiT4ZRydXDhw+RlJSELFmyICgoSFd+7949WFhYwMnJSbUGEhERERERfQqMeubq+++/x6JFiwzKlyxZgu+//15xo4iIiIiIiD41RiVXBw4cQEhIiEF5xYoVceDAAcWNIiIiIiIi+tQYdVvgy5cv8fr1a4PyxMREPH/+XHGjPnc+vdana/3YYaEmagkREREREX0oo3quvvzyS0ybNs2gfMqUKShRooTiRhEREREREX1qjEquBg8ejOnTp6N8+fIIDw9HeHg4ypcvj5kzZ2LIkCHpijVp0iT4+vrCxsYGJUqUwO7du9Nc9+bNm2jSpAkCAgJgZmaGLl26GKwTGRkJjUZjsLx48SK9b5OIiIiIiOiDGZVclS1bFvv27YOXlxeWLFmCtWvXIm/evDhx4gTKlSv3wXEWL16MLl26oE+fPjh27BjKlSuHGjVqIC4uLtX1X758CTc3N/Tp0wdFihRJM66TkxNu3rypt9jY2KT7fRIREREREX0oo+e5Klq0KObPn6+o8jFjxqB169b48ccfAQARERHYvHkzJk+ejKFDhxqs7+Pjg3HjxgEAZs6cmWZcjUYDDw8PRW0jIiIiIiJKD6OTq+TkZFy8eBG3bt1CcnKy3mvly5d/7++/evUKR44cQa9evfTKq1atir179xrbLADAkydP4O3t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uXNnjBo1StUGEhERERERfQqMui2wRYsWePbsGUqVKgULi5QQr1+/hoWFBVq1aoVWrVrp1r137546LSUiIiIiIvqIGZVcRUREqNwMIiIiIiKiT5tRyVVYWJja7SAiIiIiIvqkKZpE+NatW7h16xaSk5P1ygsXLqyoUURERERERJ8ao5KrI0eOICwsTDe31Zs0Gg2SkpJUaRwREREREdGnwqjkqmXLlvD398eMGTPg7u4OjUajdruIiIiIiIg+KUYlV1euXMGKFSuQN29etdtDRERERET0STJqnqvKlSvj+PHjareFiIiIiIjok2VUz9X06dMRFhaGkydPomDBgrC0tNR7vU6dOqo0joiIiIiI6FNhVHK1d+9eREdHY+PGjQavcUALIiIiIiL6HBl1W2CnTp3QrFkz3Lx5E8nJyXoLEysiIiIiIvocGZVc3b17F127doW7u7va7SEiIiIiIvokGZVcffPNN9ixY4fabSEiIiIiIvpkGfXMlb+/P3r37o3o6GgUKlTIYECLTp06qdI4IiIiIiKiT4XRowU6ODhg165d2LVrl95rGo2GyRUREREREX12jJ5EmIiIiIiIiP7PBydX3bp1w8CBA2Fvb49u3bqluZ5Go8Ho0aNVaRx9mnx6rU/X+rHDQk3UEiIiIiKijPPBydWxY8eQmJio+39aNBqN8lYRERERERF9Yj44uXpzdECOFEhERERERKTPqKHYiYiIiIiISB+TKyIiIiIiIhUwuSIiIiIiIlIBkysiIiIiIiIVMLkiIiIiIiJSQaYnV5MmTYKvry9sbGxQokQJ7N69O811b968iSZNmiAgIABmZmbo0qVLqustX74cgYGBsLa2RmBgIFauXGmi1hMREREREaXI1ORq8eLF6NKlC/r06YNjx46hXLlyqFGjBuLi4lJd/+XLl3Bzc0OfPn1QpEiRVNfZt28fGjVqhGbNmuH48eNo1qwZGjZsiAMHDpjyrRARERER0WcuU5OrMWPGoHXr1vjxxx+RP39+REREwMvLC5MnT051fR8fH4wbNw7NmzeHs7NzqutERESgSpUq6N27N/Lly4fevXujcuXKiIiIMOE7ISIiIiKiz12mJVevXr3CkSNHULVqVb3yqlWrYu/evUbH3bdvn0HMatWqvTPmy5cv8ejRI72FiIiIiIgoPTItubpz5w6SkpLg7u6uV+7u7o6EhASj4yYkJKQ75tChQ+Hs7KxbvLy8jK6fiIiIiIg+T5k+oIVGo9H7WUQMykwds3fv3nj48KFuiY+PV1Q/ERERERF9fiwyq+Js2bLB3NzcoEfp1q1bBj1P6eHh4ZHumNbW1rC2tja6TiIiIiIiokzrubKyskKJEiUQFRWlVx4VFYXg4GCj45YpU8Yg5pYtWxTFJCIiIiIiep9M67kCgG7duqFZs2YICgpCmTJlMG3aNMTFxaFt27YAUm7Xu379OubMmaP7nZiYGADAkydPcPv2bcTExMDKygqBgYEAgM6dO6N8+fIYPnw46tati9WrV2Pr1q2Ijo7O8PdHRERERESfj0xNrho1aoS7d+9iwIABuHnzJgoWLIgNGzbA29sbQMqkwW/PeVWsWDHd/48cOYIFCxbA29sbsbGxAIDg4GAsWrQIv//+O/r27Ys8efJg8eLFKFWqVIa9LyIiIiIi+vxkanIFAO3bt0f79u1TfS0yMtKgTETeG/Pbb7/Ft99+q7RpREREREREHyzTRwskIiIiIiL6L2ByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKmByRUREREREpAImV0RERERERCpgckVERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKrDI7AYQpZdPr/XpWj92WKiJWkJERERE9H/Yc0VERERERKQCJldEREREREQqYHJFRERERESkAiZXREREREREKsj05GrSpEnw9fWFjY0NSpQogd27d79z/V27dqFEiRKwsbGBn58fpkyZovd6ZGQkNBqNwfLixQtTvg0iIiIiIvrMZWpytXjxYnTp0gV9+vTBsWPHUK5cOdSoUQNxcXGprn/lyhXUrFkT5cqVw7Fjx/C///0PnTp1wvLly/XWc3Jyws2bN/UWGxubjHhLRERERET0mcrUodjHjBmD1q1b48cffwQAREREYPPmzZg8eTKGDh1qsP6UKVOQO3duREREAADy58+Pw4cPY9SoUWjQoIFuPY1GAw8Pjwx5D0REREREREAm9ly9evUKR44cQdWqVfXKq1atir1796b6O/v27TNYv1q1ajh8+DASExN1ZU+ePIG3tzdy5cqFWrVq4dixY+9sy8uXL/Ho0SO9hYiIiIiIKD0yLbm6c+cOkpKS4O7urlfu7u6OhISEVH8nISEh1fVfv36NO3fuAADy5cuHyMhIrFmzBgsXLoSNjQ3Kli2LCxcupNmWoUOHwtnZWbd4eXkpfHdERERERPS5yfQBLTQajd7PImJQ9r713ywvXbo0fvjhBxQpUgTlypXDkiVL4O/vjwkTJqQZs3fv3nj48KFuiY+PN/btEBERERHRZyrTnrnKli0bzM3NDXqpbt26ZdA7peXh4ZHq+hYWFsiaNWuqv2NmZoYvv/zynT1X1tbWsLa2Tuc7ICIiIiIi+j+Z1nNlZWWFEiVKICoqSq88KioKwcHBqf5OmTJlDNbfsmULgoKCYGlpmerviAhiYmLg6empTsOJiIiIiIhSkam3BXbr1g3Tp0/HzJkzcebMGXTt2hVxcXFo27YtgJTb9Zo3b65bv23btrh69Sq6deuGM2fOYObMmZgxYwZ69OihWyc8PBybN2/G5cuXERMTg9atWyMmJkYXk4iIiIiIyBQydSj2Ro0a4e7duxgwYABu3ryJggULYsOGDfD29gYA3Lx5U2/OK19fX2zYsAFdu3bFn3/+iRw5cmD8+PF6w7A/ePAAbdq0QUJCApydnVGsWDH8/fffKFmyZIa/P/o0+fRan+7fiR0WaoKWEBEREdGnJFOTKwBo37492rdvn+prkZGRBmUVKlTA0aNH04w3duxYjB07Vq3mERERERERfZBMHy2QiIiIiIjov4DJFRERERERkQqYXBEREREREamAyRUREREREZEKmFwRERERERGpgMkVERERERGRCphcERERERERqYDJFRERERERkQqYXBEREREREamAyRUREREREZEKmFwRERERERGpgMkVERERERGRCphcERERERERqYDJFRERERERkQqYXBEREREREamAyRUREREREZEKmFwRERERERGpgMkVERERERGRCphcERERERERqYDJFRERERERkQqYXBEREREREamAyRUREREREZEKmFwRERERERGpgMkVERERERGRCphcERERERERqYDJFRERERERkQqYXBEREREREamAyRUREREREZEKmFwRERERERGpgMkVERERERGRCphcERERERERqYDJFRERERERkQqYXBEREREREanAIrMbQPQ58um1Pl3rxw4LNVFLiIiIiEgt7LkiIiIiIiJSAZMrIiIiIiIiFTC5IiIiIiIiUgGTKyIiIiIiIhUwuSIiIiIiIlIBkysiIiIiIiIVcCh2ov8gDvVORERElPHYc0VERERERKQCJldEREREREQqYHJFRERERESkAj5zRUTpxme6iIiIiAwxuSKijw6TNyIiIvoUMbkios+SqRO4Tz0+ERERpR+TKyIiMsDkjYiIKP04oAUREREREZEK2HNFREQZLr09YwBvnSQioo8fkysiIiIjMHkjIqK3MbkiIiL6CHFQFCKiTw+TKyIiIlLdf+HWTyagRJReTK6IiIiIMsF/ITlkAkqkj8kVEREREX2U/gsJKH1eOBQ7ERERERGRCthzRURERERkAh9bz1tG1PG59+6x54qIiIiIiEgFTK6IiIiIiIhUkOnJ1aRJk+Dr6wsbGxuUKFECu3fvfuf6u3btQokSJWBjYwM/Pz9MmTLFYJ3ly5cjMDAQ1tbWCAwMxMqVK03VfCIiIiIiIgCZ/MzV4sWL0aVLF0yaNAlly5bF1KlTUaNGDZw+fRq5c+c2WP/KlSuoWbMmfvrpJ8ybNw979uxB+/bt4ebmhgYNGgAA9u3bh0aNGmHgwIGoX78+Vq5ciYYNGyI6OhqlSpXK6LdIRERERERp+K8905WpPVdjxoxB69at8eOPPyJ//vyIiIiAl5cXJk+enOr6U6ZMQe7cuREREYH8+fPjxx9/RKtW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2LhxY6qvK01+du3a9c7X1eo5W7JkCcaNG4czZ84ASLkw0LlzZzRs2FCV+Ddu3MCff/6Js2fP6g7o7du3150cKDV06FCMGTMGoaGhqfbwGXvxQmvlypUYPXq03vb59ddfUbduXUVx33ThwgW97aNGz+qbli9fjkaNGuHrr79G2bJldUnitm3bsGTJEtSvX19R/CZNmiAoKAjdunXD4MGDMW7cONStWxdRUVEoXry44uSnU6dOmDZtGkJCQuDu7g6NRqP3+qxZsxTFB4D169djyJAhiImJga2tLQoXLox+/fqp8jkz9fYHUo55LVq0wKJFiyAisLCw0J04RUZGKjq52bJlC77++muYmX26s788f/4c8+bN0/ucNW3aFLa2tqrWc+nSJRw7dgzJyckoVqyYaskzAMTHx6Nu3bo4efIkvLy8oNFoEBcXh0KFCmH16tWKr9znypULd+/eRbVq1dC0aVPUrl1blTsYtGbNmoW+ffti9OjRaN26NaZPn45Lly5h6NChmD59Or7//ntF8SdPnowuXbqgVatWqV4M+/nnn1V5H6bax8HBwdi+fbvBNj937hwqV66Ma9euqVLP5cuXcfToUZP8jT548ADLli3DpUuX8OuvvyJLliw4evQo3N3dFfegZyQmV5+ZR48effC6Sm4bu3z5MurXr49//vkHGo0G2j8z7UmNmvPwmKrnx8XFBUePHjVZctW0aVPExsYiIiICISEhWLlyJf79918MGjQIo0eP1t0mRab1rgsZH/vFi4x05MgRjB07FmfOnNGdXHbv3j3V23TS6969e3jx4gVy5MiB5ORkjBo1CtHR0cibNy/69u0LV1dXRfGzZMmCefPmoWbNmorbmllMuf3fZKoTp9evX2Pnzp24dOkSmjRpAkdHR9y4cQNOTk66uwIoY0RFReklidq7HJSaNm0avvvuO8Wf13f566+/MGjQIN08mjlz5kT//v3RunVrVeJnxMUwUwkNDUVSUhLWrVsHC4uUG9POnDmDSpUqoWHDhqrezWAKJ06cQOXKleHi4oLY2FicO3cOfn5+6Nu3L65evYo5c+aoVtetW7dSvYtB6XmjFpMrhc6fP4+dO3emupPUuC0KgEFiooSZmdkHx1GSANWuXRvm5ub466+/4Ofnh4MHD+Lu3bvo3r07Ro0apXtGSglT9/y0bNkShQoVQrdu3RTFSYun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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot a barplot of the random forest's feature importances,\n",
"# assigning the `feature_importances_` attribute of \n",
"# `rf_grid_cv.best_estimator_.named_steps.randomforestregressor` to the name `imps` to then\n",
"# create a pandas Series object of the feature importances, with the index given by the\n",
"# training data column names, sorting the values in descending order\n",
"plt.subplots(figsize=(10, 5))\n",
"imps = rf_grid_cv.best_estimator_.named_steps.randomforestregressor.feature_importances_\n",
"rf_feat_imps = pd.Series(imps, index=X_train.columns).sort_values(ascending=False)\n",
"rf_feat_imps.plot(kind='bar')\n",
"plt.xlabel('features')\n",
"plt.ylabel('importance')\n",
"plt.title('Best random forest regressor feature importances');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Encouragingly, the dominant top four features are in common with our linear model:\n",
"* fastQuads\n",
"* Runs\n",
"* Snow Making_ac\n",
"* vertical_drop"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.11 Final Model Selection"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Time to select our final model to use for further business modeling! It would be good to revisit the above model selection; there is undoubtedly more that could be done to explore possible hyperparameters.\n",
"It would also be worthwhile to investigate removing the least useful features. Gathering or calculating, and storing, features adds business cost and dependencies, so if features genuinely are not needed they should be removed.\n",
"Building a simpler model with fewer features can also have the advantage of being easier to sell (and/or explain) to stakeholders.\n",
"Certainly there seem to be four strong features here and so a model using only those would probably work well.\n",
"However, we want to explore some different scenarios where other features vary so keep the fuller \n",
"model for now. \n",
"The business is waiting for this model and we have something that we have confidence in to be much better than guessing with the average price.\n",
"\n",
"Or, rather, we have two \"somethings\". We built a best linear model and a best random forest model. We need to finally choose between them. We can calculate the mean absolute error using cross-validation. Although `cross-validate` defaults to the $R^2$ [metric for scoring](https://scikit-learn.org/stable/modules/model_evaluation.html#scoring) regression, we can specify the mean absolute error as an alternative via\n",
"the `scoring` parameter."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.11.1 Linear regression model performance"
]
},
{
"cell_type": "code",
"execution_count": 184,
"metadata": {},
"outputs": [],
"source": [
"# 'neg_mean_absolute_error' uses the (negative of) the mean absolute error\n",
"lr_neg_mae = cross_validate(lr_grid_cv.best_estimator_, X_train, y_train, \n",
" scoring='neg_mean_absolute_error', cv=5, n_jobs=-1)"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(10.891687453692906, 1.867599419260583)"
]
},
"execution_count": 185,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr_mae_mean = np.mean(-1 * lr_neg_mae['test_score'])\n",
"lr_mae_std = np.std(-1 * lr_neg_mae['test_score'])\n",
"lr_mae_mean, lr_mae_std"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"10.314388905802957"
]
},
"execution_count": 186,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_test, lr_grid_cv.best_estimator_.predict(X_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.11.2 Random forest regression model performance"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [],
"source": [
"rf_neg_mae = cross_validate(rf_grid_cv.best_estimator_, X_train, y_train, \n",
" scoring='neg_mean_absolute_error', cv=5, n_jobs=-1)"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(9.829508627130718, 1.0814411685916026)"
]
},
"execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rf_mae_mean = np.mean(-1 * rf_neg_mae['test_score'])\n",
"rf_mae_std = np.std(-1 * rf_neg_mae['test_score'])\n",
"rf_mae_mean, rf_mae_std"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9.539958614347025"
]
},
"execution_count": 189,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(y_test, rf_grid_cv.best_estimator_.predict(X_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.11.3 Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The random forest model has a lower cross-validation mean absolute error by almost ~$1. It also exhibits less variability. Verifying performance on the test set produces performance consistent with the cross-validation results."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.12 Data quantity assessment"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, we need to advise the business whether it needs to undertake further data collection. Would more data be useful? We're often led to believe more data is always good, but gathering data invariably has a cost associated with it. Assess this trade off by seeing how performance varies with differing data set sizes. The `learning_curve` function does this conveniently."
]
},
{
"cell_type": "code",
"execution_count": 190,
"metadata": {},
"outputs": [],
"source": [
"fractions = [.2, .25, .3, .35, .4, .45, .5, .6, .75, .8, 1.0]\n",
"train_size, train_scores, test_scores = learning_curve(pipe, X_train, y_train, train_sizes=fractions)\n",
"train_scores_mean = np.mean(train_scores, axis=1)\n",
"train_scores_std = np.std(train_scores, axis=1)\n",
"test_scores_mean = np.mean(test_scores, axis=1)\n",
"test_scores_std = np.std(test_scores, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 191,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1oAAAHUCAYAAAAjh1kfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABnTUlEQVR4nO3deZyNdf/H8feZfR+zmLENxr6OZSayc9uzlYokuyJJ0sZPRRJSSd2FdIekpO7QQjRkC2XfIlsYyzD2wZj1XL8/NOd2zAwzXOPMjNfz8TgPzrV+zvme4bzn+72+l8UwDEMAAAAAANM4OboAAAAAAChoCFoAAAAAYDKCFgAAAACYjKAFAAAAACYjaAEAAACAyQhaAAAAAGAyghYAAAAAmIygBQAAAAAmI2gBAAAAgMkIWkA+smPHDvXp00fh4eHy8PCQj4+PateurYkTJ+rcuXOOLs9hSpcurd69e9ueHz58WBaLRbNmzbrlvqNHj5bFYrmt83711VeaPHlypussFotGjx59W8dF7jtx4oRGjx6tbdu25crxZ82aJYvFosOHD+d435x8fvOy3HiP7+Tn9XbdSVsCuLe5OLoAANnz6aefatCgQapYsaJeeuklValSRSkpKdq0aZOmTZum9evXa8GCBY4uM08oWrSo1q9fr7Jly+bqeb766ivt2rVLQ4cOzbBu/fr1KlGiRK6eH7fvxIkTeuONN1S6dGnVrFnT9OO3a9dO69evV9GiRXO87936/Oa23HiP+/fvrzZt2phyrOy6k7YEcG8jaAH5wPr16/X000+rZcuWWrhwodzd3W3rWrZsqRdeeEFLliy56TGuXr0qT0/P3C41T3B3d9f999/v0BocfX5HSkhIkJeXl6PLMFVOX1PhwoVVuHDh2zpXXvj85lUlSpS467/AuJO2vF1paWlKTU21+7ceQP7D0EEgHxg3bpwsFoumT5+e6X+8bm5u6tixo+156dKl1b59e82fP1+1atWSh4eH3njjDUnSrl271KlTJwUEBMjDw0M1a9bU559/bnc8q9WqsWPHqmLFivL09FShQoUUERGhDz74wLbN6dOn9dRTTyksLEzu7u4qXLiwGjRooGXLlmX5OlJSUhQSEqIePXpkWHfhwgV5enpq2LBhkqTExES98MILqlmzpvz9/RUYGKh69erp+++/v+X7ldXQq0WLFqlmzZpyd3dXeHi43n333Uz3//jjj9W4cWOFhITI29tb1atX18SJE5WSkmLbpmnTplq0aJGOHDkii8Vie6TLbOhgdt77lStXymKxaO7cuRo5cqSKFSsmPz8/tWjRQnv37r3la89uuyxZskTNmzeXv7+/vLy8VLlyZY0fP95umx9++EH16tWTl5eXfH191bJlS61fv95um/ShXFu2bNEjjzyigIAAW0+MYRiaMmWKatasKU9PTwUEBOiRRx7R33//fcvXceDAAfXp00fly5eXl5eXihcvrg4dOmjnzp1222Xns3qjlStX6r777pMk9enTx9Z26e3Vu3dv+fj4aOfOnWrVqpV8fX3VvHlzSVJ0dLQ6deqkEiVKyMPDQ+XKldOAAQN05swZu3NkNtysadOmqlatmjZu3KhGjRrJy8tLZcqU0YQJE2S1Wm3bZfb5TX+f//zzT3Xr1k3+/v4KDQ1V3759dfHiRbtzX7hwQf369VNgYKB8fHzUrl07/f3339kazprd93P//v16/PHHFRISInd3d1WuXFkff/xxtt/jzCQkJOjFF1+0DY0ODAxUVFSU5s6dm+F9uPF9zuzRtGlT23Z38lm8k7aUrrXHCy+8oDJlysjd3V0hISF64IEH9Ndff0n6X3tPnDhRY8eOVXh4uNzd3bVixQpJ0qZNm9SxY0cFBgbKw8NDtWrV0jfffGN3jtOnT2vQoEGqUqWKfHx8FBISon/9619as2ZNhtczdepU1ahRQz4+PvL19VWlSpX0f//3f3bbnDx5UgMGDFCJEiXk5uam8PBwvfHGG0pNTc3xsYB7GT1aQB6XlpamX3/9VZGRkQoLC8v2flu2bNGePXv06quvKjw8XN7e3tq7d6/q16+vkJAQffjhhwoKCtKcOXPUu3dvnTp1Si+//LIkaeLEiRo9erReffVVNW7cWCkpKfrrr7904cIF2/F79OihLVu26K233lKFChV04cIFbdmyRWfPns2yJldXVz3xxBOaNm2aPv74Y/n5+dnWzZ07V4mJierTp48kKSkpSefOndOLL76o4sWLKzk5WcuWLVPnzp01c+ZM9ezZM0fv4/Lly9WpUyfVq1dPX3/9tdLS0jRx4kSdOnUqw7YHDx7U448/rvDwcLm5uWn79u1666239Ndff2nGjBmSpClTpuipp57SwYMHszVkM7vvfbr/+7//U4MGDfSf//xH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l2EY2Wuzq1evGoMHDzYCAwMNT09Po3379kZMTIwDXs296WZteOjQoUzXSTJWrFhhOwZt6Hi3+lm80Y3TuxsG7ZgXZKcdP/vsM6NcuXKGh4eHUaNGDWPhwoV2xzCjHS2GYRi3FRUBAAAAAJniGi0AAAAAMBlBCwAAAABMRtACAAAAAJMRtAAAAADAZAQtAAAAADAZQQsAAAAATEbQAgAAAACTEbQAAAAAwGQELQDAXde0aVMNHTo029sfPnxYFotF27Zty7Wa8orevXvrwQcfdHQZAIA7ZDEMw3B0EQCAvMlisdx0fa9evTRr1qwcH/fcuXNydXWVr69vtrZPS0vT6dOnFRwcLBcXlxyf727p3bu3Lly4oIULF972MS5evCjDMFSoUCHT6gIA3H15938rAIDDxcbG2v4+b948vf7669q7d69tmaenp932KSkpcnV1veVxAwMDc1SHs7OzihQpkqN98it/f39HlwAAMAFDBwEAWSpSpIjt4e/vL4vFYnuemJioQoUK6ZtvvlHTpk3l4eGhOXPm6OzZs+rWrZtKlCghLy8vVa9eXXPnzrU77o1DB0uXLq1x48apb9++8vX1VcmSJTV9+nTb+huHDq5cuVIWi0XLly9XVFSUvLy8VL9+fbsQKEljx45VSEiIfH191b9/fw0fPlw1a9bM8vWeP39e3bt3V+HCheXp6any5ctr5syZtvXHjx9X165dFRAQoKCgIHXq1EmHDx+WJI0ePVqff/65vv/+e1ksFlksFq1cuTLT8/z3v/9V9erV5enpqaCgILVo0UJXrlyRZD90MP113/ho2rSp7Vjr1q1T48aN5enpqbCwMA0ZMsR2LACA4xC0AAB35JVXXtGQIUO0Z88etW7dWomJiYqMjNRPP/2kXbt26amnnlKPHj30xx9/3PQ47733nqKiorR161YNGjRITz/9tP7666+b7jNy5Ei999572rRpk1xcXNS3b1/bui+//FJvvfWW3n77bW3evFklS5bU1KlTb3q81157Tbt379bPP/+sPXv2aOrUqQoODpYkJSQkqFmzZvLx8dHq1av122+/ycfHR23atFFycrJefPFFdenSRW3atFFsbKxiY2NVv379DOeIjY1Vt27d1LdvX+3Zs0crV65U586dldlI/rCwMNuxYmNjtXXrVgUFBalx48aSpJ07d6p169bq3LmzduzYoXnz5um3337T4MGDb/o6AQB3gQEAQDbMnDnT8Pf3tz0/dOiQIcmYPHnyLfd94IEHjBdeeMH2vEmTJsZzzz1ne16qVCnjiSeesD23Wq1GSEiIMXXqVLtzbd261TAMw1ixYoUhyVi2bJltn0WLFhmSjKtXrxqGYRh169Y1nnnmGbs6GjRoYNSoUSPLOjt06GD06dMn03WfffaZUbFiRcNqtdqWJSUlGZ6ensbSpUsNwzCMXr16GZ06dcr6jTAMY/PmzYYk4/Dhw5muz+oYV69eNerWrWu0b9/eSEtLMwzDMHr06GE89dRTdtutWbPGcHJysr0PAADHoEcLAHBHoqKi7J6npaXprbfeUkREhIKCguTj46NffvlFMTExNz1ORESE7e/pQxTj4uKyvU/RokUlybbP3r17VadOHbvtb3x+o6efflpff/21atasqZdfflnr1q2zrdu8ebMOHDggX19f+fj4yMfHR4GBgUpMTNTBgwdvetzr1ahRQ82bN1f16tX16KOP6tNPP9X58+dvuV+/fv106dIlffXVV3JycrLVNGvWLFs9Pj4+at26taxWqw4dOpTtmgAA5mMyDADAHfH29rZ7/t577+n999/X5MmTVb16dXl7e2vo0KFKTk6+6XFunETDYrHIarVme5/0GRKv3+fGWRONW0y027ZtWx05ckSLFi3SsmXL1Lx5cz3zzDN69913ZbVaFRkZqS+//DLDfoULF77pca/n7Oys6OhorVu3Tr/88ov+/e9/a+TIkfrjjz8UHh6e6T5jx47VkiVLtGHDBruZGq1WqwYMGKAhQ4Zk2KdkyZLZrgkAYD56tAAAplqzZo06deqkJ554QjVq1FCZMmW0f//+u15HxYoVtWHDBrtlmzZtuuV+hQsXVu/evTVnzhxNnjzZNilH7dq1tX//foWEhKhcuXJ2j/SZAt3c3JSWlnbLc1gsFjVo0EBvvPGGtm7dKjc3Ny1YsCDTbb/77juNGTNG33zzjcqWLWu3rnbt2vrzzz8z1FOuXDm5ubndsg4AQO4haAEATFWuXDlbj82ePXs0YMAAnTx58q7X8eyzz+qzzz7T559/rv3792vs2LHasWPHTe8N9vrrr+v777/XgQMH9Oeff+qnn35S5cqVJUndu3dXcHCwOnXqpDVr1ujQoUNatWqVnnvuOR07dkzStdkTd+zYob179+rMmTNKSUnJcI4//vhD48aN06ZNmxQTE6P58+fr9OnTtvNcb9euXerZs6deeeUVVa1aVSdPntTJkyd17tw5SdcmIlm/fr2eeeYZbdu2Tfv379cPP/ygZ5991oy3EABwBwhaAABTvfbaa6pdu7Zat26tpk2bqkiRIrbpyu+m7t27a8SIEXrxxRdVu3ZtHTp0SL1795aHh0eW+7i5uWnEiBGKiIhQ48aN5ezsrK+//lqS5OXlpdWrV6tkyZLq3LmzKleurL59++rq1avy8/OTJD355JOqWLGioqKiVLhwYa1duzbDOfz8/LR69Wo98MADqlChgl599VW99957atu2bYZtN23apISEBI0dO1ZFixa1PTp37izp2jVqq1at0v79+9WoUSPVqlVLr732mu16NQCA41iMWw1YBwCggGjZsqWKFCmiL774wtGlAAAKOCbDAAAUSAkJCZo2bZpat24tZ2dnzZ07V8uWLVN0dLSjSwMA3APo0QIAFEhXr15Vhw4dtGXLFiUlJalixYp69dVXbcPuAADITQQtAAAAADAZk2EAAAAAgMkIWgAAAABgMoIWAAAAAJiMoAUAAAAAJiNoAQAAAIDJCFoAAAAAYDKCFgAAAACYjKAFAAAAACb7fzrrUbhulYG4AAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.subplots(figsize=(10, 5))\n",
"plt.errorbar(train_size, test_scores_mean, yerr=test_scores_std)\n",
"plt.xlabel('Training set size')\n",
"plt.ylabel('CV scores')\n",
"plt.title('Cross-validation score as training set size increases');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This shows that you seem to have plenty of data. There's an initial rapid improvement in model scores as one would expect, but it's essentially levelled off by around a sample size of 40-50."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4.13 Save best model object from pipeline"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [],
"source": [
"best_model = rf_grid_cv.best_estimator_\n",
"best_model.version = '1.0'\n",
"best_model.pandas_version = pd.__version__\n",
"best_model.numpy_version = np.__version__\n",
"best_model.sklearn_version = sklearn_version\n",
"best_model.X_columns = [col for col in X_train.columns]\n",
"best_model.build_datetime = datetime.datetime.now()"
]
},
{
"cell_type": "code",
"execution_count": 193,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A file already exists with this name.\n",
"\n",
"Do you want to overwrite? (Y/N)Y\n",
"Writing file. \"../models/ski_resort_pricing_model.pkl\"\n"
]
}
],
"source": [
"# save the model\n",
"\n",
"modelpath = '../models'\n",
"save_file(best_model, 'ski_resort_pricing_model.pkl', modelpath)"
]
}
],
"metadata": {
"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.13"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}