python - h2o GLM GridSearch lambda 值

标签 python glm h2o

我正在使用 H2O (Python),我正在使用 H2OGridSearch 来获取 GLM 的 alpha 值(H2OGeneralizedLinearEstimator),还使用 ​​lambda_search=True 使用 k 折交叉验证。

如何获得最佳模型的 lambda 值?

编辑:完全可重现的示例

数据:

34.40 17:1 73:1 127:1 265:1 912:1 1162:1 1512:1 1556:1 1632:1 1738:1
205.10 127:1 138:1 338:1 347:1 883:1 912:1 1120:1 1122:1 1512:1
7.75 66:1 127:1 347:1 602:1 1422:1 1512:1 1535:1 1738:1
8.85 127:1 608:1 906:1 979:1 1077:1 1512:1 1738:1
51.80 127:1 347:1 608:1 766:1 912:1 928:1 952:1 1034:1 1512:1 1610:1 1738:1
110.00 127:1 229:1 347:1 602:1 608:1 1171:1 1512:1 1718:1
8.90 66:1 127:1 205:1 347:1 490:1 589:1 912:1 1016:1 1512:1

将此文件命名为h2o_example.svmlight

然后运行:

h2o_data = h2o.import_file("h2o_example.svmlight")
cols = h2o_data.columns[1:]
hyper_parameters = {"alpha": [0.0, 0.01, 0.99, 1.0]}
grid = H2OGridSearch(H2OGeneralizedLinearEstimator(family="gamma", link="log", lambda_search=True, nfolds=2, intercept=True, standardize=False),
hyper_params=hyper_parameters)
grid.train(y="C1", x=cols, training_frame=h2o_data)
grid_table = grid.get_grid(sort_by="r2", decreasing=True)
best = grid_table.models[0]
best.actual_params["lambda"]
best.actual_params["alpha"]

最后两个命令失败,报错:

TypeError: 'property' object has no attribute '__getitem__'

显然,我以错误的方式使用了 lambda_search。如何根据我的标准获得最佳模型的单个 alpha 和 lambda 值?

最佳答案

最终编辑

有多种获取 lambda 的方法(如下所示),但这里有两种获取 lambda 的简洁方法。(注意完全可重现的代码在底部)

如果您有 lambda_search = True,您可以查看 lambda_search 列下的模型汇总表,看看为 lambda.min< 设置了什么值,这是你最好的 lambda

model.summary()['lambda_search']

这将生成一个包含类似于以下字符串的列表:

['nlambda = 100, lambda.max = 12.733, lambda.min = 0.05261, lambda.1se = -1.0']

如果您不使用 lambda 搜索并且不设置 lambda 值(或设置它),您也可以使用汇总表

model.summary()['regularization']

输出如下:

['Elastic Net (alpha = 0.5, lambda = 0.01289 )']

其他选项:

看模型实际参数: best.actual_params['lambda'] best.actual_params['alpha']

best 是您在网格搜索结果中的最佳模型

第一次编辑

得到你能做的最好的模型

grid_table = grid.get_grid(sort_by='r2', decreasing=True)
best = grid_table.models[0]

然后你可以使用:

best.actual_params['lambda']

完全可重现的示例

import h2o
from h2o.estimators.glm import H2OGeneralizedLinearEstimator
h2o.init()

# import the airlines dataset:
# This dataset is used to classify whether a flight will be delayed 'YES' or not "NO"
# original data can be found at http://www.transtats.bts.gov/
airlines= h2o.import_file("https://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k_headers.zip")

# convert columns to factors
airlines["Year"]= airlines["Year"].asfactor()
airlines["Month"]= airlines["Month"].asfactor()
airlines["DayOfWeek"] = airlines["DayOfWeek"].asfactor()
airlines["Cancelled"] = airlines["Cancelled"].asfactor()
airlines['FlightNum'] = airlines['FlightNum'].asfactor()

# set the predictor names and the response column name
predictors = ["Origin", "Dest", "Year", "UniqueCarrier", "DayOfWeek", "Month", "Distance", "FlightNum"]
response = "IsDepDelayed"

# split into train and validation sets
train, valid= airlines.split_frame(ratios = [.8])

# try using the `lambda_` parameter:
# initialize your estimator
airlines_glm = H2OGeneralizedLinearEstimator(family = 'binomial', lambda_ = .0001)

# then train your model
airlines_glm.train(x = predictors, y = response, training_frame = train, validation_frame = valid)

# print the auc for the validation data
print(airlines_glm.auc(valid=True))


# Example of values to grid over for `lambda`
# import Grid Search
from h2o.grid.grid_search import H2OGridSearch

# select the values for lambda_ to grid over
hyper_params = {'lambda': [1, 0.5, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0]}

# this example uses cartesian grid search because the search space is small
# and we want to see the performance of all models. For a larger search space use
# random grid search instead: {'strategy': "RandomDiscrete"}
# initialize the glm estimator
airlines_glm_2 = H2OGeneralizedLinearEstimator(family = 'binomial')

# build grid search with previously made GLM and hyperparameters
grid = H2OGridSearch(model = airlines_glm_2, hyper_params = hyper_params,
                     search_criteria = {'strategy': "Cartesian"})

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

# sort the grid models by decreasing AUC
grid_table = grid.get_grid(sort_by = 'auc', decreasing = True)
print(grid_table)

best = grid_table.models[0]
print(best.actual_params['lambda'])

关于python - h2o GLM GridSearch lambda 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684402/

相关文章:

python - Python 中 Plotly Express 的等值线图可以接受 CSS 格式的颜色吗?

r - 使用 rlang 将权重传递给 glm()

R 中速率变量的回归

r - 在用户定义函数中调用 glm() 函数

r - 具有类别不平衡的 H2O 深度学习

python - Apache Cassandra Python 插入数据

python - 在函数内部包含 For 循环以处理元组列表

r - H2O autoML 模型的交叉验证预测

python - 如何控制Python中的导入路径?

r - H2O 在 R 中连接失败