XGboost - 增加训练错误“mae”

时间:2016-07-24 21:28:06

标签: python machine-learning regression xgboost

我正在使用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 ”时,训练错误会按预期减少。

1 个答案:

答案 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。不幸的是,它收敛得很慢。它仍可能适用于您的数据。