H2O R api: выбор оптимальной модели из сетки поиска

Я используюh2o пакет (v 3.6.0) в R, и я построил модель поиска сетки. Теперь я пытаюсь получить доступ к модели, которая минимизирует MSE на наборе проверки. В питонеsklearn, это легко достижимо при использованииRandomizedSearchCV:

## Pseudo code:
grid = RandomizedSearchCV(model, params, n_iter = 5)
grid.fit(X)
best = grid.best_estimator_

Это, к сожалению, не так просто в 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)
    )
)

Просмотр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

Немного покопавшись, вы можете получить доступ к каждой отдельной модели и просмотреть все мыслимые метрики:

> 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

И смного копать, вы, наконец, можете добраться до этого:

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

Кажется, что это большая работа, чтобы перейти к метрике, которая должна быть на высшем уровне для выбора модели (да, я сейчас добавляю свои мнения ...). В моей ситуации у меня есть сетка с сотнями моделей, и мое текущее, хакерское решение не выглядит очень "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
}

Это настолько утилитарно для чего-то такого, что является ключевым в практике машинного обучения, и мне кажется странным, что у h2o не было бы «более чистого» метода извлечения оптимальной модели или, по крайней мере, метрик модели.

Я что-то пропустил? Не существует ли метода «из коробки» для выбора лучшей модели?

Ответы на вопрос(3)

Ваш ответ на вопрос