XGBoost自定义目标函数与评估指标教程

XGBoost自定义目标函数与评估指标教程

xgboost dmlc/xgboost: 是一个高效的的机器学习算法库,基于 C++ 开发,提供用于提升分类、回归、排序等任务的性能。 xgboost 项目地址: https://gitcode.com/gh_mirrors/xg/xgboost

概述

XGBoost作为一个可扩展的机器学习库,允许用户自定义目标函数和评估指标来满足特定需求。本教程将详细介绍如何在XGBoost中实现自定义的目标函数和评估指标,并通过平方对数误差(SLE)及其对应的均方根对数误差(RMSLE)作为示例进行说明。

目标函数与评估指标的基本概念

在XGBoost中,目标函数用于:

  1. 计算模型预测值与真实标签之间的差异
  2. 提供梯度信息(一阶和二阶导数)
  3. 指导模型优化方向

评估指标则用于监控模型在训练过程中的表现,通常与目标函数相关但不完全相同。

平方对数误差(SLE)实现

平方对数误差(SLE)的数学表达式为:

1/2 * [log(pred + 1) - log(label + 1)]^2

梯度计算

SLE的一阶导数(梯度)为:

[log(pred + 1) - log(label + 1)] / (pred + 1)

海森矩阵计算

SLE的二阶导数(海森矩阵)为:

[-log(pred + 1) + log(label + 1) + 1] / (pred + 1)^2

Python实现代码

import numpy as np
import xgboost as xgb
from typing import Tuple

def gradient(predt: np.ndarray, dtrain: xgb.DMatrix) -> np.ndarray:
    '''计算平方对数误差的梯度'''
    y = dtrain.get_label()
    return (np.log1p(predt) - np.log1p(y)) / (predt + 1)

def hessian(predt: np.ndarray, dtrain: xgb.DMatrix) -> np.ndarray:
    '''计算平方对数误差的海森矩阵'''
    y = dtrain.get_label()
    return ((-np.log1p(predt) + np.log1p(y) + 1) /
            np.power(predt + 1, 2))

def squared_log(predt: np.ndarray,
                dtrain: xgb.DMatrix) -> Tuple[np.ndarray, np.ndarray]:
    '''平方对数误差目标函数'''
    predt[predt < -1] = -1 + 1e-6  # 防止数值不稳定
    grad = gradient(predt, dtrain)
    hess = hessian(predt, dtrain)
    return grad, hess

均方根对数误差(RMSLE)实现

RMSLE是SLE的常用评估指标,其数学表达式为:

sqrt(1/N * [log(pred + 1) - log(label + 1)]^2)

Python实现代码

def rmsle(predt: np.ndarray, dtrain: xgb.DMatrix) -> Tuple[str, float]:
    '''均方根对数误差评估指标'''
    y = dtrain.get_label()
    predt[predt < -1] = -1 + 1e-6  # 数值稳定性处理
    elements = np.power(np.log1p(y) - np.log1p(predt), 2)
    return 'PyRMSLE', float(np.sqrt(np.sum(elements) / len(y)))

在XGBoost中使用自定义函数

训练时使用自定义目标函数

xgb.train({'tree_method': 'hist', 'seed': 1994},
          dtrain=dtrain,
          num_boost_round=10,
          obj=squared_log)

同时使用自定义评估指标

xgb.train({'tree_method': 'hist', 'seed': 1994,
           'disable_default_eval_metric': 1},
          dtrain=dtrain,
          num_boost_round=10,
          obj=squared_log,
          custom_metric=rmsle,
          evals=[(dtrain, 'dtrain'), (dtest, 'dtest')],
          evals_result=results)

反向链接函数注意事项

当使用内置目标函数时,XGBoost会自动处理预测值的转换。但对于自定义目标函数,用户需要自行处理:

  1. 对于恒等链接函数(如平方误差),无需特殊处理
  2. 对于对数链接或逆链接等非线性链接函数,需要特别注意预测值的转换

在Python接口中,可以通过predict函数的output_margin参数控制预测行为。

Scikit-Learn接口集成

XGBoost提供了与scikit-learn的良好集成:

直接使用scikit-learn的损失函数

from sklearn.metrics import mean_absolute_error
reg = xgb.XGBRegressor(
    tree_method="hist",
    eval_metric=mean_absolute_error,
)
reg.fit(X, y, eval_set=[(X, y)])

简化版自定义目标函数

def softprob_obj(labels: np.ndarray, predt: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
    rows = labels.shape[0]
    classes = predt.shape[1]
    grad = np.zeros((rows, classes), dtype=float)
    hess = np.zeros((rows, classes), dtype=float)
    eps = 1e-6
    for r in range(predt.shape[0]):
        target = labels[r]
        p = softmax(predt[r, :])
        for c in range(predt.shape[1]):
            g = p[c] - 1.0 if c == target else p[c]
            h = max((2.0 * p[c] * (1.0 - p[c])).item(), eps)
            grad[r, c] = g
            hess[r, c] = h
    return grad.reshape((rows * classes, 1)), hess.reshape((rows * classes, 1))

clf = xgb.XGBClassifier(tree_method="hist", objective=softprob_obj)

总结

本教程详细介绍了在XGBoost中实现自定义目标函数和评估指标的方法,包括:

  1. 目标函数和评估指标的基本概念
  2. 平方对数误差及其评估指标的具体实现
  3. 在XGBoost训练过程中使用自定义函数
  4. 反向链接函数的注意事项
  5. 与scikit-learn接口的集成方法

通过这些方法,用户可以根据具体需求灵活扩展XGBoost的功能,实现更加个性化的模型训练和评估。

xgboost dmlc/xgboost: 是一个高效的的机器学习算法库,基于 C++ 开发,提供用于提升分类、回归、排序等任务的性能。 xgboost 项目地址: https://gitcode.com/gh_mirrors/xg/xgboost

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史跃骏Erika

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值