{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.dummy import DummyRegressor\n", "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.tree import DecisionTreeRegressor\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.ensemble import HistGradientBoostingRegressor\n", "from sklearn.metrics import mean_absolute_percentage_error" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "ames_train = pd.read_csv(\n", " \"https://cs307.org/lab-04/data/ames-train.csv\",\n", ")\n", "ames_test = pd.read_csv(\n", " \"https://cs307.org/lab-04/data/ames-test.csv\",\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OrderPIDMS SubClassMS ZoningLot FrontageLot AreaStreetAlleyLot ShapeLand Contour...Pool AreaPool QCFenceMisc FeatureMisc ValMo SoldYr SoldSale TypeSale ConditionSalePrice
02832908188140160RM24.02522PaveNaNRegLvl...0NaNNaNNaN042006WDNormal137500
1273690542615080RLNaN19690PaveNaNIR1Lvl...738GdGdPrvNaN082006WDAlloca274970
2213590720013020RL97.011800PaveNaNIR1Bnk...0NaNNaNNaN082007WDFamily131000
32424528228415120RMNaN3072PaveNaNRegLvl...0NaNNaNNaN052006WDNormal178740
4196753545702020RL80.08000PaveNaNRegLvl...0NaNMnPrvNaN0112007WDNormal156500
..................................................................
1870102052730207020RLNaN10825PaveNaNIR1Lvl...0NaNNaNNaN072008WDNormal181900
187123790542620020RL65.011479PaveNaNRegLvl...0NaNMnPrvNaN062010WDNormal144500
1872154791020205030RM40.03636PaveNaNRegLvl...0NaNMnPrvNaN012008WDNormal55000
1873185553325111020RL80.012000PaveNaNRegLvl...0NaNNaNNaN032007WDNormal255000
1874283690822703050RL62.08707PaveNaNRegLvl...0NaNNaNNaN052006WDAdjLand107000
\n", "

1875 rows × 82 columns

\n", "
" ], "text/plain": [ " Order PID MS SubClass MS Zoning Lot Frontage Lot Area Street \\\n", "0 2832 908188140 160 RM 24.0 2522 Pave \n", "1 2736 905426150 80 RL NaN 19690 Pave \n", "2 2135 907200130 20 RL 97.0 11800 Pave \n", "3 2424 528228415 120 RM NaN 3072 Pave \n", "4 1967 535457020 20 RL 80.0 8000 Pave \n", "... ... ... ... ... ... ... ... \n", "1870 1020 527302070 20 RL NaN 10825 Pave \n", "1871 237 905426200 20 RL 65.0 11479 Pave \n", "1872 1547 910202050 30 RM 40.0 3636 Pave \n", "1873 1855 533251110 20 RL 80.0 12000 Pave \n", "1874 2836 908227030 50 RL 62.0 8707 Pave \n", "\n", " Alley Lot Shape Land Contour ... Pool Area Pool QC Fence Misc Feature \\\n", "0 NaN Reg Lvl ... 0 NaN NaN NaN \n", "1 NaN IR1 Lvl ... 738 Gd GdPrv NaN \n", "2 NaN IR1 Bnk ... 0 NaN NaN NaN \n", "3 NaN Reg Lvl ... 0 NaN NaN NaN \n", "4 NaN Reg Lvl ... 0 NaN MnPrv NaN \n", "... ... ... ... ... ... ... ... ... \n", "1870 NaN IR1 Lvl ... 0 NaN NaN NaN \n", "1871 NaN Reg Lvl ... 0 NaN MnPrv NaN \n", "1872 NaN Reg Lvl ... 0 NaN MnPrv NaN \n", "1873 NaN Reg Lvl ... 0 NaN NaN NaN \n", "1874 NaN Reg Lvl ... 0 NaN NaN NaN \n", "\n", " Misc Val Mo Sold Yr Sold Sale Type Sale Condition SalePrice \n", "0 0 4 2006 WD Normal 137500 \n", "1 0 8 2006 WD Alloca 274970 \n", "2 0 8 2007 WD Family 131000 \n", "3 0 5 2006 WD Normal 178740 \n", "4 0 11 2007 WD Normal 156500 \n", "... ... ... ... ... ... ... \n", "1870 0 7 2008 WD Normal 181900 \n", "1871 0 6 2010 WD Normal 144500 \n", "1872 0 1 2008 WD Normal 55000 \n", "1873 0 3 2007 WD Normal 255000 \n", "1874 0 5 2006 WD AdjLand 107000 \n", "\n", "[1875 rows x 82 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ames_train" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABk+ElEQVR4nO3dd3wUZf4H8M/sbnaz6b1BCr2EXo2gIHACYkNUQFRAxFPhpwg29BTrYTkRRQTvVBAbCqfooSAQOtKl95JOGuk9W57fH5tdWFIIYZPJzn7er9vXsTPPznyHxOTDU2YkIYQAERERkUKp5C6AiIiIqDEx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEBERkaIx7BAREZGiMewQERGRojHsEMnstddegyRJTXKuwYMHY/Dgwbb3mzdvhiRJWLlyZZOcf9KkSYiJiWmSczVUcXExHn30UYSFhUGSJMyYMaPJzm39emzevLnJznk1S5cuhSRJSExMlLsUogZj2CFyIOsvBuvL3d0dERERGD58OD7++GMUFRU55DwXLlzAa6+9hoMHDzrkeI7UnGurj3/+859YunQpnnjiCXz99dd46KGHam1bWVmJjz76CD179oSPjw/8/PwQGxuLxx57DCdPnmzCqmuWmJho9/2oVqsRFRWF0aNHO+3Xh6ghNHIXQKREb7zxBlq1agWDwYCMjAxs3rwZM2bMwLx58/Drr7+iW7dutrb/+Mc/8OKLL17T8S9cuIDXX38dMTEx6NGjR70/t27dums6T0PUVdt//vMfmM3mRq/hemzcuBE33HAD5syZc9W2Y8aMwZo1azB+/HhMnToVBoMBJ0+exOrVq3HjjTeiY8eOTVDx1Y0fPx633XYbTCYTTpw4gUWLFmHNmjXYtWvXVb9/HnroIYwbNw46na5piiVqBAw7RI1g5MiR6NOnj+397NmzsXHjRtx+++248847ceLECej1egCARqOBRtO4/ymWlpbCw8MDWq22Uc9zNW5ubrKevz6ysrLQuXPnq7bbu3cvVq9ejbfffhsvvfSS3b5PPvkE+fn5jVThtevVqxcefPBB2/sBAwbgzjvvxKJFi/DZZ5/V+JmSkhJ4enpCrVZDrVY3ValEjYLDWERNZMiQIXjllVeQlJSEb775xra9pjk769evx8CBA+Hn5wcvLy906NDB9gt18+bN6Nu3LwBg8uTJtiGKpUuXArDMy+nSpQv279+Pm2++GR4eHrbPXjlnx8pkMuGll15CWFgYPD09ceeddyIlJcWuTUxMDCZNmlTts5cf82q11TRnp6SkBLNmzUJkZCR0Oh06dOiAf/3rXxBC2LWTJAnTp0/HqlWr0KVLF+h0OsTGxmLt2rU1/4VfISsrC1OmTEFoaCjc3d3RvXt3fPXVV7b91vkyCQkJ+O2332y11zZX5dy5cwAsweFKarUagYGBtvdJSUl48skn0aFDB+j1egQGBuK+++6r9zyY3bt3Y8SIEfD19YWHhwcGDRqEHTt21OuzNRkyZAgAICEhAcCl4dctW7bgySefREhICFq2bGm378pa16xZg0GDBsHb2xs+Pj7o27cvvvvuu0atm6ih2LND1IQeeughvPTSS1i3bh2mTp1aY5tjx47h9ttvR7du3fDGG29Ap9Ph7Nmztl8SnTp1whtvvIFXX30Vjz32GG666SYAwI033mg7Rk5ODkaOHIlx48bhwQcfRGhoaJ11vf3225AkCS+88AKysrIwf/58DBs2DAcPHrT1QNVHfWq7nBACd955JzZt2oQpU6agR48e+OOPP/Dcc88hLS0NH374oV377du346effsKTTz4Jb29vfPzxxxgzZgySk5PtwsWVysrKMHjwYJw9exbTp09Hq1atsGLFCkyaNAn5+fl4+umn0alTJ3z99dd45pln0LJlS8yaNQsAEBwcXOMxo6OjAQDffvstBgwYUGfv3N69e/Hnn39i3LhxaNmyJRITE7Fo0SIMHjwYx48fh4eHR62f3bhxI0aOHInevXtjzpw5UKlUWLJkCYYMGYJt27ahX79+tX62NtagduXf2ZNPPong4GC8+uqrKCkpqfXzS5cuxSOPPILY2FjMnj0bfn5+OHDgANauXYsHHnig0eomajBBRA6zZMkSAUDs3bu31ja+vr6iZ8+etvdz5swRl/+n+OGHHwoAIjs7u9Zj7N27VwAQS5YsqbZv0KBBAoBYvHhxjfsGDRpke79p0yYBQLRo0UIUFhbatv/4448CgPjoo49s26Kjo8XEiROvesy6aps4caKIjo62vV+1apUAIN566y27dvfee6+QJEmcPXvWtg2A0Gq1dtsOHTokAIgFCxZUO9fl5s+fLwCIb775xratsrJSxMXFCS8vL7trj46OFqNG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5Co0chdAypJiW3bedPN1UlNS0CG2W+37U9Nsf25RdUdn67wdSZIavT4iIpIXww45lByTk01mgcfnr6x1/+zR/Wx/Dvd1h1qSUFJhQn6ZAf4e2qYokYiIZMRhLHKo5nhDwctp1CqE+ugAcN4OEZGrYNghh2quy84vZw1iaby5IBGRS2DYIYe6dPfk5tmzAwAtrJOU+ZwsIiKX0KCwc/78eUfXQQpgucdO009Qvlbhvu5QSUBxhRGF5Ua5yyEiokbWoLDTtm1b3HLLLfjmm29QXl7u6JrISV0srkS5wQxJAsJ9m2/YcVOrEFp1vx1rOCMiIuVqUNj566+/0K1bN8ycORNhYWH4+9//jj179ji6NnIy1uAQ5uMOraZ5j5BevgSdiIiUrUG/kXr06IGPPvoIFy5cwJdffon09HQMHDgQXbp0wbx585Cdne3oOskJOMPkZKuWl83bISIiZbuuf35rNBrcc889WLFiBd59912cPXsWzz77LCIjI/Hwww8jPT3dUXWSE7BNTm6my84vF+6rhyQBReVGCL2f3OUQEVEjuq6ws2/fPjz55JMIDw/HvHnz8Oyzz+LcuXNYv349Lly4gLvuustRdZITkOPuyQ2l1agQ4m253445sJXM1RARUWNq0B2U582bhyVLluDUqVO47bbbsGzZMtx2221QqSzZqVWrVli6dCliYmIcWSs1c831aee1aenngczCCpgDYuQuhYiIGlGDws6iRYvwyCOPYNKkSQgPD6+xTUhICL744ovrKo6cizMsO79chJ879icDgmGHiEjRGhR2zpw5c9U2Wq0WEydObMjhyQkJIWyPX2jONxS8XHjViizhHYKc4goEeulkroiIiBpDg+bsLFmyBCtWrKi2fcWKFfjqq6+uuyhyPtnFFagwmqGSgDBfd7nLqRe9mxoBnpYHge5PypO5GiIiaiwNCjtz585FUFBQte0hISH45z//ed1FkfNJybX06oT76uGmbt732LlcRFUw28ewQ0SkWA36rZScnIxWraqvYImOjkZycvJ1F0XOxzpfp4WTzNexiqgaytqbmCtzJURE1FgaFHZCQkJw+PDhatsPHTqEwMDA6y6KnI8z3VDwctawczStAGWVJpmrISKixtCgsDN+/Hg89dRT2LRpE0wmE0wmEzZu3Iinn34a48aNc3SN5ASc6YaCl/Nx1wBlBTCYBA6l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eHhUW7ap0WjEv/71L3HixAkxZ86cGpdtXq2W+njiiSeEr6+v2Lx5s90SztLSUlubxx9/XERFRYmNGzeKffv2ibi4OBEXF2fbb12+eeutt4qDBw+KtWvXiuDg4BqXbz733HPixIkTYuHChTUu37za98XVarmaF198UWzZskUkJCSIw4cPixdffFFIkiTWrVunuGuty+WrsZR43bNmzRKbN28WCQkJYseOHWLYsGEiKChIZGVlKfJ6hbDcVkCj0Yi3335bnDlzRnz77bfCw8NDfPPNN7Y2SvwZZjKZRFRUlHjhhReq7VPi11kODDvXYcGCBSIqKkpotVrRr18/sWvXLrlLEps2bRIAqr0mTpwohLAsl3zllVdEaGio0Ol0YujQoeLUqVN2x8jJyRHjx48XXl5ewsfHR0yePFkUFRXZtTl06JAYOHCg0Ol0okWLFuKdd96pVsuPP/4o2rdvL7RarYiNjRW//fab3f761FIfNV0vALFkyRJbm7KyMvHkk08Kf39/4eHhIUaPHi3S09PtjpOYmChGjhwp9Hq9CAoKErNmzRIGg8GuzaZNm0SPHj2EVqsVrVu3tjuH1dW+L+pTS10eeeQRER0dLbRarQgODhZDhw61BR2lXWtdrgw7SrvusWPHivDwcKHVakWLFi3E2LFj7e43o7Trtfrf//4nunTpInQ6nejYsaP497//bbdfiT/D/vjjDwGgxs8q9evc1CQhhJClS4mIiIioCXDODhERESkaww4REREpGsMOERERKRrDDhERESkaww4REREpGsMOERERKRrDDhERESkaww4RNbmlS5dWe3pyUxk8eDBmzJjR6Od56KGHbA+0vFxiYiJee+21atsrKysRExODffv2NXptRK6GYYeIrkl2djaeeOIJREVFQafTISwsDMOHD8eOHTuatI7XXnsNkiRBkiRoNBrExMTgmWeeQXFxcZ2f++mnn/Dmm282am2HDh3C77//jqeeeqren9FqtXj22WfxwgsvNGJlRK5JI3cBRORcxowZg8rKSnz11Vdo3bo1MjMzER8fj5ycnCavJTY2Fhs2bIDRaMSOHTvwyCOPoLS0FJ999lm1tpWVldBqtQgICGj0uhYsWID77rsPXl5etm0JCQmYOXMmdu7cicLCQixfvhyDBw/G4sWLbW0mTJiAWbNm4dixY4iNjW30OolcBXt2iKje8vPzsW3bNrz77ru45ZZbEB0djX79+mH27Nm48847be3mzZuHrl27wtPTE5GRkXjyySev2uPyyy+/oFevXnB3d0fr1q3x+uuvw2g01vkZjUaDsLAwtGzZEmPHjsWECRPw66+/ArD0/PTo0QOff/45WrVqBXd3dwDVh7EqKirwwgsvIDIyEjqdDm3btsUXX3xh23/06FGMHDkSXl5eCA0NxUMPPYSLFy/WWpPJZMLKlStxxx132G1/+OGHkZmZiUWLFmHSpEn46KOPEBgYaNfG398fAwYMwPLly+u8biK6Ngw7RFRvXl5e8PLywqpVq1BRUVFrO5VKhY8//hjHjh3DV199hY0bN+L555+vtf22bdvw8MMP4+mnn8bx48fx2WefYenSpXj77bevqT69Xo/Kykrb+7Nnz+K///0vfvrpJxw8eLDGzzz88MP4/vvv8fHHH+PEiRP47LPPbD0y+fn5GDJkCHr27Il9+/Zh7dq1yMzMxP33319rDYcPH0ZBQQH69Oljt/3AgQOYNm0aevbsiZCQEAwfPrzG6+vXrx+2bdt2TddNRHXjMBYR1ZtGo8HSpUsxdepULF68GL169cKgQYMwbtw4dOvWzdbu8p6TmJgYvPXWW3j88cfx6aef1njc119/HS+++CImTpwIAGjdujXefPNNPP/885gzZ069atu/fz++++47DBkyxLatsrISy5YtQ3BwcI2fOX36NH788UesX78ew4YNs53b6pNPPkHPnj3tJhp/+eWXiIyMxOnTp9G+fftqx0xKSoJarUZISIjd9gEDBmD+/Pkwm811XkdERASSkpKufsFEVG/s2SGiazJmzBhcuHABv/76K0aMGIHNmzejV69eWLp0qa3Nhg0bMHToULRo0QLe3t546KGHkJOTg9LS0hqPeejQIbzxxhu2niMvLy9MnToV6enptX4GAI4cOQIvLy/o9Xr069cPcXFx+OSTT2z7o6Ojaw06AHDw4EGo1WoMGjSo1ro2bdpkV1fHjh0BAOfOnavxM2VlZdDpdJAkyW77t99+ixtuuAEvvfQS3n77bcTFxWHlypXVPq/X6+u8ZiK6duzZIaJr5u7ujr/97W/429/+hldeeQWPPvoo5syZg0mTJiExMRG33347nnjiCbz99tsICAjA9u3bMWXKFFRWVsLDw6Pa8YqLi/H666/jnnvuqfFctenQoQN+/fVXaDQaREREQKvV2u339PSs8zr0en2d+4uLi3HHHXfg3XffrbYvPDy8xs8EBQWhtLTUNiH68u0LFizArFmz8M477yAmJgZjx47FmjVrcOutt9ra5ebm1hnQiOjaMewQ0XXr3LkzVq1aBcAynGQ2m/HBBx9ApbJ0Hv/44491fr5Xr144deoU2rZte03n1Wq11/yZy3Xt2hVmsxlbtmyxDWNdWdd///tfxMTEQKOp34/LHj16AACOHz9u+/OVwsLC8OKLL2LFihXYtm2bXdg5evQoevbsec3XQkS14zAWEdVbTk4OhgwZgm+++QaHDx9GQkICVqxYgffeew933XUXAKBt27YwGAxYsGABzp8/j6+//tpueXVNXn31VSxbtgyvv/46jh07hhMnTmD58uX4xz/+0ajXExMTg4kTJ+KRRx7BqlWrkJCQgM2bN9vC2bRp05Cbm4vx48dj7969OHfuHP744w9MnjwZJpOpxmMGBwejV69e2L59u932KVOmYM+ePSgpKUFFRQV++uknHDt2DL1797Zrd2X4IaLrx7BDRPXm5eWF/v3748MPP8TNN9+MLl264JVXXsHUqVNtc2W6d++OefPm4d1330WXLl3w7bffYu7cuXUed/jw4Vi9ejXWrVuHvn374oYbbsCHH36I6OjoRr+mRYsW4d5778WTTz6Jjh07YurUqSgpKQFgmSy8Y8cOmEwm3HrrrejatStmzJgBPz8/W69VTR599FF8++23dttCQkLwyCOPoF+/fnj//ffx7LPP4s0338Tdd99ta7Nz504UFBTg3nvvbZRrJXJVkhBCyF0EEZGSlJWVoUOHDvjhhx8QFxdnty8xMRFLly6t8ZERY8eORffu3fHSSy81UaVEroE9O0REDqbX67Fs2bI6bz54pcrKSnTt2hXPPPNMI1ZG5JrYs0NERESKxp4dIiIiUjSGHSIiIlI0hh0iIiJSNIYdIiIiUjSGHSIiIlI0hh0iIiJSNIYdIiIiUjSGHSIiIlI0hh0iIiJSNIYdIiIiUrT/B6YpOgz+PVjWAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.histplot(ames_train[\"SalePrice\"], kde=True)\n", "plt.title(\"Distribution of Sale Price\")\n", "plt.xlabel(\"Sale Price ($)\")\n", "plt.ylabel(\"Frequency\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# create X and y for train dataset\n", "X_train = ames_train.drop(\"SalePrice\", axis=1)\n", "y_train = ames_train[\"SalePrice\"]\n", "\n", "# create X and y for test dataset\n", "X_test = ames_test.drop(\"SalePrice\", axis=1)\n", "y_test = ames_test[\"SalePrice\"]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# helper function to find columns that are mostly missing\n", "def columns_missing_above_threshold(df, threshold):\n", " missing_proportion = df.isnull().sum() / len(df)\n", " columns_above_threshold = missing_proportion[missing_proportion > threshold].index.tolist()\n", " return columns_above_threshold" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# define columns to be excluded\n", "many_missing_columns = columns_missing_above_threshold(X_train, 0.6)\n", "exclude_columns = [\"Order\", \"PID\"] + many_missing_columns\n", "\n", "# find columns with string data type (will be considered categorical)\n", "string_columns = X_train.select_dtypes(include=[\"object\"]).columns.tolist()\n", "string_columns = [col for col in string_columns if col not in exclude_columns]\n", "\n", "# find columns with numeric data type\n", "numeric_columns = X_train.select_dtypes(include=[\"int64\", \"float64\"]).columns.tolist()\n", "numeric_columns = [col for col in numeric_columns if col not in exclude_columns]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# pipeline for numeric\n", "numeric_preprocessor = Pipeline(\n", " steps=[\n", " (\"MedianImputer\", SimpleImputer(strategy=\"median\")),\n", " (\"Standardize\", StandardScaler()),\n", " ]\n", ")\n", "\n", "# pipeline for categorical\n", "categorical_preprocessor = Pipeline(\n", " steps=[\n", " (\"ModalImputer\", SimpleImputer(strategy=\"most_frequent\")),\n", " (\"OneHotEncoder\", OneHotEncoder(handle_unknown=\"infrequent_if_exist\", max_categories=5)),\n", " ]\n", ")\n", "\n", "# column transformer\n", "preprocessor = ColumnTransformer(\n", " transformers=[\n", " (\"ExcludeColumns\", \"drop\", exclude_columns),\n", " (\"CategoricalPreprocessing\", categorical_preprocessor, string_columns),\n", " (\"NumericProcessing\", numeric_preprocessor, numeric_columns),\n", " ],\n", " remainder=\"drop\",\n", ")\n", "\n", "# full pipeline\n", "pipeline = Pipeline(\n", " steps=[\n", " (\"Preprocessor\", preprocessor),\n", " (\"Regressor\", DummyRegressor()),\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "param_grid = [\n", " {\n", " \"Regressor\": [DummyRegressor()],\n", " },\n", " {\n", " \"Regressor\": [LinearRegression()],\n", " },\n", " {\n", " \"Regressor\": [KNeighborsRegressor()],\n", " \"Regressor__n_neighbors\": [1, 3, 5, 7, 9, 11, 15],\n", " },\n", " {\n", " \"Regressor\": [DecisionTreeRegressor()],\n", " \"Regressor__max_depth\": [1, 3, 5, 7, 9, 11, 15, None],\n", " },\n", " {\n", " \"Regressor\": [HistGradientBoostingRegressor()],\n", " \"Regressor__learning_rate\": [0.1, 0.01, 0.001],\n", " \"Regressor__max_iter\": [1000],\n", " \"Regressor__max_depth\": [None, 3],\n", " \"Regressor__l2_regularization\": [0.1, 1.0],\n", " },\n", "]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('Preprocessor',\n",
       "                 ColumnTransformer(transformers=[('ExcludeColumns', 'drop',\n",
       "                                                  ['Order', 'PID', 'Alley',\n",
       "                                                   'Pool QC', 'Fence',\n",
       "                                                   'Misc Feature']),\n",
       "                                                 ('CategoricalPreprocessing',\n",
       "                                                  Pipeline(steps=[('ModalImputer',\n",
       "                                                                   SimpleImputer(strategy='most_frequent')),\n",
       "                                                                  ('OneHotEncoder',\n",
       "                                                                   OneHotEncoder(handle_unknown='infrequent_if_exist',\n",
       "                                                                                 max_categories=5))]),\n",
       "                                                  ['MS Zoning', 'St...\n",
       "                                                   'Year Remod/Add',\n",
       "                                                   'Mas Vnr Area',\n",
       "                                                   'BsmtFin SF 1',\n",
       "                                                   'BsmtFin SF 2',\n",
       "                                                   'Bsmt Unf SF',\n",
       "                                                   'Total Bsmt SF',\n",
       "                                                   '1st Flr SF', '2nd Flr SF',\n",
       "                                                   'Low Qual Fin SF',\n",
       "                                                   'Gr Liv Area',\n",
       "                                                   'Bsmt Full Bath',\n",
       "                                                   'Bsmt Half Bath',\n",
       "                                                   'Full Bath', 'Half Bath',\n",
       "                                                   'Bedroom AbvGr',\n",
       "                                                   'Kitchen AbvGr',\n",
       "                                                   'TotRms AbvGrd',\n",
       "                                                   'Fireplaces',\n",
       "                                                   'Garage Yr Blt',\n",
       "                                                   'Garage Cars', 'Garage Area',\n",
       "                                                   'Wood Deck SF',\n",
       "                                                   'Open Porch SF',\n",
       "                                                   'Enclosed Porch', ...])])),\n",
       "                ('Regressor', DummyRegressor())])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(steps=[('Preprocessor',\n", " ColumnTransformer(transformers=[('ExcludeColumns', 'drop',\n", " ['Order', 'PID', 'Alley',\n", " 'Pool QC', 'Fence',\n", " 'Misc Feature']),\n", " ('CategoricalPreprocessing',\n", " Pipeline(steps=[('ModalImputer',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('OneHotEncoder',\n", " OneHotEncoder(handle_unknown='infrequent_if_exist',\n", " max_categories=5))]),\n", " ['MS Zoning', 'St...\n", " 'Year Remod/Add',\n", " 'Mas Vnr Area',\n", " 'BsmtFin SF 1',\n", " 'BsmtFin SF 2',\n", " 'Bsmt Unf SF',\n", " 'Total Bsmt SF',\n", " '1st Flr SF', '2nd Flr SF',\n", " 'Low Qual Fin SF',\n", " 'Gr Liv Area',\n", " 'Bsmt Full Bath',\n", " 'Bsmt Half Bath',\n", " 'Full Bath', 'Half Bath',\n", " 'Bedroom AbvGr',\n", " 'Kitchen AbvGr',\n", " 'TotRms AbvGrd',\n", " 'Fireplaces',\n", " 'Garage Yr Blt',\n", " 'Garage Cars', 'Garage Area',\n", " 'Wood Deck SF',\n", " 'Open Porch SF',\n", " 'Enclosed Porch', ...])])),\n", " ('Regressor', DummyRegressor())])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipeline" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "mod = GridSearchCV(\n", " pipeline,\n", " param_grid=param_grid,\n", " n_jobs=-1,\n", " cv=5,\n", " verbose=2,\n", " scoring=\"neg_mean_absolute_percentage_error\",\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 5 folds for each of 29 candidates, totalling 145 fits\n", "[CV] END .........................Regressor=DummyRegressor(); total time= 0.1s\n", "[CV] END .........................Regressor=DummyRegressor(); total time= 0.1s\n", "[CV] END .........................Regressor=DummyRegressor(); total time= 0.1s\n", "[CV] END .......................Regressor=LinearRegression(); total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=1; total time= 0.1s\n", "[CV] END .........................Regressor=DummyRegressor(); total time= 0.1s\n", "[CV] END .........................Regressor=DummyRegressor(); total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=1; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=1; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=1; total time= 0.1s\n", "[CV] END .......................Regressor=LinearRegression(); total time= 0.2s\n", "[CV] END .......................Regressor=LinearRegression(); total time= 0.2s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=1; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=3; total time= 0.1s\n", "[CV] END .......................Regressor=LinearRegression(); total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=3; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=3; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=3; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=5; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=5; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=3; total time= 0.1s\n", "[CV] END .......................Regressor=LinearRegression(); total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=5; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=7; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=5; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=7; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=7; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=7; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=7; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=5; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=9; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=9; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=9; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=9; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=9; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=11; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=11; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=11; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=11; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=11; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=15; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=15; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=15; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=1; total time= 0.1s\n", "[CV] END Regressor=KNeighborsRegressor(), Regressor__n_neighbors=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=1; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=1; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=1; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=1; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=3; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=3; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=3; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=3; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=3; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=5; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=5; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=5; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=5; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=5; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=7; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=7; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=7; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=7; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=7; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=9; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=9; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=9; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=9; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=9; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=11; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=11; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=11; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=None; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=None; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=11; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=11; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=None; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=15; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=None; total time= 0.1s\n", "[CV] END Regressor=DecisionTreeRegressor(), Regressor__max_depth=None; total time= 0.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.9s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.9s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.2s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.9s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.3s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.9s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.2s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.2s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.3s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.3s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.3s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.3s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.6s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.6s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.6s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 11.6s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 9.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.4s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 2.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=0.1, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.5s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 9.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 8.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.1, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.9s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 9.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.6s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.6s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.4s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.3s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.1s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=3, Regressor__max_iter=1000; total time= 3.2s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 9.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 9.7s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 9.8s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.001, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 10.0s\n", "[CV] END Regressor=HistGradientBoostingRegressor(), Regressor__l2_regularization=1.0, Regressor__learning_rate=0.01, Regressor__max_depth=None, Regressor__max_iter=1000; total time= 7.8s\n" ] }, { "data": { "text/html": [ "
GridSearchCV(cv=5,\n",
       "             estimator=Pipeline(steps=[('Preprocessor',\n",
       "                                        ColumnTransformer(transformers=[('ExcludeColumns',\n",
       "                                                                         'drop',\n",
       "                                                                         ['Order',\n",
       "                                                                          'PID',\n",
       "                                                                          'Alley',\n",
       "                                                                          'Pool '\n",
       "                                                                          'QC',\n",
       "                                                                          'Fence',\n",
       "                                                                          'Misc '\n",
       "                                                                          'Feature']),\n",
       "                                                                        ('CategoricalPreprocessing',\n",
       "                                                                         Pipeline(steps=[('ModalImputer',\n",
       "                                                                                          SimpleImputer(strategy='most_frequent')),\n",
       "                                                                                         ('OneHotEncoder',\n",
       "                                                                                          OneHotEncoder(handle_unknown='infrequent_if_exist',\n",
       "                                                                                                        max_...\n",
       "                          'Regressor__n_neighbors': [1, 3, 5, 7, 9, 11, 15]},\n",
       "                         {'Regressor': [DecisionTreeRegressor()],\n",
       "                          'Regressor__max_depth': [1, 3, 5, 7, 9, 11, 15,\n",
       "                                                   None]},\n",
       "                         {'Regressor': [HistGradientBoostingRegressor()],\n",
       "                          'Regressor__l2_regularization': [0.1, 1.0],\n",
       "                          'Regressor__learning_rate': [0.1, 0.01, 0.001],\n",
       "                          'Regressor__max_depth': [None, 3],\n",
       "                          'Regressor__max_iter': [1000]}],\n",
       "             scoring='neg_mean_absolute_percentage_error', verbose=2)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "GridSearchCV(cv=5,\n", " estimator=Pipeline(steps=[('Preprocessor',\n", " ColumnTransformer(transformers=[('ExcludeColumns',\n", " 'drop',\n", " ['Order',\n", " 'PID',\n", " 'Alley',\n", " 'Pool '\n", " 'QC',\n", " 'Fence',\n", " 'Misc '\n", " 'Feature']),\n", " ('CategoricalPreprocessing',\n", " Pipeline(steps=[('ModalImputer',\n", " SimpleImputer(strategy='most_frequent')),\n", " ('OneHotEncoder',\n", " OneHotEncoder(handle_unknown='infrequent_if_exist',\n", " max_...\n", " 'Regressor__n_neighbors': [1, 3, 5, 7, 9, 11, 15]},\n", " {'Regressor': [DecisionTreeRegressor()],\n", " 'Regressor__max_depth': [1, 3, 5, 7, 9, 11, 15,\n", " None]},\n", " {'Regressor': [HistGradientBoostingRegressor()],\n", " 'Regressor__l2_regularization': [0.1, 1.0],\n", " 'Regressor__learning_rate': [0.1, 0.01, 0.001],\n", " 'Regressor__max_depth': [None, 3],\n", " 'Regressor__max_iter': [1000]}],\n", " scoring='neg_mean_absolute_percentage_error', verbose=2)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mod.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Regressor': HistGradientBoostingRegressor(),\n", " 'Regressor__l2_regularization': 1.0,\n", " 'Regressor__learning_rate': 0.01,\n", " 'Regressor__max_depth': None,\n", " 'Regressor__max_iter': 1000}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mod.best_params_" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# mod.cv_results_" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CV MAPE: 0.09323748138117231\n" ] } ], "source": [ "print(f\"CV MAPE: {-mod.best_score_}\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test MAPE: 0.08164649164771304\n" ] } ], "source": [ "y_test_pred = mod.predict(X_test)\n", "test_mape = mean_absolute_percentage_error(y_test, y_test_pred)\n", "print(f\"Test MAPE: {test_mape}\")" ] } ], "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.12.5" } }, "nbformat": 4, "nbformat_minor": 2 }