在 XGBoost.XGBRegressor 中创建自定义目标函数

jpb*_*jpb 3 python machine-learning gradient-descent xgboost hessian-matrix

因此,我对 Python 中的 ML/AI 游戏相对较新,目前正在研究围绕 XGBoost 自定义目标函数实现的问题。

我的微分方程知识相当生疏,所以我创建了一个带有梯度和 hessian 的自定义 obj 函数,该函数对均方误差函数进行建模,该函数作为 XGBRegressor 中的默认目标函数运行,以确保我正确执行所有这些操作。问题是,模型的结果(错误输出很接近,但在大多数情况下并不相同(并且在某些点上相差很大)。我不知道我做错了什么,也不知道如果我做错了什么,这怎么可能我的计算是正确的。如果你们都可以看看这个,也许可以深入了解我错在哪里,那就太棒了!

没有自定义函数的原始代码是:

    import xgboost as xgb

    reg = xgb.XGBRegressor(n_estimators=150, 
                   max_depth=2,
                   objective ="reg:squarederror", 
                   n_jobs=-1)

    reg.fit(X_train, y_train)

    y_pred_test = reg.predict(X_test)
Run Code Online (Sandbox Code Playgroud)

我的 MSE 自定义目标函数如下:

    def gradient_se(y_true, y_pred):
        #Compute the gradient squared error.
        return (-2 * y_true) + (2 * y_pred)

    def hessian_se(y_true, y_pred):
        #Compute the hessian for squared error
        return 0*(y_true + y_pred) + 2

   def custom_se(y_true, y_pred):
        #squared error objective. A simplified version of MSE used as
        #objective function.

        grad = gradient_se(y_true, y_pred)
        hess = hessian_se(y_true, y_pred)
        return grad, hess
Run Code Online (Sandbox Code Playgroud)

文档参考在这里

谢谢!

Qqb*_*qbt 8

根据文档,库按此顺序传递预测值(y_pred在您的情况下)和地面实况值(在您的情况下)。y_true

您可以在函数中以相反的顺序将y_true和值传递给和函数。对于粗麻布来说,这没有什么区别,因为粗麻布应该为所有值返回 2,并且您已经正确完成了这一点。y_predcustom_se(y_true, y_pred)gradient_sehessian_sex

对于该函数,您的和gradient_se符号不正确。y_truey_pred

正确的实现如下:

    def gradient_se(y_pred, y_true):
        #Compute the gradient squared error.
        return 2*(y_pred - y_true)

    def hessian_se(y_pred, y_true):
        #Compute the hessian for squared error
        return 0*y_true + 2

   def custom_se(y_pred, y_true):
        #squared error objective. A simplified version of MSE used as
        #objective function.

        grad = gradient_se(y_pred, y_true)
        hess = hessian_se(y_pred, y_true)
        return grad, hess
Run Code Online (Sandbox Code Playgroud)

更新:请记住,本机 XGBoost 实现XGBoost 的 sklearn 包装器实现使用不同的参数顺序。本机实现首先采用预测,然后采用真实标签 (dtrain) ,而sklearn实现首先采用真实标签 (dtrain) ,然后采用预测。