Docs
📘机器学习XGBoost介绍

📘机器学习XGBoost介绍

XGBoost 算法介绍

XGBoost(eXtreme Gradient Boosting)是一种高效、灵活且可扩展的梯度提升决策树(Gradient Boosting Decision Tree, GBDT) 实现。它由陈天奇博士开发,并在 KDD Cup 等众多机器学习竞赛中表现出色,因其出色的性能、快速的训练速度和强大的泛化能力而广受欢迎。

简单来说,XGBoost 的核心思想是通过迭代地训练一系列弱学习器(通常是决策树),并将它们组合起来形成一个强大的预测模型。 每次迭代都会在之前所有弱学习器预测的残差上训练一个新的弱学习器,以逐步纠正模型的错误,从而不断提升模型的预测能力。

XGBoost 的主要特点:

  • 高性能和准确性: 在许多实际应用和竞赛中,XGBoost 的预测准确率都非常高。
  • 训练速度快: 内部优化和并行化设计使其训练速度远超传统 GBDT。
  • 可扩展性强: 能够处理大规模数据集,支持分布式计算。
  • 灵活性高: 支持多种损失函数和自定义目标函数,适用于分类、回归、排序等多种任务。
  • 正则化: 内置多种正则化技术,有效防止过拟合,提高模型泛化能力。
  • 缺失值处理: 能够自动处理数据中的缺失值。

XGBoost 算法原理

XGBoost 的原理基于梯度提升(Gradient Boosting) 框架,并在此基础上进行了多项重要的优化和改进。

1. 梯度提升(Gradient Boosting)

梯度提升是一种集成学习方法,它的基本思想是:

  • 迭代构建弱学习器: 模型会一步步地构建,每一步都添加一个新的弱学习器(通常是决策树)。
  • 拟合残差(或梯度): 每棵新树不是直接拟合原始数据,而是拟合当前模型预测结果与真实值之间的残差。更准确地说,它是通过拟合损失函数关于当前预测的负梯度来减少误差。
  • 叠加组合: 所有弱学习器的预测结果会按照一定的权重叠加起来,形成最终的强学习器。

这个过程就像是在不断“纠错”:第一棵树可能学习了数据的整体趋势,但存在误差;第二棵树就去学习第一棵树预测错误的那些部分;第三棵树再学习前两棵树的错误,以此类推,直到模型达到预设的精度或迭代次数。

2. 基学习器:CART 决策树

XGBoost 默认使用 CART(Classification and Regression Trees)决策树 作为基学习器。CART 树可以用于分类和回归任务,通过递归地将特征空间划分为更小的区域来生长。每次分裂都会选择能最大程度降低损失的特征和分裂点。

3. XGBoost 的核心优化点

XGBoost 在传统 GBDT 的基础上进行了多项关键优化,使其表现更为出色:

  • 正则化(Regularization): 这是 XGBoost 的一个重要改进。它在目标函数中加入了正则化项,用于控制模型的复杂度,从而有效防止过拟合,提高模型的泛化能力。
    • 叶子节点权重正则化: 对决策树叶子节点的预测值(权重)进行 L1 和 L2 正则化。
    • 树的复杂度正则化: 限制了树的深度、叶子节点数量等。
  • 收缩(Shrinkage / Learning Rate):
    • 在每次添加新的树时,XGBoost 会给新树的预测结果乘以一个学习率(η
    • 这个学习率能够减小每棵树的影响,使得学习过程更加平滑,有助于防止过拟合,并提高模型的泛化能力。它类似于梯度下降中的学习率。
  • 二阶泰勒展开:
    • XGBoost 使用损失函数的二阶泰勒展开来近似目标函数。这使得模型在优化时能够同时考虑一阶梯度(方向)和二阶梯度(曲率),从而更精确地找到最佳分裂点,加速收敛。
    • 这使得 XGBoost 可以支持自定义损失函数,只要该损失函数可求一阶和二阶导数即可。
  • 近似贪婪算法(Approximate Greedy Algorithm):
    • 当数据量非常大时,精确地枚举所有可能的分裂点会非常耗时。XGBoost 采用了一种近似算法,通过分位数(quantiles)来找到最佳分裂点,从而大大加速计算。
  • 并行处理(Parallelization):
    • XGBoost 在寻找最佳分裂点时,对特征和分裂点的计算可以进行并行处理,这显著提高了训练速度。
  • 缺失值处理(Handling Missing Values):
    • XGBoost 能够自动处理缺失值。在进行分裂时,它会将缺失值自动分配到能最大化增益的方向,无需用户进行额外的填充。
  • 列抽样(Column Subsampling / Feature Subsampling):
    • 类似于随机森林,XGBoost 允许在每次构建树时随机选择一部分特征进行分裂。这不仅可以加速计算,还有助于减少过拟合。

4. XGBoost 的目标函数

XGBoost 的优化目标函数由两部分组成:

Obj(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+k=1∑tΩ(fk)

其中:

  • i=1nl(yi**,y^i(t1)+ft(xi****)):这是损失函数**部分,衡量当前模型(前 t−1 棵树的预测加上新树 ft 的预测)与真实值 yi 之间的误差。
  • k=1tΩ(fk**):这是正则化项**,衡量模型复杂度。Ω(fk) 包含了对每棵树的叶子节点数量和叶子节点权重的惩罚,用于控制模型的复杂度,防止过拟合。

XGBoost 通过最小化这个目标函数来选择最佳的树结构和叶子节点权重。


XGBoost 的强大之处在于它综合了梯度提升的强大预测能力与多项工程和算法上的优化,使其成为机器学习领域中一个兼具效率和效果的优秀算法。

XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统。严格意义上讲XGBoost并不是一种模型,而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型,并对模型中的算法进行了诸多优化,在取得高精度的同时又保持了极快的速度,在一段时间内成为了国内外数据挖掘、机器学习领域中的大规模杀伤性武器

介绍

XGBoost(Extreme Gradient Boosting)是一种高效、灵活且可扩展的梯度提升框架,广泛应用于分类、回归和排序等机器学习任务。XGBoost由陈天奇开发,以其卓越的性能和速度在众多数据科学竞赛中脱颖而出,成为数据科学家和机器学习工程师的首选算法之一。

主要特点

  1. 高效性:XGBoost通过优化算法和并行计算,显著提高了训练速度和效率。
  2. 灵活性:支持多种目标函数,包括回归、分类和排序任务。
  3. 可扩展性:能够处理大规模数据集,支持分布式计算和外存计算。
  4. 正则化:内置正则化项(L1和L2),防止过拟合。
  5. 缺失值处理:自动处理缺失值,无需预处理。
  6. 特征重要性:提供特征重要性评估,帮助特征选择。
  7. 交叉验证:内置交叉验证功能,方便模型评估和调参。

总结

XGBoost是一种高效、灵活且可扩展的梯度提升框架,适用于各种机器学习任务。通过优化算法、并行计算和正则化技术,XGBoost在性能和速度上表现出色,成为数据科学领域的重要工具。


更重要的是,XGBoost在系统优化和机器学习原理方面都进行了深入的考虑。毫不夸张的讲,XGBoost提供的可扩展性,可移植性与准确性推动了机器学习计算限制的上限,该系统在单台机器上运行速度比当时流行解决方案快十倍以上,甚至在分布式系统中可以处理十亿级的数据。

XGBoost的主要优点:

  1. 简单易用。相对其他机器学习库,用户可以轻松使用XGBoost并获得相当不错的效果。
  2. 高效可扩展。在处理大规模数据集时速度快效果好,对内存等硬件资源要求不高。
  3. 鲁棒性
  4. 强。相对于深度学习模型不需要精细调参便能取得接近的效果。
  5. XGBoost内部实现提升树模型,可以自动处理缺失值。

XGBoost的主要缺点:

  1. 相对于深度学习模型无法对时空位置建模
  2. ,不能很好地捕获图像、语音、文本等高维数据。
  3. 在拥有海量训练数据,并能找到合适的深度学习模型时,深度学习的精度可以遥遥领先XGBoost

XGboost的应用

XGBoost在机器学习与数据挖掘领域有着极为广泛的应用。据统计在2015年Kaggle平台上29个获奖方案中,17只队伍使用了XGBoost;在2015年KDD-Cup中,前十名的队伍均使用了XGBoost,且集成其他模型比不上调节XGBoost的参数所带来的提升。这些实实在在的例子都表明,XGBoost在各种问题上都可以取得非常好的效果。
同时,XGBoost还被成功应用在工业界与学术界的各种问题中。例如商店销售额预测、高能物理事件分类、web文本分类;用户行为预测、运动检测、广告点击率预测、恶意软件分类、灾害风险预测、在线课程退学率预测。虽然领域相关的数据分析和特性工程在这些解决方案中也发挥了重要作用,但学习者与实践者对XGBoost的一致选择表明了这一软件包的影响力与重要性。

[

](https://www.kaggle.com/dansbecker/xgboost/notebook?scriptVersionId=4747397&cellId=3)

代码DEMO

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import Imputer

data = pd.read_csv('../input/train.csv')
data.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = data.SalePrice
X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object'])
train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25)

my_imputer = Imputer()
train_X = my_imputer.fit_transform(train_X)
test_X = my_imputer.transform(test_X)

from xgboost import XGBRegressor

my_model = XGBRegressor()
# Add silent=True to avoid printing out updates with each cycle
my_model.fit(train_X, train_y, verbose=False)





# make predictions
predictions = my_model.predict(test_X)

from sklearn.metrics import mean_absolute_error
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))

Conclusion

XGBoost is currently the dominant algorithm for building accurate models on conventional data (also called tabular or strutured data). Go apply it to improve your models!

文献

kaggle

https://www.kaggle.com/code?language=Python