Я использую пакет h2o
(v 3.6.0) в R, и я построил модель поиска сетки. Теперь я пытаюсь получить доступ к модели, которая минимизирует MSE в наборе проверки. В Пайтона sklearn
, это легко достижимо при использовании RandomizedSearchCV
:H2O R api: получение оптимальной модели из поиска сетки
## 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([email protected]_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([email protected]_ids[[1]])@[email protected]$MSE
[1] 1.056927e-05
Это, кажется, как много kludgey работы, чтобы добраться до метрики, которые должны быть верхним уровнем для выбора модели (да, я сейчас вставляя мои мнения ...). В моей ситуации, у меня есть сетка с сотнями моделей, и мои текущие, Hacky решение просто не кажется очень «R-эск»:
model_select_ <- function(grid) {
model_ids <- [email protected]_ids
min = Inf
best_model = NULL
for(model_id in model_ids) {
model <- h2o.getModel(model_id)
mse <- [email protected][email protected]$MSE
if(mse < min) {
min <- mse
best_model <- model
}
}
best_model
}
Это так утилитарное за то, что так ядро к практике машинного обучения, и это просто поражает меня настолько странно, что у h2o не было бы «чистого» метода извлечения оптимальной модели или, по крайней мере, модельных показателей.
Я что-то упустил? Нет ли метода «из коробки» для выбора лучшей модели?
Это замечательно, Эрин. В воспроизводимом примере я не прошел проверку, но в моем фактическом коде я сделал. Спасибо! – Tgsmith61591
H2O.grid() не использует validation_frame, фактически. Он использует только training_frame. Он игнорирует validation_frame, который вы передаете для целей подсчета очков. Полученная модель, естественно, переоснащена и, следовательно, бесполезна. Эта проблема еще исправлена? Вы можете посмотреть свою выигрышную модель из поиска и непосредственно увидеть ее скоринговую прогрессию, чтобы сравнить, например, training_auc и validation_auc. Вы увидите проблему, если вы посмотрите там. –
@GeoffreyAnderson У нас есть билет, открытый для отслеживания ваших наблюдений/проблем с помощью 'validation_frame' и' h2o.grid' и надеюсь вскоре решить это. Вы можете следить за прогрессом здесь: https://0xdata.atlassian.net/browse/PUBDEV-4035 –