我正在运行回归 XGBoost 模型并尝试通过使用以下代码观察训练和测试错误来防止过度拟合:
eval_set = [(X_train, y_train), (X_test, y_test)]
xg_reg = xgb.XGBRegressor(booster='gbtree',
objective ='reg:squarederror',
max_depth = 6,
n_estimators = 100,
min_child_weight = 1,
learning_rate = 0.05,
seed = 1,early_stopping_rounds = 10)
xg_reg.fit(X_train,y_train,eval_metric="rmse", eval_set = eval_set, verbose = True)
打印如下:
[93] validation_0-rmse:0.233752 validation_1-rmse:0.373165
[94] validation_0-rmse:0.2334 validation_1-rmse:0.37314
[95] validation_0-rmse:0.232194 validation_1-rmse:0.372643
[96] validation_0-rmse:0.231809 validation_1-rmse:0.372675
[97] validation_0-rmse:0.231392 validation_1-rmse:0.372702
[98] validation_0-rmse:0.230033 validation_1-rmse:0.372244
[99] validation_0-rmse:0.228548 validation_1-rmse:0.372253
但是,我注意到打印出来的训练轮数并且在 evals_results 中总是等于 n_estimators。
In [92]: len(results['validation_0']['rmse'])
Out[92]: 100
如果我将树的数量更改为 600,轮数会增加到 600,等等。我的印象是打印的是每轮训练的度量结果,包括一次训练所有树。
这里发生了什么?每一层树都被认为是一个单独的训练轮吗?