XGboost - 训练误差“mae”上升

4

我正在使用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

其中,收益是因变量,其余变量均为特征。

当我设置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个回答

7
你必须区分最小化objective和评估集上的误差(由eval_metric计算)这两者可能是不同的,这就是你的评估集误差增大的原因。
在你的设置中,XGBoost试图最小化均方根误差(RMSE),因为你使用objective="reg:linear"作为参数(XGBRegressor的默认参数)。实际上,XGBoost甚至不支持平均绝对误差(MAE)作为objective函数。有关详细信息,请参见XGBoost目标参数。不实现MAE作为目标函数的原因可能是XGBoost需要算法中的非零二阶导数(对于MAE不适用)。
使用XGRegressors的train函数(请参见此处),您可以通过定义误差函数和计算梯度和海森矩阵(一阶和二阶导数)的函数来定义自己的objective。有关详细信息,请参见此示例
我尝试通过将海森矩阵设置为常量但很小的值来实现MAE,但不幸的是它收敛得非常缓慢。然而,在使用您的数据时可能仍然有效。

你知道为什么MAE收敛得非常慢吗?在Scikit-Learn的RandomForestRegressor中,当设置criterion='mae'时,训练速度也非常慢。 - byrony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接