H2O R api: Abrufen des optimalen Modells aus der Rastersuche

Ich benutze dash2o package (v 3.6.0) in R und ich habe ein Gittersuchmodell erstellt. Jetzt versuche ich, auf das Modell zuzugreifen, mit dem MSE im Validierungssatz minimiert wird. In Pythonssklearn, dies ist mit @ leicht zu erreichRandomizedSearchCV:

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

Dies erweist sich in h2o leider nicht als unkompliziert. Hier ist ein Beispiel, das Sie neu erstellen können:

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

Ansehengrid gibt eine Fülle von Informationen aus, einschließlich des folgenden Teils:

> 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

Mit ein wenig Graben können Sie auf jedes einzelne Modell zugreifen und jede nur vorstellbare Metrik anzeigen:

> 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

Und mit einemMeng Graben, können Sie endlich dazu kommen:

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

Das scheint eine Menge kluger Arbeit zu sein, um zu einer Metrik zu gelangen, die für die Modellauswahl die oberste Ebene sein sollte (ja, ich interjektiere jetzt meine Meinungen ...). In meiner Situation habe ich ein Raster mit Hunderten von Modellen, und meine aktuelle, hackige Lösung scheint einfach nicht sehr "rätselhaft" zu sein:

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
}

Dies ist so nützlich für etwas, das für die Praxis des maschinellen Lernens so wichtig ist, und ich finde es nur merkwürdig, dass H2O keine "sauberere" Methode zum Extrahieren des optimalen Modells oder zumindest von Modellmetriken hätte.

Bin ich etwas vermisst? Gibt es keine sofort einsatzbereite Methode zur Auswahl des besten Modells?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage