Python H2O R api:从网格搜索中检索最优模型

Python H2O R api:从网格搜索中检索最优模型,python,r,h2o,Python,R,H2o,我在R中使用h2o包(v3.6.0),并构建了一个网格搜索模型。现在,我正在尝试访问使验证集上的MSE最小化的模型。在python的sklearn中,使用RandomizedSearchCV可以轻松实现这一点: ## Pseudo code: grid = RandomizedSearchCV(model, params, n_iter = 5) grid.fit(X) best = grid.best_estimator_ 不幸的是,这在h2o中并不是那么简单。以下是您可以重新创建的示例:

我在R中使用
h2o
包(v3.6.0),并构建了一个网格搜索模型。现在,我正在尝试访问使验证集上的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)
    )
)
通过一点挖掘,您可以访问每个单独的模型并查看可以想象的每个指标:

> 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-esque”:


model\u select\是的,有一种简单的方法可以提取H2O网格搜索的“顶部”模型。还有一些实用程序函数将提取您一直试图访问的所有模型度量(例如
h2o.mse
)。如何执行这些操作的示例可以在GitHub repo上的和子文件夹中找到

因为您使用的是R,所以下面是一个包含网格搜索的示例,其中包含排序结果。您还可以在
h2o.getGrid
函数的R文档中找到如何访问此信息

打印所有模型的auc,按验证auc排序:

auc_table <- h2o.getGrid(grid_id = "eeg_demo_gbm_grid", sort_by = "auc", decreasing = TRUE)
print(auc_table)
best_model <- h2o.getModel(auc_table@model_ids[[1]])
h2o.auc(best_model, valid = TRUE)
表中的顶行包含具有最佳AUC的模型,因此下面我们可以获取该模型并提取验证AUC:

auc_table <- h2o.getGrid(grid_id = "eeg_demo_gbm_grid", sort_by = "auc", decreasing = TRUE)
print(auc_table)
best_model <- h2o.getModel(auc_table@model_ids[[1]])
h2o.auc(best_model, valid = TRUE)

best_model这似乎仅适用于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)
库(h2o)
图书馆(jsonlite)
h2o.init()

iris.hex不幸的是,当你把它们都传进来时,H2O网格函数使用的是训练帧而不是验证帧。因此,获胜的模式是极其矫枉过正和无用的。编辑:好的,这里更正一下,实际上,对于学习曲线分析和偏差与方差分析来说,像这样的训练偏差非常低是很有用的。但为了清楚起见,我还需要能够再次运行并获得一个验证数据集,作为最终模型拟合和选择的搜索标准

例如,这里有一个来自GBM上的网格函数的获胜模型,其中传递了validation_帧,AUC是搜索度量。您可以看到,验证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

这太好了,艾琳。在可复制的示例中,我没有通过验证集,但在实际代码中通过了。非常感谢。实际上,grid()不使用验证框架。它只使用训练框架。它会忽略为评分目的传入的验证帧。由此产生的模型自然过度拟合,因此毫无用处。这个问题解决了吗?您可以从搜索中查看获胜模型,并直接查看其得分进度,以比较例如培训auc和验证auc。如果您在那里查看,您将看到问题。@GeoffreyAnderson我们有一张票证,用于跟踪您在
验证\u框架
h2o.grid
中的观察结果/问题,希望能很快解决。您可以在此处跟踪进度:@Erin L.感谢您的关注。仅供参考,模型训练功能(例如,h2o.gbm(),h2o.randomForest())而不是网格本身是问题的实际来源,根据我对其进行的持续研究,我认为这是问题的实际来源。我非常希望修复我的用户错误(如果有的话),或者用一些解决方法修复任何软件错误(如果有的话)。H2O在运行library(H2O)时不会告诉您版本,但在这种情况下它会很有帮助。H2O也没有类似于H2O.version的函数,但这在类似这样的情况下也会很有帮助。H2O集群版本:3.10.1.1 from H2O.init(),我认为这并没有回答问题(关于如何检索模型的顺序)。如果您发现validation_frame被忽略的问题,我建议删除此答案并开始一个新问题,并提供一个完全可复制的示例。@GeoffreyAnderson我们不需要H2O中的特殊函数来获取软件包版本;这就是R中的
packageVersion()
。只需键入:
packageVersion(“h2o”)
h2o.init()
即可查看版本号。@GeoffreyAnderson h2o的算法使用验证框架提前停止。模型在满足早期停止标准后停止,但没有提供额外的修剪步骤来查找迄今为止构建的树的最高AUC。换言之,模型发现,在指定的连续
停止轮数之后,AUC在指定的
停止轮数公差下没有改善。在这一点上,它已经建立了X棵树,具有一定的分数,因此这就是它返回的分数。它不会返回最高分数,因为您的示例中的最高分数对应于不同数量的树。Iris是一个多类问题,这就是上面的示例不支持AUC的原因。错误消息将精确打印multiclass支持的度量:
指定的排序依据的参数无效。必须是以下各项之一:[r2,每类平均精度,每类最大误差,err,总行数,rmse,精度,错误计数,logloss,mse,每类平均误差]
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