我正在使用Python和数据集运行XGBoost XGBRegressor,如下所示:
click_id | manufacturer | category | delivery_time | price | revenue
1 |10 | 100 | 24 | 100 | 0
2 |10 | 100 | 24 | 100 | 0
3 |10 | 100 | 24 | 100 | 0
4 |10 | 100 | 24 | 100 | 120
5 |20 | 200 | 48 | 200 | 0
收入是因变量,其余变量是特征。
当我运行XGBRegressor并将 eval_metric 设置为“ mae ”(平均绝对错误)时,训练和验证错误会不断增加。如何增加训练误差?是否存在可能导致xgboost训练错误增加的任何情况(模型参数或奇怪数据点的任意组合)?
这是代码:
model = XGBRegressor(
learning_rate=0.1,
n_estimators=200,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.9,
colsample_bytree=0.9,
reg_alpha=10,
nthread=4)
model.fit(X_train, y_train,
eval_set=[(X_train, y_train), (X_test, y_test)], eval_metric='mae')
当 eval_metric 设置为“ rmse ”时,训练错误会按预期减少。
答案 0 :(得分:3)
您必须区分最小化objective
和评估集上的错误(由eval_metric
计算)。这两者可能不同 - 这就是评估集中错误增加的原因。
您设置中的XGBoost正在尝试最小化均方根误差(RMSE),因为您使用objective="reg:linear"
作为参数(默认参数XGBRegressor
)。实际上,XGBoost甚至不支持作为objective
函数的平均绝对误差(MAE)。有关详细信息,请查看XGBoost objective parameter。未实现MAE作为目标的原因可能是XGBoost在算法中需要非零二阶导数(MAE不是这种情况)。
使用XGRegressors train
- 函数(参见here)您可以通过定义错误函数和用于计算渐变和粗体(一阶和二阶)的函数来定义您自己的objective
衍生物)。有关详细信息,请查看this example。
我试图通过将hessian设置为常量但小的值来实现MAE。不幸的是,它收敛得很慢。它仍可能适用于您的数据。