{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction To The Data Set" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "pd.options.display.max_columns = 99" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "cols = ['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration', 'num-of-doors', 'body-style', \n", " 'drive-wheels', 'engine-location', 'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type', \n", " 'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke', 'compression-rate', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg', 'price']\n", "cars = pd.read_csv('imports-85.data', names=cols)" ] }, { "cell_type": "code", "execution_count": 3, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolingnormalized-lossesmakefuel-typeaspirationnum-of-doorsbody-styledrive-wheelsengine-locationwheel-baselengthwidthheightcurb-weightengine-typenum-of-cylindersengine-sizefuel-systemborestrokecompression-ratehorsepowerpeak-rpmcity-mpghighway-mpgprice
03?alfa-romerogasstdtwoconvertiblerwdfront88.6168.864.148.82548dohcfour130mpfi3.472.689.01115000212713495
13?alfa-romerogasstdtwoconvertiblerwdfront88.6168.864.148.82548dohcfour130mpfi3.472.689.01115000212716500
21?alfa-romerogasstdtwohatchbackrwdfront94.5171.265.552.42823ohcvsix152mpfi2.683.479.01545000192616500
32164audigasstdfoursedanfwdfront99.8176.666.254.32337ohcfour109mpfi3.193.4010.01025500243013950
42164audigasstdfoursedan4wdfront99.4176.666.454.32824ohcfive136mpfi3.193.408.01155500182217450
.................................................................................
200-195volvogasstdfoursedanrwdfront109.1188.868.955.52952ohcfour141mpfi3.783.159.51145400232816845
201-195volvogasturbofoursedanrwdfront109.1188.868.855.53049ohcfour141mpfi3.783.158.71605300192519045
202-195volvogasstdfoursedanrwdfront109.1188.868.955.53012ohcvsix173mpfi3.582.878.81345500182321485
203-195volvodieselturbofoursedanrwdfront109.1188.868.955.53217ohcsix145idi3.013.4023.01064800262722470
204-195volvogasturbofoursedanrwdfront109.1188.868.955.53062ohcfour141mpfi3.783.159.51145400192522625
\n", "

205 rows × 26 columns

\n", "
" ], "text/plain": [ " symboling normalized-losses make fuel-type aspiration \\\n", "0 3 ? alfa-romero gas std \n", "1 3 ? alfa-romero gas std \n", "2 1 ? alfa-romero gas std \n", "3 2 164 audi gas std \n", "4 2 164 audi gas std \n", ".. ... ... ... ... ... \n", "200 -1 95 volvo gas std \n", "201 -1 95 volvo gas turbo \n", "202 -1 95 volvo gas std \n", "203 -1 95 volvo diesel turbo \n", "204 -1 95 volvo gas turbo \n", "\n", " num-of-doors body-style drive-wheels engine-location wheel-base \\\n", "0 two convertible rwd front 88.6 \n", "1 two convertible rwd front 88.6 \n", "2 two hatchback rwd front 94.5 \n", "3 four sedan fwd front 99.8 \n", "4 four sedan 4wd front 99.4 \n", ".. ... ... ... ... ... \n", "200 four sedan rwd front 109.1 \n", "201 four sedan rwd front 109.1 \n", "202 four sedan rwd front 109.1 \n", "203 four sedan rwd front 109.1 \n", "204 four sedan rwd front 109.1 \n", "\n", " length width height curb-weight engine-type num-of-cylinders \\\n", "0 168.8 64.1 48.8 2548 dohc four \n", "1 168.8 64.1 48.8 2548 dohc four \n", "2 171.2 65.5 52.4 2823 ohcv six \n", "3 176.6 66.2 54.3 2337 ohc four \n", "4 176.6 66.4 54.3 2824 ohc five \n", ".. ... ... ... ... ... ... \n", "200 188.8 68.9 55.5 2952 ohc four \n", "201 188.8 68.8 55.5 3049 ohc four \n", "202 188.8 68.9 55.5 3012 ohcv six \n", "203 188.8 68.9 55.5 3217 ohc six \n", "204 188.8 68.9 55.5 3062 ohc four \n", "\n", " engine-size fuel-system bore stroke compression-rate horsepower \\\n", "0 130 mpfi 3.47 2.68 9.0 111 \n", "1 130 mpfi 3.47 2.68 9.0 111 \n", "2 152 mpfi 2.68 3.47 9.0 154 \n", "3 109 mpfi 3.19 3.40 10.0 102 \n", "4 136 mpfi 3.19 3.40 8.0 115 \n", ".. ... ... ... ... ... ... \n", "200 141 mpfi 3.78 3.15 9.5 114 \n", "201 141 mpfi 3.78 3.15 8.7 160 \n", "202 173 mpfi 3.58 2.87 8.8 134 \n", "203 145 idi 3.01 3.40 23.0 106 \n", "204 141 mpfi 3.78 3.15 9.5 114 \n", "\n", " peak-rpm city-mpg highway-mpg price \n", "0 5000 21 27 13495 \n", "1 5000 21 27 16500 \n", "2 5000 19 26 16500 \n", "3 5500 24 30 13950 \n", "4 5500 18 22 17450 \n", ".. ... ... ... ... \n", "200 5400 23 28 16845 \n", "201 5300 19 25 19045 \n", "202 5500 18 23 21485 \n", "203 4800 26 27 22470 \n", "204 5400 19 25 22625 \n", "\n", "[205 rows x 26 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cars" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Select only the columns with continuous values from - https://archive.ics.uci.edu/ml/machine-learning-databases/autos/imports-85.names\n", "continuous_values_cols = ['normalized-losses', 'wheel-base', 'length', 'width', 'height', 'curb-weight', 'bore', 'stroke', 'compression-rate', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg', 'price']\n", "numeric_cars = cars[continuous_values_cols]" ] }, { "cell_type": "code", "execution_count": 5, "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", "
normalized-losseswheel-baselengthwidthheightcurb-weightborestrokecompression-ratehorsepowerpeak-rpmcity-mpghighway-mpgprice
0?88.6168.864.148.825483.472.689.01115000212713495
1?88.6168.864.148.825483.472.689.01115000212716500
2?94.5171.265.552.428232.683.479.01545000192616500
316499.8176.666.254.323373.193.4010.01025500243013950
416499.4176.666.454.328243.193.408.01155500182217450
\n", "
" ], "text/plain": [ " normalized-losses wheel-base length width height curb-weight bore \\\n", "0 ? 88.6 168.8 64.1 48.8 2548 3.47 \n", "1 ? 88.6 168.8 64.1 48.8 2548 3.47 \n", "2 ? 94.5 171.2 65.5 52.4 2823 2.68 \n", "3 164 99.8 176.6 66.2 54.3 2337 3.19 \n", "4 164 99.4 176.6 66.4 54.3 2824 3.19 \n", "\n", " stroke compression-rate horsepower peak-rpm city-mpg highway-mpg price \n", "0 2.68 9.0 111 5000 21 27 13495 \n", "1 2.68 9.0 111 5000 21 27 16500 \n", "2 3.47 9.0 154 5000 19 26 16500 \n", "3 3.40 10.0 102 5500 24 30 13950 \n", "4 3.40 8.0 115 5500 18 22 17450 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numeric_cars.head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Cleaning" ] }, { "cell_type": "code", "execution_count": 6, "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", "
normalized-losseswheel-baselengthwidthheightcurb-weightborestrokecompression-ratehorsepowerpeak-rpmcity-mpghighway-mpgprice
0NaN88.6168.864.148.825483.472.689.01115000212713495
1NaN88.6168.864.148.825483.472.689.01115000212716500
2NaN94.5171.265.552.428232.683.479.01545000192616500
316499.8176.666.254.323373.193.4010.01025500243013950
416499.4176.666.454.328243.193.408.01155500182217450
.............................................
20095109.1188.868.955.529523.783.159.51145400232816845
20195109.1188.868.855.530493.783.158.71605300192519045
20295109.1188.868.955.530123.582.878.81345500182321485
20395109.1188.868.955.532173.013.4023.01064800262722470
20495109.1188.868.955.530623.783.159.51145400192522625
\n", "

205 rows × 14 columns

\n", "
" ], "text/plain": [ " normalized-losses wheel-base length width height curb-weight bore \\\n", "0 NaN 88.6 168.8 64.1 48.8 2548 3.47 \n", "1 NaN 88.6 168.8 64.1 48.8 2548 3.47 \n", "2 NaN 94.5 171.2 65.5 52.4 2823 2.68 \n", "3 164 99.8 176.6 66.2 54.3 2337 3.19 \n", "4 164 99.4 176.6 66.4 54.3 2824 3.19 \n", ".. ... ... ... ... ... ... ... \n", "200 95 109.1 188.8 68.9 55.5 2952 3.78 \n", "201 95 109.1 188.8 68.8 55.5 3049 3.78 \n", "202 95 109.1 188.8 68.9 55.5 3012 3.58 \n", "203 95 109.1 188.8 68.9 55.5 3217 3.01 \n", "204 95 109.1 188.8 68.9 55.5 3062 3.78 \n", "\n", " stroke compression-rate horsepower peak-rpm city-mpg highway-mpg price \n", "0 2.68 9.0 111 5000 21 27 13495 \n", "1 2.68 9.0 111 5000 21 27 16500 \n", "2 3.47 9.0 154 5000 19 26 16500 \n", "3 3.40 10.0 102 5500 24 30 13950 \n", "4 3.40 8.0 115 5500 18 22 17450 \n", ".. ... ... ... ... ... ... ... \n", "200 3.15 9.5 114 5400 23 28 16845 \n", "201 3.15 8.7 160 5300 19 25 19045 \n", "202 2.87 8.8 134 5500 18 23 21485 \n", "203 3.40 23.0 106 4800 26 27 22470 \n", "204 3.15 9.5 114 5400 19 25 22625 \n", "\n", "[205 rows x 14 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numeric_cars = numeric_cars.replace('?', np.nan)\n", "numeric_cars" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "normalized-losses 41\n", "wheel-base 0\n", "length 0\n", "width 0\n", "height 0\n", "curb-weight 0\n", "bore 4\n", "stroke 4\n", "compression-rate 0\n", "horsepower 2\n", "peak-rpm 2\n", "city-mpg 0\n", "highway-mpg 0\n", "price 4\n", "dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numeric_cars = numeric_cars.astype('float')\n", "numeric_cars.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "normalized-losses 37\n", "wheel-base 0\n", "length 0\n", "width 0\n", "height 0\n", "curb-weight 0\n", "bore 4\n", "stroke 4\n", "compression-rate 0\n", "horsepower 2\n", "peak-rpm 2\n", "city-mpg 0\n", "highway-mpg 0\n", "price 0\n", "dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Because `price` is the column we want to predict, let's remove any rows with missing `price` values.\n", "numeric_cars = numeric_cars.dropna(subset=['price'])\n", "numeric_cars.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Replace missing values in other columns using column means.\n", "numeric_cars = numeric_cars.fillna(numeric_cars.mean())" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "normalized-losses 0\n", "wheel-base 0\n", "length 0\n", "width 0\n", "height 0\n", "curb-weight 0\n", "bore 0\n", "stroke 0\n", "compression-rate 0\n", "horsepower 0\n", "peak-rpm 0\n", "city-mpg 0\n", "highway-mpg 0\n", "price 0\n", "dtype: int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Confirm that there's no more missing values!\n", "numeric_cars.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Normalize all columnns to range from 0 to 1 except the target column.\n", "price_col = numeric_cars['price']\n", "numeric_cars = (numeric_cars - numeric_cars.min())/(numeric_cars.max() - numeric_cars.min())\n", "numeric_cars['price'] = price_col" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Univariate Model" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "horsepower 4037.037713\n", "curb-weight 4401.118255\n", "highway-mpg 4630.026799\n", "width 4704.482590\n", "city-mpg 4766.422505\n", "length 5427.200961\n", "wheel-base 5461.553998\n", "compression-rate 6610.812153\n", "bore 6780.627785\n", "normalized-losses 7330.197653\n", "peak-rpm 7697.459696\n", "stroke 8006.529545\n", "height 8144.441043\n", "dtype: float64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.metrics import mean_squared_error\n", "\n", "def knn_train_test(train_col, target_col, df):\n", " knn = KNeighborsRegressor()\n", " np.random.seed(1)\n", " \n", " # Randomize order of rows in data frame.\n", " shuffled_index = np.random.permutation(df.index)\n", " rand_df = df.reindex(shuffled_index)\n", "\n", " # Divide number of rows in half and round.\n", " last_train_row = int(len(rand_df) / 2)\n", " \n", " # Select the first half and set as training set.\n", " # Select the second half and set as test set.\n", " train_df = rand_df.iloc[0:last_train_row]\n", " test_df = rand_df.iloc[last_train_row:]\n", " \n", " # Fit a KNN model using default k value.\n", " knn.fit(train_df[[train_col]], train_df[target_col])\n", " \n", " # Make predictions using model.\n", " predicted_labels = knn.predict(test_df[[train_col]])\n", "\n", " # Calculate and return RMSE.\n", " mse = mean_squared_error(test_df[target_col], predicted_labels)\n", " rmse = np.sqrt(mse)\n", " return rmse\n", "\n", "rmse_results = {}\n", "train_cols = numeric_cars.columns.drop('price')\n", "\n", "# For each column (minus `price`), train a model, return RMSE value\n", "# and add to the dictionary `rmse_results`.\n", "for col in train_cols:\n", " rmse_val = knn_train_test(col, 'price', numeric_cars)\n", " rmse_results[col] = rmse_val\n", "\n", "# Create a Series object from the dictionary so \n", "# we can easily view the results, sort, etc\n", "rmse_results_series = pd.Series(rmse_results)\n", "rmse_results_series.sort_values()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'normalized-losses': {1: 7846.750605148984,\n", " 3: 7500.5698123109905,\n", " 5: 7330.197653434445,\n", " 7: 7756.421586234123,\n", " 9: 7688.096096891432},\n", " 'wheel-base': {1: 4493.734068810494,\n", " 3: 5120.161506064513,\n", " 5: 5461.553997873057,\n", " 7: 5448.1070513823315,\n", " 9: 5738.405685192312},\n", " 'length': {1: 4628.45550121557,\n", " 3: 5129.8358210721635,\n", " 5: 5427.2009608367125,\n", " 7: 5313.427720847974,\n", " 9: 5383.054514833446},\n", " 'width': {1: 4559.257297950061,\n", " 3: 4606.413692169901,\n", " 5: 4704.482589704386,\n", " 7: 4571.485046194653,\n", " 9: 4652.914172067787},\n", " 'height': {1: 8904.04645636071,\n", " 3: 8277.609643045525,\n", " 5: 8144.441042663747,\n", " 7: 7679.598124393773,\n", " 9: 7811.03606291223},\n", " 'curb-weight': {1: 5264.290230758878,\n", " 3: 5022.318011757233,\n", " 5: 4401.118254793124,\n", " 7: 4330.608104418053,\n", " 9: 4632.044474454401},\n", " 'bore': {1: 8602.58848450066,\n", " 3: 6984.239489480916,\n", " 5: 6780.627784685976,\n", " 7: 6878.097965921532,\n", " 9: 6866.808502038413},\n", " 'stroke': {1: 9116.495955406906,\n", " 3: 7338.68466990294,\n", " 5: 8006.529544647101,\n", " 7: 7803.937796804327,\n", " 9: 7735.554366079291},\n", " 'compression-rate': {1: 8087.205346523092,\n", " 3: 7375.063685578359,\n", " 5: 6610.812153159129,\n", " 7: 6732.801282941515,\n", " 9: 7024.485525463435},\n", " 'horsepower': {1: 4170.054848037801,\n", " 3: 4020.8492630885394,\n", " 5: 4037.0377131537603,\n", " 7: 4353.811860277134,\n", " 9: 4515.135617419103},\n", " 'peak-rpm': {1: 9511.480067750124,\n", " 3: 8537.550899973421,\n", " 5: 7697.4596964334805,\n", " 7: 7510.294160083481,\n", " 9: 7340.041341263401},\n", " 'city-mpg': {1: 5901.143574354764,\n", " 3: 4646.746408727155,\n", " 5: 4766.422505090134,\n", " 7: 5232.523034167316,\n", " 9: 5465.209492527533},\n", " 'highway-mpg': {1: 6025.594966720739,\n", " 3: 4617.305019788554,\n", " 5: 4630.026798588056,\n", " 7: 4796.061440186946,\n", " 9: 5278.358056953987}}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def knn_train_test(train_col, target_col, df):\n", " np.random.seed(1)\n", " \n", " # Randomize order of rows in data frame.\n", " shuffled_index = np.random.permutation(df.index)\n", " rand_df = df.reindex(shuffled_index)\n", "\n", " # Divide number of rows in half and round.\n", " last_train_row = int(len(rand_df) / 2)\n", " \n", " # Select the first half and set as training set.\n", " # Select the second half and set as test set.\n", " train_df = rand_df.iloc[0:last_train_row]\n", " test_df = rand_df.iloc[last_train_row:]\n", " \n", " k_values = [1,3,5,7,9]\n", " k_rmses = {}\n", " \n", " for k in k_values:\n", " # Fit model using k nearest neighbors.\n", " knn = KNeighborsRegressor(n_neighbors=k)\n", " knn.fit(train_df[[train_col]], train_df[target_col])\n", "\n", " # Make predictions using model.\n", " predicted_labels = knn.predict(test_df[[train_col]])\n", "\n", " # Calculate and return RMSE.\n", " mse = mean_squared_error(test_df[target_col], predicted_labels)\n", " rmse = np.sqrt(mse)\n", " \n", " k_rmses[k] = rmse\n", " return k_rmses\n", "\n", "k_rmse_results = {}\n", "\n", "# For each column (minus `price`), train a model, return RMSE value\n", "# and add to the dictionary `rmse_results`.\n", "train_cols = numeric_cars.columns.drop('price')\n", "for col in train_cols:\n", " rmse_val = knn_train_test(col, 'price', numeric_cars)\n", " k_rmse_results[col] = rmse_val\n", "\n", "k_rmse_results" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "for k,v in k_rmse_results.items():\n", " x = list(v.keys())\n", " y = list(v.values())\n", " \n", " plt.plot(x,y)\n", " plt.xlabel('k value')\n", " plt.ylabel('RMSE')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Multivariate Model" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "horsepower 4219.377860\n", "width 4618.910560\n", "curb-weight 4730.075815\n", "highway-mpg 5069.469256\n", "length 5176.394904\n", "city-mpg 5202.409003\n", "wheel-base 5252.392462\n", "compression-rate 7166.073599\n", "bore 7222.472445\n", "normalized-losses 7624.407151\n", "stroke 8000.240467\n", "peak-rpm 8119.365233\n", "height 8163.346266\n", "dtype: float64\n" ] } ], "source": [ "# Compute average RMSE across different `k` values for each feature.\n", "feature_avg_rmse = {}\n", "for k,v in k_rmse_results.items():\n", " avg_rmse = np.mean(list(v.values()))\n", " feature_avg_rmse[k] = avg_rmse\n", "series_avg_rmse = pd.Series(feature_avg_rmse)\n", "sorted_series_avg_rmse = series_avg_rmse.sort_values()\n", "print(sorted_series_avg_rmse)\n", "\n", "sorted_features = sorted_series_avg_rmse.index" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'2 best features': {5: 3589.3132622073304},\n", " '3 best features': {5: 3305.9401397969677},\n", " '4 best features': {5: 3358.6915801682458},\n", " '5 best features': {5: 3665.546673045813},\n", " '6 best features': {5: 3628.261188214127}}" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def knn_train_test(train_cols, target_col, df):\n", " np.random.seed(1)\n", " \n", " # Randomize order of rows in data frame.\n", " shuffled_index = np.random.permutation(df.index)\n", " rand_df = df.reindex(shuffled_index)\n", "\n", " # Divide number of rows in half and round.\n", " last_train_row = int(len(rand_df) / 2)\n", " \n", " # Select the first half and set as training set.\n", " # Select the second half and set as test set.\n", " train_df = rand_df.iloc[0:last_train_row]\n", " test_df = rand_df.iloc[last_train_row:]\n", " \n", " k_values = [5]\n", " k_rmses = {}\n", " \n", " for k in k_values:\n", " # Fit model using k nearest neighbors.\n", " knn = KNeighborsRegressor(n_neighbors=k)\n", " knn.fit(train_df[train_cols], train_df[target_col])\n", "\n", " # Make predictions using model.\n", " predicted_labels = knn.predict(test_df[train_cols])\n", "\n", " # Calculate and return RMSE.\n", " mse = mean_squared_error(test_df[target_col], predicted_labels)\n", " rmse = np.sqrt(mse)\n", " \n", " k_rmses[k] = rmse\n", " return k_rmses\n", "\n", "k_rmse_results = {}\n", "\n", "for nr_best_feats in range(2,7):\n", " k_rmse_results['{} best features'.format(nr_best_feats)] = knn_train_test(\n", " sorted_features[:nr_best_feats],\n", " 'price',\n", " numeric_cars\n", " )\n", "\n", "k_rmse_results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Hyperparameter Tuning" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'2 best features': {1: 4061.9613050304106,\n", " 2: 3497.49936199118,\n", " 3: 3402.8692636542114,\n", " 4: 3587.0044198356923,\n", " 5: 3589.3132622073304,\n", " 6: 3680.062981095498,\n", " 7: 3756.92796407086,\n", " 8: 3937.770418264052,\n", " 9: 4078.3485919700097,\n", " 10: 4163.828373808731,\n", " 11: 4297.135962941241,\n", " 12: 4370.753019740529,\n", " 13: 4500.462028689254,\n", " 14: 4604.156707686779,\n", " 15: 4595.345097101211,\n", " 16: 4605.433669910023,\n", " 17: 4611.2845838376215,\n", " 18: 4598.88218482117,\n", " 19: 4579.964891966457,\n", " 20: 4653.966845712387,\n", " 21: 4759.076059393234,\n", " 22: 4807.805949321809,\n", " 23: 4865.320887129985,\n", " 24: 4910.715769042787},\n", " '3 best features': {1: 3013.0109985241875,\n", " 2: 2813.285969825997,\n", " 3: 3171.585284478674,\n", " 4: 3182.3137417981943,\n", " 5: 3305.9401397969677,\n", " 6: 3522.506848900376,\n", " 7: 3774.3772094554106,\n", " 8: 3978.969124021116,\n", " 9: 3992.923680588881,\n", " 10: 4076.2381473803043,\n", " 11: 4156.388331131807,\n", " 12: 4201.10713385948,\n", " 13: 4303.62676861325,\n", " 14: 4359.693296989702,\n", " 15: 4371.771103372868,\n", " 16: 4394.4846551644205,\n", " 17: 4510.399710057406,\n", " 18: 4584.310961865486,\n", " 19: 4636.62620477063,\n", " 20: 4664.465847866811,\n", " 21: 4724.096637428273,\n", " 22: 4752.535484102914,\n", " 23: 4808.703310452101,\n", " 24: 4858.9452710176065},\n", " '4 best features': {1: 2600.746383728188,\n", " 2: 2725.4325072335123,\n", " 3: 3108.8580314362966,\n", " 4: 3217.3135209486827,\n", " 5: 3358.6915801682458,\n", " 6: 3633.1687033129465,\n", " 7: 3896.127441396644,\n", " 8: 4002.8383900652543,\n", " 9: 4055.5309369929582,\n", " 10: 4128.67807741542,\n", " 11: 4249.827289347268,\n", " 12: 4344.035898237492,\n", " 13: 4402.995293166156,\n", " 14: 4424.314365328619,\n", " 15: 4442.943179452285,\n", " 16: 4528.57927503009,\n", " 17: 4572.28806185627,\n", " 18: 4604.034045947238,\n", " 19: 4660.524954508328,\n", " 20: 4735.352015758023,\n", " 21: 4742.329532242572,\n", " 22: 4763.606459864159,\n", " 23: 4807.076030845482,\n", " 24: 4848.127192424658},\n", " '5 best features': {1: 2773.8991269216394,\n", " 2: 2936.079965592973,\n", " 3: 3152.3415515178144,\n", " 4: 3488.57822210674,\n", " 5: 3665.546673045813,\n", " 6: 3563.9910249785435,\n", " 7: 3714.642677357888,\n", " 8: 3927.6655582704293,\n", " 9: 4074.724411578548,\n", " 10: 4202.692919892065,\n", " 11: 4228.8377103033245,\n", " 12: 4280.7222580306225,\n", " 13: 4323.694733441248,\n", " 14: 4341.598003940922,\n", " 15: 4381.910642108479,\n", " 16: 4462.210967318207,\n", " 17: 4512.666161759793,\n", " 18: 4549.02427742861,\n", " 19: 4625.542238703432,\n", " 20: 4680.4075341436155,\n", " 21: 4769.300287838951,\n", " 22: 4813.1714929806085,\n", " 23: 4871.956026848068,\n", " 24: 4922.889655107399}}" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def knn_train_test(train_cols, target_col, df):\n", " np.random.seed(1)\n", " \n", " # Randomize order of rows in data frame.\n", " shuffled_index = np.random.permutation(df.index)\n", " rand_df = df.reindex(shuffled_index)\n", "\n", " # Divide number of rows in half and round.\n", " last_train_row = int(len(rand_df) / 2)\n", " \n", " # Select the first half and set as training set.\n", " # Select the second half and set as test set.\n", " train_df = rand_df.iloc[0:last_train_row]\n", " test_df = rand_df.iloc[last_train_row:]\n", " \n", " k_values = [i for i in range(1, 25)]\n", " k_rmses = {}\n", " \n", " for k in k_values:\n", " # Fit model using k nearest neighbors.\n", " knn = KNeighborsRegressor(n_neighbors=k)\n", " knn.fit(train_df[train_cols], train_df[target_col])\n", "\n", " # Make predictions using model.\n", " predicted_labels = knn.predict(test_df[train_cols])\n", "\n", " # Calculate and return RMSE.\n", " mse = mean_squared_error(test_df[target_col], predicted_labels)\n", " rmse = np.sqrt(mse)\n", " \n", " k_rmses[k] = rmse\n", " return k_rmses\n", "\n", "k_rmse_results = {}\n", "\n", "for nr_best_feats in range(2,6):\n", " k_rmse_results['{} best features'.format(nr_best_feats)] = knn_train_test(\n", " sorted_features[:nr_best_feats],\n", " 'price',\n", " numeric_cars\n", " )\n", "\n", "k_rmse_results" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for k,v in k_rmse_results.items():\n", " x = list(v.keys())\n", " y = list(v.values())\n", " \n", " plt.plot(x,y)\n", " plt.xlabel('k value')\n", " plt.ylabel('RMSE')" ] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }