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

问题描述 投票:1回答:1

因此,我对使用python的ML / AI游戏还是比较陌生的,我目前正在研究围绕XGBoost的自定义目标函数的实现的问题。

我的微分方程知识非常生锈,因此我创建了一个带有梯度和粗麻布的自定义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)

我为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

文档参考为here

谢谢!

python machine-learning xgboost gradient-descent hessian-matrix
1个回答
0
投票

根据the documentation,库将按此顺序传递预测值(在您的情况下为y_pred)和基本真理值(在您的情况下为y_true)。

您在y_true函数中将y_predcustom_se(y_true, y_pred)值反向传递给gradient_sehessian_se函数。对于hessian来说,这没有什么区别,因为hessian应该为所有x值返回2,并且您已经正确地做到了。

对于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
© www.soinside.com 2019 - 2024. All rights reserved.