【问题标题】:XGBoost custom squarederror loss function not working similar to default implementationXGBoost 自定义平方误差损失函数不像默认实现那样工作
【发布时间】:2022-11-04 16:55:37
【问题描述】:

我最近一直在尝试为 xgboost 回归实现默认的 reg:squarederror 损失函数,以便我以后可以在此函数的基础上将其更改为非对称函数。但是,与默认实现相比,我的自定义版本无法获得相同的结果。

这是我一直在尝试的代码:

import xgboost as xgb
import numpy as np
import pandas as pd

a = np.array([1,2,3,4,5,6])
b = np.array([2,3,4,5,6,7])

a = pd.DataFrame(data=a)
b = pd.DataFrame(data=b)
model = xgb.XGBRegressor(random_state=0, objective='reg:squarederror')
model.fit(a, b)
print(model.predict(a))

def squared_error(predt: np.ndarray, dtrain: xgb.DMatrix):
    y = dtrain.get_label()
    grad = predt - y
    hess = np.ones(predt.shape)
    return grad, hess


dtrain = xgb.DMatrix(a.values, label=b.values)
dtest = xgb.DMatrix(a.values)

model2 = xgb.train({'seed': 0}, dtrain=dtrain, obj=squared_error)
print(model2.predict(dtest))

问题是这两个模型没有给出相同的结果。 任何想法我的代码有什么问题?

我也对 reg:squaredlogerror 和给定的示例 (https://xgboost.readthedocs.io/en/stable/tutorials/custom_metric_obj.html) 进行了相同的尝试,这对两个模型都给出了相同的结果。这让我相信我的代码有问题。

我将不胜感激找到我的错误的任何帮助。

-蒂莫

【问题讨论】:

    标签: python machine-learning regression data-science xgboost


    【解决方案1】:

    尝试

        def squared_error(predt: np.ndarray, dtrain: xgb.DMatrix):
            y = dtrain.get_label()
            grad = y - pred
            hess = np.ones(y.shape[0])
            return grad, hess
    

    然后它应该工作

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2019-06-13
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多