因此,我对 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)
我的 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
Thanks!
根据文档,库传递预测值(y_pred
在你的情况下)和真实值(y_true
在你的情况下)按此顺序。
你通过了y_true
and y_pred
中的值以相反的顺序custom_se(y_true, y_pred)
函数对两个gradient_se
and hessian_se
功能。对于粗麻布来说,这没有什么区别,因为粗麻布应该返回 2x
价值观,你已经正确地做到了这一点。
For the gradient_se
您的函数符号不正确y_true
and y_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
更新:请记住原生 XGBoost 实现和实施XGBoost 的 sklearn 包装器使用不同的参数顺序。这native实施需要预测first和真实标签(菌株)second,而sklearn实现采用真实标签(dtrain)first和预测second.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)