8

R でパッケージ (v 3.6.0)を使用しておりh2o、グリッド検索モデルを構築しました。今、検証セットで MSE を最小化するモデルにアクセスしようとしています。Python のsklearnでは、これは以下を使用すると簡単に実現できRandomizedSearchCVます。

## 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(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

そして、掘り下げ、最終的にこれにたどり着くことができます:

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

これは、モデル選択のトップレベルであるべきメトリックに到達するための多くの厄介な作業のようです. 私の状況では、何百ものモデルを含むグリッドがあり、現在のハッキーなソリューションはあまり「R風」ではないようです。

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
}

これは、機械学習の実践の中核をなすものとしてはやり過ぎのように思えます。また、最適なモデル、または少なくともモデル メトリックを抽出する「よりクリーンな」方法が h2o にないことは奇妙に思えます。

何か不足していますか?最適なモデルを選択するための「すぐに使える」方法はありませんか?

4

3 に答える 3

4

はい、H2O グリッド検索の「トップ」モデルを抽出する簡単な方法があります。h2o.mseアクセスしようとしているすべてのモデル メトリック (例: ) を抽出するユーティリティ関数もあります。これらを実行する方法の例は、 h2o-3 GitHub リポジトリのh2o-r/demosおよびh2o-py/demosサブフォルダーにあります。

R を使用しているため、並べ替えられた結果を含むグリッド検索を含む関連コード例を次に示します。この情報にアクセスする方法は、h2o.getGrid関数の R ドキュメントにも記載されています。

すべてのモデルの auc を検証 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.78299280750123
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(auc_table@model_ids[[1]])
h2o.auc(best_model, valid = TRUE)

関数h2o.getGridが検証セットのメトリックでソートできるようにするには、実際にh2o.grid関数 aを渡す必要がありますvalidation_frame。上記の例では、validation_frame を渡していないため、検証セットのグリッド内のモデルを評価できません。

于 2016-02-28T07:32:50.887 に答える
3

これは、最近のバージョンの h2o でのみ有効なようです。3.8.2.3 では、「auc」が無効なメトリックであるという Java 例外が発生します。以下は失敗します:

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)

ただし、「auc」を「logloss」に置き換えて = F を減少させれば問題ありません。

于 2016-08-09T17:29:08.177 に答える