【问题标题】:Creating a Custom Objective Function in for XGBoost.XGBRegressor为 XGBoost.XGBRegressor 创建自定义目标函数
【发布时间】:2020-04-28 05:42:02
【问题描述】:

所以我对 Python 中的 ML/AI 游戏比较陌生,我目前正在解决一个围绕 XGBoost 的自定义目标函数实现的问题。

我的微分方程知识相当生疏,所以我创建了一个自定义 obj 函数,它具有梯度和 hessian,它对作为 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】:

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

    您将custom_se(y_true, y_pred) 函数中的y_truey_pred 值以相反的顺序传递给gradient_sehessian_se 函数。对于粗麻布,它没有任何区别,因为粗麻布应该为所有 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
    

    更新:请记住native XGBoost implementationsklearn wrapper for XGBoost 的实现使用不同的参数顺序。 native 实现采用预测 first 和真实标签(dtrain)second,而 sklearn 实现采用真实标签(dtrain) first 和预测 second

    【讨论】:

    • 根据文档,顺序是y_trueypred。见注。 xgboost.readthedocs.io/en/latest/python/… 但我认为文档是错误的,因为这里实现的所有目标函数都颠倒了顺序 github.com/dmlc/xgboost/blob/master/demo/guide-python/…
    • 实际上,通过我的实验,我发现y_truey_pred 现在是正确的排序方式。
    • @PavelKomarov 文档和示例代码都显示 preds 是第一,dtrain 是第二(dtrain 有标签),请参阅github.com/dmlc/xgboost/blob/…
    • 我不知道该告诉你什么,小伙子。我打印了传入函数的信息,很明显第一个参数包含真正的目标,而第二个是模型预测(起初远离目标,但更接近)。我正在使用 sklearn 包装器 XGBRegressor,我看到两个 args 都以 numpy 数组的形式出现,而不是 preds 作为 xgboost 数据矩阵。
    • 哦,你没有提到你正在使用 sklearn 包装器! sklearn 包装器翻转参数github.com/dmlc/xgboost/blob/…。请记住,原始问题不是使用 sklearn 包装器,并且使用原始代码错误地传递了参数,因为它没有使用 sklearn 包装器接口,所以你在这里的特定评论完全是错误的,小伙子。
    猜你喜欢
    • 2016-02-24
    • 2016-10-03
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多