博客
关于我
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/

    你可能感兴趣的文章
    python基于flask搭建http服务(四)—— Docker容器化部署
    查看>>
    Python块键盘/鼠标输入
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>