H2O R api: recuperando el modelo óptimo de la búsqueda de cuadrícula

Estoy usando elh2o paquete (v 3.6.0) en R, y he construido un modelo de búsqueda de cuadrícula. Ahora, estoy tratando de acceder al modelo que minimiza MSE en el conjunto de validación. En pitónsklearn, esto se puede lograr fácilmente cuando se usaRandomizedSearchCV:

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

Esto, desafortunadamente, no resulta tan sencillo en H2O. Aquí hay un ejemplo que puede recrear:

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)
    )
)

Visitagrid imprime una gran cantidad de información, incluida esta parte:

> 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

Con un poco de excavación, puede acceder a cada modelo individual y ver cada métrica imaginable:

> 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

Y con unmucho de cavar, finalmente puedes llegar a esto:

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

Esto parece mucho trabajo de kludgey para llegar a una métrica que debería ser de alto nivel para la selección del modelo (sí, ahora estoy interponiendo mis opiniones ...). En mi situación, tengo una cuadrícula con cientos de modelos, y mi actual solución hacky no parece muy "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
}

Esto es tan utilitario para algo que es tan esencial para la práctica del aprendizaje automático, y me parece extraño que H2O no tenga un método "más limpio" para extraer el modelo óptimo, o al menos las métricas del modelo.

¿Me estoy perdiendo de algo? ¿No hay un método "listo para usar" para seleccionar el mejor modelo?

Respuestas a la pregunta(3)

Su respuesta a la pregunta