博客
关于我
XGBoost算法原理以及实现
阅读量:140 次
发布时间:2019-02-27

本文共 2351 字,大约阅读时间需要 7 分钟。

XGBoost算法是由GBDT算法演变而来的,两者在优化过程中有显著的不同。GBDT算法在求解最优化问题时采用了一阶导技术,而XGBoost则更进一步,使用了损失函数的一阶导和二阶导。此外,XGBoost还支持自定义损失函数,但前提是损失函数需要具备可导性。

XGBoost算法原理

XGBoost算法的核心原理是基于决策树的思想,在现有决策树的基础上不断添加新的树,提升模型的精确率和效果。具体来说,XGBoost通过加树的方式逐步优化模型,实现模型性能的提升。

基础理解

  • 损失函数:通常以方差损失函数 ( l(y_i, \hat{y}_i) = (y_i - \hat{y}_i)^2 ) 为例,损失函数的选择会影响模型的训练目标。

  • 最优化目标:目标函数 ( F(x) = \argmin E(x,y)(L(y, F(x))) ),其中 ( L(y, F(x)) ) 是损失函数。

  • 集成算法表示:最终的预测结果表示为 ( \hat{y}i = \sum{k=1}^K f_k(x_i) ),其中 ( f_k ) 属于某一族基模型。

  • 初始预测值: ( \hat{y}_0^ = 0 )。

  • 逐步更新预测值

    • ( \hat{y}_1^ = f_1(x_i) = \hat{y}_0^ + f_1(x_i) )
    • ( \hat{y}_2^ = f_1(x_i) + f_2(x_i) = \hat{y}_1^ + f_2(x_i) )
    • 依此类推,直到 ( \hat{y}n^ = \sum{k=1}^n f_k(x_i) )。
  • 推导过程

  • 样本计算:在样本中计算真实值 ( y_i ) 和预测值 ( \hat{y}_i^ )。

  • 目标函数:目标函数为 ( \text{Obj}_t = \sum l(y_i, \hat{y}_i^{t-1} + f_t(x_i)) + U(f_t) + c ),其中 ( c ) 为常数。

  • 泰勒展开:利用泰勒展开,( f(x + h) \approx f(x) + h f'(x) + \frac{h^2}{2} f''(x) ),其中 ( h ) 为步长。

  • 定义一阶导和二阶导

    • ( G_i = G(\hat{y}{t-1}^) l(y_i, \hat{y}{t-1}^) )
    • ( H_i = H(\hat{y}{t-1}^) \cdot 2 l(y_i, \hat{y}{t-1}^) ),其中 ( G ) 和 ( H ) 分别为一阶导和二阶导。
  • 目标函数变换:目标函数变换为 ( \text{Obj}_t \approx \sum (g_i f_t(x_i) + \frac{1}{2} h_i (f_t(x_i))^2) + U(f_t) )。

  • 样本遍历转换:将样本遍历转换为叶子节点遍历,得到最终目标函数:[\text{Obj}_t = \sum \left( G_j w_j + \frac{1}{2} (H_j + \lambda) w_j^2 \right) + qT]其中,( G_j ) 和 ( H_j ) 分别为叶子节点上的一阶导和二阶导。

  • 求解优化

    • 对 ( w_j ) 求偏导并令其为零,得到 ( w_j = -\frac{G_j}{H_j + \lambda} )。
    • 将 ( w_j ) 代入目标函数,得到最终损失函数:[\text{Obj} = -\frac{1}{2} \sum \frac{G_j^2}{H_j + \lambda} + qT]
    • 据此计算模型复杂度并设置阈值。
  • 参数解释

  • max_depth:指定每个基础模型的最大深度,默认为 3。
  • learning_rate:模型迭代的学习率,默认为 0.1。
  • n_estimators:基础模型的数量,默认为 100。
  • silent:是否输出日志信息,默认为 True。
  • objective:目标函数类型,默认为分类中的 logistic 损失或回归中的 linear 损失。
  • booster:基础模型类型,默认为 CART 决策树。
  • gamma:节点分割的最小增益阈值,默认为 0。
  • min_child_weight:叶子节点中二阶导之和的最小值,默认为 1。
  • subsample:构建基础模型的抽样比例,默认为 1。
  • colsample_bytree:每个基础模型所需的字段采样比例,默认为 1。
  • reg_alpha:L1 正则项系数,默认为 0。
  • reg_lambda:L2 正则项系数,默认为 1。
  • scale_pos_weight:平衡类别样本的系数,默认为 1。
  • base_score:样本初始化预测得分,默认为 0.5。
  • random_state:随机数生成器的种子,默认为 0。
  • XGBoost实战案例

  • 数据集:信用卡欺诈数据集,包含 25 个特征和 284807 条记录,因变量为交易是否欺诈(0 表示正常,1 表示欺诈)。

  • 数据处理

    • 删除敏感信息,使用 PCA 处理后得到处理后的数据集。
    • 查看类别比例,发现欺诈交易占比极低,仅 0.17%,需要使用 SMOTE 算法进行重采样。
  • 模型训练

    • 使用 SMOTE 算法对训练数据进行重采样,平衡类别分布。
    • 构建 XGBoost 分类器,使用默认参数直接建模。
    • 对训练数据进行拟合,评估模型性能。
  • 模型评估

    • 使用测试数据集验证模型性能,计算准确率和分类报告。
    • 生成 ROC 曲线并计算 AUC 值,评估模型的分类能力。
  • 不平衡数据建模对比

    • 不进行数据重采样直接建模,验证模型性能差异。
  • 通过实验结果发现,使用 SMOTE 简单重采样能显著提升模型性能,虽然仅提升 0.01 的 AUC 值,但仍然对模型性能有积极作用。

    转载地址:http://xrvb.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现djb2哈希算法(附完整源码)
    查看>>
    Objective-C实现DNF排序算法(附完整源码)
    查看>>
    Objective-C实现doomsday末日算法(附完整源码)
    查看>>
    Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现double hash双哈希算法(附完整源码)
    查看>>
    Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
    查看>>
    Objective-C实现double linear search 双线性搜索算法(附完整源码)
    查看>>
    Objective-C实现double sort双重排序算法(附完整源码)
    查看>>
    Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
    查看>>
    Objective-C实现DoublyLinkedList双链表算法(附完整源码)
    查看>>
    Objective-C实现DPLL(davisb putnamb logemannb loveland)算法(附完整源码)
    查看>>
    Objective-C实现DWT离散小波变换(附完整源码)
    查看>>
    Objective-C实现Edmonds-Karp算法(附完整源码)
    查看>>
    Objective-C实现EEMD算法(附完整源码)
    查看>>
    Objective-C实现elgamal 密钥生成器算法(附完整源码)
    查看>>
    Objective-C实现EM算法(附完整源码)
    查看>>
    Objective-C实现EM算法(附完整源码)
    查看>>
    Objective-C实现entropy熵算法(附完整源码)
    查看>>
    Objective-C实现euclidean distance欧式距离算法(附完整源码)
    查看>>