2016-02-26 10 views
6

Я использую пакет 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 не было бы «чистого» метода извлечения оптимальной модели или, по крайней мере, модельных показателей.

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

ответ

4

Да, есть простой способ извлечь «верхнюю» модель поиска сетки H2O. Существуют также служебные функции, которые будут извлекать все модельные показатели (например, h2o.mse), к которым вы пытались получить доступ. Примеры того, как это сделать, можно найти в подкаталогах h2o-r/demos и h2o-py/demos на репозитории GitHub h2o-3.

Поскольку вы используете R, вот relevant code example, который содержит поиск по сетке, с отсортированными результатами. Вы также можете найти, как получить доступ к этой информации в документации R для функции h2o.getGrid.

печати из ППК для всех моделей, отсортировано по валидации AUC:

auc_table <- h2o.getGrid(grid_id = "eeg_demo_gbm_grid", sort_by = "auc", decreasing = TRUE) 
print(auc_table) 

Ниже приведен пример вывода:

H2O Grid Details 
================ 

Grid ID: eeg_demo_gbm_grid 
Used hyper parameters: 
    - ntrees 
    - max_depth 
    - learn_rate 
Number of models: 18 
Number of failed models: 0 

Hyper-Parameter Search Summary: ordered by decreasing auc 
    ntrees max_depth learn_rate     model_ids    auc 
1  100   5  0.2 eeg_demo_gbm_grid_model_17 0.967771493797284 
2  50   5  0.2 eeg_demo_gbm_grid_model_16 0.949609591795923 
3  100   5  0.1 eeg_demo_gbm_grid_model_8 0.94941792664595 
4  50   5  0.1 eeg_demo_gbm_grid_model_7 0.922075196552274 
5  100   3  0.2 eeg_demo_gbm_grid_model_14 0.913785959685157 
6  50   3  0.2 eeg_demo_gbm_grid_model_13 0.887706691652792 
7  100   3  0.1 eeg_demo_gbm_grid_model_5 0.884064379717198 
8  5   5  0.2 eeg_demo_gbm_grid_model_15 0.851187402678818 
9  50   3  0.1 eeg_demo_gbm_grid_model_4 0.848921799270639 
10  5   5  0.1 eeg_demo_gbm_grid_model_6 0.825662907513139 
11 100   2  0.2 eeg_demo_gbm_grid_model_11 0.812030639460551 
12  50   2  0.2 eeg_demo_gbm_grid_model_10 0.785379521713437 
13 100   2  0.1 eeg_demo_gbm_grid_model_2 0.7829928075
14  5   3  0.2 eeg_demo_gbm_grid_model_12 0.774673686150002 
15  50   2  0.1 eeg_demo_gbm_grid_model_1 0.754834657912535 
16  5   3  0.1 eeg_demo_gbm_grid_model_3 0.749285131682721 
17  5   2  0.2 eeg_demo_gbm_grid_model_9 0.692702793188135 
18  5   2  0.1 eeg_demo_gbm_grid_model_0 0.676144542037133 

Верхняя строка в таблице содержит модель с лучшей AUC, поэтому ниже мы можем взять эту модель и извлечь подтверждение AUC:

best_model <- h2o.getModel([email protected]_ids[[1]]) 
h2o.auc(best_model, valid = TRUE) 

В для функции h2o.getGrid, чтобы иметь возможность сортировать по метрику в наборе валидации, необходимо фактически передать функцию h2o.grid a validation_frame.В приведенном выше примере вы не прошли проверку validation_frame, поэтому вы не можете оценить модели в сетке в наборе проверки.

+0

Это замечательно, Эрин. В воспроизводимом примере я не прошел проверку, но в моем фактическом коде я сделал. Спасибо! – Tgsmith61591

+0

H2O.grid() не использует validation_frame, фактически. Он использует только training_frame. Он игнорирует validation_frame, который вы передаете для целей подсчета очков. Полученная модель, естественно, переоснащена и, следовательно, бесполезна. Эта проблема еще исправлена? Вы можете посмотреть свою выигрышную модель из поиска и непосредственно увидеть ее скоринговую прогрессию, чтобы сравнить, например, training_auc и validation_auc. Вы увидите проблему, если вы посмотрите там. –

+0

@GeoffreyAnderson У нас есть билет, открытый для отслеживания ваших наблюдений/проблем с помощью 'validation_frame' и' h2o.grid' и надеюсь вскоре решить это. Вы можете следить за прогрессом здесь: https://0xdata.atlassian.net/browse/PUBDEV-4035 –

3

Это похоже на последние версии h2o, с 3.8.2.3 вы получаете исключение Java, в котором говорится, что «auc» является недопустимой метрикой. Следующий сбой:

library(h2o) 
library(jsonlite) 
h2o.init() 
iris.hex <- as.h2o(iris) 
h2o.grid("gbm", grid_id = "gbm_grid_id", x = c(1:4), y = 5, 
    training_frame = iris.hex, hyper_params = list(ntrees = c(1,2,3))) 
grid <- h2o.getGrid("gbm_grid_id", sort_by = "auc", decreasing = T) 

Однако заменить 'ППК' с 'logloss' и снижение = F, и это нормально.

+0

Iris - проблема многоклассов, поэтому AUC не поддерживается в вашем примере выше. Сообщение об ошибке точно отображает метрики, поддерживаемые для многоклассов: 'Недопустимый аргумент для sort_by указан. Должен быть одним из: [r2, mean_per_class_accuracy, max_per_class_error, err, total_rows, rmse, precision, err_count, logloss, mse, mean_per_class_error] ' –

+0

о да, конечно, глупый мне lol! – RobertoRonaldo

-2

К сожалению, функция сетки H2O использует training_frame not validation_frame, когда вы передаете их оба. Следовательно, выигрышная модель чрезвычайно перегружена и бесполезна. EDIT: Ну, здесь исправление, на самом деле полезно иметь очень низкую тренировочную предвзятость, для этого, для анализа кривой кривой и смещения по сравнению с анализом дисперсий. Но чтобы быть ясным, мне также нужно иметь возможность запускать снова и получить набор данных валидации, который будет использоваться в качестве критерия поиска для окончательной установки и выбора модели.

Например, это выигрышная модель из функции сетки на GBM, где прошла validation_frame, а AUC - метрика поиска. Вы можете видеть, что validation_auc начинается с 0,5 и фактически ухудшается до 0,44 в финальной истории выигрыша выигрышной модели:

Scoring History: 
      timestamp   duration number_of_trees training_rmse 
1 2017-02-06 10:09:19 6 min 13.153 sec    0  0.70436 
2 2017-02-06 10:09:23 6 min 16.863 sec    100  0.70392 
3 2017-02-06 10:09:27 6 min 20.950 sec    200  0.70343 
4 2017-02-06 10:09:31 6 min 24.806 sec    300  0.70289 
5 2017-02-06 10:09:35 6 min 29.244 sec    400  0.70232 
6 2017-02-06 10:09:39 6 min 33.069 sec    500  0.70171 
7 2017-02-06 10:09:43 6 min 37.243 sec    600  0.70107 
    training_logloss training_auc training_lift training_classification_error 
1   2.77317  0.50000  1.00000      0.49997 
2   2.69896  0.99980  99.42857      0.00026 
3   2.62768  0.99980  99.42857      0.00020 
4   2.55902  0.99982  99.42857      0.00020 
5   2.49675  0.99993  99.42857      0.00020 
6   2.43712  0.99994  99.42857      0.00020 
7   2.38071  0.99994  99.42857      0.00013 
    validation_rmse validation_logloss validation_auc validation_lift 
1   0.06921   0.03058  0.50000   1.00000 
2   0.06921   0.03068  0.45944   9.03557 
3   0.06922   0.03085  0.46685   9.03557 
4   0.06922   0.03107  0.46817   9.03557 
5   0.06923   0.03133  0.45656   9.03557 
6   0.06924   0.03163  0.44947   9.03557 
7   0.06924   0.03192  0.44400   9.03557 
    validation_classification_error 
1       0.99519 
2       0.00437 
3       0.00656 
4       0.00656 
5       0.00700 
6       0.00962 
7       0.00962 
+0

H2O не сообщает вам версию при запуске библиотеки (h2o), но это было бы полезно в таких случаях. H2O также не имеет такой функции, как h2o.version, но это также было бы полезно в таких случаях. –

+0

H2O кластерная версия: 3.10.1.1 from h2o.init() –

+0

Я не думаю, что это отвечает на вопрос (о том, как получить заказ моделей). Если вы видите проблему с игнорированием validation_frame, я бы предложил удалить этот ответ и начать новый вопрос с полностью воспроизводимым примером. –

Смежные вопросы