2016-07-24 164 views
1

我跑XGBoost XGBRegressor Python和数据集,看起来像这样:XGboost - 提高培训错误 “前”

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') 

eval_metric设定为预期 “RMSE” 训练误差在下降。

回答

3

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

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

使用XGRegressors train - 功能(见here),您可以通过定义误差函数和calulating梯度和海赛(第一和第二阶导数)的函数定义自己的objective。详情请看this example

我试图通过设置hessian为一个常数但是很小的值来实现MAE。不幸的是,它收敛得很慢。它仍然可以与你的数据一起工作。