{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction To The Dataset"
]
},
{
"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": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" symboling | \n",
" normalized-losses | \n",
" make | \n",
" fuel-type | \n",
" aspiration | \n",
" num-of-doors | \n",
" body-style | \n",
" drive-wheels | \n",
" engine-location | \n",
" wheel-base | \n",
" length | \n",
" width | \n",
" height | \n",
" curb-weight | \n",
" engine-type | \n",
" num-of-cylinders | \n",
" engine-size | \n",
" fuel-system | \n",
" bore | \n",
" stroke | \n",
" compression-rate | \n",
" horsepower | \n",
" peak-rpm | \n",
" city-mpg | \n",
" highway-mpg | \n",
" price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 3 | \n",
" ? | \n",
" alfa-romero | \n",
" gas | \n",
" std | \n",
" two | \n",
" convertible | \n",
" rwd | \n",
" front | \n",
" 88.6 | \n",
" 168.8 | \n",
" 64.1 | \n",
" 48.8 | \n",
" 2548 | \n",
" dohc | \n",
" four | \n",
" 130 | \n",
" mpfi | \n",
" 3.47 | \n",
" 2.68 | \n",
" 9.0 | \n",
" 111 | \n",
" 5000 | \n",
" 21 | \n",
" 27 | \n",
" 13495 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" ? | \n",
" alfa-romero | \n",
" gas | \n",
" std | \n",
" two | \n",
" convertible | \n",
" rwd | \n",
" front | \n",
" 88.6 | \n",
" 168.8 | \n",
" 64.1 | \n",
" 48.8 | \n",
" 2548 | \n",
" dohc | \n",
" four | \n",
" 130 | \n",
" mpfi | \n",
" 3.47 | \n",
" 2.68 | \n",
" 9.0 | \n",
" 111 | \n",
" 5000 | \n",
" 21 | \n",
" 27 | \n",
" 16500 | \n",
"
\n",
" \n",
" 2 | \n",
" 1 | \n",
" ? | \n",
" alfa-romero | \n",
" gas | \n",
" std | \n",
" two | \n",
" hatchback | \n",
" rwd | \n",
" front | \n",
" 94.5 | \n",
" 171.2 | \n",
" 65.5 | \n",
" 52.4 | \n",
" 2823 | \n",
" ohcv | \n",
" six | \n",
" 152 | \n",
" mpfi | \n",
" 2.68 | \n",
" 3.47 | \n",
" 9.0 | \n",
" 154 | \n",
" 5000 | \n",
" 19 | \n",
" 26 | \n",
" 16500 | \n",
"
\n",
" \n",
" 3 | \n",
" 2 | \n",
" 164 | \n",
" audi | \n",
" gas | \n",
" std | \n",
" four | \n",
" sedan | \n",
" fwd | \n",
" front | \n",
" 99.8 | \n",
" 176.6 | \n",
" 66.2 | \n",
" 54.3 | \n",
" 2337 | \n",
" ohc | \n",
" four | \n",
" 109 | \n",
" mpfi | \n",
" 3.19 | \n",
" 3.40 | \n",
" 10.0 | \n",
" 102 | \n",
" 5500 | \n",
" 24 | \n",
" 30 | \n",
" 13950 | \n",
"
\n",
" \n",
" 4 | \n",
" 2 | \n",
" 164 | \n",
" audi | \n",
" gas | \n",
" std | \n",
" four | \n",
" sedan | \n",
" 4wd | \n",
" front | \n",
" 99.4 | \n",
" 176.6 | \n",
" 66.4 | \n",
" 54.3 | \n",
" 2824 | \n",
" ohc | \n",
" five | \n",
" 136 | \n",
" mpfi | \n",
" 3.19 | \n",
" 3.40 | \n",
" 8.0 | \n",
" 115 | \n",
" 5500 | \n",
" 18 | \n",
" 22 | \n",
" 17450 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" symboling normalized-losses make fuel-type aspiration num-of-doors \\\n",
"0 3 ? alfa-romero gas std two \n",
"1 3 ? alfa-romero gas std two \n",
"2 1 ? alfa-romero gas std two \n",
"3 2 164 audi gas std four \n",
"4 2 164 audi gas std four \n",
"\n",
" body-style drive-wheels engine-location wheel-base length width \\\n",
"0 convertible rwd front 88.6 168.8 64.1 \n",
"1 convertible rwd front 88.6 168.8 64.1 \n",
"2 hatchback rwd front 94.5 171.2 65.5 \n",
"3 sedan fwd front 99.8 176.6 66.2 \n",
"4 sedan 4wd front 99.4 176.6 66.4 \n",
"\n",
" height curb-weight engine-type num-of-cylinders engine-size fuel-system \\\n",
"0 48.8 2548 dohc four 130 mpfi \n",
"1 48.8 2548 dohc four 130 mpfi \n",
"2 52.4 2823 ohcv six 152 mpfi \n",
"3 54.3 2337 ohc four 109 mpfi \n",
"4 54.3 2824 ohc five 136 mpfi \n",
"\n",
" bore stroke compression-rate horsepower peak-rpm city-mpg highway-mpg \\\n",
"0 3.47 2.68 9.0 111 5000 21 27 \n",
"1 3.47 2.68 9.0 111 5000 21 27 \n",
"2 2.68 3.47 9.0 154 5000 19 26 \n",
"3 3.19 3.40 10.0 102 5500 24 30 \n",
"4 3.19 3.40 8.0 115 5500 18 22 \n",
"\n",
" price \n",
"0 13495 \n",
"1 16500 \n",
"2 16500 \n",
"3 13950 \n",
"4 17450 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"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)\n",
"\n",
"cars.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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', 'engine-size', 'bore', 'stroke', 'compression-rate', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg', 'price']\n",
"numeric_cars = cars[continuous_values_cols]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" normalized-losses | \n",
" wheel-base | \n",
" length | \n",
" width | \n",
" height | \n",
" curb-weight | \n",
" engine-size | \n",
" bore | \n",
" stroke | \n",
" compression-rate | \n",
" horsepower | \n",
" peak-rpm | \n",
" city-mpg | \n",
" highway-mpg | \n",
" price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" ? | \n",
" 88.6 | \n",
" 168.8 | \n",
" 64.1 | \n",
" 48.8 | \n",
" 2548 | \n",
" 130 | \n",
" 3.47 | \n",
" 2.68 | \n",
" 9.0 | \n",
" 111 | \n",
" 5000 | \n",
" 21 | \n",
" 27 | \n",
" 13495 | \n",
"
\n",
" \n",
" 1 | \n",
" ? | \n",
" 88.6 | \n",
" 168.8 | \n",
" 64.1 | \n",
" 48.8 | \n",
" 2548 | \n",
" 130 | \n",
" 3.47 | \n",
" 2.68 | \n",
" 9.0 | \n",
" 111 | \n",
" 5000 | \n",
" 21 | \n",
" 27 | \n",
" 16500 | \n",
"
\n",
" \n",
" 2 | \n",
" ? | \n",
" 94.5 | \n",
" 171.2 | \n",
" 65.5 | \n",
" 52.4 | \n",
" 2823 | \n",
" 152 | \n",
" 2.68 | \n",
" 3.47 | \n",
" 9.0 | \n",
" 154 | \n",
" 5000 | \n",
" 19 | \n",
" 26 | \n",
" 16500 | \n",
"
\n",
" \n",
" 3 | \n",
" 164 | \n",
" 99.8 | \n",
" 176.6 | \n",
" 66.2 | \n",
" 54.3 | \n",
" 2337 | \n",
" 109 | \n",
" 3.19 | \n",
" 3.40 | \n",
" 10.0 | \n",
" 102 | \n",
" 5500 | \n",
" 24 | \n",
" 30 | \n",
" 13950 | \n",
"
\n",
" \n",
" 4 | \n",
" 164 | \n",
" 99.4 | \n",
" 176.6 | \n",
" 66.4 | \n",
" 54.3 | \n",
" 2824 | \n",
" 136 | \n",
" 3.19 | \n",
" 3.40 | \n",
" 8.0 | \n",
" 115 | \n",
" 5500 | \n",
" 18 | \n",
" 22 | \n",
" 17450 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" normalized-losses wheel-base length width height curb-weight \\\n",
"0 ? 88.6 168.8 64.1 48.8 2548 \n",
"1 ? 88.6 168.8 64.1 48.8 2548 \n",
"2 ? 94.5 171.2 65.5 52.4 2823 \n",
"3 164 99.8 176.6 66.2 54.3 2337 \n",
"4 164 99.4 176.6 66.4 54.3 2824 \n",
"\n",
" engine-size bore stroke compression-rate horsepower peak-rpm city-mpg \\\n",
"0 130 3.47 2.68 9.0 111 5000 21 \n",
"1 130 3.47 2.68 9.0 111 5000 21 \n",
"2 152 2.68 3.47 9.0 154 5000 19 \n",
"3 109 3.19 3.40 10.0 102 5500 24 \n",
"4 136 3.19 3.40 8.0 115 5500 18 \n",
"\n",
" highway-mpg price \n",
"0 27 13495 \n",
"1 27 16500 \n",
"2 26 16500 \n",
"3 30 13950 \n",
"4 22 17450 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numeric_cars.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Cleaning"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" normalized-losses | \n",
" wheel-base | \n",
" length | \n",
" width | \n",
" height | \n",
" curb-weight | \n",
" engine-size | \n",
" bore | \n",
" stroke | \n",
" compression-rate | \n",
" horsepower | \n",
" peak-rpm | \n",
" city-mpg | \n",
" highway-mpg | \n",
" price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" NaN | \n",
" 88.6 | \n",
" 168.8 | \n",
" 64.1 | \n",
" 48.8 | \n",
" 2548 | \n",
" 130 | \n",
" 3.47 | \n",
" 2.68 | \n",
" 9.0 | \n",
" 111 | \n",
" 5000 | \n",
" 21 | \n",
" 27 | \n",
" 13495 | \n",
"
\n",
" \n",
" 1 | \n",
" NaN | \n",
" 88.6 | \n",
" 168.8 | \n",
" 64.1 | \n",
" 48.8 | \n",
" 2548 | \n",
" 130 | \n",
" 3.47 | \n",
" 2.68 | \n",
" 9.0 | \n",
" 111 | \n",
" 5000 | \n",
" 21 | \n",
" 27 | \n",
" 16500 | \n",
"
\n",
" \n",
" 2 | \n",
" NaN | \n",
" 94.5 | \n",
" 171.2 | \n",
" 65.5 | \n",
" 52.4 | \n",
" 2823 | \n",
" 152 | \n",
" 2.68 | \n",
" 3.47 | \n",
" 9.0 | \n",
" 154 | \n",
" 5000 | \n",
" 19 | \n",
" 26 | \n",
" 16500 | \n",
"
\n",
" \n",
" 3 | \n",
" 164 | \n",
" 99.8 | \n",
" 176.6 | \n",
" 66.2 | \n",
" 54.3 | \n",
" 2337 | \n",
" 109 | \n",
" 3.19 | \n",
" 3.40 | \n",
" 10.0 | \n",
" 102 | \n",
" 5500 | \n",
" 24 | \n",
" 30 | \n",
" 13950 | \n",
"
\n",
" \n",
" 4 | \n",
" 164 | \n",
" 99.4 | \n",
" 176.6 | \n",
" 66.4 | \n",
" 54.3 | \n",
" 2824 | \n",
" 136 | \n",
" 3.19 | \n",
" 3.40 | \n",
" 8.0 | \n",
" 115 | \n",
" 5500 | \n",
" 18 | \n",
" 22 | \n",
" 17450 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" normalized-losses wheel-base length width height curb-weight \\\n",
"0 NaN 88.6 168.8 64.1 48.8 2548 \n",
"1 NaN 88.6 168.8 64.1 48.8 2548 \n",
"2 NaN 94.5 171.2 65.5 52.4 2823 \n",
"3 164 99.8 176.6 66.2 54.3 2337 \n",
"4 164 99.4 176.6 66.4 54.3 2824 \n",
"\n",
" engine-size bore stroke compression-rate horsepower peak-rpm city-mpg \\\n",
"0 130 3.47 2.68 9.0 111 5000 21 \n",
"1 130 3.47 2.68 9.0 111 5000 21 \n",
"2 152 2.68 3.47 9.0 154 5000 19 \n",
"3 109 3.19 3.40 10.0 102 5500 24 \n",
"4 136 3.19 3.40 8.0 115 5500 18 \n",
"\n",
" highway-mpg price \n",
"0 27 13495 \n",
"1 27 16500 \n",
"2 26 16500 \n",
"3 30 13950 \n",
"4 22 17450 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numeric_cars = numeric_cars.replace('?', np.nan)\n",
"numeric_cars.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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",
"engine-size 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": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numeric_cars = numeric_cars.astype('float')\n",
"numeric_cars.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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",
"engine-size 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": 7,
"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": 8,
"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": 9,
"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",
"engine-size 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": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Confirm that there are no more missing values!\n",
"numeric_cars.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"engine-size 3238.462830\n",
"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": 11,
"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 DataFrame.\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": 12,
"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",
" 'engine-size': {1: 3258.4861059962027,\n",
" 3: 2840.562805643501,\n",
" 5: 3238.4628296477176,\n",
" 7: 3563.086774256415,\n",
" 9: 3831.8244149840766},\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": 12,
"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 DataFrame.\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": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"