XGboost - 增加训练错误“mae”

hak*_*kaa 4 python regression machine-learning 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为“”(平均绝对误差)的培训和验证错误不断增加。训练误差如何增加?是否有任何情况(模型参数或奇怪数据点的任意组合)可能导致 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')
Run Code Online (Sandbox Code Playgroud)

eval_metric设置为“ rmse ”时,训练误差按预期减少。

小智 7

您必须区分最小化objective和评估集上的错误(由 计算eval_metric)。这两者可能不同 - 这就是评估集中错误增加的原因。

您设置中的 XGBoost 试图最小化均方根误差 (RMSE),因为您使用objective="reg:linear"作为参数(默认参数为XGBRegressor)。事实上,XGBoost 甚至不支持作为objective函数的平均绝对误差 (MAE) 。有关详细信息,请查看XGBoost 目标参数。MAE 作为目标没有实现的一个原因可能是 XGBoost 在算法中需要非零二阶导数(MAE 不是这种情况)。

使用 XGRegressorstrain函数(请参阅此处),您可以objective通过定义误差函数和用于计算梯度和 hessian(一阶和二阶导数)的函数来定义您自己的函数。有关详细信息,请查看此示例

我试图通过将 hessian 设置为一个恒定但很小的值来自己实现 MAE。不幸的是,它收敛得很慢。它仍然可以处理您的数据。