我正在运行一个回归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,等等。我的印象是每一轮训练的结果都是公制的,包括同时训练所有的树木。
这里发生什么事情?每一层树都被认为是单独的训练轮吗?
发布于 2019-08-26 19:36:36
对于梯度提升,真的没有“一层树”的概念,我认为这就是混乱发生的地方。每一次迭代(轮)适合于一棵树的一些损失函数的负梯度(在所有以前的迭代中使用更新模型的预测计算),在你的例子中,根均方误差。该算法在每一次迭代中都不适合树的集合。然后,将每棵树添加到所有先前拟合的树中,加上先前迭代中的最优权重,从而得到最终的预测结果。
你所看到的验证分数是,因此,你的完整模型的分数符合树的迭代。例如,这里的这一行:
[93] validation_0-rmse:0.233752 validation_1-rmse:0.373165是您的模型在validation_ 0和validation_1上的性能,该模型适合在以前迭代生成的过去梯度上的93棵树。
https://datascience.stackexchange.com/questions/58225
复制相似问题