From 07c894341d78f994495a8b73f3dd5bca2cc030ff Mon Sep 17 00:00:00 2001
From: benjas <909336740@qq.com>
Date: Fri, 25 Dec 2020 15:12:25 +0800
Subject: [PATCH] =?UTF-8?q?Delete=20=E5=BB=BA=E6=A8=A1=E4=B8=8E=E5=88=86?=
=?UTF-8?q?=E6=9E=90=5F=E5=BB=BA=E7=AD=91=E8=83=BD=E6=BA=90=E5=88=A9?=
=?UTF-8?q?=E7=94=A8=E7=8E=87=E9=A2=84=E6=B5=8B-checkpoint.ipynb?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...筑能源利用率预测-checkpoint.ipynb | 2093 -----------------
1 file changed, 2093 deletions(-)
delete mode 100644 机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/.ipynb_checkpoints/建模与分析_建筑能源利用率预测-checkpoint.ipynb
diff --git a/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/.ipynb_checkpoints/建模与分析_建筑能源利用率预测-checkpoint.ipynb b/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/.ipynb_checkpoints/建模与分析_建筑能源利用率预测-checkpoint.ipynb
deleted file mode 100644
index a27871d..0000000
--- a/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/.ipynb_checkpoints/建模与分析_建筑能源利用率预测-checkpoint.ipynb
+++ /dev/null
@@ -1,2093 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 载入工具包"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import numpy as np\n",
- "\n",
- "pd.options.mode.chained_assignment = None # 消除警告,比如说提示版本升级之类的\n",
- "\n",
- "pd.set_option('display.max_columns', 60) # 设置最大显示列为60\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "\n",
- "plt.rcParams['font.size'] = 24 # 设置字体大小\n",
- "\n",
- "from IPython.core.pylabtools import figsize # 设置画图大小\n",
- "\n",
- "import seaborn as sns # 画图工具\n",
- "sns.set(font_scale=2)\n",
- "\n",
- "# 输入缺失值和缩放值\n",
- "from sklearn.preprocessing import Imputer, MinMaxScaler\n",
- "\n",
- "# 机器学习模型\n",
- "from sklearn.linear_model import LinearRegression\n",
- "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
- "from sklearn.svm import SVR\n",
- "from sklearn.neighbors import KNeighborsRegressor\n",
- "\n",
- "# 超参数调整\n",
- "from sklearn.model_selection import RandomizedSearchCV, GridSearchCV"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Training Feature Size: (6622, 64)\n",
- "Testing Feature Size: (2839, 64)\n",
- "Training Labels Size: (6622, 1)\n",
- "Testing Labels Size: (2839, 1)\n"
- ]
- }
- ],
- "source": [
- "# Read in data into dataframes \n",
- "train_features = pd.read_csv('data/training_features.csv')\n",
- "test_features = pd.read_csv('data/testing_features.csv')\n",
- "train_labels = pd.read_csv('data/training_labels.csv')\n",
- "test_labels = pd.read_csv('data/testing_labels.csv')\n",
- "\n",
- "# Display sizes of data\n",
- "print('Training Feature Size: ', train_features.shape)\n",
- "print('Testing Feature Size: ', test_features.shape)\n",
- "print('Training Labels Size: ', train_labels.shape)\n",
- "print('Testing Labels Size: ', test_labels.shape)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Order | \n",
- " Property Id | \n",
- " DOF Gross Floor Area | \n",
- " Year Built | \n",
- " Number of Buildings - Self-reported | \n",
- " Occupancy | \n",
- " Site EUI (kBtu/ft²) | \n",
- " Weather Normalized Site Electricity Intensity (kWh/ft²) | \n",
- " Weather Normalized Site Natural Gas Intensity (therms/ft²) | \n",
- " Water Intensity (All Water Sources) (gal/ft²) | \n",
- " Latitude | \n",
- " Longitude | \n",
- " Community Board | \n",
- " Census Tract | \n",
- " log_Direct GHG Emissions (Metric Tons CO2e) | \n",
- " log_Water Intensity (All Water Sources) (gal/ft²) | \n",
- " Borough_Staten Island | \n",
- " Largest Property Use Type_Adult Education | \n",
- " Largest Property Use Type_Automobile Dealership | \n",
- " Largest Property Use Type_Bank Branch | \n",
- " Largest Property Use Type_College/University | \n",
- " Largest Property Use Type_Convenience Store without Gas Station | \n",
- " Largest Property Use Type_Courthouse | \n",
- " Largest Property Use Type_Distribution Center | \n",
- " Largest Property Use Type_Enclosed Mall | \n",
- " Largest Property Use Type_Financial Office | \n",
- " Largest Property Use Type_Hospital (General Medical & Surgical) | \n",
- " Largest Property Use Type_Hotel | \n",
- " Largest Property Use Type_K-12 School | \n",
- " Largest Property Use Type_Library | \n",
- " ... | \n",
- " Largest Property Use Type_Multifamily Housing | \n",
- " Largest Property Use Type_Museum | \n",
- " Largest Property Use Type_Non-Refrigerated Warehouse | \n",
- " Largest Property Use Type_Other | \n",
- " Largest Property Use Type_Other - Education | \n",
- " Largest Property Use Type_Other - Entertainment/Public Assembly | \n",
- " Largest Property Use Type_Other - Lodging/Residential | \n",
- " Largest Property Use Type_Other - Mall | \n",
- " Largest Property Use Type_Other - Public Services | \n",
- " Largest Property Use Type_Other - Recreation | \n",
- " Largest Property Use Type_Other - Services | \n",
- " Largest Property Use Type_Other - Specialty Hospital | \n",
- " Largest Property Use Type_Outpatient Rehabilitation/Physical Therapy | \n",
- " Largest Property Use Type_Parking | \n",
- " Largest Property Use Type_Performing Arts | \n",
- " Largest Property Use Type_Pre-school/Daycare | \n",
- " Largest Property Use Type_Refrigerated Warehouse | \n",
- " Largest Property Use Type_Repair Services (Vehicle, Shoe, Locksmith, etc.) | \n",
- " Largest Property Use Type_Residence Hall/Dormitory | \n",
- " Largest Property Use Type_Residential Care Facility | \n",
- " Largest Property Use Type_Restaurant | \n",
- " Largest Property Use Type_Retail Store | \n",
- " Largest Property Use Type_Self-Storage Facility | \n",
- " Largest Property Use Type_Senior Care Community | \n",
- " Largest Property Use Type_Social/Meeting Hall | \n",
- " Largest Property Use Type_Strip Mall | \n",
- " Largest Property Use Type_Supermarket/Grocery Store | \n",
- " Largest Property Use Type_Urgent Care/Clinic/Other Outpatient | \n",
- " Largest Property Use Type_Wholesale Club/Supercenter | \n",
- " Largest Property Use Type_Worship Facility | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 13276 | \n",
- " 5849784 | \n",
- " 90300.0 | \n",
- " 1950 | \n",
- " 1 | \n",
- " 100 | \n",
- " 126.0 | \n",
- " 5.2 | \n",
- " 1.2 | \n",
- " 99.41 | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " 6.088818 | \n",
- " 4.599253 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 7377 | \n",
- " 4398442 | \n",
- " 52000.0 | \n",
- " 1926 | \n",
- " 1 | \n",
- " 100 | \n",
- " 95.4 | \n",
- " 4.7 | \n",
- " 0.9 | \n",
- " NaN | \n",
- " 40.835496 | \n",
- " -73.887745 | \n",
- " 3.0 | \n",
- " 161.0 | \n",
- " 5.384036 | \n",
- " NaN | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 9479 | \n",
- " 4665374 | \n",
- " 104700.0 | \n",
- " 1954 | \n",
- " 1 | \n",
- " 100 | \n",
- " 40.4 | \n",
- " 3.8 | \n",
- " 0.3 | \n",
- " NaN | \n",
- " 40.663206 | \n",
- " -73.949469 | \n",
- " 9.0 | \n",
- " 329.0 | \n",
- " 5.017280 | \n",
- " NaN | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 14774 | \n",
- " 3393340 | \n",
- " 129333.0 | \n",
- " 1992 | \n",
- " 1 | \n",
- " 100 | \n",
- " 157.1 | \n",
- " 16.9 | \n",
- " 1.1 | \n",
- " NaN | \n",
- " 40.622968 | \n",
- " -74.078742 | \n",
- " 1.0 | \n",
- " 27.0 | \n",
- " 6.510853 | \n",
- " NaN | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " 3286 | \n",
- " 2704325 | \n",
- " 109896.0 | \n",
- " 1927 | \n",
- " 1 | \n",
- " 100 | \n",
- " 62.3 | \n",
- " 3.5 | \n",
- " 0.0 | \n",
- " 28.65 | \n",
- " 40.782421 | \n",
- " -73.972622 | \n",
- " 7.0 | \n",
- " 165.0 | \n",
- " 6.123589 | \n",
- " 3.355153 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
5 rows × 64 columns
\n",
- "
"
- ],
- "text/plain": [
- " Order Property Id DOF Gross Floor Area Year Built \\\n",
- "0 13276 5849784 90300.0 1950 \n",
- "1 7377 4398442 52000.0 1926 \n",
- "2 9479 4665374 104700.0 1954 \n",
- "3 14774 3393340 129333.0 1992 \n",
- "4 3286 2704325 109896.0 1927 \n",
- "\n",
- " Number of Buildings - Self-reported Occupancy Site EUI (kBtu/ft²) \\\n",
- "0 1 100 126.0 \n",
- "1 1 100 95.4 \n",
- "2 1 100 40.4 \n",
- "3 1 100 157.1 \n",
- "4 1 100 62.3 \n",
- "\n",
- " Weather Normalized Site Electricity Intensity (kWh/ft²) \\\n",
- "0 5.2 \n",
- "1 4.7 \n",
- "2 3.8 \n",
- "3 16.9 \n",
- "4 3.5 \n",
- "\n",
- " Weather Normalized Site Natural Gas Intensity (therms/ft²) \\\n",
- "0 1.2 \n",
- "1 0.9 \n",
- "2 0.3 \n",
- "3 1.1 \n",
- "4 0.0 \n",
- "\n",
- " Water Intensity (All Water Sources) (gal/ft²) Latitude Longitude \\\n",
- "0 99.41 NaN NaN \n",
- "1 NaN 40.835496 -73.887745 \n",
- "2 NaN 40.663206 -73.949469 \n",
- "3 NaN 40.622968 -74.078742 \n",
- "4 28.65 40.782421 -73.972622 \n",
- "\n",
- " Community Board Census Tract log_Direct GHG Emissions (Metric Tons CO2e) \\\n",
- "0 NaN NaN 6.088818 \n",
- "1 3.0 161.0 5.384036 \n",
- "2 9.0 329.0 5.017280 \n",
- "3 1.0 27.0 6.510853 \n",
- "4 7.0 165.0 6.123589 \n",
- "\n",
- " log_Water Intensity (All Water Sources) (gal/ft²) Borough_Staten Island \\\n",
- "0 4.599253 0 \n",
- "1 NaN 0 \n",
- "2 NaN 0 \n",
- "3 NaN 1 \n",
- "4 3.355153 0 \n",
- "\n",
- " Largest Property Use Type_Adult Education \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Automobile Dealership \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Bank Branch \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_College/University \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Convenience Store without Gas Station \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Courthouse \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Distribution Center \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Enclosed Mall \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Financial Office \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Hospital (General Medical & Surgical) \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Hotel Largest Property Use Type_K-12 School \\\n",
- "0 0 0 \n",
- "1 0 0 \n",
- "2 0 0 \n",
- "3 0 0 \n",
- "4 0 0 \n",
- "\n",
- " Largest Property Use Type_Library ... \\\n",
- "0 0 ... \n",
- "1 0 ... \n",
- "2 0 ... \n",
- "3 0 ... \n",
- "4 0 ... \n",
- "\n",
- " Largest Property Use Type_Multifamily Housing \\\n",
- "0 1 \n",
- "1 1 \n",
- "2 1 \n",
- "3 0 \n",
- "4 1 \n",
- "\n",
- " Largest Property Use Type_Museum \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Non-Refrigerated Warehouse \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Education \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Entertainment/Public Assembly \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Lodging/Residential \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Mall \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Public Services \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Recreation \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Services \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Other - Specialty Hospital \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Outpatient Rehabilitation/Physical Therapy \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Parking \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Performing Arts \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Pre-school/Daycare \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Refrigerated Warehouse \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Repair Services (Vehicle, Shoe, Locksmith, etc.) \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Residence Hall/Dormitory \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Residential Care Facility \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Restaurant \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Retail Store \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Self-Storage Facility \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Senior Care Community \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 1 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Social/Meeting Hall \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Strip Mall \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Supermarket/Grocery Store \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Urgent Care/Clinic/Other Outpatient \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Wholesale Club/Supercenter \\\n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- " Largest Property Use Type_Worship Facility \n",
- "0 0 \n",
- "1 0 \n",
- "2 0 \n",
- "3 0 \n",
- "4 0 \n",
- "\n",
- "[5 rows x 64 columns]"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "train_features.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 缺失值填充\n",
- "\n",
- "利用sklearn的 Imputer object来进行缺失值填充,测试集则使用数据集中的结果进行填充,尽可能的不要利用测试集的数据对测试集加工,因为一开始我们也是不知道的,可参考[Data Leagage](https://www.kaggle.com/dansbecker/data-leakage)。"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Create an imputer object with a median filling strategy\n",
- "imputer = Imputer(strategy = 'median')\n",
- "\n",
- "# Train on the training features\n",
- "imputer.fit(train_features)\n",
- "\n",
- "# Transform both training data and testing data\n",
- "X = imputer.transform(train_features)\n",
- "X_test = imputer.transform(test_features)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Missing values in training features: 0\n",
- "Missing values in testing features: 0\n"
- ]
- }
- ],
- "source": [
- "print('Missing values in training features:', np.sum(np.isnan(X)))\n",
- "print('Missing values in testing features:',np.sum(np.isnan(X_test)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(array([], dtype=int64), array([], dtype=int64))\n",
- "(array([], dtype=int64), array([], dtype=int64))\n"
- ]
- }
- ],
- "source": [
- "# Make sure all values are finite\n",
- "print(np.where(~np.isfinite(X)))\n",
- "print(np.where(~np.isfinite(X_test)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 特征标准化与归一化"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Create the scaler object with a range of 0-1\n",
- "scaler = MinMaxScaler(feature_range=(0, 1))\n",
- "\n",
- "# Fit on the training data\n",
- "scaler.fit(X)\n",
- "\n",
- "# Transform both training data and testing data\n",
- "X = scaler.transform(X)\n",
- "X_test = scaler.transform(X_test)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Convert y to one-dimensional array (vector)\n",
- "y = np.array(train_labels).reshape((-1, ))\n",
- "y_test = np.array(test_labels).reshape((-1, ))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 选择的机器学习算法(回归问题)\n",
- " 1. Linear Regression\n",
- " 2. Support Vector Machine Regression\n",
- " 3. Random Forest Regression\n",
- " 4. Gradient Boosting Regression\n",
- " 5. K-Nearest Neighbors Regression\n",
- "\n",
- "这里先使用默认参数,后续再调参"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Function to calculation mean absolute error\n",
- "def mae (y_true,y_pred):\n",
- " return np.mean(abs(y_true - y_pred))\n",
- "\n",
- "# Takes in a model, trains the model, and evaluates the model on the test set\n",
- "def fit_and_evaluate(model):\n",
- " \n",
- " # Train the model\n",
- " model.fit(X,y)\n",
- " \n",
- " # Make predictions and evalute\n",
- " model_pred = model.predict(X_test)\n",
- " model_mae = mae(y_test,model_pred)\n",
- " \n",
- " # Return the performance metric\n",
- " return model_mae"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Linear Regression Performance on the test set: MAE = 13.4651\n"
- ]
- }
- ],
- "source": [
- "lr = LinearRegression()\n",
- "lr_mae = fit_and_evaluate(lr)\n",
- "\n",
- "print('Linear Regression Performance on the test set: MAE = %0.4f'% lr_mae)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Support Vector Machine Regression Performance on the test set: MAE = 10.9337\n"
- ]
- }
- ],
- "source": [
- "svm = SVR(C=1000,gamma =0.1)\n",
- "svm_mae = fit_and_evaluate(svm)\n",
- "\n",
- "print('Support Vector Machine Regression Performance on the test set: MAE = %0.4f' % svm_mae)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "D:\\Anaconda3\\lib\\site-packages\\sklearn\\ensemble\\forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.\n",
- " \"10 in version 0.20 to 100 in 0.22.\", FutureWarning)\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Random Forest Regression Performance on the test set: MAE = 10.0073\n"
- ]
- }
- ],
- "source": [
- "random_forest = RandomForestRegressor(random_state = 60)\n",
- "random_forest_mae = fit_and_evaluate(random_forest)\n",
- "\n",
- "print('Random Forest Regression Performance on the test set: MAE = %0.4f' % random_forest_mae)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Gradient Boosted Regression Performance on the test set: MAE = 10.0144\n"
- ]
- }
- ],
- "source": [
- "gradient_boosted = GradientBoostingRegressor(random_state=60)\n",
- "gradient_boosted_mae = fit_and_evaluate(gradient_boosted)\n",
- "\n",
- "print('Gradient Boosted Regression Performance on the test set: MAE = %0.4f' % gradient_boosted_mae)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "K-Nearest Neighbors Regression Performance on the test set: MAE = 13.0131\n"
- ]
- }
- ],
- "source": [
- "knn = KNeighborsRegressor(n_neighbors=10)\n",
- "knn_mae = fit_and_evaluate(knn)\n",
- "\n",
- "print('K-Nearest Neighbors Regression Performance on the test set: MAE = %0.4f' % knn_mae)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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58/nq6++4rPPPiMxMZEWLVqQPXt2QkJCmDFjRqprLF++nIkTJ/KPf/yDDz/8kJs3bzJ69GiCgoJM6g0fPpxJkyZhZWVF8+bNad68OdmyZWPFihX06dMn1XVXrFjBxo0badGiBW+//Tbly5dPVefevXv06dOHtWvXGs//nXfeYf369fj6+nLjxg2jbsr83127dlGpUiXjg8bMmTP597//zf37902ufefOHbp27cqJEydo3LgxNWrU4M8//6R3796cO3cuw9fmWV6L48eP0717dywtLWnRogUlS5Zk48aN9OrVi8TExMfe72mFhITQp08fTp8+Tb169WjWrBmXL19m4MCBLF682KgXExNDz5492bVrFx988AHt2rXD3d2dkJAQevbsSUJCAlZWVvj6+hq98f/6179o2LDhE8Xh5eWFjY0NYWFhqcpCQ0PJly9fmq99iq1bt3Lr1i3q1q0LQO3atbGysmLVqlUmf6/lzaQeThF5JrVq1WLt2rVs3brVZM7Xpk2bcHR0pFKlSvzyyy8m50RHRzNlyhQKFCjAzJkzcXV1BeDu3bv079+fDRs2UK1aNRo1asStW7eMYew5c+aQP39+AFq3bk23bt1SxTNu3DguX77MhAkTTHp4lixZwsSJE5k1axa9e/d+qjZeunQJgCJFijzVeQcOHGDx4sW89dZbTJ061UhEr127Ro8ePVi0aBHVqlXjvffeM87566+/THoLmzdvTqtWrVi1ahXt27fH398fSF7Z27RpU9avX0+/fv1M7nvs2DG++uorateuDUCXLl2MuXQNGjSgSJEiHDp0iNDQUBo0aMDo0aONc+Pj4+nYsSNHjx4lKioKd3d3o+zatWssWrQowzmbe/bs4fjx4/j6+prMYwwODmbq1KmsX7+eVq1aERsby9ixY7Gzs2PmzJmUKVPGuP/o0aNZt24dixYtMukRu3HjBu+88w5ff/21seK5RIkSzJw5kzVr1qT5fnie1+LkyZP06tWLTz75BEheBNe7d292797Nvn37+OCDD9K939OKjo5m8uTJlChRgu+//54cOXIA0L17d/z8/Pjuu+/w9PTE3d2ddevWcfnyZcaMGUP9+vWNa4wdO5ZVq1axb98+PDw86Nq1K7t27eLSpUt07tw53RGBRzk5OfHBBx+wc+dO4uLijB70+Ph4tmzZQqNGjTI8/+HhdICcOXNS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ZXJenz59KFOmDEuXLmXdunVYW1tTunRpBg4c+Njvln5WDRs2xNXVleDgYG7cuMFbb73FiBEjjC19ADw9Pfnyyy9ZuHAh69atw87ODldXVwYNGkT58uX55JNP2LFjh8k+j0/CxsaGyZMns3DhQrZs2UJISAi2traUL1+eTp06mQzJent7M2vWLObOncvOnTu5f/8+bm5u9O7dmzZt2rzwPRcz47V4Gp06daJ48eL89NNPhIaGkpiYSOHChenfvz8tWrQw3ls5c+bkhx9+YO7cufz+++/s2bMHJycnqlevjq+vL0WLFjWu6evry5kzZ9i5cyfnz59/6oSzVq1aTJkyhTx58mT4FbUpe28+rpe4cOHCvPvuuxw4cIANGzbQrFkzo+zRXvFH5c6dWwlnFmBx/fp1bf8vIvIaS/lqyzZt2qTaDF5E5FWgOZwiIiIiYlZKOEVERETErJRwioiIiIhZaQ6niIiIiJiVejhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpksWdOHEis0PI8vSMzUvP1/z0jM3vTX/GSjhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpIiIiImalhFNEREREzEoJp4iIiIiYlRJOERERETErJZwiIiIiYlbWmR2AiIiIvL6SkpK4c+cO8fHxmR3KK83Ozo4bN25kdhhPzMLCAjs7O7Jly/ZCrqeEU14J4xs3zuwQsqy7d+9ib2+f2WFkaXrG5qXna3538+Zl5Pz5T31eUlIS169fx9HREQcHBywsLF58cFmEra0tdnZ2mR3GE0tMTOTOnTvExcWRPXv2535tlXDKK2Hsb79ldggiIm+s/u+990zn3blzB0dHxxfWCyavDktLS5ycnLhz5w737t177mRZczhFRETkmcTHx2NjY5PZYYgZ2dvbc+/evee+jhJOEREReWYaRs/aXtTrq4RTRERERMxKCaeIiIiImNUbu2jIx8eHCxcuGL9bWFiQPXt23n33XQYOHEj+/PnNct8mTZrg5+dHkyZNzHL9FKtXr2b06NFpln311VfUrl3brPd/VHR0NJGRkXh6er7U+4qIiEjme2MTTgB/f3/q168PJC//j4yM5OuvvyYgIICZM2dmcnTPz8XFhYULF6Y6niNHjpcey9ixY6lQoYISThERkTfQG51wOjo64uLiYvyeL18+unXrxsiRI4mNjcXJySkT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jBjBuHHjaNOmDS4uLjRr1gxra2siIiLw8vJi4MCBTJgwgd69e5MjRw4+/vhjpk6dmua1Ro0axcSJE43FMh4eHgwYMOCJ2lCyZEkqV65M165dGTt2LN7e3qnqhIaGEhoaCvz/PUCbNm2Kr68vkLwR/eTJk5k6dSqLFy+mQIEC+Pv706xZMyB54/iYmBiCgoK4cuUKpUuXZtq0aZQoUQKAiRMnMnnyZDp06ICtrS1169alS5cuADRu3JiwsDDat2/P+vXrM2xrjhw5mDp1KuPGjaNDhw5UrFiRhg0bPtFzEBERkazH4vr169rRWzKdc86cmR2CiMgbq/977zHy/zo0xDze9EVDWWJIXUREREReXUo4RURERMSslHCKiIiIiFkp4RQRERERs1LCKSIiIiJmlSW2RZLX3/Bq1TI7hCzr7t27xj6vYh56xual5/sS5M2b2RFIFqeEU14JA9esyewQsqw3fSuOl0HP2Lz0fM3vxIkTmR2CZHEaUhcRERERs1LCKSIiIiJmpYRTRERERMxKCaeIiIiImJUSThERERExKyWcIiIiImJWSjhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpIiIiImalhFNEREREzEoJp4iIiIiYlRJOERERETErJZwiIiIiYlZKOEVERETErJRwioiIiIhZKeEUEREREbNSwikiIiIiZqWEU0RERETMSgmniIiIiJiVEk4RERERMSvrzA5ABGB848aZHUKWdffuXezt7TM7jCxNz9i89HzN71V4xjYlStBn6tRMjUHMRwmnvBLG/vZbZocgIiKZaHhmByBmpSF1ERERETErJZwiIiIiYlZKOEVERETErJRwioiIiIhZPTbhjI+PZ86cOXz00UdUq1aNxo0bExgYyNWrV19GfM8kIiKCAwcOpDp++/ZtvLy8WLZsWZrnffvtt3Ts2PG57793715OnTr13NdJ4eHhgYeHB9HR0anKfv75Zzw8PJg5c+Zz38fPzy/D63h4eLBnz57nvo+IiIi8WR6bcM6YMYP169czePBgli1bxtixYzl58iR9+vQhKSnpZcT41AYOHEhUVFSq446OjlSvXp2wsLBUZUlJSYSGhlK/fv3nvn+PHj24cuXKc1/nYdbW1mzbti3V8S1btmBhYfFC75WetWvXUrFixZdyLxEREck6Hptwrlq1iq5du1KpUiUKFixI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BMqbwfn/pmeIiMibaXi1agxcsyazwzAbzeEUERERETEjJZwiIiIiYlYvZQw75esQ0/L+++9nWC4iIiIirzf1cIqIiIiIWSnhFBERERGz0rJweSUMr1Yts0PIsu7evYu9vX1mh5Gl6Rmbl56v+b0Kz9imRIlMvb+YlxJOeSVk5a0wMtubvhXHy6BnbF56vuanZyzmpiF1ERERETErJZwiIiIiYlZKOEVERETErJRwioiIiIhZKeEUEREREbNSwikiIiIiZqWEU0RERETMSgmniIiIiJiVEk4RERERMSslnCIiIiJiVko4RURERMSslHCKiIiIiFkp4RQRERERs1LCKSIiIiJmpYRTRERERMxKCaeIiIiImJUSThERERExKyWcIiIiImJWSjhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpIiIiImZlndkBiACMb9w4s0PIsu7evYu9vX1mh5Gl6Rmbl56v+ekZm9+LesY2JUrQZ+rUFxDRy6WEU14JY3/7LbNDEBEReeUNz+wAnpGG1EVERETErJRwioiIiIhZKeEUEREREbNSwikiIiIiZvVSE04PDw/27NljcuzAgQN4eXkxYcKEdM/z8fGhc+fOJCUlmRzft28fHh4exMfHmyXe5xEREcGBAwfSLDt//jweHh5MmzYtVVlQUBCfffbZE93jRdb18/Nj5syZT3QtERERkaeRqT2cJ06coH///tStW5f+/ftnWDc8PJxffvnlJUX2/AYOHEhUVFSGdX766SdOnTr1zPfo0KFDhom6iIiIyKsg0xLO6Oho/P398fDwYNiwYVhYWGRYv2DBgnz33Xdcv379JUVofnnz5uWbb7555vMdHBxwdnZ+gRGJiIiIvHiZknBevXqV3r17U7JkScaMGYOVldVjz2nXrh2Ojo5pDkOniI2NJSAgAG9vbxo0aEBgYCC3b982yrdt28Ynn3yCp6cn3t7eDB06lNjYWCB5yLl///50796d2rVrs3PnTu7fv8+kSZOoV68ederUYciQIVy5csW43rJly2jWrBmenp60a9eObdu2AcnD0xcuXCAwMJBRo0alG2+fPn34888/WbNmTbp1Tp06Rffu3fHy8uKjjz5i8eLFxtSCR4fJd+3aRdu2bfHy8sLf35/x48eb3D8+Pp4JEybg7e1N/fr1WbRokcm9YmJi6N69O56ennTu3Jkz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O3PkyBGWLl1KfHw806ZNo0qVKjz11FPFeRoPrS1btrB9+3bGjBlD5cqVjT+PL1++DJj3b/Pmzfn000/ZtWsXiYmJzJo1iytXrtClS5fiPA2LsEpNTTVfJSzygKSnpzNz5ky2bduGk5MTQUFBBAUFAeDr60toaCidOnUC4OjRo7z33nvGZx6OGzeOevXqFWf6D7358+ezYsWKfI/t3r2bZs2amfTx6tWrWbVqFefOncPb25vhw4ffdVRJ4Pjx40RGRnL06FHKlStH9+7dee2117CystJ1/ID4+/vz3nvvmd3Ne3v/6hq+d76+vixcuND4RItLly4xffp09u3bh5ubG0OGDOG5554DICUlhW7duvHBBx/wxBNPADd+lkRERHD27FkaNGjAhAkTqF69erGdz8Pm1v4dP348sbGxZjGVK1cmJibGrH9zcnL46KOP2LhxI6mpqTRo0IBRo0ZRu3btYjgTy1LBKSIiIiIWpSl1EREREbEoFZwiIiIiYlEqOEVERETEolRwioiIiIhFqeAUEREREYtSwSkiIiVeft8DLiIPDxWcIiJ/wZAhQ/D19eWVV14pMCYyMhJfX1+GDBlShJndm+effx5fX1/27duX7/GuXbsSGhpaJLn8lc+6evUqYWFh/Pzzz/f9+WFhYfj6+t7xJSJ/je3dQ0REJD/W1tYcP36cpKQkPD09TY7l5eWxdevWYsqscPbv309ycjLe3t58+eWXJbKgiouL4+uvvzY+uPx+VahQwezrM0Xk/qngFBH5i+rWrUtSUhJbt25lwIABJsf+85//cPnyZWrWrFlM2d3dhg0beOyxx+jcuTPz5s3j/PnzVKpUqbjTKlZ2dnY0atSouNMQKXU0pS4i8hfZ29vTvHnzfEcyN2/eTNOmTXF2djY7tnHjRl566SX8/Pzo1KkTixYtMn638k3bt28nODiYli1b4ufnR69evfj888+Nx1NSUvD19WXbtm28++67BAYGEhgYyIQJE4zf23wn169f5/vvv6d58+a0adMGa2trvvrqq3xjc3JyiIiIoHXr1jz77LNMmjSJixcvGo9nZGQwd+5cOnfujJ+fHz169CAqKors7GxjzLVr14iMjKR79+40b96cF198kfXr198xR19fXz744AOTfevXr8fX15eUlBRiYmJ4/fXXAXjzzTcJCwszxhWmj+/HkCFDmDRpEu++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v3//Akf5WrRowZYtW6hfvz61atUiNjaWw4cPm8SUL18egN27d/PII4/g7e1dqD4uSFZWltmTAG7l7e1t/MzCGjp0KMOHD2fYsGG88MILZGVl8cknn5CRkcGgQYPuqS2RkkoFp4jIA9C4cWMqVaqElZXVHR9nExwcTMWKFVmzZg2ff/455cuX54knnuD11183rnMMDQ0lPDzcePOKp6cn48ePZ8uWLXcshu7m/Pnz7Nmzhy5duuQ7AgvQunVr5s2bx9q1a40FZ/fu3cnIyGDChAnY2NjQrl073nrrLaysrACYMGECH374IatXr+bChQu4uLgQEBDA0KFDAXBwcODDDz9k0aJFLF26lGvXruHp6ck777xDt27dCsw3JCSEnJwcoqKisLKywt/fnwkTJpisz6xVqxbPPfcca9euJSEhgcjIyEL1cUEuX75McHBwgcfnz59P06ZN79jG7Xx9fVm4cCFRUVGEhoZiZ2dH48aNCQsL001C8rdhlZqaen/zMyIiIiIid6A1nCIiIiJiUSo4RURERMSiVHCKiIiIiEWp4BQRERERi1LBKSIiIiIWpYJTRERERCxKBaeIiIiIWJQKThERERGxKBWcIiIiImJR/w8NR99xBPZ7NgAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.style.use('fivethirtyeight')\n",
- "figsize(8, 4)\n",
- "\n",
- "# Dataframe to hold the results\n",
- "model_comparison = pd.DataFrame({'model':['Linear Regression',\n",
- " 'Support Vector Machine',\n",
- " 'Random Forest',\n",
- " 'Gradient Boosted',\n",
- " 'K-Nearest Neighbors'],\n",
- " 'mae':[lr_mae,\n",
- " svm_mae,\n",
- " random_forest_mae, \n",
- " gradient_boosted_mae, \n",
- " knn_mae]})\n",
- "# Horizontal bar chart of test mae\n",
- "model_comparison.sort_values('mae',ascending = False).plot(x = 'model',\n",
- " y = 'mae',\n",
- " kind = 'barh',\n",
- " color = 'red', \n",
- " edgecolor = 'black')\n",
- "# Plot formatting\n",
- "plt.ylabel('');plt.yticks(size = 14);plt.xlabel('Mean Absolute Error');plt.xticks(size = 14)\n",
- "plt.title('Model Comparison on Test MAE', size = 20);"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "集成算法的效果更好,这里由于参数只使用默认的,对SVM等这种参数影响较大的模型不太公平。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 调参"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Cross Validation\n",
- "
"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 设置相关参数\n",
- "# 要优化的损失函数\n",
- "loss = ['ls','lad','huber']\n",
- "\n",
- "# 梯度增强过程中使用的树的数量\n",
- "n_estimators = [100,500, 900, 1100,1500]\n",
- "\n",
- "# 树的最大深度\n",
- "max_depth = [2,3,5,10,15]\n",
- "\n",
- "# 每片叶子的最小样本数\n",
- "min_samples_leaf = [1,2,4,6,8]\n",
- "\n",
- "# 拆分节点的最小样本数\n",
- "min_samples_split = [2, 4, 6, 10]\n",
- "\n",
- "# 进行拆分时要考虑的最大特征数\n",
- "max_features = ['auto', 'sqrt', 'log2', None]\n",
- "\n",
- "# 定义要进行搜索的超参数网格\n",
- "hyperparameter_grid = {'loss': loss,\n",
- " 'n_estimators': n_estimators,\n",
- " 'max_depth': max_depth,\n",
- " 'min_samples_leaf': min_samples_leaf,\n",
- " 'min_samples_split': min_samples_split,\n",
- " 'max_features': max_features} "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### 随机搜索"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Create the model to use for hyperparameter tuning\n",
- "model = GradientBoostingRegressor(random_state = 42)\n",
- "\n",
- "# Set up the random search with 4-fold cross validation\n",
- "random_cv = RandomizedSearchCV(estimator=model,\n",
- " param_distributions=hyperparameter_grid,\n",
- " cv=4, n_iter=25, \n",
- " scoring = 'neg_mean_absolute_error',\n",
- " n_jobs = -1, verbose = 1, \n",
- " return_train_score = True,\n",
- " random_state=42)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Fitting 4 folds for each of 25 candidates, totalling 100 fits\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 4 concurrent workers.\n",
- "[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 5.6min\n",
- "[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 8.8min finished\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "RandomizedSearchCV(cv=4, error_score='raise-deprecating',\n",
- " estimator=GradientBoostingRegressor(alpha=0.9,\n",
- " criterion='friedman_mse',\n",
- " init=None,\n",
- " learning_rate=0.1,\n",
- " loss='ls', max_depth=3,\n",
- " max_features=None,\n",
- " max_leaf_nodes=None,\n",
- " min_impurity_decrease=0.0,\n",
- " min_impurity_split=None,\n",
- " min_samples_leaf=1,\n",
- " min_samples_split=2,\n",
- " min_weight_fraction_leaf=0.0,\n",
- " n_estimators=100,...\n",
- " iid='warn', n_iter=25, n_jobs=-1,\n",
- " param_distributions={'loss': ['ls', 'lad', 'huber'],\n",
- " 'max_depth': [2, 3, 5, 10, 15],\n",
- " 'max_features': ['auto', 'sqrt', 'log2',\n",
- " None],\n",
- " 'min_samples_leaf': [1, 2, 4, 6, 8],\n",
- " 'min_samples_split': [2, 4, 6, 10],\n",
- " 'n_estimators': [100, 500, 900, 1100,\n",
- " 1500]},\n",
- " pre_dispatch='2*n_jobs', random_state=42, refit=True,\n",
- " return_train_score=True, scoring='neg_mean_absolute_error',\n",
- " verbose=1)"
- ]
- },
- "execution_count": 22,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Fit on the training data\n",
- "random_cv.fit(X, y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " mean_fit_time | \n",
- " std_fit_time | \n",
- " mean_score_time | \n",
- " std_score_time | \n",
- " param_n_estimators | \n",
- " param_min_samples_split | \n",
- " param_min_samples_leaf | \n",
- " param_max_features | \n",
- " param_max_depth | \n",
- " param_loss | \n",
- " params | \n",
- " split0_test_score | \n",
- " split1_test_score | \n",
- " split2_test_score | \n",
- " split3_test_score | \n",
- " mean_test_score | \n",
- " std_test_score | \n",
- " rank_test_score | \n",
- " split0_train_score | \n",
- " split1_train_score | \n",
- " split2_train_score | \n",
- " split3_train_score | \n",
- " mean_train_score | \n",
- " std_train_score | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 12 | \n",
- " 10.512508 | \n",
- " 0.161444 | \n",
- " 0.021770 | \n",
- " 0.001280 | \n",
- " 500 | \n",
- " 6 | \n",
- " 6 | \n",
- " None | \n",
- " 5 | \n",
- " lad | \n",
- " {'n_estimators': 500, 'min_samples_split': 6, ... | \n",
- " -8.924621 | \n",
- " -8.775078 | \n",
- " -9.325044 | \n",
- " -9.037550 | \n",
- " -9.015523 | \n",
- " 0.201467 | \n",
- " 1 | \n",
- " -6.934705 | \n",
- " -6.837958 | \n",
- " -6.869084 | \n",
- " -6.840749 | \n",
- " -6.870624 | \n",
- " 0.038950 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 11.610687 | \n",
- " 0.557825 | \n",
- " 0.034470 | \n",
- " 0.010364 | \n",
- " 500 | \n",
- " 6 | \n",
- " 8 | \n",
- " None | \n",
- " 5 | \n",
- " huber | \n",
- " {'n_estimators': 500, 'min_samples_split': 6, ... | \n",
- " -8.872382 | \n",
- " -8.903982 | \n",
- " -9.317120 | \n",
- " -9.075047 | \n",
- " -9.042086 | \n",
- " 0.176489 | \n",
- " 2 | \n",
- " -4.384343 | \n",
- " -4.326121 | \n",
- " -4.823009 | \n",
- " -4.229809 | \n",
- " -4.440820 | \n",
- " 0.227453 | \n",
- "
\n",
- " \n",
- " 9 | \n",
- " 9.308119 | \n",
- " 0.115381 | \n",
- " 0.019372 | \n",
- " 0.002762 | \n",
- " 500 | \n",
- " 4 | \n",
- " 2 | \n",
- " auto | \n",
- " 3 | \n",
- " huber | \n",
- " {'n_estimators': 500, 'min_samples_split': 4, ... | \n",
- " -9.062297 | \n",
- " -9.042221 | \n",
- " -9.439618 | \n",
- " -9.153004 | \n",
- " -9.174248 | \n",
- " 0.158764 | \n",
- " 3 | \n",
- " -6.955777 | \n",
- " -7.088986 | \n",
- " -6.913108 | \n",
- " -6.940327 | \n",
- " -6.974550 | \n",
- " 0.067813 | \n",
- "
\n",
- " \n",
- " 0 | \n",
- " 2.768650 | \n",
- " 0.022904 | \n",
- " 0.010735 | \n",
- " 0.006010 | \n",
- " 100 | \n",
- " 2 | \n",
- " 6 | \n",
- " auto | \n",
- " 5 | \n",
- " ls | \n",
- " {'n_estimators': 100, 'min_samples_split': 2, ... | \n",
- " -9.100775 | \n",
- " -9.026372 | \n",
- " -9.457063 | \n",
- " -9.201235 | \n",
- " -9.196321 | \n",
- " 0.162799 | \n",
- " 4 | \n",
- " -7.302003 | \n",
- " -7.312645 | \n",
- " -7.173397 | \n",
- " -7.386171 | \n",
- " -7.293554 | \n",
- " 0.076569 | \n",
- "
\n",
- " \n",
- " 7 | \n",
- " 5.052495 | \n",
- " 0.146989 | \n",
- " 0.016706 | \n",
- " 0.003104 | \n",
- " 500 | \n",
- " 4 | \n",
- " 6 | \n",
- " auto | \n",
- " 3 | \n",
- " ls | \n",
- " {'n_estimators': 500, 'min_samples_split': 4, ... | \n",
- " -9.147703 | \n",
- " -9.199053 | \n",
- " -9.698781 | \n",
- " -9.358627 | \n",
- " -9.350987 | \n",
- " 0.215296 | \n",
- " 5 | \n",
- " -7.089709 | \n",
- " -7.103749 | \n",
- " -7.021418 | \n",
- " -7.080088 | \n",
- " -7.073741 | \n",
- " 0.031358 | \n",
- "
\n",
- " \n",
- " 19 | \n",
- " 12.648192 | \n",
- " 0.497953 | \n",
- " 0.025433 | \n",
- " 0.002286 | \n",
- " 1100 | \n",
- " 6 | \n",
- " 2 | \n",
- " auto | \n",
- " 3 | \n",
- " lad | \n",
- " {'n_estimators': 1100, 'min_samples_split': 6,... | \n",
- " -9.350800 | \n",
- " -9.382812 | \n",
- " -9.475236 | \n",
- " -9.291753 | \n",
- " -9.375148 | \n",
- " 0.066368 | \n",
- " 6 | \n",
- " -8.513004 | \n",
- " -8.658903 | \n",
- " -7.820534 | \n",
- " -8.017995 | \n",
- " -8.252609 | \n",
- " 0.344461 | \n",
- "
\n",
- " \n",
- " 10 | \n",
- " 62.647066 | \n",
- " 2.078449 | \n",
- " 0.127230 | \n",
- " 0.011548 | \n",
- " 1100 | \n",
- " 10 | \n",
- " 6 | \n",
- " None | \n",
- " 10 | \n",
- " huber | \n",
- " {'n_estimators': 1100, 'min_samples_split': 10... | \n",
- " -9.274382 | \n",
- " -9.242743 | \n",
- " -9.530568 | \n",
- " -9.475944 | \n",
- " -9.380872 | \n",
- " 0.124366 | \n",
- " 7 | \n",
- " -0.409811 | \n",
- " -0.459465 | \n",
- " -0.393491 | \n",
- " -0.370483 | \n",
- " -0.408312 | \n",
- " 0.032671 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 39.648134 | \n",
- " 1.619497 | \n",
- " 0.063250 | \n",
- " 0.002862 | \n",
- " 500 | \n",
- " 4 | \n",
- " 2 | \n",
- " auto | \n",
- " 10 | \n",
- " huber | \n",
- " {'n_estimators': 500, 'min_samples_split': 4, ... | \n",
- " -9.415934 | \n",
- " -9.291198 | \n",
- " -9.575363 | \n",
- " -9.429866 | \n",
- " -9.428068 | \n",
- " 0.100721 | \n",
- " 8 | \n",
- " -0.205702 | \n",
- " -0.193613 | \n",
- " -0.164415 | \n",
- " -0.141062 | \n",
- " -0.176198 | \n",
- " 0.025235 | \n",
- "
\n",
- " \n",
- " 16 | \n",
- " 17.596702 | \n",
- " 0.263915 | \n",
- " 0.041574 | \n",
- " 0.001576 | \n",
- " 1500 | \n",
- " 4 | \n",
- " 6 | \n",
- " None | \n",
- " 3 | \n",
- " ls | \n",
- " {'n_estimators': 1500, 'min_samples_split': 4,... | \n",
- " -9.248892 | \n",
- " -9.316306 | \n",
- " -9.798843 | \n",
- " -9.427920 | \n",
- " -9.447940 | \n",
- " 0.212403 | \n",
- " 9 | \n",
- " -4.821677 | \n",
- " -4.876202 | \n",
- " -4.776650 | \n",
- " -4.729506 | \n",
- " -4.801009 | \n",
- " 0.054284 | \n",
- "
\n",
- " \n",
- " 21 | \n",
- " 3.955678 | \n",
- " 0.036891 | \n",
- " 0.033909 | \n",
- " 0.007227 | \n",
- " 500 | \n",
- " 6 | \n",
- " 4 | \n",
- " log2 | \n",
- " 5 | \n",
- " huber | \n",
- " {'n_estimators': 500, 'min_samples_split': 6, ... | \n",
- " -9.365194 | \n",
- " -9.286988 | \n",
- " -9.751767 | \n",
- " -9.409179 | \n",
- " -9.453243 | \n",
- " 0.177788 | \n",
- " 10 | \n",
- " -5.733003 | \n",
- " -5.742441 | \n",
- " -5.571781 | \n",
- " -5.666476 | \n",
- " -5.678425 | \n",
- " 0.068177 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " mean_fit_time std_fit_time mean_score_time std_score_time \\\n",
- "12 10.512508 0.161444 0.021770 0.001280 \n",
- "3 11.610687 0.557825 0.034470 0.010364 \n",
- "9 9.308119 0.115381 0.019372 0.002762 \n",
- "0 2.768650 0.022904 0.010735 0.006010 \n",
- "7 5.052495 0.146989 0.016706 0.003104 \n",
- "19 12.648192 0.497953 0.025433 0.002286 \n",
- "10 62.647066 2.078449 0.127230 0.011548 \n",
- "2 39.648134 1.619497 0.063250 0.002862 \n",
- "16 17.596702 0.263915 0.041574 0.001576 \n",
- "21 3.955678 0.036891 0.033909 0.007227 \n",
- "\n",
- " param_n_estimators param_min_samples_split param_min_samples_leaf \\\n",
- "12 500 6 6 \n",
- "3 500 6 8 \n",
- "9 500 4 2 \n",
- "0 100 2 6 \n",
- "7 500 4 6 \n",
- "19 1100 6 2 \n",
- "10 1100 10 6 \n",
- "2 500 4 2 \n",
- "16 1500 4 6 \n",
- "21 500 6 4 \n",
- "\n",
- " param_max_features param_max_depth param_loss \\\n",
- "12 None 5 lad \n",
- "3 None 5 huber \n",
- "9 auto 3 huber \n",
- "0 auto 5 ls \n",
- "7 auto 3 ls \n",
- "19 auto 3 lad \n",
- "10 None 10 huber \n",
- "2 auto 10 huber \n",
- "16 None 3 ls \n",
- "21 log2 5 huber \n",
- "\n",
- " params split0_test_score \\\n",
- "12 {'n_estimators': 500, 'min_samples_split': 6, ... -8.924621 \n",
- "3 {'n_estimators': 500, 'min_samples_split': 6, ... -8.872382 \n",
- "9 {'n_estimators': 500, 'min_samples_split': 4, ... -9.062297 \n",
- "0 {'n_estimators': 100, 'min_samples_split': 2, ... -9.100775 \n",
- "7 {'n_estimators': 500, 'min_samples_split': 4, ... -9.147703 \n",
- "19 {'n_estimators': 1100, 'min_samples_split': 6,... -9.350800 \n",
- "10 {'n_estimators': 1100, 'min_samples_split': 10... -9.274382 \n",
- "2 {'n_estimators': 500, 'min_samples_split': 4, ... -9.415934 \n",
- "16 {'n_estimators': 1500, 'min_samples_split': 4,... -9.248892 \n",
- "21 {'n_estimators': 500, 'min_samples_split': 6, ... -9.365194 \n",
- "\n",
- " split1_test_score split2_test_score split3_test_score mean_test_score \\\n",
- "12 -8.775078 -9.325044 -9.037550 -9.015523 \n",
- "3 -8.903982 -9.317120 -9.075047 -9.042086 \n",
- "9 -9.042221 -9.439618 -9.153004 -9.174248 \n",
- "0 -9.026372 -9.457063 -9.201235 -9.196321 \n",
- "7 -9.199053 -9.698781 -9.358627 -9.350987 \n",
- "19 -9.382812 -9.475236 -9.291753 -9.375148 \n",
- "10 -9.242743 -9.530568 -9.475944 -9.380872 \n",
- "2 -9.291198 -9.575363 -9.429866 -9.428068 \n",
- "16 -9.316306 -9.798843 -9.427920 -9.447940 \n",
- "21 -9.286988 -9.751767 -9.409179 -9.453243 \n",
- "\n",
- " std_test_score rank_test_score split0_train_score split1_train_score \\\n",
- "12 0.201467 1 -6.934705 -6.837958 \n",
- "3 0.176489 2 -4.384343 -4.326121 \n",
- "9 0.158764 3 -6.955777 -7.088986 \n",
- "0 0.162799 4 -7.302003 -7.312645 \n",
- "7 0.215296 5 -7.089709 -7.103749 \n",
- "19 0.066368 6 -8.513004 -8.658903 \n",
- "10 0.124366 7 -0.409811 -0.459465 \n",
- "2 0.100721 8 -0.205702 -0.193613 \n",
- "16 0.212403 9 -4.821677 -4.876202 \n",
- "21 0.177788 10 -5.733003 -5.742441 \n",
- "\n",
- " split2_train_score split3_train_score mean_train_score std_train_score \n",
- "12 -6.869084 -6.840749 -6.870624 0.038950 \n",
- "3 -4.823009 -4.229809 -4.440820 0.227453 \n",
- "9 -6.913108 -6.940327 -6.974550 0.067813 \n",
- "0 -7.173397 -7.386171 -7.293554 0.076569 \n",
- "7 -7.021418 -7.080088 -7.073741 0.031358 \n",
- "19 -7.820534 -8.017995 -8.252609 0.344461 \n",
- "10 -0.393491 -0.370483 -0.408312 0.032671 \n",
- "2 -0.164415 -0.141062 -0.176198 0.025235 \n",
- "16 -4.776650 -4.729506 -4.801009 0.054284 \n",
- "21 -5.571781 -5.666476 -5.678425 0.068177 "
- ]
- },
- "execution_count": 23,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# 获取所有cv结果并按测试性能排序\n",
- "random_results = pd.DataFrame(random_cv.cv_results_).sort_values('mean_test_score', ascending = False)\n",
- "\n",
- "random_results.head(10)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "GradientBoostingRegressor(alpha=0.9, criterion='friedman_mse', init=None,\n",
- " learning_rate=0.1, loss='lad', max_depth=5,\n",
- " max_features=None, max_leaf_nodes=None,\n",
- " min_impurity_decrease=0.0, min_impurity_split=None,\n",
- " min_samples_leaf=6, min_samples_split=6,\n",
- " min_weight_fraction_leaf=0.0, n_estimators=500,\n",
- " n_iter_no_change=None, presort='auto',\n",
- " random_state=42, subsample=1.0, tol=0.0001,\n",
- " validation_fraction=0.1, verbose=0, warm_start=False)"
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "random_cv.best_estimator_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 网格搜索\n",
- "\n",
- "随机搜索找到一个大概的值,再用网格搜索更加精确的查找。"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 创建一系列要评估的树\n",
- "trees_grid = {'n_estimators': [100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800]}\n",
- "\n",
- "model = GradientBoostingRegressor(loss = 'lad', max_depth = 5,\n",
- " min_samples_leaf = 6,\n",
- " min_samples_split = 6,\n",
- " max_features = None,\n",
- " random_state = 42)\n",
- "\n",
- "# 使用树的范围和随机森林模型的网格搜索对象\n",
- "grid_search = GridSearchCV(estimator = model, \n",
- " param_grid=trees_grid, \n",
- " cv = 4, \n",
- " scoring = 'neg_mean_absolute_error', \n",
- " verbose = 1,\n",
- " n_jobs = -1, \n",
- " return_train_score = True)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Fitting 4 folds for each of 15 candidates, totalling 60 fits\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 4 concurrent workers.\n",
- "[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 1.3min\n",
- "[Parallel(n_jobs=-1)]: Done 60 out of 60 | elapsed: 2.2min finished\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "GridSearchCV(cv=4, error_score='raise-deprecating',\n",
- " estimator=GradientBoostingRegressor(alpha=0.9,\n",
- " criterion='friedman_mse',\n",
- " init=None, learning_rate=0.1,\n",
- " loss='lad', max_depth=5,\n",
- " max_features=None,\n",
- " max_leaf_nodes=None,\n",
- " min_impurity_decrease=0.0,\n",
- " min_impurity_split=None,\n",
- " min_samples_leaf=6,\n",
- " min_samples_split=6,\n",
- " min_weight_fraction_leaf=0.0,\n",
- " n_estimators=100,\n",
- " n_iter_no_change=None,\n",
- " presort='auto',\n",
- " random_state=42, subsample=1.0,\n",
- " tol=0.0001,\n",
- " validation_fraction=0.1,\n",
- " verbose=0, warm_start=False),\n",
- " iid='warn', n_jobs=-1,\n",
- " param_grid={'n_estimators': [100, 150, 200, 250, 300, 350, 400,\n",
- " 450, 500, 550, 600, 650, 700, 750,\n",
- " 800]},\n",
- " pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
- " scoring='neg_mean_absolute_error', verbose=1)"
- ]
- },
- "execution_count": 26,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Fit the grid search\n",
- "grid_search.fit(X, y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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JBIJPv30U6xfvx4///wzFixYADc3NwDai/xNmzYN2dnZ6NGjB+zt7QFoA4tSqYSLiwtcXFwAaKeyWrZsiVOnTsHPzw8jR44EoD276ueff4ZarUb//v2LpGYiIiIqeYr93Sh9fX1x6dIlhIWFoWfPnmjUqBEEQUBkZCQeP36MevXq4auvvtJvP336dISHh8Pb29tgqmzixInw9vZGQEAAgoODUbVqVVy4cAEJCQlo1aoVevbsWdxPjYiIiF4RBQaczp07P/M0bB1BELBz506TtlUoFFi8eDGCgoKwd+9eREREQBRFVK5cGV988QX69esHGxubZ+6nYsWKWLNmDfz8/HDy5EncvXsXHh4e6NOnD/r27ct3EiciInqNFZgCmjZtanLAee4HlcnQt29f9O3b95nbFjY9Vr58eUydOrUoSyMiIiIrUGDAmTZtWnHWQURERFRknmse5/jx4wgPD8fjx4/h4uKChg0b4p133jHbSA8RERHRizAp4GRmZuL//u//cObMGUgkEri4uCA5ORkbNmxAo0aNsHDhQpPWzRAREREVB5Oug+Pn54eIiAhMnToVISEh2LdvH44fP44ffvgBly5dgr+/v7nrJCIiIjKZSQHn4MGD8Pb2RqdOnfRXGpbJZOjUqROGDh2KAwcOmLVIIiIioudhUsBJSUlBrVq1jPbVqlVL/95PRERERK8CkwJOpUqVcO7cOaN94eHhKF++fJEWRURERPQyTFpk3KNHD8ybNw+2trb46KOP4OrqisTEROzfvx9//vmn0TfjJCIiIrIUkwPO5cuX4efnh5UrV+rbRVFEp06dMGjQILMVSERERPS8TAo4EokE33//Pfr3749z584hNTUVzs7OePvtt+Hp6WnuGkuOrEzIg/ciu303gNcGIiIispjnutBf9erVUb16dQDA5cuXERMTg3LlysHR0dEsxZUkQkoSbBdMgfTGf0BaKrK7cVSLiIjIUkxaZJyUlIQxY8bor3ezdetWDB48GJMmTUKvXr0QExNjzhpfeZK7N2E3c6Q23ABQbAuA7NQhC1dFRET0+jIp4CxZsgSXL1+Gl5cXAGD16tVo3Lgx1qxZAw8PDyxdutSsRb7qRLkNBGWGQZvC/zdIrl60UEVERESvN5MCzqlTpzBmzBi0bt0aly9fRnx8PPr374/atWvj888/L/AU8teFWL4iMr76CaJM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VD0Qd+LJJ59k8ODBeHjc/gwIf39/1q1bh6tr5fpCqsjPUYi7Wo2aWLv2xdq1r+3v19P/XEnZ9kpLH3e2yNMVVUV/5iT6Mydh03doej1qs3Y3Xmm17ADOsglxRZMER1RpHh4ed5TcALi4uNC0adOyCUgIUfW518LavT/W7v1tf09PQx951P5KS59wrsjTFasV/enj6E8fh99W27aZaNHuz1danbG29Aejc/nfx11OEhxRoRISEhg6dCgDBw5kwIABfPrpp1y9epXmzZuzYsUKDAYDSUlJrFmzhv3795OYmIjVasXLy4vevXvz4osv4u3tbW+voDE4uWULFixAVVW++eYbTp8+jcFgoGvXrkyYMIGWLVva2yhoDE5u2ciRIxkyZAhLlizhyJEjmM1mWrVqxahRoxgwYEC++ztz5gzLly/nyJEjZGRk0KZNG8aMGcOJEydYunQpS5YsoVu3bvnOq4jPduLEiYSGhvL999/z4YcfcuLECerUqcO0adMICLB11R87doxvv/2Wo0ePcv36derVq0efPn0YPXo0Pj4+Jb6WENVKLY88e20pV1NtPTwnw9CfCit2N3XFarGN+YkKhw3foBmcUFu0t6/BY23RXhKeciAJjnCIyMhIduzYgb+/P82aNaNGjRoYDAZiYmIYP348V69epWXLlgQEBHDt2jWOHz/OL7/8QkhICN9//z01atQo9hobNmxg586dNGvWjN69e3Pq1Cl27NjBoUOHWLduHfXq1Su2jejoaF588UXc3d3p3LkzycnJhIeH884777BgwQL69+9vPzYsLIzJkyeTmZlJ27Zt6dSpE+Hh4bz++uu0bdu2iKuUrcI+21xTpkzBZDLRt29fTp48aY/tp59+4uOPP0ZVVTp06IC3tzfR0dH8/PPPbN26lUWLFuW7j8KuZbFYKux+hahoWm1PLL0Csfw5S0tJS7H17OSO4UmKK/J8xZJj6xGKPAqsQnNywtrC397Do7ZoB07GCriT6k0SnDvk/vwAR4dQKtdX/c/RIQC2AclPP/00kydPBkD9c42KRYsWcfXqVd544w2eeuop+/GpqamMHTuWuLg4du3alW+Ac0F27tzJlClTePzxxwHIyclh0qRJHDp0iF9//bVEs64OHDjAkCFDmDJlCs7Ott+wlixZwtdff833339vT3BycnJ47733yMzM5N1332Xo0KEA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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 将结果导入数据框\n",
- "results = pd.DataFrame(grid_search.cv_results_)\n",
- "\n",
- "# 绘制训练误差和测试误差与树木数量的关系图\n",
- "figsize(8, 8)\n",
- "plt.style.use('fivethirtyeight')\n",
- "plt.plot(results['param_n_estimators'], -1 * results['mean_test_score'], label = 'Testing Error')\n",
- "plt.plot(results['param_n_estimators'], -1 * results['mean_train_score'], label = 'Training Error')\n",
- "plt.xlabel('Number of Trees'); plt.ylabel('Mean Abosolute Error'); plt.legend();\n",
- "plt.title('Performance vs Number of Trees');"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " mean_fit_time | \n",
- " std_fit_time | \n",
- " mean_score_time | \n",
- " std_score_time | \n",
- " param_n_estimators | \n",
- " params | \n",
- " split0_test_score | \n",
- " split1_test_score | \n",
- " split2_test_score | \n",
- " split3_test_score | \n",
- " mean_test_score | \n",
- " std_test_score | \n",
- " rank_test_score | \n",
- " split0_train_score | \n",
- " split1_train_score | \n",
- " split2_train_score | \n",
- " split3_train_score | \n",
- " mean_train_score | \n",
- " std_train_score | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 13 | \n",
- " 14.369840 | \n",
- " 0.281917 | \n",
- " 0.032413 | \n",
- " 0.004375 | \n",
- " 750 | \n",
- " {'n_estimators': 750} | \n",
- " -8.901092 | \n",
- " -8.751699 | \n",
- " -9.298411 | \n",
- " -9.049730 | \n",
- " -9.000181 | \n",
- " 0.201836 | \n",
- " 1 | \n",
- " -6.716494 | \n",
- " -6.660453 | \n",
- " -6.520818 | \n",
- " -6.579989 | \n",
- " -6.619438 | \n",
- " 0.074807 | \n",
- "
\n",
- " \n",
- " 14 | \n",
- " 14.957021 | \n",
- " 0.327790 | \n",
- " 0.030169 | \n",
- " 0.001295 | \n",
- " 800 | \n",
- " {'n_estimators': 800} | \n",
- " -8.903857 | \n",
- " -8.758299 | \n",
- " -9.296941 | \n",
- " -9.047485 | \n",
- " -9.001594 | \n",
- " 0.198793 | \n",
- " 2 | \n",
- " -6.689643 | \n",
- " -6.648109 | \n",
- " -6.486269 | \n",
- " -6.530287 | \n",
- " -6.588577 | \n",
- " 0.083101 | \n",
- "
\n",
- " \n",
- " 12 | \n",
- " 13.406416 | \n",
- " 0.316643 | \n",
- " 0.028174 | \n",
- " 0.001915 | \n",
- " 700 | \n",
- " {'n_estimators': 700} | \n",
- " -8.904269 | \n",
- " -8.755862 | \n",
- " -9.312990 | \n",
- " -9.053755 | \n",
- " -9.006666 | \n",
- " 0.205811 | \n",
- " 3 | \n",
- " -6.743886 | \n",
- " -6.695770 | \n",
- " -6.611240 | \n",
- " -6.624919 | \n",
- " -6.668953 | \n",
- " 0.053861 | \n",
- "
\n",
- " \n",
- " 11 | \n",
- " 12.764133 | \n",
- " 0.196318 | \n",
- " 0.026181 | \n",
- " 0.000824 | \n",
- " 650 | \n",
- " {'n_estimators': 650} | \n",
- " -8.906208 | \n",
- " -8.755401 | \n",
- " -9.325190 | \n",
- " -9.052215 | \n",
- " -9.009699 | \n",
- " 0.210186 | \n",
- " 4 | \n",
- " -6.778068 | \n",
- " -6.721452 | \n",
- " -6.708191 | \n",
- " -6.666758 | \n",
- " -6.718617 | \n",
- " 0.039814 | \n",
- "
\n",
- " \n",
- " 9 | \n",
- " 10.654021 | \n",
- " 0.313924 | \n",
- " 0.029671 | \n",
- " 0.008415 | \n",
- " 550 | \n",
- " {'n_estimators': 550} | \n",
- " -8.918502 | \n",
- " -8.756938 | \n",
- " -9.325492 | \n",
- " -9.042721 | \n",
- " -9.010861 | \n",
- " 0.207970 | \n",
- " 5 | \n",
- " -6.874737 | \n",
- " -6.781878 | \n",
- " -6.809121 | \n",
- " -6.745712 | \n",
- " -6.802862 | \n",
- " 0.047201 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " mean_fit_time std_fit_time mean_score_time std_score_time \\\n",
- "13 14.369840 0.281917 0.032413 0.004375 \n",
- "14 14.957021 0.327790 0.030169 0.001295 \n",
- "12 13.406416 0.316643 0.028174 0.001915 \n",
- "11 12.764133 0.196318 0.026181 0.000824 \n",
- "9 10.654021 0.313924 0.029671 0.008415 \n",
- "\n",
- " param_n_estimators params split0_test_score \\\n",
- "13 750 {'n_estimators': 750} -8.901092 \n",
- "14 800 {'n_estimators': 800} -8.903857 \n",
- "12 700 {'n_estimators': 700} -8.904269 \n",
- "11 650 {'n_estimators': 650} -8.906208 \n",
- "9 550 {'n_estimators': 550} -8.918502 \n",
- "\n",
- " split1_test_score split2_test_score split3_test_score mean_test_score \\\n",
- "13 -8.751699 -9.298411 -9.049730 -9.000181 \n",
- "14 -8.758299 -9.296941 -9.047485 -9.001594 \n",
- "12 -8.755862 -9.312990 -9.053755 -9.006666 \n",
- "11 -8.755401 -9.325190 -9.052215 -9.009699 \n",
- "9 -8.756938 -9.325492 -9.042721 -9.010861 \n",
- "\n",
- " std_test_score rank_test_score split0_train_score split1_train_score \\\n",
- "13 0.201836 1 -6.716494 -6.660453 \n",
- "14 0.198793 2 -6.689643 -6.648109 \n",
- "12 0.205811 3 -6.743886 -6.695770 \n",
- "11 0.210186 4 -6.778068 -6.721452 \n",
- "9 0.207970 5 -6.874737 -6.781878 \n",
- "\n",
- " split2_train_score split3_train_score mean_train_score std_train_score \n",
- "13 -6.520818 -6.579989 -6.619438 0.074807 \n",
- "14 -6.486269 -6.530287 -6.588577 0.083101 \n",
- "12 -6.611240 -6.624919 -6.668953 0.053861 \n",
- "11 -6.708191 -6.666758 -6.718617 0.039814 \n",
- "9 -6.809121 -6.745712 -6.802862 0.047201 "
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "results.sort_values('mean_test_score', ascending = False).head(5)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}