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?