h2o AutoML 与 h2o XGBoost - 模型指标

h2o AutoML vs h2o XGBoost - model metrics

我的数据集相当小:15 列,3500 行,我一直看到 h2o 中的 xgboost 训练的模型比 h2o AutoML 更好。我正在使用 H2O 3.26.0.2 和 Flow UI.

H2O XGBoost 在几秒钟内完成,而 AutoML 需要多长时间(20 分钟)并且总是给我带来更差的性能。

我承认数据集可能并不完美,但我希望带有网格搜索的 AutoML 与 h2o XGBoost 一样好(或更好)。我的想法是 AutoML 将训练多个 XGBoost 模型并对超参数进行网格搜索,所以它应该是相似的,对吧?

对于 AutoML 和 XGBoost,我使用相同的训练数据集和相同的响应列。

使用 XGBoost 进行 运行 实验的代码是:

import h2o
from h2o.estimators.xgboost import H2OXGBoostEstimator

h2o_frame = h2o.import_file(path="myFile.csv")

feature_columns = h2o_frame.columns
label_column = "responseColumn"
feature_columns.remove(label_column)

xgb = H2OXGBoostEstimator(nfolds=10, seed=1)

xgb.train(x=feature_columns, y=label_column, training_frame=h2o_frame)

# now export metrics to file
MRD = xgb.mean_residual_deviance()
RMSE= xgb.rmse()
MSE= xgb.mse()
MAE= xgb.mae()
RMSLE= xgb.rmsle()

header = ['model','mean_residual_deviance','rmse','mse','mae','rmsle']

with open('metrics.out', mode='w') as result_file:
    writer = csv.writer(result_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(header)
    writer.writerow(['H2O_XGBoost', MRD, RMSE, MSE, MAE, RMSLE])

使用 AutoML 进行 运行 实验的代码是:

import h2o
from h2o.automl import H2OAutoML

h2o_frame = h2o.import_file(path="myFile.csv")

feature_columns = h2o_frame.columns
label_column = "responseColumn"
feature_columns.remove(label_column)

aml = H2OAutoML(seed=1, nfolds=10, exclude_algos=["StackedEnsemble"], max_models=20)

aml.train(x=feature_columns, y=label_column, training_frame=h2o_frame)

# now export metrics to file
h2o.export_file(aml.leaderboard, "metrics.out", force = True, parts = 1)

尝试使用不同的 nfold,更多 AutoML 模型,增加早期停止轮数。我尝试从 AutoML 中排除所有算法(XGBoost 除外),但我仍然得到相同的结果。

结果差异如下:

H2O XGBoost:

model   xgboost-5a8f9766-940c-4e5c-b57d-62b186f4c058
model_checksum  7409831159060775248
frame   train_set_v01.hex
frame_checksum  6864971999838167226
description ·
model_category  Regression
scoring_time    1566296468447
predictions ·
MSE 252.265021
RMSE    15.882853
nobs    3476
custom_metric_name  ·
custom_metric_value 0
r2  0.726871
mean_residual_deviance  252.265021
mae 10.709369
rmsle   NaN

xgboost-5a8f9766-940c-4e5c-b57d-62b186f4c058 的 XGBoost 本机参数:

name    value
silent  true
eta 0.3
colsample_bylevel   1
objective   reg:linear
min_child_weight    1
nthread 8
seed    -1058380797
max_depth   6
colsample_bytree    1
lambda  1
gamma   0
alpha   0
booster gbtree
grow_policy depthwise
nround  50
subsample   1
max_delta_step  0
tree_method auto

H2O AutoML(获奖模型):

model   StackedEnsemble_AllModels_AutoML_20190819_235446
model_checksum  -6727284429527535576
frame   automl_training_train_set_v01.hex
frame_checksum  6864971999838167226
description ·
model_category  Regression
scoring_time    1566256209073
predictions ·
MSE 332.146239
RMSE    18.224880
nobs    3476
custom_metric_name  ·
custom_metric_value 0
r2  0.640383
mean_residual_deviance  332.146239
mae 12.927023
rmsle   1.225650
residual_deviance   1154540.326762
null_deviance   3210476.302359
AIC 30070.640602
null_degrees_of_freedom 3475
residual_degrees_of_freedom 3464

来自同一 AutoML 的评分最高的 XGBoost 模型(排行榜第三):

model   XGBoost_grid_1_AutoML_20190819_235446_model_5
model_checksum  8047828446507408480
frame   automl_training_train_set_v01.hex
frame_checksum  6864971999838167226
description ·
model_category  Regression
scoring_time    1566255442068
predictions ·
MSE 616.910151
RMSE    24.837676
nobs    3476
custom_metric_name  ·
custom_metric_value 0
r2  0.332068
mean_residual_deviance  616.910151
mae 17.442629
rmsle   1.325149

XGBoost 本机参数(AutoML 中的 XGBoost_grid_1_AutoML_20190819_235446_model_5):

name    value
silent  true
normalize_type  tree
eta 0.05
objective   reg:linear
colsample_bylevel   0.8
nthread 8
seed    940795529
min_child_weight    15
rate_drop   0
one_drop    0
sample_type uniform
max_depth   20
colsample_bytree    1
lambda  100
gamma   0
alpha   0.1
booster dart
grow_policy depthwise
skip_drop   0
nround  120
subsample   0.8
max_delta_step  0
tree_method auto

这里的问题是您正在将 XGBoost 的 训练指标 与 AutoML 模型的 CV 指标 进行比较。

您为手动 XGBoost 模型发布的代码提供了训练指标。相反,如果您想与 AutoML 中模型的性能进行公平比较,则需要获取 CV 指标(AutoML 排行榜默认报告 CV 指标,这就是您在代码中报告的内容)。

改变这个:

# now export metrics to file
MRD = xgb.mean_residual_deviance()
RMSE= xgb.rmse()
MSE= xgb.mse()
MAE= xgb.mae()
RMSLE= xgb.rmsle()

收件人:

# now export metrics to file
MRD = xgb.mean_residual_deviance(xval=True)
RMSE= xgb.rmse(xval=True)
MSE= xgb.mse(xval=True)
MAE= xgb.mae(xval=True)
RMSLE= xgb.rmsle(xval=True)

指标的描述及其 return 在 Python module docs 中。

进行此更改后,您应该会看到问题已解决,并且手动 XGBoost 模型和 AutoML 模型的性能相当。