{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Deep learning for Bulldozers" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "from fastai.imports import *\n", "from fastai.torch_imports import *\n", "from fastai.dataset import *\n", "from fastai.learner import *\n", "from fastai.structured import *\n", "from fastai.column_data import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Load in our data from last lesson" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dep = 'SalePrice'\n", "PATH = \"data/bulldozers/\"\n", "df_raw = pd.read_feather('tmp/bulldozers-raw')\n", "keep_cols = list(np.load('tmp/keep_cols.npy'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_raw.loc[df_raw.YearMade<1950, 'YearMade'] = 1950\n", "df_raw['age'] = df_raw.saleYear-df_raw.YearMade\n", "df_raw = df_raw[keep_cols+['age', dep]].copy()\n", "df_indep = df_raw.drop(dep,axis=1)\n", "\n", "n_valid = 12000\n", "n_trn = len(df_raw)-n_valid" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'YearMade Coupler_System ProductSize fiProductClassDesc ModelID saleElapsed fiSecondaryDesc Enclosure fiModelDesc Hydraulics_Flow fiModelDescriptor Hydraulics Drive_System ProductGroupDesc ProductGroup state saleDay Track_Type saleDayofyear Stick_Length age'" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat_flds = [n for n in df_indep.columns if df_raw[n].nunique()\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Coupler_SystemProductSizefiProductClassDescModelIDfiSecondaryDescEnclosurefiModelDescHydraulics_FlowfiModelDescriptorHydraulics...stateTrack_TypeStick_LengthYearMadesaleElapsedSalesIDMachineIDsaleDaysaleDayofyearage
00059644413950001...1000.9131960.397377-0.858580-0.496185-0.0131011.352092-0.828814
10462115531725001...33000.405756-0.061496-0.858578-2.4949361.173518-0.907472-0.430749
21039154206331304...32000.722906-0.075286-0.858577-1.7757591.173518-1.187503-0.762470
3068110033674001...44000.7229061.179600-0.858574-0.4340960.342885-0.395690-0.298060
410403540014208304...32001.1034860.863382-0.858572-0.3640200.8175320.231967-0.828814
\n", "

5 rows × 23 columns

\n", "" ], "text/plain": [ " Coupler_System ProductSize fiProductClassDesc ModelID fiSecondaryDesc \\\n", "0 0 0 59 644 41 \n", "1 0 4 62 11 55 \n", "2 1 0 39 1542 0 \n", "3 0 6 8 110 0 \n", "4 1 0 40 3540 0 \n", "\n", " Enclosure fiModelDesc Hydraulics_Flow fiModelDescriptor Hydraulics \\\n", "0 3 950 0 0 1 \n", "1 3 1725 0 0 1 \n", "2 6 331 3 0 4 \n", "3 3 3674 0 0 1 \n", "4 1 4208 3 0 4 \n", "\n", " ... state Track_Type Stick_Length YearMade saleElapsed SalesID \\\n", "0 ... 1 0 0 0.913196 0.397377 -0.858580 \n", "1 ... 33 0 0 0.405756 -0.061496 -0.858578 \n", "2 ... 32 0 0 0.722906 -0.075286 -0.858577 \n", "3 ... 44 0 0 0.722906 1.179600 -0.858574 \n", "4 ... 32 0 0 1.103486 0.863382 -0.858572 \n", "\n", " MachineID saleDay saleDayofyear age \n", "0 -0.496185 -0.013101 1.352092 -0.828814 \n", "1 -2.494936 1.173518 -0.907472 -0.430749 \n", "2 -1.775759 1.173518 -1.187503 -0.762470 \n", "3 -0.434096 0.342885 -0.395690 -0.298060 \n", "4 -0.364020 0.817532 0.231967 -0.828814 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Model" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def rmse(x,y): return math.sqrt(((x-y)**2).mean())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Coupler_System': 3,\n", " 'Drive_System': 5,\n", " 'Enclosure': 7,\n", " 'Hydraulics': 13,\n", " 'Hydraulics_Flow': 4,\n", " 'ModelID': 5219,\n", " 'ProductGroup': 7,\n", " 'ProductGroupDesc': 7,\n", " 'ProductSize': 7,\n", " 'Stick_Length': 30,\n", " 'Track_Type': 3,\n", " 'fiModelDesc': 5000,\n", " 'fiModelDescriptor': 140,\n", " 'fiProductClassDesc': 75,\n", " 'fiSecondaryDesc': 176,\n", " 'state': 54}" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "emb_c = {n: len(c.cat.categories)+1 for n,c in df_raw[cat_flds].items()}\n", "emb_c" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "emb_szs = [(c, min(50, (c+1)//2)) for _,c in emb_c.items()]\n", "metrics=[rmse]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y_range=(0,np.max(y)*1.2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m = md.get_learner(emb_szs, len(cont_flds), 0.05, 1, [500,250], [0.5,0.05],\n", " y_range=y_range, use_bn=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f044a0aa354945f7a061ab97c4a05a87", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " 63%|██████▎ | 3812/6081 [00:28<00:14, 154.49it/s, loss=0.202] " ] } ], "source": [ "m.lr_find()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " \r", " 63%|██████▎ | 3812/6081 [00:40<00:23, 95.21it/s, loss=0.314]" ] } ], "source": [ "m.sched.plot(1300)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lr=1e-3; wd=1e-7" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6d1f92b2e46c41a8b7b1f491c62b34ac", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 0.06207 0.09731] \n", "[ 1. 0.06048 0.07684] \n", "[ 2. 0.05326 0.06389] \n", "\n" ] } ], "source": [ "m.fit(lr, 2, wd, cycle_len=1, cycle_mult=2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4f331b172ac8477ea2ac80f15a0fe06f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 0.05471 0.0523 ] \n", "[ 1. 0.04767 0.0512 ] \n", "[ 2. 0.05249 0.05747] \n", "[ 3. 0.04643 0.05393] \n", "[ 4. 0.04984 0.04934] \n", "[ 5. 0.04277 0.04869] \n", "\n" ] } ], "source": [ "m.fit(lr, 2, wd, cycle_len=2, cycle_mult=2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.22068076490713912" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.sqrt(0.0487)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }