{ "cells": [ { "cell_type": "markdown", "id": "76dc69f3-2413-4686-bfe9-cafc08f20c27", "metadata": {}, "source": [ "# AutoML for wage prediction" ] }, { "cell_type": "markdown", "id": "e8342cb7", "metadata": { "papermill": { "duration": 0.013777, "end_time": "2021-03-24T11:24:18.450894", "exception": false, "start_time": "2021-03-24T11:24:18.437117", "status": "completed" }, "tags": [] }, "source": [ "## Automatic Machine Learning with H2O AutoML using Wage Data from 2015" ] }, { "cell_type": "markdown", "id": "1fbd05b7", "metadata": { "papermill": { "duration": 0.014076, "end_time": "2021-03-24T11:24:18.478815", "exception": false, "start_time": "2021-03-24T11:24:18.464739", "status": "completed" }, "tags": [] }, "source": [ "We illustrate how to predict an outcome variable Y in a high-dimensional setting, using the AutoML package *H2O* that covers the complete pipeline from the raw dataset to the deployable machine learning model. In last few years, AutoML or automated machine learning has become widely popular among data science community. " ] }, { "cell_type": "markdown", "id": "5333433f", "metadata": { "papermill": { "duration": 0.013915, "end_time": "2021-03-24T11:24:18.508556", "exception": false, "start_time": "2021-03-24T11:24:18.494641", "status": "completed" }, "tags": [] }, "source": [ "We can use AutoML as a benchmark and compare it to the methods that we used in the previous notebook where we applied one machine learning method after the other." ] }, { "cell_type": "code", "execution_count": 10, "id": "dd30c6a6", "metadata": {}, "outputs": [], "source": [ "# Import relevant packages\n", "import pandas as pd\n", "import numpy as np\n", "import pyreadr\n", "import os\n", "from urllib.request import urlopen\n", "from sklearn import preprocessing\n", "import patsy\n", "from h2o.automl import H2OAutoML\n", "\n", "from numpy import loadtxt\n", "from keras.models import Sequential\n", "from keras.layers import Dense\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 2, "id": "fb1130e2-716b-49c7-b6f3-e7061fc1dd9e", "metadata": {}, "outputs": [], "source": [ "#pip install h2o" ] }, { "cell_type": "code", "execution_count": 11, "id": "0e6d7d98", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking whether there is an H2O instance running at http://localhost:54321 . connected.\n" ] }, { "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", "
H2O_cluster_uptime:4 hours 11 mins
H2O_cluster_timezone:America/Bogota
H2O_data_parsing_timezone:UTC
H2O_cluster_version:3.36.1.3
H2O_cluster_version_age:26 days
H2O_cluster_name:H2O_from_python_User_fi8ht0
H2O_cluster_total_nodes:1
H2O_cluster_free_memory:2.467 Gb
H2O_cluster_total_cores:4
H2O_cluster_allowed_cores:4
H2O_cluster_status:locked, healthy
H2O_connection_url:http://localhost:54321
H2O_connection_proxy:{\"http\": null, \"https\": null}
H2O_internal_security:False
Python_version:3.9.12 final
" ], "text/plain": [ "-------------------------- -----------------------------\n", "H2O_cluster_uptime: 4 hours 11 mins\n", "H2O_cluster_timezone: America/Bogota\n", "H2O_data_parsing_timezone: UTC\n", "H2O_cluster_version: 3.36.1.3\n", "H2O_cluster_version_age: 26 days\n", "H2O_cluster_name: H2O_from_python_User_fi8ht0\n", "H2O_cluster_total_nodes: 1\n", "H2O_cluster_free_memory: 2.467 Gb\n", "H2O_cluster_total_cores: 4\n", "H2O_cluster_allowed_cores: 4\n", "H2O_cluster_status: locked, healthy\n", "H2O_connection_url: http://localhost:54321\n", "H2O_connection_proxy: {\"http\": null, \"https\": null}\n", "H2O_internal_security: False\n", "Python_version: 3.9.12 final\n", "-------------------------- -----------------------------" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# load the H2O package\n", "import h2o\n", "\n", "# start h2o cluster\n", "h2o.init()" ] }, { "cell_type": "code", "execution_count": 12, "id": "6de4a8bc-161e-4e0a-ae67-45bab3517933", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "link=\"https://raw.githubusercontent.com/d2cml-ai/14.388_py/main/data/wage2015_subsample_inference.Rdata\"\n", "response = urlopen(link)\n", "content = response.read()\n", "fhandle = open( 'wage2015_subsample_inference.Rdata', 'wb')\n", "fhandle.write(content)\n", "fhandle.close()\n", "result = pyreadr.read_r(\"wage2015_subsample_inference.Rdata\")\n", "os.remove(\"wage2015_subsample_inference.Rdata\")\n", "\n", "# Extracting the data frame from rdata_read\n", "data = result[ 'data' ]\n", "n = data.shape[0]\n", "type(data)" ] }, { "cell_type": "code", "execution_count": 13, "id": "305bb8e2", "metadata": {}, "outputs": [], "source": [ "# Import relevant packages for splitting data\n", "import random\n", "import math\n", "\n", "# Set Seed\n", "# to make the results replicable (generating random numbers)\n", "np.random.seed(0)\n", "random = np.random.randint(0, data.shape[0], size=math.floor(data.shape[0]))\n", "data[\"random\"] = random\n", "random # the array does not change \n", "data_2 = data.sort_values(by=['random'])" ] }, { "cell_type": "code", "execution_count": 14, "id": "52dd607c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3862, 21)\n", "(1288, 21)\n" ] } ], "source": [ "# Create training and testing sample \n", "train = data_2[ : math.floor(n*3/4)] # training sample\n", "test = data_2[ math.floor(n*3/4) : ] # testing sample\n", "print(train.shape)\n", "print(test.shape)" ] }, { "cell_type": "code", "execution_count": 15, "id": "bed9f791", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking whether there is an H2O instance running at http://localhost:54321 . connected.\n" ] }, { "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", "
H2O_cluster_uptime:4 hours 12 mins
H2O_cluster_timezone:America/Bogota
H2O_data_parsing_timezone:UTC
H2O_cluster_version:3.36.1.3
H2O_cluster_version_age:26 days
H2O_cluster_name:H2O_from_python_User_fi8ht0
H2O_cluster_total_nodes:1
H2O_cluster_free_memory:2.467 Gb
H2O_cluster_total_cores:4
H2O_cluster_allowed_cores:4
H2O_cluster_status:locked, healthy
H2O_connection_url:http://localhost:54321
H2O_connection_proxy:{\"http\": null, \"https\": null}
H2O_internal_security:False
Python_version:3.9.12 final
" ], "text/plain": [ "-------------------------- -----------------------------\n", "H2O_cluster_uptime: 4 hours 12 mins\n", "H2O_cluster_timezone: America/Bogota\n", "H2O_data_parsing_timezone: UTC\n", "H2O_cluster_version: 3.36.1.3\n", "H2O_cluster_version_age: 26 days\n", "H2O_cluster_name: H2O_from_python_User_fi8ht0\n", "H2O_cluster_total_nodes: 1\n", "H2O_cluster_free_memory: 2.467 Gb\n", "H2O_cluster_total_cores: 4\n", "H2O_cluster_allowed_cores: 4\n", "H2O_cluster_status: locked, healthy\n", "H2O_connection_url: http://localhost:54321\n", "H2O_connection_proxy: {\"http\": null, \"https\": null}\n", "H2O_internal_security: False\n", "Python_version: 3.9.12 final\n", "-------------------------- -----------------------------" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# start h2o cluster\n", "h2o.init()" ] }, { "cell_type": "code", "execution_count": 16, "id": "bb269c76", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parse progress: |████████████████████████████████████████████████████████████████| (done) 100%\n", "Parse progress: |████████████████████████████████████████████████████████████████| (done) 100%\n", "Rows:3862\n", "Cols:21\n", "\n", "\n" ] }, { "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", "
wage lwage sex shs hsg scl clg ad mw so we ne exp1 exp2 exp3 exp4 occ occ2 ind ind2 random
type real real int int int int int int int int int int real real real real int int int int int
mins 3.021978021978022 1.10591159114972130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 1.0 370.0 2.0 0.0
mean 23.4654177314672022.969427791239379 0.446918694976696 0.0235629207664422580.247022268254790260.2780942516830658 0.3125323666494045 0.138788192646297240.25530813050233040.298291040911444870.215691351631279140.2307094769549456213.6721905748317282.99230321077161378.15417316157433 24.8497603346711465243.41843604350411.69135163127914 6667.99611600207313.3337648886587061914.2263076126374
maxs 528.845673076923 6.270696655981913 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 47.0 22.09 103.823 487.9681 100000.0 22.0 100000.0 22.0 3825.0
sigma 21.4300857435067660.57508937089339250.49723877097042930.15170256601034887 0.4313356487428773 0.448118104070973130.463585519808550450.3457701367976389 0.436090737870262 0.457567162363124670.4113543571812672 0.4213414081729523 10.5986136870326553.987480265404191 14.42474448790359753.27996156215637 11579.911146621046.97834165856571255588.2642823549115.691380293915183 1104.7025392074318
zeros 0 0 2136 3771 2908 2788 2655 3326 2876 2710 3029 2971 48 48 48 48 0 0 0 0 3
missing0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 26.4423076923076933.274965291519244 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 29.0 8.41 24.389 70.7281 340.0 1.0 8660.0 20.0 0.0
1 19.23076923076923 2.95651156040070970.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 33.5 11.2225 37.595375 125.94450625 9620.0 22.0 1870.0 5.0 0.0
2 48.07692307692308 3.872802292274865 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 2.0 0.04 0.008 0.0016 3060.0 10.0 8190.0 18.0 0.0
3 12.01923076923077 2.486507931154974 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 29.0 8.41 24.389 70.7281 6440.0 19.0 770.0 4.0 2.0
4 39.90384615384615 3.68647271408337131.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 12.0 1.44 1.728 2.0736 1820.0 5.0 7860.0 17.0 2.0
5 13.1578947368421042.57702193869580580.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 11.0 1.21 1.331 1.4641 8810.0 21.0 3895.0 6.0 3.0
6 20.1923076923076933.005301724570142 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 17.0 2.89 4.913 8.3521 7200.0 20.0 8770.0 21.0 4.0
7 12.01923076923077 2.486507931154974 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 7.0 0.49 0.343 0.2401 5610.0 17.0 4265.0 7.0 5.0
8 28.8461538461538473.361976668508874 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 8.0 0.64 0.512 0.4096 5240.0 17.0 6970.0 12.0 7.0
9 34.13461538461539 3.530311983328089 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 38.0 14.44 54.872 208.5136 5550.0 17.0 6370.0 10.0 7.0
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# convert data as h2o type\n", "train_h = h2o.H2OFrame(train)\n", "test_h = h2o.H2OFrame(test)\n", "\n", "# have a look at the data\n", "train_h.describe()\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "1f0bfa3f", "metadata": {}, "outputs": [], "source": [ "# define the variables\n", "y = 'lwage'\n", "\n", "data_columns = list(data)\n", "no_relev_col = ['wage','occ2', 'ind2', 'random', 'lwage']\n", "\n", "# This gives us: new_list = ['carrot' , 'lemon']\n", "x = [col for col in data_columns if col not in no_relev_col]\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "57c48dce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AutoML progress: |█\n", "05:14:21.267: AutoML: XGBoost is not available; skipping it.\n", "\n", "██████████████████████████████████████████████████████████████| (done) 100%\n", "Model Details\n", "=============\n", "H2OStackedEnsembleEstimator : Stacked Ensemble\n", "Model Key: StackedEnsemble_AllModels_1_AutoML_2_20220804_51421\n", "\n", "No model summary for this model\n", "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on train data. **\n", "\n", "MSE: 0.14963411645818037\n", "RMSE: 0.38682569260350375\n", "MAE: 0.29493414661545647\n", "RMSLE: 0.09962964024727533\n", "R^2: 0.5474439172253015\n", "Mean Residual Deviance: 0.14963411645818037\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3855\n", "Null deviance: 1276.9399854672324\n", "Residual deviance: 577.8869577614926\n", "AIC: 3639.772059449712\n", "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on cross-validation data. **\n", "\n", "MSE: 0.21847845950742845\n", "RMSE: 0.4674167942077268\n", "MAE: 0.35554195972164104\n", "RMSLE: 0.11935352477830528\n", "R^2: 0.3392298618411601\n", "Mean Residual Deviance: 0.21847845950742845\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3854\n", "Null deviance: 1277.1043650451534\n", "Residual deviance: 843.7638106176887\n", "AIC: 5103.517182973992\n", "\n", "Cross-Validation Metrics Summary: \n" ] }, { "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", "
meansdcv_1_validcv_2_validcv_3_validcv_4_validcv_5_valid
0mae0.3555370.0111490.3588560.3656650.3368520.3549340.361377
1mean_residual_deviance0.2186580.0181640.2322280.2262810.1915590.2088520.234372
2mse0.2186580.0181640.2322280.2262810.1915590.2088520.234372
3null_deviance255.42087018.944805270.143950279.337650235.192600252.053120240.377060
4r20.3391520.0246810.3320460.3429150.3670030.3523540.301443
5residual_deviance168.74406013.997013180.441440183.513900148.841520163.113280167.810170
6rmse0.4672780.0196860.4819010.4756900.4376750.4570030.484120
7rmsle0.1193070.0046190.1224570.1212970.1113120.1194220.122048
\n", "
" ], "text/plain": [ " mean sd cv_1_valid cv_2_valid \\\n", "0 mae 0.355537 0.011149 0.358856 0.365665 \n", "1 mean_residual_deviance 0.218658 0.018164 0.232228 0.226281 \n", "2 mse 0.218658 0.018164 0.232228 0.226281 \n", "3 null_deviance 255.420870 18.944805 270.143950 279.337650 \n", "4 r2 0.339152 0.024681 0.332046 0.342915 \n", "5 residual_deviance 168.744060 13.997013 180.441440 183.513900 \n", "6 rmse 0.467278 0.019686 0.481901 0.475690 \n", "7 rmsle 0.119307 0.004619 0.122457 0.121297 \n", "\n", " cv_3_valid cv_4_valid cv_5_valid \n", "0 0.336852 0.354934 0.361377 \n", "1 0.191559 0.208852 0.234372 \n", "2 0.191559 0.208852 0.234372 \n", "3 235.192600 252.053120 240.377060 \n", "4 0.367003 0.352354 0.301443 \n", "5 148.841520 163.113280 167.810170 \n", "6 0.437675 0.457003 0.484120 \n", "7 0.111312 0.119422 0.122048 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# run AutoML for 10 base models and a maximal runtime of 100 seconds\n", "# Run AutoML for 30 seconds\n", "aml = H2OAutoML(max_runtime_secs = 100, max_models = 10, seed = 1)\n", "aml.train(x = x, y = y, training_frame = train_h, leaderboard_frame = test_h)\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "88df97d7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
model_id rmse mse mae rmsle mean_residual_deviance
StackedEnsemble_AllModels_1_AutoML_1_20220722_170939 0.47064 0.2215020.3539430.120368 0.221502
GBM_2_AutoML_1_20220722_170939 0.4718490.2226420.3559410.12074 0.222642
GBM_5_AutoML_1_20220722_170939 0.47191 0.2226990.35582 0.120501 0.222699
StackedEnsemble_BestOfFamily_1_AutoML_1_20220722_1709390.4737980.2244840.3575980.121491 0.224484
GBM_3_AutoML_1_20220722_170939 0.4745850.22523 0.3593090.121264 0.22523
GBM_1_AutoML_1_20220722_170939 0.4781490.2286260.3622110.122278 0.228626
GBM_4_AutoML_1_20220722_170939 0.4790720.22951 0.3629160.122456 0.22951
GBM_grid_1_AutoML_1_20220722_170939_model_1 0.48001 0.23041 0.36381 0.122671 0.23041
XRT_1_AutoML_1_20220722_170939 0.4912180.2412950.3750890.125318 0.241295
DRF_1_AutoML_1_20220722_170939 0.50224 0.2522450.3826060.12847 0.252245
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# AutoML Leaderboard\n", "lb = aml.leaderboard\n", "print(lb)" ] }, { "cell_type": "markdown", "id": "d295cdc1", "metadata": {}, "source": [ "We see that two Stacked Ensembles are at the top of the leaderboard. Stacked Ensembles often outperform a single model. The out-of-sample (test) MSE of the leading model is given by" ] }, { "cell_type": "code", "execution_count": 23, "id": "800f6aba", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.22150159010610537" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aml.leaderboard['mse'][0,0]" ] }, { "cell_type": "markdown", "id": "6c9c7ec9", "metadata": {}, "source": [ "The in-sample performance can be evaluated by" ] }, { "cell_type": "code", "execution_count": 24, "id": "7e47ac17", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Details\n", "=============\n", "H2OStackedEnsembleEstimator : Stacked Ensemble\n", "Model Key: StackedEnsemble_AllModels_1_AutoML_1_20220722_170939\n", "\n", "No model summary for this model\n", "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on train data. **\n", "\n", "MSE: 0.15027004489538795\n", "RMSE: 0.38764680431468534\n", "MAE: 0.2955371675604367\n", "RMSLE: 0.09990016533775842\n", "R^2: 0.5455206039510314\n", "Mean Residual Deviance: 0.15027004489538795\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3854\n", "Null deviance: 1276.9399854672324\n", "Residual deviance: 580.3429133859883\n", "AIC: 3658.1503537307485\n", "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on cross-validation data. **\n", "\n", "MSE: 0.2185070080606413\n", "RMSE: 0.46744733185744175\n", "MAE: 0.35554501482828577\n", "RMSLE: 0.11935774800872184\n", "R^2: 0.3391435190891413\n", "Mean Residual Deviance: 0.2185070080606413\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3853\n", "Null deviance: 1277.1043650451534\n", "Residual deviance: 843.8740651301968\n", "AIC: 5106.021797066896\n", "\n", "Cross-Validation Metrics Summary: \n" ] }, { "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", "
meansdcv_1_validcv_2_validcv_3_validcv_4_validcv_5_valid
0mae0.3555750.0111500.3586940.3655970.3367750.3554300.361377
1mean_residual_deviance0.2186850.0181490.2322070.2262130.1914510.2091820.234372
2mse0.2186850.0181490.2322070.2262130.1914510.2091820.234372
3null_deviance255.42087018.944805270.143950279.337650235.192600252.053120240.377060
4r20.3390710.0246540.3321080.3431130.3673600.3513310.301443
5residual_deviance168.76434013.983558180.424550183.458680148.757460163.370830167.810170
6rmse0.4673060.0196740.4818780.4756180.4375510.4573640.484120
7rmsle0.1193100.0046320.1224370.1212790.1112710.1195140.122048
\n", "
" ], "text/plain": [ " mean sd cv_1_valid cv_2_valid \\\n", "0 mae 0.355575 0.011150 0.358694 0.365597 \n", "1 mean_residual_deviance 0.218685 0.018149 0.232207 0.226213 \n", "2 mse 0.218685 0.018149 0.232207 0.226213 \n", "3 null_deviance 255.420870 18.944805 270.143950 279.337650 \n", "4 r2 0.339071 0.024654 0.332108 0.343113 \n", "5 residual_deviance 168.764340 13.983558 180.424550 183.458680 \n", "6 rmse 0.467306 0.019674 0.481878 0.475618 \n", "7 rmsle 0.119310 0.004632 0.122437 0.121279 \n", "\n", " cv_3_valid cv_4_valid cv_5_valid \n", "0 0.336775 0.355430 0.361377 \n", "1 0.191451 0.209182 0.234372 \n", "2 0.191451 0.209182 0.234372 \n", "3 235.192600 252.053120 240.377060 \n", "4 0.367360 0.351331 0.301443 \n", "5 148.757460 163.370830 167.810170 \n", "6 0.437551 0.457364 0.484120 \n", "7 0.111271 0.119514 0.122048 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aml.leader" ] }, { "cell_type": "markdown", "id": "ca0b36af", "metadata": { "papermill": { "duration": 0.027663, "end_time": "2021-03-24T11:25:13.491063", "exception": false, "start_time": "2021-03-24T11:25:13.463400", "status": "completed" }, "tags": [] }, "source": [ "This is in line with our previous results. To understand how the ensemble works, let's take a peek inside the Stacked Ensemble \"All Models\" model. The \"All Models\" ensemble is an ensemble of all of the individual models in the AutoML run. This is often the top performing model on the leaderboard." ] }, { "cell_type": "code", "execution_count": 25, "id": "95549783", "metadata": {}, "outputs": [], "source": [ "model_ids = h2o.as_list(aml.leaderboard['model_id'][0], use_pandas=True)\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "c2236931", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'StackedEnsemble_AllModels_1_AutoML_1_20220722_170939'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = model_ids[model_ids['model_id'].str.contains(\"StackedEnsemble_AllModels\")].values.tolist()\n", "model_id = model[0][0]\n", "model_id" ] }, { "cell_type": "code", "execution_count": 30, "id": "615b33c4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Details\n", "=============\n", "H2OStackedEnsembleEstimator : Stacked Ensemble\n", "Model Key: StackedEnsemble_AllModels_1_AutoML_1_20220722_170939\n", "\n", "No model summary for this model\n", "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on train data. **\n", "\n", "MSE: 0.15027004489538795\n", "RMSE: 0.38764680431468534\n", "MAE: 0.2955371675604367\n", "RMSLE: 0.09990016533775842\n", "R^2: 0.5455206039510314\n", "Mean Residual Deviance: 0.15027004489538795\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3854\n", "Null deviance: 1276.9399854672324\n", "Residual deviance: 580.3429133859883\n", "AIC: 3658.1503537307485\n", "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on cross-validation data. **\n", "\n", "MSE: 0.2185070080606413\n", "RMSE: 0.46744733185744175\n", "MAE: 0.35554501482828577\n", "RMSLE: 0.11935774800872184\n", "R^2: 0.3391435190891413\n", "Mean Residual Deviance: 0.2185070080606413\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3853\n", "Null deviance: 1277.1043650451534\n", "Residual deviance: 843.8740651301968\n", "AIC: 5106.021797066896\n", "\n", "Cross-Validation Metrics Summary: \n" ] }, { "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", "
meansdcv_1_validcv_2_validcv_3_validcv_4_validcv_5_valid
0mae0.3555750.0111500.3586940.3655970.3367750.3554300.361377
1mean_residual_deviance0.2186850.0181490.2322070.2262130.1914510.2091820.234372
2mse0.2186850.0181490.2322070.2262130.1914510.2091820.234372
3null_deviance255.42087018.944805270.143950279.337650235.192600252.053120240.377060
4r20.3390710.0246540.3321080.3431130.3673600.3513310.301443
5residual_deviance168.76434013.983558180.424550183.458680148.757460163.370830167.810170
6rmse0.4673060.0196740.4818780.4756180.4375510.4573640.484120
7rmsle0.1193100.0046320.1224370.1212790.1112710.1195140.122048
\n", "
" ], "text/plain": [ " mean sd cv_1_valid cv_2_valid \\\n", "0 mae 0.355575 0.011150 0.358694 0.365597 \n", "1 mean_residual_deviance 0.218685 0.018149 0.232207 0.226213 \n", "2 mse 0.218685 0.018149 0.232207 0.226213 \n", "3 null_deviance 255.420870 18.944805 270.143950 279.337650 \n", "4 r2 0.339071 0.024654 0.332108 0.343113 \n", "5 residual_deviance 168.764340 13.983558 180.424550 183.458680 \n", "6 rmse 0.467306 0.019674 0.481878 0.475618 \n", "7 rmsle 0.119310 0.004632 0.122437 0.121279 \n", "\n", " cv_3_valid cv_4_valid cv_5_valid \n", "0 0.336775 0.355430 0.361377 \n", "1 0.191451 0.209182 0.234372 \n", "2 0.191451 0.209182 0.234372 \n", "3 235.192600 252.053120 240.377060 \n", "4 0.367360 0.351331 0.301443 \n", "5 148.757460 163.370830 167.810170 \n", "6 0.437551 0.457364 0.484120 \n", "7 0.111271 0.119514 0.122048 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "se = h2o.get_model(model_id)\n", "se" ] }, { "cell_type": "code", "execution_count": 31, "id": "439e8999", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Details\n", "=============\n", "H2OGeneralizedLinearEstimator : Generalized Linear Modeling\n", "Model Key: metalearner_AUTO_StackedEnsemble_AllModels_1_AutoML_1_20220722_170939\n", "\n", "\n", "GLM Model: summary\n" ] }, { "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", "
familylinkregularizationlambda_searchnumber_of_predictors_totalnumber_of_active_predictorsnumber_of_iterationstraining_frame
0gaussianidentityElastic Net (alpha = 0.5, lambda = 0.002551 )nlambda = 100, lambda.max = 0.2219, lambda.min = 0.002551, lambda....10749levelone_training_StackedEnsemble_AllModels_1_AutoML_1_20220722_17...
\n", "
" ], "text/plain": [ " family link regularization \\\n", "0 gaussian identity Elastic Net (alpha = 0.5, lambda = 0.002551 ) \n", "\n", " lambda_search \\\n", "0 nlambda = 100, lambda.max = 0.2219, lambda.min = 0.002551, lambda.... \n", "\n", " number_of_predictors_total number_of_active_predictors \\\n", "0 10 7 \n", "\n", " number_of_iterations \\\n", "0 49 \n", "\n", " training_frame \n", "0 levelone_training_StackedEnsemble_AllModels_1_AutoML_1_20220722_17... " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "ModelMetricsRegressionGLM: glm\n", "** Reported on train data. **\n", "\n", "MSE: 0.21727419974117612\n", "RMSE: 0.4661268065035266\n", "MAE: 0.35448759076481845\n", "RMSLE: 0.11902010738109643\n", "R^2: 0.3428720464937892\n", "Mean Residual Deviance: 0.21727419974117612\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3854\n", "Null deviance: 1276.9399854672324\n", "Residual deviance: 839.1129594004221\n", "AIC: 5082.170839083037\n", "\n", "ModelMetricsRegressionGLM: glm\n", "** Reported on cross-validation data. **\n", "\n", "MSE: 0.2185070080606413\n", "RMSE: 0.46744733185744175\n", "MAE: 0.35554501482828577\n", "RMSLE: 0.11935774800872184\n", "R^2: 0.3391435190891413\n", "Mean Residual Deviance: 0.2185070080606413\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3853\n", "Null deviance: 1277.1043650451534\n", "Residual deviance: 843.8740651301968\n", "AIC: 5106.021797066896\n", "\n", "Cross-Validation Metrics Summary: \n" ] }, { "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", "
meansdcv_1_validcv_2_validcv_3_validcv_4_validcv_5_valid
0mae0.3555750.0111500.3586940.3655970.3367750.3554300.361377
1mean_residual_deviance0.2186850.0181490.2322070.2262130.1914510.2091820.234372
2mse0.2186850.0181490.2322070.2262130.1914510.2091820.234372
3null_deviance255.42087018.944805270.143950279.337650235.192600252.053120240.377060
4r20.3390710.0246540.3321080.3431130.3673600.3513310.301443
5residual_deviance168.76434013.983558180.424550183.458680148.757460163.370830167.810170
6rmse0.4673060.0196740.4818780.4756180.4375510.4573640.484120
7rmsle0.1193100.0046320.1224370.1212790.1112710.1195140.122048
\n", "
" ], "text/plain": [ " mean sd cv_1_valid cv_2_valid \\\n", "0 mae 0.355575 0.011150 0.358694 0.365597 \n", "1 mean_residual_deviance 0.218685 0.018149 0.232207 0.226213 \n", "2 mse 0.218685 0.018149 0.232207 0.226213 \n", "3 null_deviance 255.420870 18.944805 270.143950 279.337650 \n", "4 r2 0.339071 0.024654 0.332108 0.343113 \n", "5 residual_deviance 168.764340 13.983558 180.424550 183.458680 \n", "6 rmse 0.467306 0.019674 0.481878 0.475618 \n", "7 rmsle 0.119310 0.004632 0.122437 0.121279 \n", "\n", " cv_3_valid cv_4_valid cv_5_valid \n", "0 0.336775 0.355430 0.361377 \n", "1 0.191451 0.209182 0.234372 \n", "2 0.191451 0.209182 0.234372 \n", "3 235.192600 252.053120 240.377060 \n", "4 0.367360 0.351331 0.301443 \n", "5 148.757460 163.370830 167.810170 \n", "6 0.437551 0.457364 0.484120 \n", "7 0.111271 0.119514 0.122048 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Scoring History: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampdurationiterationlambdapredictorsdeviance_traindeviance_xvaldeviance_sealphaiterationstraining_rmsetraining_deviancetraining_maetraining_r2
02022-07-22 17:10:180.000 sec1,22E010.3306420.3306520.0082160.5NaN
12022-07-22 17:10:180.000 sec2,2E050.3160660.3306090.0082200.5NaN
22022-07-22 17:10:180.000 sec3,18E060.3020490.3306270.0082160.5NaN
32022-07-22 17:10:180.000 sec4,17E060.2898480.3221570.0085120.5NaN
42022-07-22 17:10:180.016 sec5,15E070.2792870.3076940.0084070.55.00.5284760.2792870.4077320.155318
52022-07-22 17:10:180.016 sec6,14E070.2700070.2948010.0083230.5NaN
62022-07-22 17:10:180.016 sec7,13E070.2620860.2836210.0082530.5NaN
72022-07-22 17:10:180.016 sec8,12E070.2553350.2738750.0082260.5NaN
82022-07-22 17:10:180.016 sec9,11E080.2495860.2654710.0082060.5NaN
92022-07-22 17:10:180.016 sec10,96E-180.2445980.2583040.0081880.510.00.4945680.2445980.3775880.260234
102022-07-22 17:10:180.032 sec11,88E-180.2404600.2522040.0081750.5NaN
112022-07-22 17:10:180.032 sec12,8E-180.2369260.2469500.0081890.5NaN
122022-07-22 17:10:180.032 sec13,73E-180.2339430.2425300.0081940.5NaN
132022-07-22 17:10:180.032 sec14,66E-180.2314230.2387740.0081960.5NaN
142022-07-22 17:10:180.032 sec15,6E-180.2292930.2356080.0082040.515.00.4788460.2292930.3640870.306521
152022-07-22 17:10:180.032 sec16,55E-180.2274950.2329350.0082100.5NaN
162022-07-22 17:10:180.032 sec17,5E-180.2261540.2306820.0082160.5NaN
172022-07-22 17:10:180.047 sec18,46E-180.2246420.2287830.0082200.5NaN
182022-07-22 17:10:180.047 sec19,42E-180.2237370.2273370.0082110.5NaN
192022-07-22 17:10:180.047 sec20,38E-180.2226420.2258250.0082380.520.00.4718490.2226420.3583770.326639
\n", "
" ], "text/plain": [ " timestamp duration iteration lambda predictors \\\n", "0 2022-07-22 17:10:18 0.000 sec 1 ,22E0 1 \n", "1 2022-07-22 17:10:18 0.000 sec 2 ,2E0 5 \n", "2 2022-07-22 17:10:18 0.000 sec 3 ,18E0 6 \n", "3 2022-07-22 17:10:18 0.000 sec 4 ,17E0 6 \n", "4 2022-07-22 17:10:18 0.016 sec 5 ,15E0 7 \n", "5 2022-07-22 17:10:18 0.016 sec 6 ,14E0 7 \n", "6 2022-07-22 17:10:18 0.016 sec 7 ,13E0 7 \n", "7 2022-07-22 17:10:18 0.016 sec 8 ,12E0 7 \n", "8 2022-07-22 17:10:18 0.016 sec 9 ,11E0 8 \n", "9 2022-07-22 17:10:18 0.016 sec 10 ,96E-1 8 \n", "10 2022-07-22 17:10:18 0.032 sec 11 ,88E-1 8 \n", "11 2022-07-22 17:10:18 0.032 sec 12 ,8E-1 8 \n", "12 2022-07-22 17:10:18 0.032 sec 13 ,73E-1 8 \n", "13 2022-07-22 17:10:18 0.032 sec 14 ,66E-1 8 \n", "14 2022-07-22 17:10:18 0.032 sec 15 ,6E-1 8 \n", "15 2022-07-22 17:10:18 0.032 sec 16 ,55E-1 8 \n", "16 2022-07-22 17:10:18 0.032 sec 17 ,5E-1 8 \n", "17 2022-07-22 17:10:18 0.047 sec 18 ,46E-1 8 \n", "18 2022-07-22 17:10:18 0.047 sec 19 ,42E-1 8 \n", "19 2022-07-22 17:10:18 0.047 sec 20 ,38E-1 8 \n", "\n", " deviance_train deviance_xval deviance_se alpha iterations \\\n", "0 0.330642 0.330652 0.008216 0.5 NaN \n", "1 0.316066 0.330609 0.008220 0.5 NaN \n", "2 0.302049 0.330627 0.008216 0.5 NaN \n", "3 0.289848 0.322157 0.008512 0.5 NaN \n", "4 0.279287 0.307694 0.008407 0.5 5.0 \n", "5 0.270007 0.294801 0.008323 0.5 NaN \n", "6 0.262086 0.283621 0.008253 0.5 NaN \n", "7 0.255335 0.273875 0.008226 0.5 NaN \n", "8 0.249586 0.265471 0.008206 0.5 NaN \n", "9 0.244598 0.258304 0.008188 0.5 10.0 \n", "10 0.240460 0.252204 0.008175 0.5 NaN \n", "11 0.236926 0.246950 0.008189 0.5 NaN \n", "12 0.233943 0.242530 0.008194 0.5 NaN \n", "13 0.231423 0.238774 0.008196 0.5 NaN \n", "14 0.229293 0.235608 0.008204 0.5 15.0 \n", "15 0.227495 0.232935 0.008210 0.5 NaN \n", "16 0.226154 0.230682 0.008216 0.5 NaN \n", "17 0.224642 0.228783 0.008220 0.5 NaN \n", "18 0.223737 0.227337 0.008211 0.5 NaN \n", "19 0.222642 0.225825 0.008238 0.5 20.0 \n", "\n", " training_rmse training_deviance training_mae training_r2 \n", "0 \n", "1 \n", "2 \n", "3 \n", "4 0.528476 0.279287 0.407732 0.155318 \n", "5 \n", "6 \n", "7 \n", "8 \n", "9 0.494568 0.244598 0.377588 0.260234 \n", "10 \n", "11 \n", "12 \n", "13 \n", "14 0.478846 0.229293 0.364087 0.306521 \n", "15 \n", "16 \n", "17 \n", "18 \n", "19 0.471849 0.222642 0.358377 0.326639 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "See the whole table with table.as_data_frame()\n", "\n", "Variable Importances: \n" ] }, { "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", "
variablerelative_importancescaled_importancepercentage
0GBM_5_AutoML_1_20220722_1709390.1564441.0000000.459637
1GBM_3_AutoML_1_20220722_1709390.0641770.4102200.188552
2GBM_1_AutoML_1_20220722_1709390.0450770.2881320.132436
3GBM_grid_1_AutoML_1_20220722_170939_model_10.0429870.2747770.126298
4GBM_4_AutoML_1_20220722_1709390.0222510.1422270.065373
5DeepLearning_1_AutoML_1_20220722_1709390.0094290.0602680.027701
6DRF_1_AutoML_1_20220722_1709390.0000010.0000070.000003
7GBM_2_AutoML_1_20220722_1709390.0000000.0000000.000000
8XRT_1_AutoML_1_20220722_1709390.0000000.0000000.000000
9GLM_1_AutoML_1_20220722_1709390.0000000.0000000.000000
\n", "
" ], "text/plain": [ " variable relative_importance \\\n", "0 GBM_5_AutoML_1_20220722_170939 0.156444 \n", "1 GBM_3_AutoML_1_20220722_170939 0.064177 \n", "2 GBM_1_AutoML_1_20220722_170939 0.045077 \n", "3 GBM_grid_1_AutoML_1_20220722_170939_model_1 0.042987 \n", "4 GBM_4_AutoML_1_20220722_170939 0.022251 \n", "5 DeepLearning_1_AutoML_1_20220722_170939 0.009429 \n", "6 DRF_1_AutoML_1_20220722_170939 0.000001 \n", "7 GBM_2_AutoML_1_20220722_170939 0.000000 \n", "8 XRT_1_AutoML_1_20220722_170939 0.000000 \n", "9 GLM_1_AutoML_1_20220722_170939 0.000000 \n", "\n", " scaled_importance percentage \n", "0 1.000000 0.459637 \n", "1 0.410220 0.188552 \n", "2 0.288132 0.132436 \n", "3 0.274777 0.126298 \n", "4 0.142227 0.065373 \n", "5 0.060268 0.027701 \n", "6 0.000007 0.000003 \n", "7 0.000000 0.000000 \n", "8 0.000000 0.000000 \n", "9 0.000000 0.000000 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get the Stacked Ensemble metalearner model\n", "metalearner = se.metalearner()\n", "metalearner" ] }, { "cell_type": "markdown", "id": "06402906", "metadata": {}, "source": [ "Examine the variable importance of the metalearner (combiner) algorithm in the ensemble. This shows us how much each base learner is contributing to the ensemble. The AutoML Stacked Ensembles use the default metalearner algorithm (GLM with non-negative weights), so the variable importance of the metalearner is actually the standardized coefficient magnitudes of the GLM." ] }, { "cell_type": "markdown", "id": "7425b332", "metadata": {}, "source": [ "The table above gives us the variable importance of the metalearner in the ensemble. The AutoML Stacked Ensembles use the default metalearner algorithm (GLM with non-negative weights), so the variable importance of the metalearner is actually the standardized coefficient magnitudes of the GLM. \n" ] }, { "cell_type": "code", "execution_count": 32, "id": "4d86b390", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Intercept': 2.969427791239395,\n", " 'GBM_2_AutoML_1_20220722_170939': 0.0,\n", " 'GBM_5_AutoML_1_20220722_170939': 0.1564442116943833,\n", " 'GBM_3_AutoML_1_20220722_170939': 0.06417658529927933,\n", " 'GBM_1_AutoML_1_20220722_170939': 0.04507655475235933,\n", " 'GBM_4_AutoML_1_20220722_170939': 0.02225052417703666,\n", " 'GBM_grid_1_AutoML_1_20220722_170939_model_1': 0.0429872925804153,\n", " 'XRT_1_AutoML_1_20220722_170939': 0.0,\n", " 'DRF_1_AutoML_1_20220722_170939': 1.1143189727895769e-06,\n", " 'GLM_1_AutoML_1_20220722_170939': 0.0,\n", " 'DeepLearning_1_AutoML_1_20220722_170939': 0.009428554928469175}" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metalearner.coef_norm()" ] }, { "cell_type": "code", "execution_count": 33, "id": "b4160a06", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "metalearner.std_coef_plot()" ] }, { "cell_type": "code", "execution_count": 34, "id": "d08c1586", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Details\n", "=============\n", "H2OGeneralizedLinearEstimator : Generalized Linear Modeling\n", "Model Key: metalearner_AUTO_StackedEnsemble_AllModels_1_AutoML_1_20220722_170939\n", "\n", "\n", "GLM Model: summary\n" ] }, { "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", "
familylinkregularizationlambda_searchnumber_of_predictors_totalnumber_of_active_predictorsnumber_of_iterationstraining_frame
0gaussianidentityElastic Net (alpha = 0.5, lambda = 0.002551 )nlambda = 100, lambda.max = 0.2219, lambda.min = 0.002551, lambda....10749levelone_training_StackedEnsemble_AllModels_1_AutoML_1_20220722_17...
\n", "
" ], "text/plain": [ " family link regularization \\\n", "0 gaussian identity Elastic Net (alpha = 0.5, lambda = 0.002551 ) \n", "\n", " lambda_search \\\n", "0 nlambda = 100, lambda.max = 0.2219, lambda.min = 0.002551, lambda.... \n", "\n", " number_of_predictors_total number_of_active_predictors \\\n", "0 10 7 \n", "\n", " number_of_iterations \\\n", "0 49 \n", "\n", " training_frame \n", "0 levelone_training_StackedEnsemble_AllModels_1_AutoML_1_20220722_17... " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "ModelMetricsRegressionGLM: glm\n", "** Reported on train data. **\n", "\n", "MSE: 0.21727419974117612\n", "RMSE: 0.4661268065035266\n", "MAE: 0.35448759076481845\n", "RMSLE: 0.11902010738109643\n", "R^2: 0.3428720464937892\n", "Mean Residual Deviance: 0.21727419974117612\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3854\n", "Null deviance: 1276.9399854672324\n", "Residual deviance: 839.1129594004221\n", "AIC: 5082.170839083037\n", "\n", "ModelMetricsRegressionGLM: glm\n", "** Reported on cross-validation data. **\n", "\n", "MSE: 0.2185070080606413\n", "RMSE: 0.46744733185744175\n", "MAE: 0.35554501482828577\n", "RMSLE: 0.11935774800872184\n", "R^2: 0.3391435190891413\n", "Mean Residual Deviance: 0.2185070080606413\n", "Null degrees of freedom: 3861\n", "Residual degrees of freedom: 3853\n", "Null deviance: 1277.1043650451534\n", "Residual deviance: 843.8740651301968\n", "AIC: 5106.021797066896\n", "\n", "Cross-Validation Metrics Summary: \n" ] }, { "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", "
meansdcv_1_validcv_2_validcv_3_validcv_4_validcv_5_valid
0mae0.3555750.0111500.3586940.3655970.3367750.3554300.361377
1mean_residual_deviance0.2186850.0181490.2322070.2262130.1914510.2091820.234372
2mse0.2186850.0181490.2322070.2262130.1914510.2091820.234372
3null_deviance255.42087018.944805270.143950279.337650235.192600252.053120240.377060
4r20.3390710.0246540.3321080.3431130.3673600.3513310.301443
5residual_deviance168.76434013.983558180.424550183.458680148.757460163.370830167.810170
6rmse0.4673060.0196740.4818780.4756180.4375510.4573640.484120
7rmsle0.1193100.0046320.1224370.1212790.1112710.1195140.122048
\n", "
" ], "text/plain": [ " mean sd cv_1_valid cv_2_valid \\\n", "0 mae 0.355575 0.011150 0.358694 0.365597 \n", "1 mean_residual_deviance 0.218685 0.018149 0.232207 0.226213 \n", "2 mse 0.218685 0.018149 0.232207 0.226213 \n", "3 null_deviance 255.420870 18.944805 270.143950 279.337650 \n", "4 r2 0.339071 0.024654 0.332108 0.343113 \n", "5 residual_deviance 168.764340 13.983558 180.424550 183.458680 \n", "6 rmse 0.467306 0.019674 0.481878 0.475618 \n", "7 rmsle 0.119310 0.004632 0.122437 0.121279 \n", "\n", " cv_3_valid cv_4_valid cv_5_valid \n", "0 0.336775 0.355430 0.361377 \n", "1 0.191451 0.209182 0.234372 \n", "2 0.191451 0.209182 0.234372 \n", "3 235.192600 252.053120 240.377060 \n", "4 0.367360 0.351331 0.301443 \n", "5 148.757460 163.370830 167.810170 \n", "6 0.437551 0.457364 0.484120 \n", "7 0.111271 0.119514 0.122048 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Scoring History: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampdurationiterationlambdapredictorsdeviance_traindeviance_xvaldeviance_sealphaiterationstraining_rmsetraining_deviancetraining_maetraining_r2
02022-07-22 17:10:180.000 sec1,22E010.3306420.3306520.0082160.5NaN
12022-07-22 17:10:180.000 sec2,2E050.3160660.3306090.0082200.5NaN
22022-07-22 17:10:180.000 sec3,18E060.3020490.3306270.0082160.5NaN
32022-07-22 17:10:180.000 sec4,17E060.2898480.3221570.0085120.5NaN
42022-07-22 17:10:180.016 sec5,15E070.2792870.3076940.0084070.55.00.5284760.2792870.4077320.155318
52022-07-22 17:10:180.016 sec6,14E070.2700070.2948010.0083230.5NaN
62022-07-22 17:10:180.016 sec7,13E070.2620860.2836210.0082530.5NaN
72022-07-22 17:10:180.016 sec8,12E070.2553350.2738750.0082260.5NaN
82022-07-22 17:10:180.016 sec9,11E080.2495860.2654710.0082060.5NaN
92022-07-22 17:10:180.016 sec10,96E-180.2445980.2583040.0081880.510.00.4945680.2445980.3775880.260234
102022-07-22 17:10:180.032 sec11,88E-180.2404600.2522040.0081750.5NaN
112022-07-22 17:10:180.032 sec12,8E-180.2369260.2469500.0081890.5NaN
122022-07-22 17:10:180.032 sec13,73E-180.2339430.2425300.0081940.5NaN
132022-07-22 17:10:180.032 sec14,66E-180.2314230.2387740.0081960.5NaN
142022-07-22 17:10:180.032 sec15,6E-180.2292930.2356080.0082040.515.00.4788460.2292930.3640870.306521
152022-07-22 17:10:180.032 sec16,55E-180.2274950.2329350.0082100.5NaN
162022-07-22 17:10:180.032 sec17,5E-180.2261540.2306820.0082160.5NaN
172022-07-22 17:10:180.047 sec18,46E-180.2246420.2287830.0082200.5NaN
182022-07-22 17:10:180.047 sec19,42E-180.2237370.2273370.0082110.5NaN
192022-07-22 17:10:180.047 sec20,38E-180.2226420.2258250.0082380.520.00.4718490.2226420.3583770.326639
\n", "
" ], "text/plain": [ " timestamp duration iteration lambda predictors \\\n", "0 2022-07-22 17:10:18 0.000 sec 1 ,22E0 1 \n", "1 2022-07-22 17:10:18 0.000 sec 2 ,2E0 5 \n", "2 2022-07-22 17:10:18 0.000 sec 3 ,18E0 6 \n", "3 2022-07-22 17:10:18 0.000 sec 4 ,17E0 6 \n", "4 2022-07-22 17:10:18 0.016 sec 5 ,15E0 7 \n", "5 2022-07-22 17:10:18 0.016 sec 6 ,14E0 7 \n", "6 2022-07-22 17:10:18 0.016 sec 7 ,13E0 7 \n", "7 2022-07-22 17:10:18 0.016 sec 8 ,12E0 7 \n", "8 2022-07-22 17:10:18 0.016 sec 9 ,11E0 8 \n", "9 2022-07-22 17:10:18 0.016 sec 10 ,96E-1 8 \n", "10 2022-07-22 17:10:18 0.032 sec 11 ,88E-1 8 \n", "11 2022-07-22 17:10:18 0.032 sec 12 ,8E-1 8 \n", "12 2022-07-22 17:10:18 0.032 sec 13 ,73E-1 8 \n", "13 2022-07-22 17:10:18 0.032 sec 14 ,66E-1 8 \n", "14 2022-07-22 17:10:18 0.032 sec 15 ,6E-1 8 \n", "15 2022-07-22 17:10:18 0.032 sec 16 ,55E-1 8 \n", "16 2022-07-22 17:10:18 0.032 sec 17 ,5E-1 8 \n", "17 2022-07-22 17:10:18 0.047 sec 18 ,46E-1 8 \n", "18 2022-07-22 17:10:18 0.047 sec 19 ,42E-1 8 \n", "19 2022-07-22 17:10:18 0.047 sec 20 ,38E-1 8 \n", "\n", " deviance_train deviance_xval deviance_se alpha iterations \\\n", "0 0.330642 0.330652 0.008216 0.5 NaN \n", "1 0.316066 0.330609 0.008220 0.5 NaN \n", "2 0.302049 0.330627 0.008216 0.5 NaN \n", "3 0.289848 0.322157 0.008512 0.5 NaN \n", "4 0.279287 0.307694 0.008407 0.5 5.0 \n", "5 0.270007 0.294801 0.008323 0.5 NaN \n", "6 0.262086 0.283621 0.008253 0.5 NaN \n", "7 0.255335 0.273875 0.008226 0.5 NaN \n", "8 0.249586 0.265471 0.008206 0.5 NaN \n", "9 0.244598 0.258304 0.008188 0.5 10.0 \n", "10 0.240460 0.252204 0.008175 0.5 NaN \n", "11 0.236926 0.246950 0.008189 0.5 NaN \n", "12 0.233943 0.242530 0.008194 0.5 NaN \n", "13 0.231423 0.238774 0.008196 0.5 NaN \n", "14 0.229293 0.235608 0.008204 0.5 15.0 \n", "15 0.227495 0.232935 0.008210 0.5 NaN \n", "16 0.226154 0.230682 0.008216 0.5 NaN \n", "17 0.224642 0.228783 0.008220 0.5 NaN \n", "18 0.223737 0.227337 0.008211 0.5 NaN \n", "19 0.222642 0.225825 0.008238 0.5 20.0 \n", "\n", " training_rmse training_deviance training_mae training_r2 \n", "0 \n", "1 \n", "2 \n", "3 \n", "4 0.528476 0.279287 0.407732 0.155318 \n", "5 \n", "6 \n", "7 \n", "8 \n", "9 0.494568 0.244598 0.377588 0.260234 \n", "10 \n", "11 \n", "12 \n", "13 \n", "14 0.478846 0.229293 0.364087 0.306521 \n", "15 \n", "16 \n", "17 \n", "18 \n", "19 0.471849 0.222642 0.358377 0.326639 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "See the whole table with table.as_data_frame()\n", "\n", "Variable Importances: \n" ] }, { "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", "
variablerelative_importancescaled_importancepercentage
0GBM_5_AutoML_1_20220722_1709390.1564441.0000000.459637
1GBM_3_AutoML_1_20220722_1709390.0641770.4102200.188552
2GBM_1_AutoML_1_20220722_1709390.0450770.2881320.132436
3GBM_grid_1_AutoML_1_20220722_170939_model_10.0429870.2747770.126298
4GBM_4_AutoML_1_20220722_1709390.0222510.1422270.065373
5DeepLearning_1_AutoML_1_20220722_1709390.0094290.0602680.027701
6DRF_1_AutoML_1_20220722_1709390.0000010.0000070.000003
7GBM_2_AutoML_1_20220722_1709390.0000000.0000000.000000
8XRT_1_AutoML_1_20220722_1709390.0000000.0000000.000000
9GLM_1_AutoML_1_20220722_1709390.0000000.0000000.000000
\n", "
" ], "text/plain": [ " variable relative_importance \\\n", "0 GBM_5_AutoML_1_20220722_170939 0.156444 \n", "1 GBM_3_AutoML_1_20220722_170939 0.064177 \n", "2 GBM_1_AutoML_1_20220722_170939 0.045077 \n", "3 GBM_grid_1_AutoML_1_20220722_170939_model_1 0.042987 \n", "4 GBM_4_AutoML_1_20220722_170939 0.022251 \n", "5 DeepLearning_1_AutoML_1_20220722_170939 0.009429 \n", "6 DRF_1_AutoML_1_20220722_170939 0.000001 \n", "7 GBM_2_AutoML_1_20220722_170939 0.000000 \n", "8 XRT_1_AutoML_1_20220722_170939 0.000000 \n", "9 GLM_1_AutoML_1_20220722_170939 0.000000 \n", "\n", " scaled_importance percentage \n", "0 1.000000 0.459637 \n", "1 0.410220 0.188552 \n", "2 0.288132 0.132436 \n", "3 0.274777 0.126298 \n", "4 0.142227 0.065373 \n", "5 0.060268 0.027701 \n", "6 0.000007 0.000003 \n", "7 0.000000 0.000000 \n", "8 0.000000 0.000000 \n", "9 0.000000 0.000000 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h2o.get_model(model_id).metalearner()" ] }, { "cell_type": "markdown", "id": "a8f423ad", "metadata": { "papermill": { "duration": 0.030956, "end_time": "2021-03-24T11:25:14.345344", "exception": false, "start_time": "2021-03-24T11:25:14.314388", "status": "completed" }, "tags": [] }, "source": [ "## Generating Predictions Using Leader Model\n", "\n", "We can also generate predictions on a test sample using the leader model object." ] }, { "cell_type": "code", "execution_count": 35, "id": "90dd2625", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "stackedensemble prediction progress: |███████████████████████████████████████████| (done) 100%\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
predict
2.88073
3.32158
3.08133
2.73111
2.51044
3.13355
3.18375
3.74316
2.58496
3.3082
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = aml.predict(test_h)\n", "pred.head()" ] }, { "cell_type": "markdown", "id": "cbb85276", "metadata": {}, "source": [ "This allows us to estimate the out-of-sample (test) MSE and the standard error as well." ] }, { "cell_type": "code", "execution_count": 36, "id": "d38d7686", "metadata": {}, "outputs": [], "source": [ "pred_2 = pred.as_data_frame()\n", "pred_aml = pred_2.to_numpy()" ] }, { "cell_type": "code", "execution_count": 37, "id": "3b5cb41a", "metadata": {}, "outputs": [], "source": [ "Y_test = test_h['lwage'].as_data_frame().to_numpy()" ] }, { "cell_type": "code", "execution_count": 38, "id": "3b070b47", "metadata": {}, "outputs": [], "source": [ "import statsmodels.api as sm\n", "import statsmodels.formula.api as smf" ] }, { "cell_type": "code", "execution_count": 39, "id": "7602a9e8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Coef. 0.221502\n", "Std.Err. 0.012942\n", "Name: const, dtype: float64" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resid_basic = (Y_test-pred_aml)**2\n", "\n", "MSE_aml_basic = sm.OLS( resid_basic , np.ones( resid_basic.shape[0] ) ).fit().summary2().tables[1].iloc[0, 0:2]\n", "MSE_aml_basic" ] }, { "cell_type": "markdown", "id": "6725164f", "metadata": {}, "source": [ "We observe both a lower MSE and a lower standard error compared to our previous results (see [here](https://www.kaggle.com/janniskueck/pm3-notebook-newdata))." ] }, { "cell_type": "markdown", "id": "e03b4c5b", "metadata": { "tags": [] }, "source": [ "### By using model_performance()\n", "If needed, the standard model_performance() method can be applied to the AutoML leader model and a test set to generate an H2O model performance object.\n", "\n" ] }, { "cell_type": "code", "execution_count": 40, "id": "caaedabd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "ModelMetricsRegressionGLM: stackedensemble\n", "** Reported on test data. **\n", "\n", "MSE: 0.22150159010610537\n", "RMSE: 0.4706395543365489\n", "MAE: 0.353942656628514\n", "RMSLE: 0.12036767274774818\n", "R^2: 0.2835426043371053\n", "Mean Residual Deviance: 0.22150159010610537\n", "Null degrees of freedom: 1287\n", "Residual degrees of freedom: 1280\n", "Null deviance: 398.23902107893576\n", "Residual deviance: 285.2940480566637\n", "AIC: 1731.7504037354604\n" ] }, { "data": { "text/plain": [] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "perf = aml.leader.model_performance(test_h)\n", "perf" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.12" } }, "nbformat": 4, "nbformat_minor": 5 }