{ "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": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234
NameAlyeska ResortEaglecrest Ski AreaHilltop Ski AreaArizona SnowbowlSunrise Park Resort
RegionAlaskaAlaskaAlaskaArizonaArizona
stateAlaskaAlaskaAlaskaArizonaArizona
summit_elev3939260020901150011100
vertical_drop2500154029423001800
base_elev2501200179692009200
trams10000
fastSixes00010
fastQuads20001
quad20022
triple00123
double04011
surface20220
total_chairs74387
Runs76.036.013.055.065.0
TerrainParks2.01.01.04.02.0
LongestRun_mi1.02.01.02.01.2
SkiableTerrain_ac1610.0640.030.0777.0800.0
Snow Making_ac113.060.030.0104.080.0
daysOpenLastYear150.045.0150.0122.0115.0
yearsOpen60.044.036.081.049.0
averageSnowfall669.0350.069.0260.0250.0
AdultWeekend85.053.034.089.078.0
projectedDaysOpen150.090.0152.0122.0104.0
NightSkiing_ac550.0NaN30.0NaN80.0
resorts_per_state33322
resorts_per_100kcapita0.4100910.4100910.4100910.0274770.027477
resorts_per_100ksq_mile0.4508670.4508670.4508671.754541.75454
resort_skiable_area_ac_state_ratio0.706140.2807020.0131580.4927080.507292
resort_days_open_state_ratio0.4347830.1304350.4347830.5147680.485232
resort_terrain_park_state_ratio0.50.250.250.6666670.333333
resort_night_skiing_state_ratio0.948276NaN0.051724NaN1.0
total_chairs_runs_ratio0.0921050.1111110.2307690.1454550.107692
total_chairs_skiable_ratio0.0043480.006250.10.0102960.00875
fastQuads_runs_ratio0.0263160.00.00.00.015385
fastQuads_skiable_ratio0.0012420.00.00.00.00125
\n", "
" ], "text/plain": [ " 0 1 \\\n", "Name Alyeska Resort Eaglecrest Ski Area \n", "Region Alaska Alaska \n", "state Alaska Alaska \n", "summit_elev 3939 2600 \n", "vertical_drop 2500 1540 \n", "base_elev 250 1200 \n", "trams 1 0 \n", "fastSixes 0 0 \n", "fastQuads 2 0 \n", "quad 2 0 \n", "triple 0 0 \n", "double 0 4 \n", "surface 2 0 \n", "total_chairs 7 4 \n", "Runs 76.0 36.0 \n", "TerrainParks 2.0 1.0 \n", "LongestRun_mi 1.0 2.0 \n", "SkiableTerrain_ac 1610.0 640.0 \n", "Snow Making_ac 113.0 60.0 \n", "daysOpenLastYear 150.0 45.0 \n", "yearsOpen 60.0 44.0 \n", "averageSnowfall 669.0 350.0 \n", "AdultWeekend 85.0 53.0 \n", "projectedDaysOpen 150.0 90.0 \n", "NightSkiing_ac 550.0 NaN \n", "resorts_per_state 3 3 \n", "resorts_per_100kcapita 0.410091 0.410091 \n", "resorts_per_100ksq_mile 0.450867 0.450867 \n", "resort_skiable_area_ac_state_ratio 0.70614 0.280702 \n", "resort_days_open_state_ratio 0.434783 0.130435 \n", "resort_terrain_park_state_ratio 0.5 0.25 \n", "resort_night_skiing_state_ratio 0.948276 NaN \n", "total_chairs_runs_ratio 0.092105 0.111111 \n", "total_chairs_skiable_ratio 0.004348 0.00625 \n", "fastQuads_runs_ratio 0.026316 0.0 \n", "fastQuads_skiable_ratio 0.001242 0.0 \n", "\n", " 2 3 \\\n", "Name Hilltop Ski Area Arizona Snowbowl \n", "Region Alaska Arizona \n", "state Alaska Arizona \n", "summit_elev 2090 11500 \n", "vertical_drop 294 2300 \n", "base_elev 1796 9200 \n", "trams 0 0 \n", "fastSixes 0 1 \n", "fastQuads 0 0 \n", "quad 0 2 \n", "triple 1 2 \n", "double 0 1 \n", "surface 2 2 \n", "total_chairs 3 8 \n", "Runs 13.0 55.0 \n", "TerrainParks 1.0 4.0 \n", "LongestRun_mi 1.0 2.0 \n", "SkiableTerrain_ac 30.0 777.0 \n", "Snow Making_ac 30.0 104.0 \n", "daysOpenLastYear 150.0 122.0 \n", "yearsOpen 36.0 81.0 \n", "averageSnowfall 69.0 260.0 \n", "AdultWeekend 34.0 89.0 \n", "projectedDaysOpen 152.0 122.0 \n", "NightSkiing_ac 30.0 NaN \n", "resorts_per_state 3 2 \n", "resorts_per_100kcapita 0.410091 0.027477 \n", "resorts_per_100ksq_mile 0.450867 1.75454 \n", "resort_skiable_area_ac_state_ratio 0.013158 0.492708 \n", "resort_days_open_state_ratio 0.434783 0.514768 \n", "resort_terrain_park_state_ratio 0.25 0.666667 \n", "resort_night_skiing_state_ratio 0.051724 NaN \n", "total_chairs_runs_ratio 0.230769 0.145455 \n", "total_chairs_skiable_ratio 0.1 0.010296 \n", "fastQuads_runs_ratio 0.0 0.0 \n", "fastQuads_skiable_ratio 0.0 0.0 \n", "\n", " 4 \n", "Name Sunrise Park Resort \n", "Region Arizona \n", "state Arizona \n", "summit_elev 11100 \n", "vertical_drop 1800 \n", "base_elev 9200 \n", "trams 0 \n", "fastSixes 0 \n", "fastQuads 1 \n", "quad 2 \n", "triple 3 \n", "double 1 \n", "surface 0 \n", "total_chairs 7 \n", "Runs 65.0 \n", "TerrainParks 2.0 \n", "LongestRun_mi 1.2 \n", "SkiableTerrain_ac 800.0 \n", "Snow Making_ac 80.0 \n", "daysOpenLastYear 115.0 \n", "yearsOpen 49.0 \n", "averageSnowfall 250.0 \n", "AdultWeekend 78.0 \n", "projectedDaysOpen 104.0 \n", "NightSkiing_ac 80.0 \n", "resorts_per_state 2 \n", "resorts_per_100kcapita 0.027477 \n", "resorts_per_100ksq_mile 1.75454 \n", "resort_skiable_area_ac_state_ratio 0.507292 \n", "resort_days_open_state_ratio 0.485232 \n", "resort_terrain_park_state_ratio 0.333333 \n", "resort_night_skiing_state_ratio 1.0 \n", "total_chairs_runs_ratio 0.107692 \n", "total_chairs_skiable_ratio 0.00875 \n", "fastQuads_runs_ratio 0.015385 \n", "fastQuads_skiable_ratio 0.00125 " ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ski_data = pd.read_csv('../data/ski_data_step3_features.csv')\n", "ski_data.head().T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.5 Extract Big Mountain Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Big Mountain is our resort. Separate it from the rest of the data to use later." ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "big_mountain = ski_data[ski_data.Name == 'Big Mountain Resort']" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
124
NameBig Mountain Resort
RegionMontana
stateMontana
summit_elev6817
vertical_drop2353
base_elev4464
trams0
fastSixes0
fastQuads3
quad2
triple6
double0
surface3
total_chairs14
Runs105.0
TerrainParks4.0
LongestRun_mi3.3
SkiableTerrain_ac3000.0
Snow Making_ac600.0
daysOpenLastYear123.0
yearsOpen72.0
averageSnowfall333.0
AdultWeekend81.0
projectedDaysOpen123.0
NightSkiing_ac600.0
resorts_per_state12
resorts_per_100kcapita1.122778
resorts_per_100ksq_mile8.161045
resort_skiable_area_ac_state_ratio0.140121
resort_days_open_state_ratio0.129338
resort_terrain_park_state_ratio0.148148
resort_night_skiing_state_ratio0.84507
total_chairs_runs_ratio0.133333
total_chairs_skiable_ratio0.004667
fastQuads_runs_ratio0.028571
fastQuads_skiable_ratio0.001
\n", "
" ], "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": "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mzcNXrtx4wbMzMzg6uqqV/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 }