当前位置:   article > 正文

机器学习——XGBoost

机器学习——XGBoost

目录

一、初识XGBoost

1. 介绍

2. 使用 XGBoost 的方法

(1)直接使用xgboost库自己的建模流程

(2)使用xgboost库中的sklearn的API

3. XGBoost的三大板块

4. 提升集成算法

5. 建模流程

二、模型常用参数

1. n_estimators

2. subsample(有放回抽样问题)

3. eta(步长)

4. booster(选择弱评估器)

5. objective(XGB的目标函数)

    补充:方差与泛化误差学习曲线

6. gamma(让树停止生长)

7. scale_pos_weight

三、XGB的目标函数(求解)

1. 目标函数求解

2. 参数化决策树

3. 求解 w 与 T(寻找最佳树结构)

3. 最佳分枝(结构分数之差)

四、模型调参

五、xgboost模型评估

六、XGBoost模型的保存和调用

1. Pickle保存和调用模型

2. Joblib保存和调用模型

七、其他参数

1. n_jobs(更多计算资源)

2. base.score(降低学习难度)

3. random_state(生成树的随机模式)

4. missing(自动处理缺失值)


一、初识XGBoost

1. 介绍

        XGBoost 全称 是 eXtreme Gradient Boosting,可译为 极限梯度提升算法。它由 陈天奇所设计,致力于 让提升树突破自身的 计算极限,以实现 运算快速,性能优秀的 工程目标。与决策树、SVM 等不同,它是一个 集大成的机器学习算法

2. 使用 XGBoost 的方法

(1)直接使用xgboost库自己的建模流程

  1. params {eta, gamma, max_depth, min_child_weight, max_delta_step, subsample, colsample_bytree, colsample_bylevel, colsample_bynode, lambda, alpha, tree_method string, sketch_eps, scale_pos_weight, updater, refresh_leaf, process_type,
  2. grow_policy, max_leaves, max_bin, predictor, num_parallel_tree}
xgboost.train (params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None, maximize=False,early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None,learning_rates=None)
(2)使用xgboost库中的sklearn的API
class xgboost.XGBRegressor (max_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, importance_type='gain', **kwargs)

        使用 xgboost 中设定的 建模流程来 建模,和使用 sklearnAPI中的类来建模,模理效果是 比较 相似的,但是 xgboost 库 本身的 运算速度(尤其是交叉验证)以 及调参手段比 sklearn要 简单。

3. XGBoost的三大板块

        XGBoost 本身的 核心是 基于 梯度提升树实现的 集成算法,整体来说 可以有 三个核心部分:集成算法本身,用于集成的弱评估器,以及应用中的其他过程。三个部分中,前 两个部分 包含了 XGBoost 的核心原理 以及 数学过程,最后的部分 主要是在 XGBoost 应用中 占有一席之地。

4. 提升集成算法

        XGBoost 的基础是 梯度提升算法。梯度提升(Gradient boosting)是 构建预测模型的 最强大技术 之一,它是 集成算法中 提升法(Boosting) 的 代表算法。集成算法 通过在 数据上 构建多个 弱评估器,汇总 所有弱评估器的 建模结果,以 获取比 单个模型 更好的 回归或分类 表现。弱评估器 被定义为 是表现至少 比随机猜测 更好的模型,即 预测准确率 不低于 50% 的任意 模型

        梯度提升树中 可以 有回归树 也可以 有分类树,两者 都以 CART 树 算法 作为主流,XGBoost 背后也是 CART 树,这意味着 XGBoost 中所有的树都是 二叉的。

5. 建模流程

        梯度提升回归树是 专注于回归的 树模型的 提升集成模型,其建模 过程大致如下:最 开始先建立一棵树,然后 逐次迭代,每次 迭代过程中 都增加一棵树,逐渐 形成众多树模型集成的 强评估器。

        对于决策树而言,每个 被放入模型的 任意样本 最终一个 都会落到 一个叶子 节点上。而 对于 回归树,每个 叶子节点上的 值是 这个叶子节点上 所有样本的 均值。

        对于 梯度提升回归树 来说,每个样本 的预测结果 可以表示为 所有树上的结 果的 加权求和

        其中,K 是树的 总数量,k 代表第 k 棵树,\gamma_k 是这棵树的 权重,h_k 表示这棵树上的 预测 结果。

        XGB 和 GBDT 核心区别是 求解预测值的方式 不同,GBDT 中预测值是 由 所有弱分类器上 的预测结果的 加权求和,其中 每个样本上的 预测结果 就是样本 所在的叶子节点的 均值。对于 XGB 来说,每个叶子节点上 会有一个 预测分数(prediction score),也 被称为 叶子权重。这个叶子权重 就是 所有在这个 叶子节点上的样本 在这一棵树上的 回归取值,用 f_k(x_i) 或者 w 来表示,其中 f_k 表示 第 k 棵 决策树,x_i 表示 样本 i 对应的 特征向量。当 只有一棵树的 时候,f_1(x_i) 就是 提升集成算法 返回的结果。当 有多棵树的时候,集成模型的 回归结 果就是 所有树的预测分数 之和,假设 这个集成模型 中 总共 有 K 棵 决策树,则 整个模型 在这个 样本 i 上 给出的预测 结果为:

二、模型常用参数

1. n_estimators

    补充:

        ① XGB中的 树的 数量决定了 模型的 学习能力,树的数量越多,模型的学习能力越强只要 XGB 中 树的 数量足够了,即便 只有 很少的数据,模型 也能够 学到 训练数据 100% 的信息,所以 XGB 也是 天生过拟合的 模型。但 在这种情况下,模型 会变得 非常不稳定。

        ② XGB 中 树的 数量很少的 时候,对 模型的 影响较大,当 树的数量 已经很多的时候,对模型的 影响 比较小

        ③ 树的数量 提升 对模型的 影响 有极限,最开始,模型的表现 会随着 XGB 的树的数量一起提升,但到 达某个点 之后,树的 数量越多,模型的效果 会逐步下降,这也 说明了 暴力增加 n_estimators 不一定有效果。

2. subsample(有放回抽样问题)

        训练模型 之前,必然 会有一个 巨大的 数据集。树模型 是 天生过拟合的 模型,并且 如果数据量 太过巨大,树模型的 计算 会非常 缓慢,因此,要 对原始数据集 进行 有放回抽样 (bootstrap)。无论是 装袋 还是 提升的 集成算法中,有放回抽样 都是防止 过拟合,让 单一弱分类器 变得 更轻量的 必要操作。实际应用中,每次 抽取 50% 左右的 数据就 能够有不错的 效果了。

        在 梯度提升树中,每一次送代 都要 建立一棵 新的树,因此 每次迭代中,都要 有放回 抽取一个 新的 训练样本。但是 这并不能 保证每次 建新树后,集成的效果 都比 之前要好。因此 在梯度提升树中,每 构建一个 评估器,都 让模型 更加集中于 数据集中 容易被判错的 那些样本

        首先 有一个 巨大的 数据集,在 建第一棵树时,对 数据进行 初次 有放回 抽样,然后建模。建模完毕后,对 模型进行 评估,然后 将模型预测 错误的 样本反馈 给 数据集,一次迭代 就算完成。紧接着 要建立 第二棵决策树,于是 开始进行 第二次 有放回抽样。但这次 有放回抽样时,加大了 被 第一棵树判断错误的 样本的 权重。也就是说,被 第一棵树 判断错误的 样本,更 有可能被抽中。基于 这个有权重的 训练集来 建模,新 建的 决策树就会 更加倾向于 这些权重更大的,很容易 被判错的 样本。建模 完毕 之后,又将 判错的 样本 反馈给 原始数据集。下一次 送代的时候,被 判错的 样本的 权重会 更大,新的 模型 会更加 倾向于 很难被判断的 这些样本。如此 反复迭代,越后 面建的树,越是 之前的树 们判错样本 上的 专家,越专 注于攻克 那些之前的 树们 不擅长的 数据。

        对于一个样本 而言,它被 预测错误的 次数越多,被 加大权重的 次数也 就越多。只要 弱分类器 足够强大,随着 模型整体 不断在 被判错的样本上 发力,这些样本 会 渐渐被 判断正确。如此 就一定程度上 实现了 我们 每新建一棵树模型的 效果都会 提升的目标。

        subsample 参数 通常是 在样本量 本身很大的 时候 调整和 使用。参数 对模型的 影响 应该会非常 不稳定,大概率 应该是 无法提升 模型的泛化能力的,但 也不乏提升模型的 可能性。

3. eta(步长)

        除了 保证模型逐渐 倾向于 困难样本的 方向,还 必须控制 新弱分类器的 生成,我们 必须保证,每次 新添加的树 一定得是 对这个新数据集 预测 效果最优的 那一棵树

        可以 首先找到 一个 损失函数 Obj ,这个 损失函数 应该可以 通过 带入 预测结果 \hat{y_i} ,来衡量 梯度提升树 在样本的 预测效果。然后 利用 梯度下降来 迭代集成算法:

        在 k次 迭代 后,集成算法 中 总共 有 k 棵树,k 棵树 的集成结果 是前面 所有树上的 叶子权重的 累加 \sum_{k}^{K}{f_k(x_i)} 。所以 让 k 棵树 的集成结果 \hat{y_i}^{(k)} 加上 新建的 树上的 叶子权重 f_{k+1}(x_i),就可以 得到 第 k+1 次迭代后,总共 k+1 棵树的 预测结果 \hat{y_i}^{(k+1)} 了。让 这个 过程持续下去,直到 找到 能够让 损失函数 最小化的 \hat{y} ,这个 \hat{y} 就是模型的 预测结果。

        上式

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/1017125
推荐阅读
相关标签