H2O R api:从网格搜索中检索最优模型

Tgs*_*591 7 python r h2o

我正在使用h2oR中的软件包(v 3.6.0),我已经构建了一个网格搜索模型.现在,我正在尝试访问最小化验证集上的MSE的模型.在python中sklearn,使用时很容易实现RandomizedSearchCV:

## Pseudo code:
grid = RandomizedSearchCV(model, params, n_iter = 5)
grid.fit(X)
best = grid.best_estimator_
Run Code Online (Sandbox Code Playgroud)

不幸的是,这在h2o中并不是那么简单.以下是您可以重新创建的示例:

library(h2o)
## assume you got h2o initialized...

X <- as.h2o(iris[1:100,]) # Note: only using top two classes for example 
grid <- h2o.grid(
    algorithm = 'gbm',
    x = names(X[,1:4]),
    y = 'Species',
    training_frame = X,
    hyper_params = list(
        distribution = 'bernoulli',
        ntrees = c(25,50)
    )
)
Run Code Online (Sandbox Code Playgroud)

查看grid打印了大量信息,包括以下部分:

> grid
ntrees distribution status_ok                                                                 model_ids
 50    bernoulli        OK Grid_GBM_file1742e107fe5ba_csv_10.hex_11_model_R_1456492736353_16_model_1
 25    bernoulli        OK Grid_GBM_file1742e107fe5ba_csv_10.hex_11_model_R_1456492736353_16_model_0
Run Code Online (Sandbox Code Playgroud)

通过一些挖掘,您可以访问每个单独的模型并查看可以想象的每个指标:

> h2o.getModel(grid@model_ids[[1]])
H2OBinomialModel: gbm
Model ID:  Grid_GBM_file1742e107fe5ba_csv_10.hex_11_model_R_1456492736353_18_model_1 
Model Summary: 
  number_of_trees model_size_in_bytes min_depth max_depth mean_depth min_leaves max_leaves mean_leaves
1              50                4387         1         1    1.00000          2          2     2.00000


H2OBinomialMetrics: gbm
** Reported on training data. **

MSE:  1.056927e-05
R^2:  0.9999577
LogLoss:  0.003256338
AUC:  1
Gini:  1

Confusion Matrix for F1-optimal threshold:
           setosa versicolor    Error    Rate
setosa         50          0 0.000000   =0/50
versicolor      0         50 0.000000   =0/50
Totals         50         50 0.000000  =0/100

Maximum Metrics: Maximum metrics at their respective thresholds
                      metric threshold    value idx
1                     max f1  0.996749 1.000000   0
2                     max f2  0.996749 1.000000   0
3               max f0point5  0.996749 1.000000   0
4               max accuracy  0.996749 1.000000   0
5              max precision  0.996749 1.000000   0
6           max absolute_MCC  0.996749 1.000000   0
7 max min_per_class_accuracy  0.996749 1.000000   0
Run Code Online (Sandbox Code Playgroud)

通过大量的挖掘,你终于可以达到这个目的:

> h2o.getModel(grid@model_ids[[1]])@model$training_metrics@metrics$MSE
[1] 1.056927e-05
Run Code Online (Sandbox Code Playgroud)

对于模型选择应该是最高级别的指标来说,这看起来像很多kludgey工作(是的,我现在插入我的意见......).在我的情况下,我有一个包含数百个模型的网格,而我目前的hacky解决方案似乎并不是非常"R-esque":

model_select_ <- function(grid) {
  model_ids <- grid@model_ids
  min = Inf
  best_model = NULL

  for(model_id in model_ids) {
    model <- h2o.getModel(model_id)
    mse <- model@model$training_metrics@metrics$MSE
    if(mse < min) {
      min <- mse
      best_model <- model
    }
  }

  best_model
}
Run Code Online (Sandbox Code Playgroud)

这对于机器学习实践的核心是非常实用的,而且我觉得奇怪的是h2o没有"更清洁"的方法来提取最优模型,或者至少是模型指标.

我错过了什么吗?选择最佳型号是否没有"开箱即用"的方法?

Eri*_*ell 4

是的,有一种简单的方法可以提取 H2O 网格搜索的“顶部”模型。还有一些实用函数可以提取h2o.mse您一直试图访问的所有模型指标(例如)。有关如何执行这些操作的示例可以在h2o-3 GitHub 存储库的h2o-r/demosh2o-py/demos子文件夹中找到。

由于您使用的是 R,因此这里有一个相关的代码示例,其中包括网格搜索和排序结果。您还可以在该函数的 R 文档中找到如何访问此信息h2o.getGrid

打印出所有模型的 auc,按验证 AUC 排序:

auc_table <- h2o.getGrid(grid_id = "eeg_demo_gbm_grid", sort_by = "auc", decreasing = TRUE)
print(auc_table)
Run Code Online (Sandbox Code Playgroud)

以下是输出的示例:

H2O Grid Details
================

Grid ID: eeg_demo_gbm_grid 
Used hyper parameters: 
  -  ntrees 
  -  max_depth 
  -  learn_rate 
Number of models: 18 
Number of failed models: 0 

Hyper-Parameter Search Summary: ordered by decreasing auc
   ntrees max_depth learn_rate                  model_ids               auc
1     100         5        0.2 eeg_demo_gbm_grid_model_17 0.967771493797284
2      50         5        0.2 eeg_demo_gbm_grid_model_16 0.949609591795923
3     100         5        0.1  eeg_demo_gbm_grid_model_8  0.94941792664595
4      50         5        0.1  eeg_demo_gbm_grid_model_7 0.922075196552274
5     100         3        0.2 eeg_demo_gbm_grid_model_14 0.913785959685157
6      50         3        0.2 eeg_demo_gbm_grid_model_13 0.887706691652792
7     100         3        0.1  eeg_demo_gbm_grid_model_5 0.884064379717198
8       5         5        0.2 eeg_demo_gbm_grid_model_15 0.851187402678818
9      50         3        0.1  eeg_demo_gbm_grid_model_4 0.848921799270639
10      5         5        0.1  eeg_demo_gbm_grid_model_6 0.825662907513139
11    100         2        0.2 eeg_demo_gbm_grid_model_11 0.812030639460551
12     50         2        0.2 eeg_demo_gbm_grid_model_10 0.785379521713437
13    100         2        0.1  eeg_demo_gbm_grid_model_2  0.78299280750123
14      5         3        0.2 eeg_demo_gbm_grid_model_12 0.774673686150002
15     50         2        0.1  eeg_demo_gbm_grid_model_1 0.754834657912535
16      5         3        0.1  eeg_demo_gbm_grid_model_3 0.749285131682721
17      5         2        0.2  eeg_demo_gbm_grid_model_9 0.692702793188135
18      5         2        0.1  eeg_demo_gbm_grid_model_0 0.676144542037133
Run Code Online (Sandbox Code Playgroud)

表中的第一行包含具有最佳 AUC 的模型,因此下面我们可以获取该模型并提取验证 AUC:

best_model <- h2o.getModel(auc_table@model_ids[[1]])
h2o.auc(best_model, valid = TRUE)
Run Code Online (Sandbox Code Playgroud)

为了使h2o.getGrid函数能够按验证集上的指标进行排序,您需要实际传递函数h2o.grida validation_frame。在上面的示例中,您没有传递validation_frame,因此您无法评估验证集上网格中的模型。