对于 Python 中使用 H2O 的网格搜索,我们应该在哪里设置种子?

For grid search using H2O in Python, where should we set the seed?

我看到我们在做网格搜索调优超参数的时候,有几个地方可以设置seed,比如我们可以在下面3个地方设置seed

  1. 当我们使用 H2OGradientBoostingEstimator 初始化估计器时,
  2. 当我们定义search_criteria时,我们也可以把seed
  3. 当我们开始使用定义的网格进行训练时,我们也可以将seed放在train函数中

这3个是多余的,我们只需要在其中设置一个,还是每个都起不同的作用?

谢谢!

使用 Python API

时,有两个地方可以指定种子

1) Estimator,我们以GBM为例

gbm = H2OGradientBoostingEstimator(nfolds=5, seed=1234)
gbm.train(x=features,y=response,training_frame=train)

请注意我没有在 train 方法中指定种子。如果您将种子参数传递给 train,它将中断。

从 API docs 你可以看到没有提供种子参数。

train(x=None, y=None, training_frame=None, offset_column=None, fold_column=None, weights_column=None, validation_frame=None, max_runtime_secs=None, ignored_columns=None, model_id=None, verbose=False)

来自 documentation 这里是 Estimator 种子的定义。

此选项为依赖于随机化的算法指定随机数生成器 (RNG) 种子。定义种子后,算法将确定性地运行。 每个 H2O 实例的种子都是一致的,因此您可以在替代配置中创建具有相同起始条件的模型。

2) H2OGridSearch. For the docs 中的 search_criteria:

有关 search_criteria 的更多信息: 这是用于更智能的超参数搜索的控制参数字典。字典可以包含以下值:strategy、max_models、max_runtime_secs、stopping_metric、stopping_tolerance、stopping_rounds 和 seed。策略的默认值“笛卡尔”涵盖整个 space 超参数组合。如果要使用笛卡尔网格搜索,可以不指定 search_criteria 参数。指定“RandomDiscrete”策略以对超参数的所有组合执行随机搜索。 RandomDiscrete 通常应该与至少一个早期停止标准结合使用,max_models and/or max_runtime_secs。下面是一些示例:

虽然您可以将种子参数传递给 train 方法进行网格搜索而不会出现任何中断,但那里的种子参数什么都不做。如果你想有可重复的网格搜索运行,你需要在 search_criteria 参数中指定种子参数,就像这样

# build grid search with previously made GBM and hyper parameters
grid = H2OGridSearch(model = my_model, hyper_params = hyper_params,
                     search_criteria = {'strategy': "RandomDiscrete", "max_runtime_secs" : 10, "seed" :1234})

# train using the grid
grid.train(x = predictors, y = response, training_frame = train, validation_frame = valid)