一种在GridSearch中删除交叉验证模型的方法?

时间:2018-07-18 15:07:09

标签: h2o

我在用Jupyter笔记本在H2O中建立随机森林模型的过程中一直用光内存。我发现使用20 GB内存实例,在抛出“树模型将无法放入驱动程序节点的内存”异常之前,我可以构建大约两个具有10倍交叉验证的50树模型(共22个模型)。使用for循环,可以在计算和显示指标之后删除交叉验证模型,但是对于GridSearch,似乎没有任何方法可以在搜索时删除多余的CV模型。是这样吗有什么解决方法吗? (我总是可以增加分配的内存量,但这最终将是在本地计算机上运行的有限值)。有没有人有关于GridSearch和有限内存的提示?谢谢。

1 个答案:

答案 0 :(得分:1)

这是一个合理的请求,并且H2O的网格搜索功能中目前尚无此方法,但是我创建了票证first vignette。还有一个here,用于类似的请求,它是在继续运行网格搜索时保留网格中的“前k个”模型(并删除其余的)。

我们已经通过keep_cross_validation_models参数为ticket open实现了此功能,因此,如果您愿意使用H2O AutoML(主要是GBM),则可以使用它代替随机森林网格。如果将此参数设置为FALSE,则CV模型将被删除,但是当前实现的唯一H2O AutoML是CV模型在AutoML运行结束时被删除,而不是在它们之后立即删除。创建并保存简历指标。

因此,在此同时,为了解决此问题,我建议您执行以下操作:

通过使用grid_id参数,可以多次执行网格。每次执行后,您可以手动删除CV模型。然后,您可以再次“训练”网格并将grid_id设置为与以前相同,这将向同一网格添加更多模型。如果使用笛卡尔网格搜索,则应更改搜索空间,如果使用随机网格搜索,则只需更改种子即可,以便第二次获得其他/新模型。它是手动的,但是比编写循环和从头开始创建网格要容易一些。

Python示例:

import h2o
from h2o.estimators.random_forest import H2ORandomForestEstimator
from h2o.grid.grid_search import H2OGridSearch

h2o.init()

# Import a sample binary outcome training set into H2O
train = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv")
x = train.columns
y = "response"
x.remove(y)

# For binary classification, response should be a factor
train[y] = train[y].asfactor()

# RF hyperparameters
rf_params = {'max_depth': list(range(5, 30)),
             'sample_rate': [i * 0.1 for i in range(5, 11)],
             'min_rows': list(range(1, 25))}

# Search criteria
search_criteria = {'strategy': 'RandomDiscrete', 'max_models': 20}

rf_grid = H2OGridSearch(model=H2ORandomForestEstimator,
                        grid_id='rf_grid',
                        hyper_params=rf_params,
                        search_criteria=search_criteria)
rf_grid.train(x=x, y=y, 
              training_frame=train, 
              nfolds=5, 
              ntrees=300,
              seed=1)

# Code to delete CV models (you'll have to do this part)

rf_grid.train(x=x, y=y, 
              training_frame=train, 
              nfolds=5, 
              ntrees=300,
              seed=2)  #change seed for second random grid search run