{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Random Forest Regression of the EPA dataset\n",
"\n",
"This is a Random Forest Regression of the EPA dataset i performed the linear regression on in an earlier blog post. Most of the data engineering is already done, but there are a couple of small items to deal with along the way. I perform the analysis as i was taught, most of this knowledge came from the Fastai ML course, free and public.\n",
"\n",
"To begin, load some stuff.\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"from fastai.structured import *\n",
"\n",
"import pandas as pd \n",
"import numpy as np \n",
"from graphviz import Digraph\n",
"from pandas_summary import DataFrameSummary\n",
"from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n",
"from IPython.display import display\n",
"\n",
"from sklearn import metrics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Set a path and list contents of directory, i go back and forth between mac and ubuntu so this works for me."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"18tstcar.csv mtcars.csv\r\n",
"Robey.csv mtcarsShort.csv\r\n",
"US-Education.csv test-car-list-definitions.pdf\r\n",
"USA.dataAll.csv us-counties.json\r\n",
"US_Unemployment_Oct2012.csv us_counties_20m_topo.json\r\n",
"birthwt-small.csv us_county_data.csv\r\n",
"birthwt.csv world-countries.json\r\n",
"epaMpg.csv\r\n"
]
}
],
"source": [
"PATH = \"../data/\"\n",
"!ls {PATH}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the csv file into a pandas dataframe. "
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"epa = pd.read_csv(f'{PATH}epaMpg.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This the the same head command that exists in R, the \"T\" will transpose or pivot the dataframe. "
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" \n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" 5 \n",
" \n",
" \n",
" Represented.Test.Veh.Make \n",
" Aston Martin \n",
" Aston Martin \n",
" BENTLEY \n",
" BENTLEY \n",
" BMW \n",
" \n",
" \n",
" Model \n",
" Rapide S \n",
" Vanquish \n",
" Continental GT \n",
" Continental GT \n",
" 230i Convertible \n",
" \n",
" \n",
" Vehicle.Type \n",
" Car \n",
" Car \n",
" Car \n",
" Car \n",
" Car \n",
" \n",
" \n",
" HorsePower \n",
" 552 \n",
" 568 \n",
" 616 \n",
" 616 \n",
" 248 \n",
" \n",
" \n",
" Cylinders \n",
" 12 \n",
" 12 \n",
" 12 \n",
" 12 \n",
" 4 \n",
" \n",
" \n",
" Tested.Transmission.Type.Code \n",
" SA \n",
" SA \n",
" SA \n",
" SA \n",
" SA \n",
" \n",
" \n",
" Tested.Transmission.Type \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" \n",
" \n",
" Gears \n",
" 8 \n",
" 8 \n",
" 8 \n",
" 8 \n",
" 8 \n",
" \n",
" \n",
" Drive.System.Code \n",
" R \n",
" R \n",
" F \n",
" F \n",
" R \n",
" \n",
" \n",
" Weight \n",
" 4750 \n",
" 4500 \n",
" 6000 \n",
" 6000 \n",
" 4000 \n",
" \n",
" \n",
" AxleRatio \n",
" 2.73 \n",
" 2.73 \n",
" 2.85 \n",
" 2.85 \n",
" 2.81 \n",
" \n",
" \n",
" Test.Procedure.Cd \n",
" 21 \n",
" 21 \n",
" 90 \n",
" 11 \n",
" 3 \n",
" \n",
" \n",
" Test.Procedure.Description \n",
" Federal fuel 2-day exhaust (w/can load) \n",
" Federal fuel 2-day exhaust (w/can load) \n",
" US06 \n",
" Cold CO \n",
" HWFE \n",
" \n",
" \n",
" Test.Fuel.Type.Cd \n",
" 61 \n",
" 61 \n",
" 61 \n",
" 27 \n",
" 61 \n",
" \n",
" \n",
" Test.Fuel.Type.Description \n",
" Tier 2 Cert Gasoline \n",
" Tier 2 Cert Gasoline \n",
" Tier 2 Cert Gasoline \n",
" Cold CO Premium (Tier 2) \n",
" Tier 2 Cert Gasoline \n",
" \n",
" \n",
" FuelEcon \n",
" 17.3 \n",
" 16.5 \n",
" 17.4 \n",
" 13.6 \n",
" 45.8 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 \\\n",
"Unnamed: 0 1 \n",
"Represented.Test.Veh.Make Aston Martin \n",
"Model Rapide S \n",
"Vehicle.Type Car \n",
"HorsePower 552 \n",
"Cylinders 12 \n",
"Tested.Transmission.Type.Code SA \n",
"Tested.Transmission.Type Semi-Automatic \n",
"Gears 8 \n",
"Drive.System.Code R \n",
"Weight 4750 \n",
"AxleRatio 2.73 \n",
"Test.Procedure.Cd 21 \n",
"Test.Procedure.Description Federal fuel 2-day exhaust (w/can load) \n",
"Test.Fuel.Type.Cd 61 \n",
"Test.Fuel.Type.Description Tier 2 Cert Gasoline \n",
"FuelEcon 17.3 \n",
"\n",
" 1 \\\n",
"Unnamed: 0 2 \n",
"Represented.Test.Veh.Make Aston Martin \n",
"Model Vanquish \n",
"Vehicle.Type Car \n",
"HorsePower 568 \n",
"Cylinders 12 \n",
"Tested.Transmission.Type.Code SA \n",
"Tested.Transmission.Type Semi-Automatic \n",
"Gears 8 \n",
"Drive.System.Code R \n",
"Weight 4500 \n",
"AxleRatio 2.73 \n",
"Test.Procedure.Cd 21 \n",
"Test.Procedure.Description Federal fuel 2-day exhaust (w/can load) \n",
"Test.Fuel.Type.Cd 61 \n",
"Test.Fuel.Type.Description Tier 2 Cert Gasoline \n",
"FuelEcon 16.5 \n",
"\n",
" 2 3 \\\n",
"Unnamed: 0 3 4 \n",
"Represented.Test.Veh.Make BENTLEY BENTLEY \n",
"Model Continental GT Continental GT \n",
"Vehicle.Type Car Car \n",
"HorsePower 616 616 \n",
"Cylinders 12 12 \n",
"Tested.Transmission.Type.Code SA SA \n",
"Tested.Transmission.Type Semi-Automatic Semi-Automatic \n",
"Gears 8 8 \n",
"Drive.System.Code F F \n",
"Weight 6000 6000 \n",
"AxleRatio 2.85 2.85 \n",
"Test.Procedure.Cd 90 11 \n",
"Test.Procedure.Description US06 Cold CO \n",
"Test.Fuel.Type.Cd 61 27 \n",
"Test.Fuel.Type.Description Tier 2 Cert Gasoline Cold CO Premium (Tier 2) \n",
"FuelEcon 17.4 13.6 \n",
"\n",
" 4 \n",
"Unnamed: 0 5 \n",
"Represented.Test.Veh.Make BMW \n",
"Model 230i Convertible \n",
"Vehicle.Type Car \n",
"HorsePower 248 \n",
"Cylinders 4 \n",
"Tested.Transmission.Type.Code SA \n",
"Tested.Transmission.Type Semi-Automatic \n",
"Gears 8 \n",
"Drive.System.Code R \n",
"Weight 4000 \n",
"AxleRatio 2.81 \n",
"Test.Procedure.Cd 3 \n",
"Test.Procedure.Description HWFE \n",
"Test.Fuel.Type.Cd 61 \n",
"Test.Fuel.Type.Description Tier 2 Cert Gasoline \n",
"FuelEcon 45.8 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa.head().T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Describe() is similar to summary in R, once again, \"T\" will transpose the dataframe. "
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" count \n",
" mean \n",
" std \n",
" min \n",
" 25% \n",
" 50% \n",
" 75% \n",
" max \n",
" \n",
" \n",
" \n",
" \n",
" Unnamed: 0 \n",
" 1034.0 \n",
" 521.361702 \n",
" 300.241933 \n",
" 1.00 \n",
" 262.250 \n",
" 520.50 \n",
" 781.75 \n",
" 1040.00 \n",
" \n",
" \n",
" HorsePower \n",
" 1034.0 \n",
" 291.824952 \n",
" 144.294932 \n",
" 72.00 \n",
" 181.000 \n",
" 271.50 \n",
" 355.00 \n",
" 1500.00 \n",
" \n",
" \n",
" Cylinders \n",
" 1034.0 \n",
" 5.431335 \n",
" 1.905214 \n",
" 3.00 \n",
" 4.000 \n",
" 4.00 \n",
" 6.00 \n",
" 16.00 \n",
" \n",
" \n",
" Gears \n",
" 1034.0 \n",
" 6.509671 \n",
" 1.992824 \n",
" 1.00 \n",
" 6.000 \n",
" 7.00 \n",
" 8.00 \n",
" 10.00 \n",
" \n",
" \n",
" Weight \n",
" 1034.0 \n",
" 4191.852031 \n",
" 787.821434 \n",
" 2375.00 \n",
" 3625.000 \n",
" 4000.00 \n",
" 4750.00 \n",
" 6500.00 \n",
" \n",
" \n",
" AxleRatio \n",
" 1034.0 \n",
" 3.411064 \n",
" 0.586484 \n",
" 1.56 \n",
" 3.070 \n",
" 3.36 \n",
" 3.70 \n",
" 5.44 \n",
" \n",
" \n",
" Test.Procedure.Cd \n",
" 1034.0 \n",
" 24.993230 \n",
" 22.078601 \n",
" 2.00 \n",
" 11.000 \n",
" 21.00 \n",
" 31.00 \n",
" 95.00 \n",
" \n",
" \n",
" Test.Fuel.Type.Cd \n",
" 1034.0 \n",
" 56.366538 \n",
" 11.633650 \n",
" 19.00 \n",
" 61.000 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" \n",
" \n",
" FuelEcon \n",
" 1034.0 \n",
" 28.216538 \n",
" 9.496233 \n",
" 9.20 \n",
" 21.525 \n",
" 26.80 \n",
" 33.40 \n",
" 71.60 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" count mean std min 25% \\\n",
"Unnamed: 0 1034.0 521.361702 300.241933 1.00 262.250 \n",
"HorsePower 1034.0 291.824952 144.294932 72.00 181.000 \n",
"Cylinders 1034.0 5.431335 1.905214 3.00 4.000 \n",
"Gears 1034.0 6.509671 1.992824 1.00 6.000 \n",
"Weight 1034.0 4191.852031 787.821434 2375.00 3625.000 \n",
"AxleRatio 1034.0 3.411064 0.586484 1.56 3.070 \n",
"Test.Procedure.Cd 1034.0 24.993230 22.078601 2.00 11.000 \n",
"Test.Fuel.Type.Cd 1034.0 56.366538 11.633650 19.00 61.000 \n",
"FuelEcon 1034.0 28.216538 9.496233 9.20 21.525 \n",
"\n",
" 50% 75% max \n",
"Unnamed: 0 520.50 781.75 1040.00 \n",
"HorsePower 271.50 355.00 1500.00 \n",
"Cylinders 4.00 6.00 16.00 \n",
"Gears 7.00 8.00 10.00 \n",
"Weight 4000.00 4750.00 6500.00 \n",
"AxleRatio 3.36 3.70 5.44 \n",
"Test.Procedure.Cd 21.00 31.00 95.00 \n",
"Test.Fuel.Type.Cd 61.00 61.00 61.00 \n",
"FuelEcon 26.80 33.40 71.60 "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa.describe().T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In R all of the spaces in my column names became periods, Python hates periods, so i convert them to \"_\"."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"epa = epa.drop(epa.columns[[0]], axis=1)\n",
"\n",
"epa.columns = epa.columns.str.replace('.', '_')\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" count \n",
" mean \n",
" std \n",
" min \n",
" 25% \n",
" 50% \n",
" 75% \n",
" max \n",
" \n",
" \n",
" \n",
" \n",
" HorsePower \n",
" 1034.0 \n",
" 291.824952 \n",
" 144.294932 \n",
" 72.00 \n",
" 181.000 \n",
" 271.50 \n",
" 355.0 \n",
" 1500.00 \n",
" \n",
" \n",
" Cylinders \n",
" 1034.0 \n",
" 5.431335 \n",
" 1.905214 \n",
" 3.00 \n",
" 4.000 \n",
" 4.00 \n",
" 6.0 \n",
" 16.00 \n",
" \n",
" \n",
" Gears \n",
" 1034.0 \n",
" 6.509671 \n",
" 1.992824 \n",
" 1.00 \n",
" 6.000 \n",
" 7.00 \n",
" 8.0 \n",
" 10.00 \n",
" \n",
" \n",
" Weight \n",
" 1034.0 \n",
" 4191.852031 \n",
" 787.821434 \n",
" 2375.00 \n",
" 3625.000 \n",
" 4000.00 \n",
" 4750.0 \n",
" 6500.00 \n",
" \n",
" \n",
" AxleRatio \n",
" 1034.0 \n",
" 3.411064 \n",
" 0.586484 \n",
" 1.56 \n",
" 3.070 \n",
" 3.36 \n",
" 3.7 \n",
" 5.44 \n",
" \n",
" \n",
" Test_Procedure_Cd \n",
" 1034.0 \n",
" 24.993230 \n",
" 22.078601 \n",
" 2.00 \n",
" 11.000 \n",
" 21.00 \n",
" 31.0 \n",
" 95.00 \n",
" \n",
" \n",
" Test_Fuel_Type_Cd \n",
" 1034.0 \n",
" 56.366538 \n",
" 11.633650 \n",
" 19.00 \n",
" 61.000 \n",
" 61.00 \n",
" 61.0 \n",
" 61.00 \n",
" \n",
" \n",
" FuelEcon \n",
" 1034.0 \n",
" 28.216538 \n",
" 9.496233 \n",
" 9.20 \n",
" 21.525 \n",
" 26.80 \n",
" 33.4 \n",
" 71.60 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" count mean std min 25% \\\n",
"HorsePower 1034.0 291.824952 144.294932 72.00 181.000 \n",
"Cylinders 1034.0 5.431335 1.905214 3.00 4.000 \n",
"Gears 1034.0 6.509671 1.992824 1.00 6.000 \n",
"Weight 1034.0 4191.852031 787.821434 2375.00 3625.000 \n",
"AxleRatio 1034.0 3.411064 0.586484 1.56 3.070 \n",
"Test_Procedure_Cd 1034.0 24.993230 22.078601 2.00 11.000 \n",
"Test_Fuel_Type_Cd 1034.0 56.366538 11.633650 19.00 61.000 \n",
"FuelEcon 1034.0 28.216538 9.496233 9.20 21.525 \n",
"\n",
" 50% 75% max \n",
"HorsePower 271.50 355.0 1500.00 \n",
"Cylinders 4.00 6.0 16.00 \n",
"Gears 7.00 8.0 10.00 \n",
"Weight 4000.00 4750.0 6500.00 \n",
"AxleRatio 3.36 3.7 5.44 \n",
"Test_Procedure_Cd 21.00 31.0 95.00 \n",
"Test_Fuel_Type_Cd 61.00 61.0 61.00 \n",
"FuelEcon 26.80 33.4 71.60 "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa.describe().T"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Change any columns of strings in a panda's dataframe to a column of\n",
"#catagorical values. This applies the changes inplace.\n",
"\n",
"#Parameters:\n",
"#-----------\n",
"#df: A pandas dataframe. Any columns of strings will be changed to\n",
"# categorical values.\n",
"# \n",
"\n",
"train_cats"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Following the logic below you can see that train_cats is a fastai function that will identify a string variable that can be converted to categorical or factor. I till generate the codes for you so they can be updated in place. "
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"train_cats(epa)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"Represented_Test_Veh_Make = epa.Represented_Test_Veh_Make.cat.categories"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['ACURA', 'AUDI', 'Alfa Romeo', 'Aston Martin', 'BENTLEY', 'BMW',\n",
" 'BUGATTI', 'BUICK', 'CADILLAC', 'CHEVROLET', 'Chrysler', 'Dodge',\n",
" 'FORD', 'Ferrari', 'Fiat', 'Ford', 'GMC', 'HONDA', 'HYUNDAI', 'Hyundai',\n",
" 'INFINITI', 'Jaguar', 'Jeep', 'KIA', 'Karma', 'Kia', 'LAMBORGHINI',\n",
" 'LEXUS', 'Land Rover', 'Lincoln', 'MASERATI', 'MAZDA', 'MINI',\n",
" 'MITSUBISHI', 'Mercedes-Benz', 'Mini', 'NISSAN', 'Porsche', 'RAM',\n",
" 'Rolls Royce', 'SCION', 'SUBARU', 'TOYOTA', 'VOLKSWAGEN', 'Volvo'],\n",
" dtype='object')"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Represented_Test_Veh_Make"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"epa.Represented_Test_Veh_Make.cat.set_categories(Represented_Test_Veh_Make, ordered=True, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"epa.Represented_Test_Veh_Make = epa.Represented_Test_Veh_Make.cat.codes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice the Represented_Test_Veh_Make is not a factor. "
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" \n",
" \n",
" \n",
" \n",
" Represented_Test_Veh_Make \n",
" 3 \n",
" 3 \n",
" 4 \n",
" 4 \n",
" 5 \n",
" \n",
" \n",
" Model \n",
" Rapide S \n",
" Vanquish \n",
" Continental GT \n",
" Continental GT \n",
" 230i Convertible \n",
" \n",
" \n",
" Vehicle_Type \n",
" Car \n",
" Car \n",
" Car \n",
" Car \n",
" Car \n",
" \n",
" \n",
" HorsePower \n",
" 552 \n",
" 568 \n",
" 616 \n",
" 616 \n",
" 248 \n",
" \n",
" \n",
" Cylinders \n",
" 12 \n",
" 12 \n",
" 12 \n",
" 12 \n",
" 4 \n",
" \n",
" \n",
" Tested_Transmission_Type_Code \n",
" SA \n",
" SA \n",
" SA \n",
" SA \n",
" SA \n",
" \n",
" \n",
" Tested_Transmission_Type \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" Semi-Automatic \n",
" \n",
" \n",
" Gears \n",
" 8 \n",
" 8 \n",
" 8 \n",
" 8 \n",
" 8 \n",
" \n",
" \n",
" Drive_System_Code \n",
" R \n",
" R \n",
" F \n",
" F \n",
" R \n",
" \n",
" \n",
" Weight \n",
" 4750 \n",
" 4500 \n",
" 6000 \n",
" 6000 \n",
" 4000 \n",
" \n",
" \n",
" AxleRatio \n",
" 2.73 \n",
" 2.73 \n",
" 2.85 \n",
" 2.85 \n",
" 2.81 \n",
" \n",
" \n",
" Test_Procedure_Cd \n",
" 21 \n",
" 21 \n",
" 90 \n",
" 11 \n",
" 3 \n",
" \n",
" \n",
" Test_Procedure_Description \n",
" Federal fuel 2-day exhaust (w/can load) \n",
" Federal fuel 2-day exhaust (w/can load) \n",
" US06 \n",
" Cold CO \n",
" HWFE \n",
" \n",
" \n",
" Test_Fuel_Type_Cd \n",
" 61 \n",
" 61 \n",
" 61 \n",
" 27 \n",
" 61 \n",
" \n",
" \n",
" Test_Fuel_Type_Description \n",
" Tier 2 Cert Gasoline \n",
" Tier 2 Cert Gasoline \n",
" Tier 2 Cert Gasoline \n",
" Cold CO Premium (Tier 2) \n",
" Tier 2 Cert Gasoline \n",
" \n",
" \n",
" FuelEcon \n",
" 17.3 \n",
" 16.5 \n",
" 17.4 \n",
" 13.6 \n",
" 45.8 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 \\\n",
"Represented_Test_Veh_Make 3 \n",
"Model Rapide S \n",
"Vehicle_Type Car \n",
"HorsePower 552 \n",
"Cylinders 12 \n",
"Tested_Transmission_Type_Code SA \n",
"Tested_Transmission_Type Semi-Automatic \n",
"Gears 8 \n",
"Drive_System_Code R \n",
"Weight 4750 \n",
"AxleRatio 2.73 \n",
"Test_Procedure_Cd 21 \n",
"Test_Procedure_Description Federal fuel 2-day exhaust (w/can load) \n",
"Test_Fuel_Type_Cd 61 \n",
"Test_Fuel_Type_Description Tier 2 Cert Gasoline \n",
"FuelEcon 17.3 \n",
"\n",
" 1 \\\n",
"Represented_Test_Veh_Make 3 \n",
"Model Vanquish \n",
"Vehicle_Type Car \n",
"HorsePower 568 \n",
"Cylinders 12 \n",
"Tested_Transmission_Type_Code SA \n",
"Tested_Transmission_Type Semi-Automatic \n",
"Gears 8 \n",
"Drive_System_Code R \n",
"Weight 4500 \n",
"AxleRatio 2.73 \n",
"Test_Procedure_Cd 21 \n",
"Test_Procedure_Description Federal fuel 2-day exhaust (w/can load) \n",
"Test_Fuel_Type_Cd 61 \n",
"Test_Fuel_Type_Description Tier 2 Cert Gasoline \n",
"FuelEcon 16.5 \n",
"\n",
" 2 3 \\\n",
"Represented_Test_Veh_Make 4 4 \n",
"Model Continental GT Continental GT \n",
"Vehicle_Type Car Car \n",
"HorsePower 616 616 \n",
"Cylinders 12 12 \n",
"Tested_Transmission_Type_Code SA SA \n",
"Tested_Transmission_Type Semi-Automatic Semi-Automatic \n",
"Gears 8 8 \n",
"Drive_System_Code F F \n",
"Weight 6000 6000 \n",
"AxleRatio 2.85 2.85 \n",
"Test_Procedure_Cd 90 11 \n",
"Test_Procedure_Description US06 Cold CO \n",
"Test_Fuel_Type_Cd 61 27 \n",
"Test_Fuel_Type_Description Tier 2 Cert Gasoline Cold CO Premium (Tier 2) \n",
"FuelEcon 17.4 13.6 \n",
"\n",
" 4 \n",
"Represented_Test_Veh_Make 5 \n",
"Model 230i Convertible \n",
"Vehicle_Type Car \n",
"HorsePower 248 \n",
"Cylinders 4 \n",
"Tested_Transmission_Type_Code SA \n",
"Tested_Transmission_Type Semi-Automatic \n",
"Gears 8 \n",
"Drive_System_Code R \n",
"Weight 4000 \n",
"AxleRatio 2.81 \n",
"Test_Procedure_Cd 3 \n",
"Test_Procedure_Description HWFE \n",
"Test_Fuel_Type_Cd 61 \n",
"Test_Fuel_Type_Description Tier 2 Cert Gasoline \n",
"FuelEcon 45.8 "
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa.head().T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So instead of going through an entire dataframe and converting string and text to numeric, proc_df will do the entire dataframe."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"epa_trn, y_trn, nas = proc_df(epa, 'FuelEcon')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check it out, no more text!"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" 5 \n",
" 6 \n",
" 7 \n",
" 8 \n",
" 9 \n",
" ... \n",
" 15 \n",
" 16 \n",
" 17 \n",
" 18 \n",
" 19 \n",
" 20 \n",
" 21 \n",
" 22 \n",
" 23 \n",
" 24 \n",
" \n",
" \n",
" \n",
" \n",
" Represented_Test_Veh_Make \n",
" 3.00 \n",
" 3.00 \n",
" 4.00 \n",
" 4.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.0 \n",
" ... \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" \n",
" \n",
" Model \n",
" 436.00 \n",
" 505.00 \n",
" 191.00 \n",
" 191.00 \n",
" 5.00 \n",
" 6.00 \n",
" 6.00 \n",
" 7.00 \n",
" 8.00 \n",
" 10.0 \n",
" ... \n",
" 15.00 \n",
" 16.00 \n",
" 16.00 \n",
" 17.00 \n",
" 18.00 \n",
" 19.00 \n",
" 20.00 \n",
" 20.00 \n",
" 21.00 \n",
" 21.00 \n",
" \n",
" \n",
" Vehicle_Type \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 1.0 \n",
" ... \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" \n",
" \n",
" HorsePower \n",
" 552.00 \n",
" 568.00 \n",
" 616.00 \n",
" 616.00 \n",
" 248.00 \n",
" 248.00 \n",
" 248.00 \n",
" 248.00 \n",
" 248.00 \n",
" 181.0 \n",
" ... \n",
" 180.00 \n",
" 248.00 \n",
" 248.00 \n",
" 248.00 \n",
" 248.00 \n",
" 248.00 \n",
" 320.00 \n",
" 320.00 \n",
" 320.00 \n",
" 320.00 \n",
" \n",
" \n",
" Cylinders \n",
" 12.00 \n",
" 12.00 \n",
" 12.00 \n",
" 12.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.0 \n",
" ... \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 4.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" \n",
" \n",
" Tested_Transmission_Type_Code \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 5.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 1.0 \n",
" ... \n",
" 6.00 \n",
" 6.00 \n",
" 5.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 5.00 \n",
" 6.00 \n",
" 5.00 \n",
" \n",
" \n",
" Tested_Transmission_Type \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 5.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 3.0 \n",
" ... \n",
" 7.00 \n",
" 7.00 \n",
" 5.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 5.00 \n",
" 7.00 \n",
" 5.00 \n",
" \n",
" \n",
" Gears \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 6.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.0 \n",
" ... \n",
" 8.00 \n",
" 8.00 \n",
" 6.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 6.00 \n",
" 8.00 \n",
" 6.00 \n",
" \n",
" \n",
" Drive_System_Code \n",
" 5.00 \n",
" 5.00 \n",
" 3.00 \n",
" 3.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.0 \n",
" ... \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" \n",
" \n",
" Weight \n",
" 4750.00 \n",
" 4500.00 \n",
" 6000.00 \n",
" 6000.00 \n",
" 4000.00 \n",
" 3625.00 \n",
" 3625.00 \n",
" 4000.00 \n",
" 3750.00 \n",
" 3625.0 \n",
" ... \n",
" 4250.00 \n",
" 3875.00 \n",
" 3750.00 \n",
" 4000.00 \n",
" 4250.00 \n",
" 4250.00 \n",
" 4000.00 \n",
" 4000.00 \n",
" 4000.00 \n",
" 4000.00 \n",
" \n",
" \n",
" AxleRatio \n",
" 2.73 \n",
" 2.73 \n",
" 2.85 \n",
" 2.85 \n",
" 2.81 \n",
" 3.91 \n",
" 2.81 \n",
" 2.81 \n",
" 2.81 \n",
" 3.2 \n",
" ... \n",
" 2.93 \n",
" 2.81 \n",
" 3.91 \n",
" 2.81 \n",
" 2.93 \n",
" 2.81 \n",
" 2.81 \n",
" 3.23 \n",
" 2.81 \n",
" 3.23 \n",
" \n",
" \n",
" Test_Procedure_Cd \n",
" 21.00 \n",
" 21.00 \n",
" 90.00 \n",
" 11.00 \n",
" 3.00 \n",
" 21.00 \n",
" 3.00 \n",
" 31.00 \n",
" 21.00 \n",
" 31.0 \n",
" ... \n",
" 31.00 \n",
" 31.00 \n",
" 31.00 \n",
" 31.00 \n",
" 31.00 \n",
" 31.00 \n",
" 31.00 \n",
" 3.00 \n",
" 31.00 \n",
" 31.00 \n",
" \n",
" \n",
" Test_Procedure_Description \n",
" 4.00 \n",
" 4.00 \n",
" 8.00 \n",
" 3.00 \n",
" 6.00 \n",
" 4.00 \n",
" 6.00 \n",
" 5.00 \n",
" 4.00 \n",
" 5.0 \n",
" ... \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 5.00 \n",
" 6.00 \n",
" 5.00 \n",
" 5.00 \n",
" \n",
" \n",
" Test_Fuel_Type_Cd \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 27.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.0 \n",
" ... \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" 61.00 \n",
" \n",
" \n",
" Test_Fuel_Type_Description \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 2.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.0 \n",
" ... \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" \n",
" \n",
"
\n",
"
15 rows × 25 columns
\n",
"
"
],
"text/plain": [
" 0 1 2 3 4 \\\n",
"Represented_Test_Veh_Make 3.00 3.00 4.00 4.00 5.00 \n",
"Model 436.00 505.00 191.00 191.00 5.00 \n",
"Vehicle_Type 2.00 2.00 2.00 2.00 2.00 \n",
"HorsePower 552.00 568.00 616.00 616.00 248.00 \n",
"Cylinders 12.00 12.00 12.00 12.00 4.00 \n",
"Tested_Transmission_Type_Code 6.00 6.00 6.00 6.00 6.00 \n",
"Tested_Transmission_Type 7.00 7.00 7.00 7.00 7.00 \n",
"Gears 8.00 8.00 8.00 8.00 8.00 \n",
"Drive_System_Code 5.00 5.00 3.00 3.00 5.00 \n",
"Weight 4750.00 4500.00 6000.00 6000.00 4000.00 \n",
"AxleRatio 2.73 2.73 2.85 2.85 2.81 \n",
"Test_Procedure_Cd 21.00 21.00 90.00 11.00 3.00 \n",
"Test_Procedure_Description 4.00 4.00 8.00 3.00 6.00 \n",
"Test_Fuel_Type_Cd 61.00 61.00 61.00 27.00 61.00 \n",
"Test_Fuel_Type_Description 6.00 6.00 6.00 2.00 6.00 \n",
"\n",
" 5 6 7 8 9 \\\n",
"Represented_Test_Veh_Make 5.00 5.00 5.00 5.00 5.0 \n",
"Model 6.00 6.00 7.00 8.00 10.0 \n",
"Vehicle_Type 2.00 2.00 2.00 2.00 1.0 \n",
"HorsePower 248.00 248.00 248.00 248.00 181.0 \n",
"Cylinders 4.00 4.00 4.00 4.00 4.0 \n",
"Tested_Transmission_Type_Code 5.00 6.00 6.00 6.00 1.0 \n",
"Tested_Transmission_Type 5.00 7.00 7.00 7.00 3.0 \n",
"Gears 6.00 8.00 8.00 8.00 8.0 \n",
"Drive_System_Code 5.00 5.00 5.00 5.00 5.0 \n",
"Weight 3625.00 3625.00 4000.00 3750.00 3625.0 \n",
"AxleRatio 3.91 2.81 2.81 2.81 3.2 \n",
"Test_Procedure_Cd 21.00 3.00 31.00 21.00 31.0 \n",
"Test_Procedure_Description 4.00 6.00 5.00 4.00 5.0 \n",
"Test_Fuel_Type_Cd 61.00 61.00 61.00 61.00 61.0 \n",
"Test_Fuel_Type_Description 6.00 6.00 6.00 6.00 6.0 \n",
"\n",
" ... 15 16 17 18 \\\n",
"Represented_Test_Veh_Make ... 5.00 5.00 5.00 5.00 \n",
"Model ... 15.00 16.00 16.00 17.00 \n",
"Vehicle_Type ... 2.00 2.00 2.00 2.00 \n",
"HorsePower ... 180.00 248.00 248.00 248.00 \n",
"Cylinders ... 4.00 4.00 4.00 4.00 \n",
"Tested_Transmission_Type_Code ... 6.00 6.00 5.00 6.00 \n",
"Tested_Transmission_Type ... 7.00 7.00 5.00 7.00 \n",
"Gears ... 8.00 8.00 6.00 8.00 \n",
"Drive_System_Code ... 5.00 5.00 5.00 5.00 \n",
"Weight ... 4250.00 3875.00 3750.00 4000.00 \n",
"AxleRatio ... 2.93 2.81 3.91 2.81 \n",
"Test_Procedure_Cd ... 31.00 31.00 31.00 31.00 \n",
"Test_Procedure_Description ... 5.00 5.00 5.00 5.00 \n",
"Test_Fuel_Type_Cd ... 61.00 61.00 61.00 61.00 \n",
"Test_Fuel_Type_Description ... 6.00 6.00 6.00 6.00 \n",
"\n",
" 19 20 21 22 23 \\\n",
"Represented_Test_Veh_Make 5.00 5.00 5.00 5.00 5.00 \n",
"Model 18.00 19.00 20.00 20.00 21.00 \n",
"Vehicle_Type 2.00 2.00 2.00 2.00 2.00 \n",
"HorsePower 248.00 248.00 320.00 320.00 320.00 \n",
"Cylinders 4.00 4.00 6.00 6.00 6.00 \n",
"Tested_Transmission_Type_Code 6.00 6.00 6.00 5.00 6.00 \n",
"Tested_Transmission_Type 7.00 7.00 7.00 5.00 7.00 \n",
"Gears 8.00 8.00 8.00 6.00 8.00 \n",
"Drive_System_Code 5.00 5.00 5.00 5.00 5.00 \n",
"Weight 4250.00 4250.00 4000.00 4000.00 4000.00 \n",
"AxleRatio 2.93 2.81 2.81 3.23 2.81 \n",
"Test_Procedure_Cd 31.00 31.00 31.00 3.00 31.00 \n",
"Test_Procedure_Description 5.00 5.00 5.00 6.00 5.00 \n",
"Test_Fuel_Type_Cd 61.00 61.00 61.00 61.00 61.00 \n",
"Test_Fuel_Type_Description 6.00 6.00 6.00 6.00 6.00 \n",
"\n",
" 24 \n",
"Represented_Test_Veh_Make 5.00 \n",
"Model 21.00 \n",
"Vehicle_Type 2.00 \n",
"HorsePower 320.00 \n",
"Cylinders 6.00 \n",
"Tested_Transmission_Type_Code 5.00 \n",
"Tested_Transmission_Type 5.00 \n",
"Gears 6.00 \n",
"Drive_System_Code 5.00 \n",
"Weight 4000.00 \n",
"AxleRatio 3.23 \n",
"Test_Procedure_Cd 31.00 \n",
"Test_Procedure_Description 5.00 \n",
"Test_Fuel_Type_Cd 61.00 \n",
"Test_Fuel_Type_Description 6.00 \n",
"\n",
"[15 rows x 25 columns]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa_trn.head(25).T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A handy dandy funtion to split our trianing and validation set, as well as out dependant variable. "
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"258\n"
]
}
],
"source": [
"def split_vals(a,n): return a[:n], a[n:]\n",
"\n",
"n_valid = int(len(epa_trn)*.25)\n",
"print(n_valid)\n",
"n_trn = len(epa_trn)-n_valid\n",
"X_train, X_valid = split_vals(epa_trn, n_trn)\n",
"y_train, y_valid = split_vals(y_trn, n_trn)\n",
"raw_train, raw_valid = split_vals(epa, n_trn)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Funtioon to perfom the math to return RMSE and R^2"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"def rmse(x,y): return math.sqrt(((x-y)**2).mean())\n",
"\n",
"def print_score(m):\n",
" print(\"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\")\n",
" res = [rmse(m.predict(X_train), y_train), rmse(m.predict(X_valid), y_valid),\n",
" m.score(X_train, y_train), m.score(X_valid, y_valid)]\n",
" if hasattr(m, 'oob_score_'): res.append(m.oob_score_)\n",
" print(res)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Base Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Last but not leaset, the actual call to RandomForestRegressor, this will generate out random forest with n_jobs=-1 allowing use of all cores oon the machine, and max_depth=3 allows for a tree that is 3 deep. only 3 deep sp we can see the picture below. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Root Mean Square Error of he training set, the validation set, the R^2 of the training set and the validation set. "
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[4.5431396346344295, 5.303701840285408, 0.7589696150819684, 0.7267131839584007]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_jobs=-1,max_depth=3)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check it out, an actual tree! "
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"Tree \n",
" \n",
"\n",
"\n",
"0 \n",
" \n",
"HorsePower ≤ 257.5 \n",
"mse = 86.233 \n",
"samples = 491 \n",
"value = 28.392 \n",
" \n",
"\n",
"\n",
"1 \n",
" \n",
"HorsePower ≤ 132.0 \n",
"mse = 77.674 \n",
"samples = 217 \n",
"value = 34.688 \n",
" \n",
"\n",
"\n",
"0->1 \n",
" \n",
" \n",
"True \n",
" \n",
"\n",
"\n",
"8 \n",
" \n",
"Test_Procedure_Cd ≤ 7.0 \n",
"mse = 38.282 \n",
"samples = 274 \n",
"value = 23.509 \n",
" \n",
"\n",
"\n",
"0->8 \n",
" \n",
" \n",
"False \n",
" \n",
"\n",
"\n",
"2 \n",
" \n",
"Test_Procedure_Description ≤ 4.5 \n",
"mse = 86.912 \n",
"samples = 33 \n",
"value = 46.249 \n",
" \n",
"\n",
"\n",
"1->2 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"5 \n",
" \n",
"Test_Procedure_Cd ≤ 7.0 \n",
"mse = 48.176 \n",
"samples = 184 \n",
"value = 32.64 \n",
" \n",
"\n",
"\n",
"1->5 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"3 \n",
" \n",
"mse = 22.972 \n",
"samples = 23 \n",
"value = 41.756 \n",
" \n",
"\n",
"\n",
"2->3 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"4 \n",
" \n",
"mse = 103.35 \n",
"samples = 10 \n",
"value = 53.816 \n",
" \n",
"\n",
"\n",
"2->4 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"6 \n",
" \n",
"mse = 49.524 \n",
"samples = 37 \n",
"value = 41.188 \n",
" \n",
"\n",
"\n",
"5->6 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"7 \n",
" \n",
"mse = 28.231 \n",
"samples = 147 \n",
"value = 30.757 \n",
" \n",
"\n",
"\n",
"5->7 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"9 \n",
" \n",
"Test_Fuel_Type_Description ≤ 5.0 \n",
"mse = 29.657 \n",
"samples = 36 \n",
"value = 34.244 \n",
" \n",
"\n",
"\n",
"8->9 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"12 \n",
" \n",
"Cylinders ≤ 7.0 \n",
"mse = 17.951 \n",
"samples = 238 \n",
"value = 21.767 \n",
" \n",
"\n",
"\n",
"8->12 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"10 \n",
" \n",
"mse = 2.356 \n",
"samples = 3 \n",
"value = 22.533 \n",
" \n",
"\n",
"\n",
"9->10 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"11 \n",
" \n",
"mse = 16.042 \n",
"samples = 33 \n",
"value = 35.522 \n",
" \n",
"\n",
"\n",
"9->11 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"13 \n",
" \n",
"mse = 13.275 \n",
"samples = 172 \n",
"value = 23.261 \n",
" \n",
"\n",
"\n",
"12->13 \n",
" \n",
" \n",
" \n",
"\n",
"\n",
"14 \n",
" \n",
"mse = 6.525 \n",
"samples = 66 \n",
"value = 17.471 \n",
" \n",
"\n",
"\n",
"12->14 \n",
" \n",
" \n",
" \n",
" \n",
" \n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"draw_tree(m.estimators_[0], X_train, precision=3)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/plain": [
"[DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=1792890733, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=1185331528, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=223910256, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=1695673055, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=682028626, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=160821146, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=628680890, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=585175664, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=1472587084, splitter='best'),\n",
" DecisionTreeRegressor(criterion='mse', max_depth=3, max_features='auto',\n",
" max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
" min_impurity_split=None, min_samples_leaf=1,\n",
" min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
" presort=False, random_state=981020224, splitter='best')]"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m.estimators_"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[3.9291657558107476, 5.383733053435963, 0.8197146967839594, 0.7184033305864296]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=1,n_jobs=-1,max_depth=5)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[3.624478005904173, 4.793408964834995, 0.8465910980628262, 0.7767716002379662]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=2,n_jobs=-1,max_depth=5)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[2.957038426739578, 4.8016224728011245, 0.8978887575836642, 0.7760059409359751]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=10,n_jobs=-1,max_depth=5)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[2.9113857055307917, 4.668561556117906, 0.901017341352274, 0.7882484210705338]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=60,n_jobs=-1,max_depth=5)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[1.3898841299728917, 4.475967691229776, 0.9774411572929003, 0.8053589833033025]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=10,n_jobs=-1)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"set_rf_samples(500)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[1.8705410222690941, 5.107730835835387, 0.9591404011984577, 0.746535883221923, 0.8589083034821692]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_jobs=-1,oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[1.7870332108516374, 4.441296418778796, 0.9627072103721745, 0.8083627201971175, 0.8761671158632295]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=50, n_jobs=-1, min_samples_leaf=1, max_features=0.5,oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" # Feature importance\n",
" \n",
"This comes from feature_importances_ in RandomForestRegressor.\n",
"\n",
"The feature importances (the higher, the more important the feature).\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" cols \n",
" imp \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Represented_Test_Veh_Make \n",
" 0.370751 \n",
" \n",
" \n",
" 1 \n",
" Model \n",
" 0.203120 \n",
" \n",
" \n",
" 2 \n",
" Vehicle_Type \n",
" 0.121902 \n",
" \n",
" \n",
" 3 \n",
" HorsePower \n",
" 0.076130 \n",
" \n",
" \n",
" 4 \n",
" Cylinders \n",
" 0.050703 \n",
" \n",
" \n",
" 6 \n",
" Tested_Transmission_Type \n",
" 0.035579 \n",
" \n",
" \n",
" 5 \n",
" Tested_Transmission_Type_Code \n",
" 0.033842 \n",
" \n",
" \n",
" 7 \n",
" Gears \n",
" 0.024731 \n",
" \n",
" \n",
" 8 \n",
" Drive_System_Code \n",
" 0.019666 \n",
" \n",
" \n",
" 9 \n",
" Weight \n",
" 0.017814 \n",
" \n",
" \n",
" 10 \n",
" AxleRatio \n",
" 0.013338 \n",
" \n",
" \n",
" 11 \n",
" Test_Procedure_Cd \n",
" 0.011609 \n",
" \n",
" \n",
" 12 \n",
" Test_Procedure_Description \n",
" 0.009027 \n",
" \n",
" \n",
" 13 \n",
" Test_Fuel_Type_Cd \n",
" 0.007676 \n",
" \n",
" \n",
" 14 \n",
" Test_Fuel_Type_Description \n",
" 0.004113 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" cols imp\n",
"0 Represented_Test_Veh_Make 0.370751\n",
"1 Model 0.203120\n",
"2 Vehicle_Type 0.121902\n",
"3 HorsePower 0.076130\n",
"4 Cylinders 0.050703\n",
"6 Tested_Transmission_Type 0.035579\n",
"5 Tested_Transmission_Type_Code 0.033842\n",
"7 Gears 0.024731\n",
"8 Drive_System_Code 0.019666\n",
"9 Weight 0.017814\n",
"10 AxleRatio 0.013338\n",
"11 Test_Procedure_Cd 0.011609\n",
"12 Test_Procedure_Description 0.009027\n",
"13 Test_Fuel_Type_Cd 0.007676\n",
"14 Test_Fuel_Type_Description 0.004113"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fi = rf_feat_importance(m,epa_trn); fi[:120]"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fi.plot('cols', 'imp', figsize=(10,6), legend=True);"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"def plot_fi(fi): return fi.plot('cols', 'imp', 'barh', figsize=(12,7), legend=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" ## Plot Feature importance"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_fi(fi[:30]);"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"epa.Cylinders.value_counts().plot.barh();"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"epa.Weight.value_counts().plot.barh(figsize=(15,12));"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAD8CAYAAAB9y7/cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAADydJREFUeJzt3X+MZWV9x/H3p4uAixRcfgVYdKEliGKLZGq0VNKCWgQC2pAUU1PamG7a2lb7IxZiUukfTbSprW1iNFtEaFW0okRDUyMRLf1DsbMCstuFsiLqspTVUhDcKILf/nHPyjjuLDtzzp5799n3K9nMveeemeeTZ2c+c+5zzz2TqkKS1J6fmnYASdK+YcFLUqMseElqlAUvSY2y4CWpURa8JDXKgpekRlnwktQoC16SGnXQmIMdffTRtW7dujGHlKT93saNG79dVccs9/NGLfh169YxPz8/5pCStN9L8vWVfJ5LNJLUKAtekhplwUtSoyx4SWqUBS9JjRq14Ldv3z7mcJJ0QPMIXpIaZcFLUqN6F3ySVUluT3LTEIEkScMY4gj+zcCWAb6OJGlAvQo+yVrgQuDqYeJIkobS9wj+3cBbgR8OkEWSNKAVF3ySi4AdVbXxGfZbn2Q+yfzOnTtXOpwkaZn6HMGfDVyc5H7gI8C5ST64eKeq2lBVc1U1t3r16h7DSZKWY8UFX1VXVtXaqloHXAbcUlVvGCyZJKkXz4OXpEYN8gc/qurzwOeH+FqSpGF4BC9JjbLgJalRoxb8CSecMOZwknRA8whekhplwUtSoyx4SWqUBS9JjbLgJalRFrwkNcqCl6RGWfCS1CgLXpIaZcFLUqMseElqlAUvSY0a5Hrwe+uJBx5n2xX/seLPX/uOVwyYRpLa5hG8JDXKgpekRj1jwSe5JsmOJJsWbFuT5OYk93Yfn7tvY0qSlmtvjuCvBc5ftO0K4LNVdSrw2e6+JGmGPGPBV9WtwMOLNl8CXNfdvg547cC5JEk9rXQN/riqehCg+3jscJEkSUPY5y+yJlmfZD7J/MM7H9nXw0mSOist+IeSHA/Qfdyx1I5VtaGq5qpqbs3qI1c4nCRpuVZa8J8CLu9uXw58cpg4kqSh7M1pktcDXwBOS7ItyRuBdwCvSnIv8KruviRphjzjpQqq6vVLPHTewFkkSQPynayS1CgLXpIaNerVJA8+8TleEVKSRuIRvCQ1yoKXpEZZ8JLUKAtekhplwUtSoyx4SWqUBS9JjbLgJalRFrwkNcqCl6RGWfCS1CgLXpIaZcFLUqNGvZrkQ/dt5V2/ftGYQ/7In370pqmMK0nT4hG8JDXKgpekRvVaoklyP/AY8BTwZFXNDRFKktTfEGvwv1JV3x7g60iSBuQSjSQ1qm/BF/CZJBuTrN/dDknWJ5lPMv/d7z/RczhJ0t7qu0RzdlVtT3IscHOSu6vq1oU7VNUGYAPASWuOrJ7jSZL2Uq8j+Kra3n3cAdwIvHSIUJKk/lZc8EkOS3L4rtvAq4FNQwWTJPXTZ4nmOODGJLu+zoer6tODpJIk9bbigq+q+4CfHzCLJGlAniYpSY0a9WJjx53ys170S5JG4hG8JDXKgpekRlnwktQoC16SGmXBS1KjLHhJapQFL0mNsuAlqVEWvCQ1yoKXpEZZ8JLUKAtekhplwUtSo0a9muSOrz/Ge373ljGHnAlvet+5044g6QDkEbwkNcqCl6RG9Sr4JG9OsinJ5iRvGSqUJKm/FRd8kjOA3wFeyuRvs16U5NShgkmS+ulzBH868MWq2llVTwL/DrxumFiSpL76FPwm4JwkRyVZDVwAnLR4pyTrk8wnmX/8e4/0GE6StBwrPk2yqrYkeSdwM/A4cCfw5G722wBsAHjeMafVSseTJC1PrxdZq+r9VXVWVZ0DPAzcO0wsSVJfvd7olOTYqtqR5HnArwEvHyaWJKmvvu9k/XiSo4AfAG+qqv8bIJMkaQC9Cr6qXjFUEEnSsHwnqyQ1atSLjR37/MO98JYkjcQjeElqlAUvSY2y4CWpURa8JDXKgpekRlnwktQoC16SGmXBS1KjLHhJapQFL0mNsuAlqVEWvCQ1yoKXpEaNejXJ723azJYXnD7mkPuN0+/eMu0IkhrjEbwkNcqCl6RG9Sr4JNck2ZFk01CBJEnD6HsEfy1w/gA5JEkD61XwVXUr8PBAWSRJA3INXpIatc8LPsn6JPNJ5h9+6sl9PZwkqbPPC76qNlTVXFXNrVk16mn3knRAc4lGkhrV9zTJ64EvAKcl2ZbkjcPEkiT11WvNpKpeP1QQSdKwXKKRpEaN+qrnoWe8iNPn58ccUpIOWB7BS1KjLHhJapQFL0mNsuAlqVEWvCQ1yoKXpEZZ8JLUKAtekhplwUtSoyx4SWqUBS9JjbLgJalRFrwkNWrUq0lu/t/NvPi6F485pBpy1+V3TTuCtF/xCF6SGmXBS1KjVlzwSU5LcseCf99J8pYhw0mSVm7Fa/BVdQ9wJkCSVcADwI0D5ZIk9TTUEs15wFer6usDfT1JUk9DFfxlwPUDfS1J0gB6F3ySg4GLgY8t8fj6JPNJ5p967Km+w0mS9tIQR/CvAb5cVQ/t7sGq2lBVc1U1t+rwVQMMJ0naG0MU/OtxeUaSZk6vgk+yGngV8Ilh4kiShtLrUgVVtRM4aqAskqQB+U5WSWqUBS9JjRr1apIvOupFzF8+P+aQknTA8ghekhplwUtSoyx4SWqUBS9JjbLgJalRFrwkNcqCl6RGWfCS1CgLXpIaZcFLUqMseElqlAUvSY0a9WJjbL8drjpi1CGlA8JVj047gWaQR/CS1CgLXpIa1fdvsv5xks1JNiW5PsmhQwWTJPWz4oJPciLwR8BcVZ0BrAIuGyqYJKmfvks0BwHPTnIQsBrY3j+SJGkIKy74qnoA+BvgG8CDwKNV9ZmhgkmS+umzRPNc4BLgZOAE4LAkb9jNfuuTzCeZ/9bOWnlSSdKy9FmieSXwtar6VlX9APgE8IuLd6qqDVU1V1Vzx6xOj+EkScvRp+C/AbwsyeokAc4DtgwTS5LUV581+NuAG4AvA3d1X2vDQLkkST31ulRBVb0dePtAWSRJA/KdrJLUKAtekho17tUkT3gJXDU/6pCSdKDyCF6SGmXBS1KjLHhJapQFL0mNsuAlqVEWvCQ1yoKXpEZZ8JLUKAtekhplwUtSoyx4SWqUBS9JjRr1YmN3PfAo66741zGHlKSpu/8dF05lXI/gJalRFrwkNcqCl6RG9Sr4JEcmuSHJ3Um2JHn5UMEkSf30fZH174FPV9WlSQ4GVg+QSZI0gBUXfJKfBs4Bfgugqp4AnhgmliSprz5LNKcA3wI+kOT2JFcnOWzxTknWJ5lPMv/Uzkd7DCdJWo4+BX8QcBbw3qp6CfBd4IrFO1XVhqqaq6q5VauP6DGcJGk5+hT8NmBbVd3W3b+BSeFLkmbAigu+qv4H+GaS07pN5wH/NUgqSVJvfc+i+UPgQ90ZNPcBv90/kiRpCL0KvqruAOYGyiJJGpDvZJWkRo16NckXn3gE81O6qpokHWg8gpekRlnwktQoC16SGmXBS1KjLHhJapQFL0mNSlWNN1jyGHDPaAOuzNHAt6cdYi+Yczj7Q0Yw55D2h4zwdM7nV9Uxy/3kUc+DB+6pqpl+52uS+VnPCOYc0v6QEcw5pP0hI/TP6RKNJDXKgpekRo1d8BtGHm8l9oeMYM4h7Q8ZwZxD2h8yQs+co77IKkkaj0s0ktSoUQo+yflJ7kmyNclP/N3WaUpyf5K7ktyRZL7btibJzUnu7T4+dwq5rkmyI8mmBdt2mysT/9DN71eSjPKnE5fIeFWSB7r5vCPJBQseu7LLeE+SXx0jYzfuSUk+l2RLks1J3txtn5n53EPGmZrPJIcm+VKSO7ucf9ltPznJbd1cfrT7I0AkOaS7v7V7fN2Uc16b5GsL5vPMbvtUfoa6sVcluT3JTd394eayqvbpP2AV8FXgFOBg4E7ghft63GXkux84etG2vwau6G5fAbxzCrnOYfI3bjc9Uy7gAuDfgAAvA26bYsargD/bzb4v7P7vDwFO7r4nVo2U83jgrO724cB/d3lmZj73kHGm5rObk+d0t58F3NbN0b8Al3Xb3wf8Xnf794H3dbcvAz460v/5UjmvBS7dzf5T+Rnqxv4T4MPATd39weZyjCP4lwJbq+q+qnoC+AhwyQjj9nEJcF13+zrgtWMHqKpbgYcXbV4q1yXAP9XEF4Ejkxw/pYxLuQT4SFV9v6q+Bmxl8r2xz1XVg1X15e72Y8AW4ERmaD73kHEpU5nPbk4e7+4+q/tXwLnADd32xXO5a45vAM5LkinmXMpUfoaSrAUuBK7u7ocB53KMgj8R+OaC+9vY8zfu2Ar4TJKNSdZ3246rqgdh8oMHHDu1dD9uqVyzNsd/0D3NvWbB8tZMZOye1r6EyRHdTM7noowwY/PZLSncAewAbmby7OGRqnpyN1l+lLN7/FHgqGnkrKpd8/lX3Xz+XZJDFufsjDWf7wbeCvywu38UA87lGAW/u98ws3TqztlVdRbwGuBNSc6ZdqAVmKU5fi/wM8CZwIPAu7rtU8+Y5DnAx4G3VNV39rTrbraNknU3GWduPqvqqao6E1jL5FnD6XvIMjM5k5wBXAm8APgFYA3w59PKmeQiYEdVbVy4eQ85lp1xjILfBpy04P5aYPsI4+6VqtrefdwB3MjkG/ahXU/Puo87ppfwxyyVa2bmuKoe6n6wfgj8I08vG0w1Y5JnMSnOD1XVJ7rNMzWfu8s4q/PZZXsE+DyTNesjk+y69MnCLD/K2T1+BHu/rDd0zvO7pbCqqu8DH2C683k2cHGS+5ksXZ/L5Ih+sLkco+D/Ezi1e2X4YCYvDnxqhHGfUZLDkhy+6zbwamATk3yXd7tdDnxyOgl/wlK5PgX8ZncmwMuAR3ctPYxt0brl65jMJ0wyXtadCXAycCrwpZEyBXg/sKWq/nbBQzMzn0tlnLX5THJMkiO7288GXsnk9YLPAZd2uy2ey11zfClwS3WvEk4h590LfqGHydr2wvkc9f+8qq6sqrVVtY5JL95SVb/BkHM50qvEFzA5K+CrwNvGGHMvc53C5EyEO4HNu7IxWdf6LHBv93HNFLJdz+Qp+Q+Y/OZ+41K5mDx1e083v3cBc1PM+M9dhq9035DHL9j/bV3Ge4DXjDiXv8TkqexXgDu6fxfM0nzuIeNMzSfwc8DtXZ5NwF90209h8gtmK/Ax4JBu+6Hd/a3d46dMOect3XxuAj7I02faTOVnaEHeX+bps2gGm0vfySpJjfKdrJLUKAtekhplwUtSoyx4SWqUBS9JjbLgJalRFrwkNcqCl6RG/T856LYrwPTXJAAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"epa.Gears.value_counts().plot.barh();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A decision needs to be made on which features to keep, anything with an imortance > .01 is a good starting point. "
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [],
"source": [
"to_keep = fi[fi.imp>0.01].cols; len(to_keep)\n",
"epa_keep = epa_trn[to_keep].copy()\n",
"X_train, X_valid = split_vals(epa_keep, n_trn)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" \n",
" \n",
" \n",
" \n",
" Represented_Test_Veh_Make \n",
" 3.00 \n",
" 3.00 \n",
" 4.00 \n",
" 4.00 \n",
" 5.00 \n",
" \n",
" \n",
" Model \n",
" 436.00 \n",
" 505.00 \n",
" 191.00 \n",
" 191.00 \n",
" 5.00 \n",
" \n",
" \n",
" Vehicle_Type \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" \n",
" \n",
" HorsePower \n",
" 552.00 \n",
" 568.00 \n",
" 616.00 \n",
" 616.00 \n",
" 248.00 \n",
" \n",
" \n",
" Cylinders \n",
" 12.00 \n",
" 12.00 \n",
" 12.00 \n",
" 12.00 \n",
" 4.00 \n",
" \n",
" \n",
" Tested_Transmission_Type \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" 7.00 \n",
" \n",
" \n",
" Tested_Transmission_Type_Code \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" \n",
" \n",
" Gears \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" \n",
" \n",
" Drive_System_Code \n",
" 5.00 \n",
" 5.00 \n",
" 3.00 \n",
" 3.00 \n",
" 5.00 \n",
" \n",
" \n",
" Weight \n",
" 4750.00 \n",
" 4500.00 \n",
" 6000.00 \n",
" 6000.00 \n",
" 4000.00 \n",
" \n",
" \n",
" AxleRatio \n",
" 2.73 \n",
" 2.73 \n",
" 2.85 \n",
" 2.85 \n",
" 2.81 \n",
" \n",
" \n",
" Test_Procedure_Cd \n",
" 21.00 \n",
" 21.00 \n",
" 90.00 \n",
" 11.00 \n",
" 3.00 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2 3 4\n",
"Represented_Test_Veh_Make 3.00 3.00 4.00 4.00 5.00\n",
"Model 436.00 505.00 191.00 191.00 5.00\n",
"Vehicle_Type 2.00 2.00 2.00 2.00 2.00\n",
"HorsePower 552.00 568.00 616.00 616.00 248.00\n",
"Cylinders 12.00 12.00 12.00 12.00 4.00\n",
"Tested_Transmission_Type 7.00 7.00 7.00 7.00 7.00\n",
"Tested_Transmission_Type_Code 6.00 6.00 6.00 6.00 6.00\n",
"Gears 8.00 8.00 8.00 8.00 8.00\n",
"Drive_System_Code 5.00 5.00 3.00 3.00 5.00\n",
"Weight 4750.00 4500.00 6000.00 6000.00 4000.00\n",
"AxleRatio 2.73 2.73 2.85 2.85 2.81\n",
"Test_Procedure_Cd 21.00 21.00 90.00 11.00 3.00"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa_keep.head().T"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[1.9787342239846808, 4.43353299456738, 0.954277017175723, 0.8090321018585712, 0.850122123819888]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=60, min_samples_leaf=1, max_features=0.75,n_jobs=-1, oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Removing redundant features\n",
"\n",
"This is to evaluate colinearity and multicolinearity. "
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
"from scipy.cluster import hierarchy as hc"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"corr = np.round(scipy.stats.spearmanr(epa_keep).correlation, 4)\n",
"corr_condensed = hc.distance.squareform(1-corr)\n",
"z = hc.linkage(corr_condensed, method='average')\n",
"fig = plt.figure(figsize=(16,10))\n",
"dendrogram = hc.dendrogram(z, labels=epa_keep.columns, orientation='left', leaf_font_size=16)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"def get_oob(df):\n",
" m = RandomForestRegressor(n_estimators=60, min_samples_leaf=1, max_features=0.75, n_jobs=-1, oob_score=True)\n",
" x, _ = split_vals(df, n_trn)\n",
" m.fit(x, y_train)\n",
" return m.oob_score_"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8537126992615125"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_oob(epa_keep)"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.8811, 1.0418, 1.144 , 1.1298, 1.1779, 1.1985, 1.1899, 0.9658, 1.1247, 0.8339, 1.1195, 0.9463,\n",
" 1.1216, 1.0772, 0.8581, 0.8592, 1.0907, 1.3235, 0.9281, 0.9272, 1.1063, 0.9158, 0.7725, 1.0915,\n",
" 1.1803, 1.1557, 0.8537, 0.6658, 0.8568, 1.0077, 0.123 , 1.0984, 1.108 , 0.5002, 0.6213, 0.3393,\n",
" 1.2255, 0.9689, 1.141 , 1.1836, 0.662 , 0.6215, 0.3243, 1.1992, 1.0007, 0.0944, 0.9011, 1.1083,\n",
" 0.9844, 1.126 , 0.9045, 0.9262, 1.181 , 1.1324, 1.0289, 0.9258, 0.7846, 0.5934, 1.4143, 0.9693,\n",
" 0.7165, 1.1696, 0.8864, 1.22 , 0.9931, 1.0575])"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"corr_condensed"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tested_Transmission_Type 0.8510689554904003\n",
"Tested_Transmission_Type_Code 0.8571970840870287\n",
"Represented_Test_Veh_Make 0.8550052540335784\n",
"AxleRatio 0.8493650076942283\n"
]
}
],
"source": [
"for c in ('Tested_Transmission_Type', 'Tested_Transmission_Type_Code',\n",
" 'Represented_Test_Veh_Make','AxleRatio'):\n",
" print(c, get_oob(epa_keep.drop(c, axis=1)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"epa_keep.head().T"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8512090820790537"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to_drop = ['Tested_Transmission_Type', 'Represented_Test_Veh_Make']\n",
"get_oob(epa_keep.drop(to_drop, axis=1))"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"epa_keep.drop(to_drop, axis=1, inplace=True)\n",
"X_train, X_valid = split_vals(epa_keep, n_trn)"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 2 \n",
" 3 \n",
" 4 \n",
" \n",
" \n",
" \n",
" \n",
" Model \n",
" 436.00 \n",
" 505.00 \n",
" 191.00 \n",
" 191.00 \n",
" 5.00 \n",
" \n",
" \n",
" Vehicle_Type \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" 2.00 \n",
" \n",
" \n",
" HorsePower \n",
" 552.00 \n",
" 568.00 \n",
" 616.00 \n",
" 616.00 \n",
" 248.00 \n",
" \n",
" \n",
" Cylinders \n",
" 12.00 \n",
" 12.00 \n",
" 12.00 \n",
" 12.00 \n",
" 4.00 \n",
" \n",
" \n",
" Tested_Transmission_Type_Code \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" 6.00 \n",
" \n",
" \n",
" Gears \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" 8.00 \n",
" \n",
" \n",
" Drive_System_Code \n",
" 5.00 \n",
" 5.00 \n",
" 3.00 \n",
" 3.00 \n",
" 5.00 \n",
" \n",
" \n",
" Weight \n",
" 4750.00 \n",
" 4500.00 \n",
" 6000.00 \n",
" 6000.00 \n",
" 4000.00 \n",
" \n",
" \n",
" AxleRatio \n",
" 2.73 \n",
" 2.73 \n",
" 2.85 \n",
" 2.85 \n",
" 2.81 \n",
" \n",
" \n",
" Test_Procedure_Cd \n",
" 21.00 \n",
" 21.00 \n",
" 90.00 \n",
" 11.00 \n",
" 3.00 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2 3 4\n",
"Model 436.00 505.00 191.00 191.00 5.00\n",
"Vehicle_Type 2.00 2.00 2.00 2.00 2.00\n",
"HorsePower 552.00 568.00 616.00 616.00 248.00\n",
"Cylinders 12.00 12.00 12.00 12.00 4.00\n",
"Tested_Transmission_Type_Code 6.00 6.00 6.00 6.00 6.00\n",
"Gears 8.00 8.00 8.00 8.00 8.00\n",
"Drive_System_Code 5.00 5.00 3.00 3.00 5.00\n",
"Weight 4750.00 4500.00 6000.00 6000.00 4000.00\n",
"AxleRatio 2.73 2.73 2.85 2.85 2.81\n",
"Test_Procedure_Cd 21.00 21.00 90.00 11.00 3.00"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epa_keep.head().T"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Below is the best i could get with this dataset and model. Many questions arise related to overfit potentials, the model of the vehicle is still there, which intuitively seems like a bad idea. The model R^2 is better than the linear regression and the RMSE is lower as well. I could probably spend weeks tuning this, but with such a small number of cases not much can be done."
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[2.0215240875975593, 4.474848631689527, 0.9522781287078333, 0.8054562975259136, 0.8486352333444027]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=30, min_samples_leaf=1, max_features=0.75,n_jobs=-1, oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[1.888581320495389, 4.428329748160855, 0.9583484657250193, 0.8094800831635705, 0.8553747945694608]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=60, min_samples_leaf=1, max_features=0.75,n_jobs=-1, oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[1.9460359810242787, 4.322521682299919, 0.9557756604685869, 0.8184756713344857, 0.8558081918083186]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=120, min_samples_leaf=2, max_features=0.75,n_jobs=-1, oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE Train, RMSE Prediction, R^2 Train, R^2 Prediction\n",
"[2.4155965420503414, 4.725906365807591, 0.931859012599913, 0.7830145046639037, 0.8488920609230148]\n"
]
}
],
"source": [
"m = RandomForestRegressor(n_estimators=120, min_samples_leaf=1, max_features=0.75,n_jobs=-1, oob_score=True)\n",
"m.fit(X_train, y_train)\n",
"print_score(m)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}