The lares package provides a streamlined interface to
h2o’s AutoML for automated machine learning. This vignette demonstrates
how to build, evaluate, and interpret models with minimal code.
Install and load required packages:
h2o must be installed separately:
# Install h2o (run once)
# install.packages("h2o")
library(h2o)
# Initialize h2o quietly for vignette
Sys.unsetenv("http_proxy")
Sys.unsetenv("https_proxy")
h2o.init(nthreads = -1, max_mem_size = "2G", ip = "127.0.0.1")
#>
#> H2O is not running yet, starting it now...
#>
#> Note: In case of errors look at the following log files:
#> /var/folders/_9/97xqjz8j4cx_q5m_3t646mdm0000gn/T//Rtmpl5cGQ0/file4ca320b67f28/h2o_bernardo_started_from_r.out
#> /var/folders/_9/97xqjz8j4cx_q5m_3t646mdm0000gn/T//Rtmpl5cGQ0/file4ca32d562bdf/h2o_bernardo_started_from_r.err
#>
#>
#> Starting H2O JVM and connecting: ... Connection successful!
#>
#> R is connected to the H2O cluster:
#> H2O cluster uptime: 3 seconds 462 milliseconds
#> H2O cluster timezone: Europe/Madrid
#> H2O data parsing timezone: UTC
#> H2O cluster version: 3.44.0.3
#> H2O cluster version age: 2 years, 4 months and 2 days
#> H2O cluster name: H2O_started_from_R_bernardo_rna358
#> H2O cluster total nodes: 1
#> H2O cluster total memory: 1.76 GB
#> H2O cluster total cores: 12
#> H2O cluster allowed cores: 12
#> H2O cluster healthy: TRUE
#> H2O Connection ip: 127.0.0.1
#> H2O Connection port: 54321
#> H2O Connection proxy: NA
#> H2O Internal Security: FALSE
#> R Version: R version 4.5.3 (2026-03-11)
h2o.no_progress() # Disable progress barsIn short, these are the steps that happen on
h2o_automl’s backend:
Input Processing: The function receives a
dataframe df and the dependent variable y to
predict. Set seed for reproducibility.
Model Type Detection: Automatically decides
between classification (categorical) or regression (continuous) based on
y’s class and unique values (controlled by
thresh parameter).
Data Splitting: Splits data into test and train
datasets. Control the proportion with split parameter.
Replicate this with msplit().
Preprocessing:
no_outliersimpute = TRUE)balance = TRUE)model_preprocess()Model Training: Runs
h2o::h2o.automl() to train multiple models and generate a
leaderboard sorted by performance. Customize with:
max_models or max_timenfolds for k-fold cross-validationexclude_algos and include_algosModel Selection: Selects the best model based on
performance metric (change with stopping_metric). Use
h2o_selectmodel() to choose an alternative.
Performance Evaluation: Calculates metrics and
plots using test predictions (unseen data). Replicate with
model_metrics().
Results: Returns a list with inputs,
leaderboard, best model, metrics, and plots. Export with
export_results().
Let’s build a model to predict Titanic survival:
data(dft)
# Train an AutoML model
# Binary classification
model <- h2o_automl(
df = dft,
y = "Survived",
target = "TRUE",
ignore = c("Ticket", "Cabin", "PassengerId"),
max_models = 10,
max_time = 120,
impute = FALSE
)
#> [90m# A tibble: 2 × 5[39m
#> tag n p order pcum
#> [3m[90m<lgl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m FALSE 549 61.6 1 61.6
#> [90m2[39m TRUE 342 38.4 2 100
#> train_size test_size
#> 623 268
#> model_id auc logloss aucpr
#> 1 GBM_4_AutoML_1_20260423_85339 0.8655135 0.4261943 0.8323496
#> 2 GBM_3_AutoML_1_20260423_85339 0.8628015 0.4334215 0.8260966
#> 3 GBM_2_AutoML_1_20260423_85339 0.8589818 0.4318601 0.8276204
#> mean_per_class_error rmse mse
#> 1 0.1807105 0.3635268 0.1321517
#> 2 0.1725745 0.3662049 0.1341061
#> 3 0.1843010 0.3652161 0.1333828
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%
#> Model (1/10): GBM_4_AutoML_1_20260423_85339
#> Dependent Variable: Survived
#> Type: Classification (2 classes)
#> Algorithm: GBM
#> Split: 70% training data (of 891 observations)
#> Seed: 0
#>
#> Test metrics:
#> AUC = 0.86366
#> ACC = 0.18657
#> PRC = 0.19355
#> TPR = 0.34615
#> TNR = 0.085366
#>
#> Most important variables:
#> Sex (40.8%)
#> Fare (20.8%)
#> Age (16.2%)
#> Pclass (14.6%)
#> SibSp (3.2%)
# View results
print(model)
#> Model (1/10): GBM_4_AutoML_1_20260423_85339
#> Dependent Variable: Survived
#> Type: Classification (2 classes)
#> Algorithm: GBM
#> Split: 70% training data (of 891 observations)
#> Seed: 0
#>
#> Test metrics:
#> AUC = 0.86366
#> ACC = 0.18657
#> PRC = 0.19355
#> TPR = 0.34615
#> TNR = 0.085366
#>
#> Most important variables:
#> Sex (40.8%)
#> Fare (20.8%)
#> Age (16.2%)
#> Pclass (14.6%)
#> SibSp (3.2%)That’s it! h2o_automl() handles:
The model object contains:
names(model)
#> [1] "model" "y" "scores_test" "metrics"
#> [5] "parameters" "importance" "datasets" "scoring_history"
#> [9] "categoricals" "type" "split" "threshold"
#> [13] "model_name" "algorithm" "leaderboard" "project"
#> [17] "ignored" "seed" "h2o" "plots"Key components: - model: Best h2o model -
metrics: Performance metrics - importance:
Variable importance - datasets: Train/test data used -
parameters: Configuration used
View detailed metrics:
# All metrics
model$metrics
#> $dictionary
#> [1] "AUC: Area Under the Curve"
#> [2] "ACC: Accuracy"
#> [3] "PRC: Precision = Positive Predictive Value"
#> [4] "TPR: Sensitivity = Recall = Hit rate = True Positive Rate"
#> [5] "TNR: Specificity = Selectivity = True Negative Rate"
#> [6] "Logloss (Error): Logarithmic loss [Neutral classification: 0.69315]"
#> [7] "Gain: When best n deciles selected, what % of the real target observations are picked?"
#> [8] "Lift: When best n deciles selected, how much better than random is?"
#>
#> $confusion_matrix
#> Pred
#> Real FALSE TRUE
#> FALSE 14 150
#> TRUE 68 36
#>
#> $gain_lift
#> [90m# A tibble: 10 × 10[39m
#> percentile value random target total gain optimal lift response score
#> [3m[90m<fct>[39m[23m [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m 1[39m 1 TRUE 10.8 29 29 27.9 27.9 158. 27.9 90.0
#> [90m 2[39m 2 TRUE 20.1 22 25 49.0 51.9 143. 21.2 78.1
#> [90m 3[39m 3 TRUE 30.2 16 27 64.4 77.9 113. 15.4 51.6
#> [90m 4[39m 4 TRUE 39.9 13 26 76.9 100 92.7 12.5 29.2
#> [90m 5[39m 5 TRUE 50 6 27 82.7 100 65.4 5.77 20.7
#> [90m 6[39m 6 TRUE 60.1 5 27 87.5 100 45.7 4.81 14.8
#> [90m 7[39m 7 TRUE 69.8 6 26 93.3 100 33.7 5.77 12.3
#> [90m 8[39m 8 TRUE 79.9 1 27 94.2 100 18.0 0.962 9.31
#> [90m 9[39m 9 TRUE 89.9 3 27 97.1 100 8.00 2.88 6.12
#> [90m10[39m 10 TRUE 100 3 27 100 100 0 2.88 1.54
#>
#> $metrics
#> AUC ACC PRC TPR TNR
#> 1 0.86366 0.18657 0.19355 0.34615 0.085366
#>
#> $cv_metrics
#> [90m# A tibble: 20 × 8[39m
#> metric mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid
#> [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m 1[39m accuracy 0.855 0.033[4m1[24m 0.856 0.904 0.864 0.815 0.839
#> [90m 2[39m auc 0.861 0.042[4m4[24m 0.876 0.924 0.860 0.815 0.831
#> [90m 3[39m err 0.145 0.033[4m1[24m 0.144 0.096 0.136 0.185 0.161
#> [90m 4[39m err_cou… 18 4.06 18 12 17 23 20
#> [90m 5[39m f0point5 0.835 0.035[4m6[24m 0.855 0.881 0.826 0.830 0.785
#> [90m 6[39m f1 0.797 0.034[4m2[24m 0.812 0.838 0.809 0.777 0.75
#> [90m 7[39m f2 0.763 0.036[4m9[24m 0.774 0.799 0.793 0.730 0.718
#> [90m 8[39m lift_to… 2.66 0.377 2.40 3.12 2.72 2.18 2.88
#> [90m 9[39m logloss 0.432 0.075[4m8[24m 0.413 0.324 0.425 0.530 0.468
#> [90m10[39m max_per… 0.259 0.040[4m0[24m 0.25 0.225 0.217 0.298 0.302
#> [90m11[39m mcc 0.690 0.059[4m2[24m 0.703 0.775 0.705 0.632 0.636
#> [90m12[39m mean_pe… 0.834 0.027[4m8[24m 0.841 0.870 0.847 0.806 0.806
#> [90m13[39m mean_pe… 0.166 0.027[4m8[24m 0.159 0.130 0.153 0.194 0.194
#> [90m14[39m mse 0.132 0.024[4m5[24m 0.126 0.097[4m7[24m 0.129 0.164 0.145
#> [90m15[39m pr_auc 0.832 0.050[4m9[24m 0.868 0.895 0.815 0.818 0.764
#> [90m16[39m precisi… 0.863 0.039[4m9[24m 0.886 0.912 0.837 0.870 0.811
#> [90m17[39m r2 0.436 0.087[4m1[24m 0.481 0.551 0.446 0.342 0.358
#> [90m18[39m recall 0.741 0.040[4m0[24m 0.75 0.775 0.783 0.702 0.698
#> [90m19[39m rmse 0.362 0.034[4m2[24m 0.355 0.313 0.359 0.404 0.381
#> [90m20[39m specifi… 0.926 0.023[4m1[24m 0.932 0.965 0.911 0.910 0.914
#>
#> $max_metrics
#> metric threshold value idx
#> 1 max f1 0.49534115 0.7775281 157
#> 2 max f2 0.28977227 0.7987220 226
#> 3 max f0point5 0.50884749 0.8172147 150
#> 4 max accuracy 0.50884749 0.8410915 150
#> 5 max precision 0.98538253 1.0000000 0
#> 6 max recall 0.04255203 1.0000000 386
#> 7 max specificity 0.98538253 1.0000000 0
#> 8 max absolute_mcc 0.50884749 0.6587759 150
#> 9 max min_per_class_accuracy 0.36328089 0.8025210 200
#> 10 max mean_per_class_accuracy 0.46113191 0.8194041 168
#> 11 max tns 0.98538253 385.0000000 0
#> 12 max fns 0.98538253 236.0000000 0
#> 13 max fps 0.01285907 385.0000000 399
#> 14 max tps 0.04255203 238.0000000 386
#> 15 max tnr 0.98538253 1.0000000 0
#> 16 max fnr 0.98538253 0.9915966 0
#> 17 max fpr 0.01285907 1.0000000 399
#> 18 max tpr 0.04255203 1.0000000 386
# Specific metrics
model$metrics$AUC
#> NULL
model$metrics$Accuracy
#> NULL
model$metrics$Logloss
#> NULLSee which features matter most:
# Variable importance dataframe
head(model$importance, 15)
#> variable relative_importance scaled_importance importance
#> 1 Sex 202.18417 1.00000000 0.40811816
#> 2 Fare 102.86121 0.50875008 0.20763014
#> 3 Age 80.14220 0.39638218 0.16177077
#> 4 Pclass 72.13468 0.35677709 0.14560721
#> 5 SibSp 15.87309 0.07850806 0.03204057
#> 6 Parch 12.75075 0.06306504 0.02573799
#> 7 Embarked 9.45986 0.04678833 0.01909517
# Plot top 15 important variables
top15 <- head(model$importance, 15)
mplot_importance(
var = top15$variable,
imp = top15$importance
)SHAP values explain individual predictions:
model <- h2o_automl(
df = dft,
y = "Survived",
# Ignore specific columns
ignore = c("Ticket", "Cabin", "PassengerId"),
# Use only specific algorithms (exclude_algos also available)
include_algos = c("GBM", "DRF"), # Gradient Boosting & Random Forest
# Data split
split = 0.7,
# Handle imbalanced data
balance = TRUE,
# Remove outliers (Z-score > 3)
no_outliers = TRUE,
# Impute missing values (requires mice package if TRUE)
impute = FALSE,
# Keep only unique training rows
unique_train = TRUE,
# Reproducible results
seed = 123
)
#> [90m# A tibble: 2 × 5[39m
#> tag n p order pcum
#> [3m[90m<lgl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m FALSE 549 61.6 1 61.6
#> [90m2[39m TRUE 342 38.4 2 100
#> train_size test_size
#> 623 268
#> model_id auc logloss aucpr
#> 1 GBM_2_AutoML_2_20260423_85401 0.8596583 0.4248255 0.8431084
#> 2 DRF_1_AutoML_2_20260423_85401 0.8564385 0.4488829 0.8421588
#> 3 GBM_1_AutoML_2_20260423_85401 0.8328975 0.4839880 0.8085889
#> mean_per_class_error rmse mse
#> 1 0.1960698 0.3625182 0.1314194
#> 2 0.1961569 0.3699173 0.1368388
#> 3 0.2342388 0.3942838 0.1554597
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%
#> Model (1/3): GBM_2_AutoML_2_20260423_85401
#> Dependent Variable: Survived
#> Type: Classification (2 classes)
#> Algorithm: GBM
#> Split: 70% training data (of 891 observations)
#> Seed: 123
#>
#> Test metrics:
#> AUC = 0.87879
#> ACC = 0.86567
#> PRC = 0.88506
#> TPR = 0.74757
#> TNR = 0.93939
#>
#> Most important variables:
#> Sex (37.5%)
#> Fare (22.7%)
#> Age (17.3%)
#> Pclass (12.2%)
#> Embarked (4.1%)Predict passenger class (3 categories):
model_multiclass <- h2o_automl(
df = dft,
y = "Pclass",
ignore = c("Cabin", "PassengerId"),
max_models = 10,
max_time = 60
)
#> [90m# A tibble: 3 × 5[39m
#> tag n p order pcum
#> [3m[90m<fct>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m n_3 491 55.1 1 55.1
#> [90m2[39m n_1 216 24.2 2 79.4
#> [90m3[39m n_2 184 20.6 3 100
#> train_size test_size
#> 623 268
#> model_id mean_per_class_error logloss rmse
#> 1 XGBoost_3_AutoML_3_20260423_85406 0.0975638 0.1843648 0.2331297
#> 2 XGBoost_2_AutoML_3_20260423_85406 0.1134454 0.2204648 0.2579203
#> 3 XGBoost_1_AutoML_3_20260423_85406 0.1191367 0.2584227 0.2761215
#> mse
#> 1 0.05434945
#> 2 0.06652287
#> 3 0.07624310
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%
#> Model (1/10): XGBoost_3_AutoML_3_20260423_85406
#> Dependent Variable: Pclass
#> Type: Classification (3 classes)
#> Algorithm: XGBOOST
#> Split: 70% training data (of 891 observations)
#> Seed: 0
#>
#> Test metrics:
#> AUC = 0.98236
#> ACC = 0.9291
#>
#> Most important variables:
#> Fare (66%)
#> Age (14.8%)
#> SibSp (7.9%)
#> Parch (4.4%)
#> Survived.FALSE (2.9%)
# Multi-class metrics
model_multiclass$metrics
#> $dictionary
#> [1] "AUC: Area Under the Curve"
#> [2] "ACC: Accuracy"
#> [3] "PRC: Precision = Positive Predictive Value"
#> [4] "TPR: Sensitivity = Recall = Hit rate = True Positive Rate"
#> [5] "TNR: Specificity = Selectivity = True Negative Rate"
#> [6] "Logloss (Error): Logarithmic loss [Neutral classification: 0.69315]"
#> [7] "Gain: When best n deciles selected, what % of the real target observations are picked?"
#> [8] "Lift: When best n deciles selected, how much better than random is?"
#>
#> $confusion_matrix
#> [90m# A tibble: 3 × 4[39m
#> `Real x Pred` n_3 n_1 n_2
#> [3m[90m<fct>[39m[23m [3m[90m<int>[39m[23m [3m[90m<int>[39m[23m [3m[90m<int>[39m[23m
#> [90m1[39m n_3 136 3 3
#> [90m2[39m n_1 1 60 2
#> [90m3[39m n_2 4 6 53
#>
#> $metrics
#> AUC ACC
#> 1 0.98236 0.9291
#>
#> $metrics_tags
#> [90m# A tibble: 3 × 9[39m
#> tag n p AUC order ACC PRC TPR TNR
#> [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m n_3 142 53.0 0.985 1 0.959 0.965 0.958 0.960
#> [90m2[39m n_1 63 23.5 0.983 2 0.955 0.870 0.952 0.956
#> [90m3[39m n_2 63 23.5 0.979 3 0.944 0.914 0.841 0.976
#>
#> $cv_metrics
#> [90m# A tibble: 12 × 8[39m
#> metric mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid
#> [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m 1[39m accur… 0.926 0.027[4m2[24m 0.936 0.944 0.944 0.879 0.927
#> [90m 2[39m auc [31mNaN[39m 0 [31mNaN[39m [31mNaN[39m [31mNaN[39m [31mNaN[39m [31mNaN[39m
#> [90m 3[39m err 0.073[4m9[24m 0.027[4m2[24m 0.064 0.056 0.056 0.121 0.072[4m6[24m
#> [90m 4[39m err_c… 9.2 3.35 8 7 7 15 9
#> [90m 5[39m loglo… 0.185 0.088[4m1[24m 0.162 0.186 0.113 0.334 0.128
#> [90m 6[39m max_p… 0.190 0.078[4m5[24m 0.167 0.125 0.136 0.32 0.2
#> [90m 7[39m mean_… 0.903 0.042[4m9[24m 0.922 0.926 0.936 0.830 0.900
#> [90m 8[39m mean_… 0.097[4m2[24m 0.042[4m9[24m 0.077[4m7[24m 0.073[4m9[24m 0.064[4m0[24m 0.170 0.100
#> [90m 9[39m mse 0.054[4m4[24m 0.026[4m7[24m 0.043[4m6[24m 0.051[4m1[24m 0.035[4m7[24m 0.101 0.040[4m5[24m
#> [90m10[39m pr_auc [31mNaN[39m 0 [31mNaN[39m [31mNaN[39m [31mNaN[39m [31mNaN[39m [31mNaN[39m
#> [90m11[39m r2 0.923 0.037[4m8[24m 0.933 0.926 0.950 0.857 0.947
#> [90m12[39m rmse 0.229 0.051[4m7[24m 0.209 0.226 0.189 0.318 0.201
#>
#> $hit_ratio
#> k hit_ratio
#> 1 1 0.9261637
#> 2 2 0.9903692
#> 3 3 1.0000000
# Confusion matrix for multi-class
mplot_conf(
tag = model_multiclass$scores_test$tag,
score = model_multiclass$scores_test$score
)Predict fare prices:
model_regression <- h2o_automl(
df = dft,
y = "Fare",
ignore = c("Cabin", "PassengerId"),
max_models = 10,
exclude_algos = NULL
)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.00 7.91 14.45 32.20 31.00 512.33
#> train_size test_size
#> 609 262
#> model_id rmse mse
#> 1 StackedEnsemble_BestOfFamily_1_AutoML_4_20260423_85416 10.38136 107.7726
#> 2 StackedEnsemble_AllModels_1_AutoML_4_20260423_85416 10.55894 111.4913
#> 3 GBM_3_AutoML_4_20260423_85416 12.44341 154.8385
#> mae rmsle mean_residual_deviance
#> 1 5.533338 0.4535433 107.7726
#> 2 5.719281 0.4555461 111.4913
#> 3 5.769395 0.4650435 154.8385
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%
#> Model (1/12): StackedEnsemble_BestOfFamily_1_AutoML_4_20260423_85416
#> Dependent Variable: Fare
#> Type: Regression
#> Algorithm: STACKEDENSEMBLE
#> Split: 70% training data (of 871 observations)
#> Seed: 0
#>
#> Test metrics:
#> rmse = 6.6239
#> mae = 4.143
#> mape = 0.012637
#> mse = 43.876
#> rsq = 0.9391
#> rsqa = 0.9389
# Regression metrics
model_regression$metrics
#> $dictionary
#> [1] "RMSE: Root Mean Squared Error"
#> [2] "MAE: Mean Average Error"
#> [3] "MAPE: Mean Absolute Percentage Error"
#> [4] "MSE: Mean Squared Error"
#> [5] "RSQ: R Squared"
#> [6] "RSQA: Adjusted R Squared"
#>
#> $metrics
#> rmse mae mape mse rsq rsqa
#> 1 6.623908 4.143029 0.01263738 43.87615 0.9391 0.9389
#>
#> $cv_metrics
#> [90m# A tibble: 8 × 8[39m
#> metric mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid
#> [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m mae 5.57[90me[39m+0 6.50[90me[39m[31m-1[39m 5.34 4.79 5.52 6.58 5.63
#> [90m2[39m mean_r… 1.08[90me[39m+2 4.86[90me[39m+1 74.7 78.3 110. 192. 86.4
#> [90m3[39m mse 1.08[90me[39m+2 4.86[90me[39m+1 74.7 78.3 110. 192. 86.4
#> [90m4[39m null_d… 1.19[90me[39m+5 2.29[90me[39m+4 [4m8[24m[4m9[24m084. [4m1[24m[4m1[24m[4m1[24m869. [4m1[24m[4m4[24m[4m7[24m015. [4m1[24m[4m0[24m[4m9[24m745. [4m1[24m[4m3[24m[4m5[24m751.
#> [90m5[39m r2 8.85[90me[39m[31m-1[39m 5.72[90me[39m[31m-2[39m 0.891 0.908 0.914 0.785 0.926
#> [90m6[39m residu… 1.31[90me[39m+4 5.85[90me[39m+3 [4m9[24m415. [4m1[24m[4m0[24m332. [4m1[24m[4m2[24m509. [4m2[24m[4m3[24m363. [4m9[24m934.
#> [90m7[39m rmse 1.02[90me[39m+1 2.14[90me[39m+0 8.64 8.85 10.5 13.8 9.29
#> [90m8[39m rmsle 4.46[90me[39m[31m-1[39m 1.21[90me[39m[31m-1[39m 0.456 0.270 0.424 0.472 0.608If you have predefined train/test splits:
# Create splits
splits <- msplit(dft, size = 0.8, seed = 123)
#> train_size test_size
#> 712 179
splits$train$split <- "train"
splits$test$split <- "test"
# Combine
df_split <- rbind(splits$train, splits$test)
# Train using split column
model <- h2o_automl(
df = df_split,
y = "Survived",
train_test = "split",
max_models = 5
)
#> [90m# A tibble: 2 × 5[39m
#> tag n p order pcum
#> [3m[90m<lgl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m FALSE 549 61.6 1 61.6
#> [90m2[39m TRUE 342 38.4 2 100
#>
#> test train
#> 179 712
#> model_id auc logloss aucpr
#> 1 DRF_1_AutoML_5_20260423_85425 0.8680875 0.7855203 0.8270861
#> 2 GLM_1_AutoML_5_20260423_85425 0.8654726 0.4253319 0.8491966
#> 3 XGBoost_2_AutoML_5_20260423_85425 0.8537248 0.4484009 0.8055514
#> mean_per_class_error rmse mse
#> 1 0.1775527 0.3813365 0.1454175
#> 2 0.1923547 0.3652137 0.1333811
#> 3 0.2039812 0.3752972 0.1408480
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%
#> Model (1/5): DRF_1_AutoML_5_20260423_85425
#> Dependent Variable: Survived
#> Type: Classification (2 classes)
#> Algorithm: DRF
#> Split: 80% training data (of 891 observations)
#> Seed: 0
#>
#> Test metrics:
#> AUC = 0.85792
#> ACC = 0.78212
#> PRC = 0.84783
#> TPR = 0.5493
#> TNR = 0.93519
#>
#> Most important variables:
#> Ticket (65.7%)
#> Sex (14.9%)
#> Cabin (8.7%)
#> Pclass (3.4%)
#> Fare (2.7%)# New data (same structure as training)
new_data <- dft[1:10, ]
# Predict
predictions <- h2o_predict_model(new_data, model$model)
head(predictions)
#> predict FALSE. TRUE.
#> 1 FALSE 0.99979242 0.0002075763
#> 2 TRUE 0.02148936 0.9785106383
#> 3 TRUE 0.12765957 0.8723404255
#> 4 TRUE 0.09574468 0.9042553191
#> 5 FALSE 0.99979242 0.0002075763
#> 6 FALSE 0.97851583 0.0214841721# Get probabilities
predictions <- h2o_predict_model(new_data, model$model)
head(predictions)
#> predict FALSE. TRUE.
#> 1 FALSE 0.99979242 0.0002075763
#> 2 TRUE 0.02148936 0.9785106383
#> 3 TRUE 0.12765957 0.8723404255
#> 4 TRUE 0.09574468 0.9042553191
#> 5 FALSE 0.99979242 0.0002075763
#> 6 FALSE 0.97851583 0.0214841721This creates: - Model file (.rds) - MOJO file (for production) - Performance plots - Metrics summary
# Quick prototype
model <- h2o_automl(dft, "Survived", max_models = 3, max_time = 30)
#> [90m# A tibble: 2 × 5[39m
#> tag n p order pcum
#> [3m[90m<lgl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m FALSE 549 61.6 1 61.6
#> [90m2[39m TRUE 342 38.4 2 100
#> train_size test_size
#> 623 268
#> model_id auc logloss aucpr
#> 1 GLM_1_AutoML_6_20260423_85436 0.8566401 0.4331878 0.8468753
#> 2 XGBoost_1_AutoML_6_20260423_85436 0.8400780 0.4574884 0.8099752
#> 3 GBM_1_AutoML_6_20260423_85436 0.8159377 0.6451460 0.7378534
#> mean_per_class_error rmse mse
#> 1 0.1914171 0.3680368 0.1354511
#> 2 0.2138740 0.3789387 0.1435946
#> 3 0.2218336 0.4732407 0.2239567
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%
#> Model (1/3): GLM_1_AutoML_6_20260423_85436
#> Dependent Variable: Survived
#> Type: Classification (2 classes)
#> Algorithm: GLM
#> Split: 70% training data (of 891 observations)
#> Seed: 0
#>
#> Test metrics:
#> AUC = 0.87979
#> ACC = 0.79851
#> PRC = 0.90164
#> TPR = 0.53398
#> TNR = 0.96364
#>
#> Most important variables:
#> Ticket.1601 (0.9%)
#> Ticket.2661 (0.9%)
#> Ticket.C.A. 37671 (0.8%)
#> Cabin.C22 C26 (0.8%)
#> Sex.female (0.7%)# Refine based on results
model <- h2o_automl(
dft, "Survived",
max_models = 20,
no_outliers = TRUE,
balance = TRUE,
ignore = c("PassengerId", "Name", "Ticket", "Cabin"),
model_name = "Titanic_Model"
)
#> [90m# A tibble: 2 × 5[39m
#> tag n p order pcum
#> [3m[90m<lgl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m1[39m FALSE 549 61.6 1 61.6
#> [90m2[39m TRUE 342 38.4 2 100
#> train_size test_size
#> 623 268
#> model_id auc logloss aucpr
#> 1 GBM_3_AutoML_7_20260423_85441 0.8575063 0.4316748 0.8410436
#> 2 GBM_2_AutoML_7_20260423_85441 0.8571250 0.4270731 0.8442881
#> 3 GBM_4_AutoML_7_20260423_85441 0.8561498 0.4266892 0.8469913
#> mean_per_class_error rmse mse
#> 1 0.1887694 0.3656777 0.1337202
#> 2 0.1944735 0.3641046 0.1325721
#> 3 0.1909050 0.3631896 0.1319067
#> | | | 0% | |======================================================================| 100%
#> | | | 0% | |======================================================================| 100%# Check multiple metrics
model$metrics
#> $dictionary
#> [1] "AUC: Area Under the Curve"
#> [2] "ACC: Accuracy"
#> [3] "PRC: Precision = Positive Predictive Value"
#> [4] "TPR: Sensitivity = Recall = Hit rate = True Positive Rate"
#> [5] "TNR: Specificity = Selectivity = True Negative Rate"
#> [6] "Logloss (Error): Logarithmic loss [Neutral classification: 0.69315]"
#> [7] "Gain: When best n deciles selected, what % of the real target observations are picked?"
#> [8] "Lift: When best n deciles selected, how much better than random is?"
#>
#> $confusion_matrix
#> Pred
#> Real FALSE TRUE
#> FALSE 156 9
#> TRUE 28 75
#>
#> $gain_lift
#> [90m# A tibble: 10 × 10[39m
#> percentile value random target total gain optimal lift response score
#> [3m[90m<fct>[39m[23m [3m[90m<fct>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<int>[39m[23m [3m[90m<int>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m 1[39m 1 FALSE 10.1 25 27 15.2 16.4 50.4 15.2 93.5
#> [90m 2[39m 2 FALSE 20.1 24 27 29.7 32.7 47.4 14.5 92.2
#> [90m 3[39m 3 FALSE 30.2 26 27 45.5 49.1 50.4 15.8 89.0
#> [90m 4[39m 4 FALSE 39.9 24 26 60 64.8 50.3 14.5 86.1
#> [90m 5[39m 5 FALSE 50 23 27 73.9 81.2 47.9 13.9 81.1
#> [90m 6[39m 6 FALSE 60.1 17 27 84.2 97.6 40.2 10.3 71.1
#> [90m 7[39m 7 FALSE 69.8 18 26 95.2 100 36.4 10.9 45.7
#> [90m 8[39m 8 FALSE 79.9 3 27 97.0 100 21.4 1.82 22.6
#> [90m 9[39m 9 FALSE 89.9 4 27 99.4 100 10.5 2.42 9.55
#> [90m10[39m 10 FALSE 100 1 27 100 100 0 0.606 1.49
#>
#> $metrics
#> AUC ACC PRC TPR TNR
#> 1 0.89147 0.86194 0.89286 0.72816 0.94545
#>
#> $cv_metrics
#> [90m# A tibble: 20 × 8[39m
#> metric mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid
#> [3m[90m<chr>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m [3m[90m<dbl>[39m[23m
#> [90m 1[39m accuracy 0.836 0.046[4m2[24m 0.84 0.896 0.8 0.782 0.863
#> [90m 2[39m auc 0.847 0.072[4m1[24m 0.847 0.927 0.854 0.731 0.876
#> [90m 3[39m err 0.164 0.046[4m2[24m 0.16 0.104 0.2 0.218 0.137
#> [90m 4[39m err_cou… 20.4 5.73 20 13 25 27 17
#> [90m 5[39m f0point5 0.783 0.091[4m4[24m 0.788 0.913 0.743 0.663 0.808
#> [90m 6[39m f1 0.781 0.079[4m3[24m 0.778 0.876 0.779 0.658 0.813
#> [90m 7[39m f2 0.780 0.075[4m9[24m 0.768 0.842 0.818 0.653 0.819
#> [90m 8[39m lift_to… 2.64 0.337 2.72 2.23 2.40 3.1 2.76
#> [90m 9[39m logloss 0.432 0.082[4m8[24m 0.452 0.326 0.460 0.543 0.379
#> [90m10[39m max_per… 0.236 0.070[4m2[24m 0.239 0.179 0.233 0.35 0.178
#> [90m11[39m mcc 0.651 0.110 0.653 0.792 0.605 0.499 0.705
#> [90m12[39m mean_pe… 0.824 0.053[4m1[24m 0.823 0.889 0.807 0.748 0.854
#> [90m13[39m mean_pe… 0.176 0.053[4m1[24m 0.177 0.111 0.193 0.252 0.146
#> [90m14[39m mse 0.134 0.029[4m4[24m 0.139 0.096[4m6[24m 0.145 0.173 0.115
#> [90m15[39m pr_auc 0.822 0.098[4m7[24m 0.821 0.937 0.814 0.669 0.870
#> [90m16[39m precisi… 0.785 0.103 0.795 0.939 0.721 0.667 0.804
#> [90m17[39m r2 0.425 0.149 0.403 0.610 0.402 0.207 0.503
#> [90m18[39m recall 0.780 0.079[4m3[24m 0.761 0.821 0.846 0.65 0.822
#> [90m19[39m rmse 0.364 0.040[4m5[24m 0.372 0.311 0.381 0.416 0.339
#> [90m20[39m specifi… 0.868 0.069[4m3[24m 0.886 0.957 0.767 0.845 0.886
#>
#> $max_metrics
#> metric threshold value idx
#> 1 max f1 0.41714863 0.7672956 181
#> 2 max f2 0.28931884 0.7898957 224
#> 3 max f0point5 0.66135190 0.8173619 120
#> 4 max accuracy 0.61537557 0.8250401 130
#> 5 max precision 0.99256302 1.0000000 0
#> 6 max recall 0.03108045 1.0000000 391
#> 7 max specificity 0.99256302 1.0000000 0
#> 8 max absolute_mcc 0.61537557 0.6277286 130
#> 9 max min_per_class_accuracy 0.35070798 0.7907950 205
#> 10 max mean_per_class_accuracy 0.41714863 0.8112306 181
#> 11 max tns 0.99256302 384.0000000 0
#> 12 max fns 0.99256302 238.0000000 0
#> 13 max fps 0.01019947 384.0000000 399
#> 14 max tps 0.03108045 239.0000000 391
#> 15 max tnr 0.99256302 1.0000000 0
#> 16 max fnr 0.99256302 0.9958159 0
#> 17 max fpr 0.01019947 1.0000000 399
#> 18 max tpr 0.03108045 1.0000000 391
# Visual inspection
mplot_full(
tag = model$scores_test$tag,
score = model$scores_test$score
)
# Variable importance
mplot_importance(
var = model$importance$variable,
imp = model$importance$importance
)?h2o_automl,
?h2o_explainer, ?mplot_full?mplot_conf,
?mplot_roc, ?mplot_importance