《数据分析利器:XGBoost算法最佳解析.docx》由会员分享,可在线阅读,更多相关《数据分析利器:XGBoost算法最佳解析.docx(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据分析利器:XGBoost算法最佳解析11月30日,2021亚马逊云科技re:Invent全球大会,即将浩大开启!2021re:Invent十周年度十分活动,内容的饕餮盛宴,涵盖产品、行业、社区等专题!立即预约symonxiong腾讯CDG应用研究员XGBoost是一种经典的集成式提升算法框架具有训练效率高、预测效果好、可控参数多、使用方便等特性是大数据分析领域的一柄利器。在实际业务中XGBoost经常被运用于用户行为预判、用户标签预测、用户信誉评分等工程中。XGBoost算法框架涉及到比拟多数学公式以及优化技巧比拟难懂容易出现一知半解的情况。由于XGBoost在数据分析领域实在是太经典、太
2、常用最近带着敬畏之心对陈天奇博士的Paper以及XGBoost官网重新学习了一下基于此本文对XGBoost算法的来龙去脉进展小结。本文重点解析XGBoost算法框架的原理祈望通过本文可以洞悉XGBoost核心算法的来龙去脉。对于XGBoost算法最先想到的是Boosting算法。Boosting提升算法是一种有效且被广泛使用的模型训练算法XGBoost也是基于Boosting来实现。Boosting算法思想是对弱分类器根底上不断改良提升并将这些分类器集成在一起形成一个强分类器。简而言之XGBoost算法可以讲是一种集成式提升算法是将许多根底模型集成在一起形成一个很强的模型。这里的根底模型可以是
3、分类与回归决策树CARTClassificationandRegressionTrees可以以是线性模型。假如根底模型是CART树如图1所示比方第1颗决策树tree1预测左下角男孩的值为2对于第1颗决策树遗留下来的剩余局部使用第2颗决策树预测值为0.9那么对男孩的总预测值为20.92.9。图1.基于二叉树的XGBoost模型XGBoost算法框架可以分为四个阶段来理解如图2所示。第一个阶段怎样构造目的函数在进展优化求解时首先需要构造目的函数有了目的函数才能进展优化求解。这种思路以及LR模型LogisticRegression是一致。在LR模型中首先对于回归问题构造平方项损失对于分类问题构造最大
4、似然损失作为目的函数然后基于构造好的目的函数才会考虑采用梯度下降算法进展优化求解比方随机梯度下降、Mini-Batch批量梯度下降、梯度下降等。在这个阶段我们可以得到XGBoost的根本目的函数构造。第二个阶段目的函数优化求解困难怎样对目的函数近似转换在第一个阶段得到的根本目的函数较为复杂不是凸函数没法使用连续性变量对目的函数直接优化求极值。因此使用泰勒级数对目的函数进展展开对目的函数规整、重组后将目的函数转换为关于预测残差的多项式函数。第三个阶段怎样将树的构造引入到目的函数中第二个阶段得到的多项式目的函数是一个复合函数。被预测的残差以及模型复杂度还是未知的函数需要对这两个函数进展参数化表示即
5、将决策树的构造信息通过数学符号表示出来。在第三个阶段在树的形状确定情况下可以优化求解出部分最优解。第四个阶段怎样确定树的形状要不要使用贪心算法怎样在模型空间里面寻找最优的决策树形状这是一个NP-Hard问题我们很难对可能存在的树构造全部罗列出来尤其在特征个数很多情况下。因此在这里需要使用贪心算法来求得部分最优解。图2.XGBoost算法构建逻辑1.怎样构造目的函数当使用多棵树来预测时假设已经训练了棵树那么对于第个样本的最终预测值为在公式1中表示对个样本的预测值属于集合范围内表示通过第棵树对第个样本进展预测比方第1棵树预测值为第2棵树预测值为依次类推将这些树的预测值累加到一起那么得到样本的最终预
6、测值。因此假如要得到样本的最终预测值需要训练得到棵树。假如要训练得到棵树首先需要构造训练的目的函数(如公式2所示)。在构建模型时不仅需要考虑到模型的预测准确性还需要考虑到模型的复杂程度既准确又简单的模型在实际应用中的效果才是最好的。因此目的函数由两局部构成第一局部表示损失函数比方平方损失、穿插熵损失、折页损失函数等。第一局部表示个样本总的损失函数值。因为在这里通过样本预测值以及样本真实值的比拟可以计算出针对样本的模型预测损失值。这里可以暂时先不用考虑损失函数的详细形式因为这里的损失函数可以统一表示回归与分类问题的损失函数形式。公式2的第二局部表示正那么项是用来控制模型的复杂度模型越复杂惩罚力度
7、越大进而提升模型的泛化才能因为越复杂的模型越容易过拟合。XGBoost的正那么化思路跟模型中加/正那么化思路一致不同的地方在于正那么化项详细物理含义不同。在这里表示第棵树的复杂度接下来的问题是怎样对树的复杂度进展参数化表示这样后面才能进展参数优化。在损失函数中是有很多个模型决策树共同介入通过叠加式的训练得到。如图2所示训练完第一颗树后对于第一棵树没有训练好的地方使用第二颗树训练依次类推训练第个棵树最后训练第颗树。当在训练第棵树时前面的第1棵树到第颗树是已知的未知的是第棵树即基于前面构建的决策树已知情况下构建第棵树。图3.XGBoost叠加式训练对于样本首先初始化假定第0棵树为预测值为然后在第0
8、棵树根底上训练第1棵树得到预测值在第1棵树根底上训练第2颗树又可以得到预测值依次类推当训练第棵树的时候前面棵树的总预测值为递推训练详细经过如下所示根据XGBoost的递推训练经过每棵决策树训练时会得到样本对应的预测值根据样本预测值以及真实值比拟可以计算得到模型预测损失值。又因为训练所得的每棵决策树都有对应的构造信息因此可以得到每棵决策树的复杂度。根据这些信息可以对目的函数公式2进展简化得到公式3。在公式3中表示训练样本个数为颗决策树累加的预测值为颗决策树总的复杂度在训练第颗决策树时这两个东西是已知的即在对目的函数进展求最小值优化时候以及为已知。因此将常数项拿掉得到公式4作为XGBoost的目的
9、函数。2.目的函数优化困难怎样对函数近似转换在公式4中已经得到了需要优化的目的函数这个目的函数已经是简化后的函数。对于公式4没法进展进一步优化。为解析决目的函数无法进展进一步优化XGBoost原文是使用泰勒级数展开式技术对目的函数进展近似转换即使用函数的1阶、2阶、3阶.阶导数以及对应的函数值将目的函数进展多项式展开多项式阶数越多对目的函数的近似程度越高。这样做的好处是便于后面优化求解。令带入到目的函数公式4得到基于二阶泰勒展开式的函数(如公式5所示)其中。在训练第颗树时目的函数公式5中、是已知的。因此可以将已知常数项去掉得到进一步简化后的目的函数公式6。、分别表示第颗决策树的损失函数的1阶、
10、2阶导数。前面颗决策树预测后通过、将前面第颗决策树的预测损失信息传递给第颗决策树。在公式6中第颗树的预测函数、树复杂度函数对于我们来讲仍然都是未知的因此需要将其参数化通过参数形式表示出来才能进展下一步的优化求解。3.怎样将树构造引入到目的函数中接下来的问题是怎样对函数、进展参数化表示。首先对于叶子权重函数如图4所示决策树有1号、2号、3号叶子节点这三个叶子节点对应的取值分别为151220在1号叶子节点上有1,3两个样本在2号叶子节点上有4一个样本在3号叶子节点上有2,5两个样本。在这里使用来表示决策树的叶子权重值三个叶子节点对应的叶子权重值为、。对于样本落在决策树叶子节点的位置信息使用表示表示
11、样本1落在第1个叶子节点上表示样本1落在第3个叶子节点上表示样本4落在第2个叶子节点上。图4.XGBoost决策树构造对于第颗树的叶子权重函数根据叶子权重值以及样本所在叶子的位置信息即可确定函数。因此我们引入决策树叶子权重值以及样本所在叶子的位置信息两个变量将其参数化表示成。然而是一个函数作为的下标是不利于优化求解。因此这里需要将转化为形式。是根据样本落在叶子节点的位置信息直接遍历计算损失函数。是从叶子节点的角度对每个叶子节点中的样本进展遍历计算损失函数其中表示树的叶子节点。假设即表示有哪些样本落在第j个叶子节点上比方表示样本1,3落在叶子节点1上表示样本4落在叶子节点2上表示样本2,5落在叶
12、子节点3上如上文图4所示。在这里强调一下将转换为形式是可以从数学公式推到得到比方下式。根据样本所在叶子节点位置计算所有样本的一阶损失得到第一行等式其中表示样本的一阶损失表示样本对应的叶子节点表示叶子节点对应的叶子权重值。对于模型复杂度表示第颗树的复杂度。在决策树里面假如要降低树的复杂度在训练决策树时可以通过叶子节点中样本个数、树的深度等控制决策树的复杂度。在XGBoost中是通过叶子节点个数、树的深度、叶子节点值来控制模型复杂度。XGBoost中的决策树是分类与回归决策树CARTClassificationandRegressionTrees。由于CART是二叉树控制叶子节点个数等同于控制了树
13、的深度。因此可以使用叶子节点个数来评估树的复杂度即叶子节点个数越多树的深度越深决策树构造越复杂。对于叶子节点值由于叶子节点值越大相当于样本预测值分布在较少的几颗决策树的叶子节点上这样容易出现过拟合。假如叶子节点值越小相当于预测值分布在较多的决策树叶子节点上每颗决策树介入预测其中的一小局部过拟合的风险被分散。因此叶子节点值越大模型越容易过拟合等同于决策树的复杂度越高。综合起来如公式7所示使用叶子节点个数、叶子节点值评估第颗决策树的复杂度其中、为超参数。假如祈望叶子个数尽量少那么将值尽量调大假如祈望叶子权重值尽量小那么将尽量调大。将以及公式7带入目的函数公式6中可以得到参数化的目的函数公式8。在公
14、式8中在训练第颗决策树时以及这两局部是已知为超参数。令对公式8进展调整此时得到目的函数是关于的一元二次抛物线是目的函数最终的参数化表示形式。抛物线是有极值对抛物线求极值可以直接套用抛物线极值公式求解很方便。基于公式8对目的函数关于求导可以求得树的叶子节点最优的权重值如公式9所示。将等式9带入到公式8中计算得到树的目的损失值如等式10该等式表示决策树损失分数分数越小讲明树的预测准确度越高、复杂度越低。4.怎样确定树的形状这里需要注意到一点树的叶子节点最优解以及损失函数极小值是在树的形状给定后的优化求解。因此假如要求得叶子节点最优解以及损失函数极小值首先需要确定树的形状。怎样寻找树的形状最直接的方
15、式是枚举所有可能的形状然后计算每种形状的损失函数从中选择损失函数最小的形状作为模型训练使用。这样在树的形状确定后就可以对叶子节点值以及损失函数值进展优化求解。这种方式在实际应用中一般不会采用因为当样本的特征集很大时树的形状个数是呈指数级增加计算这些形状树对应损失函数需要消耗大量的计算资源。为了寻找树的形状我们一般使用贪心算法来简化计算降低计算的复杂度。贪心算法是在部分寻找最优解在每一步迭代时选择能使当前部分最优的方向。XGBoost寻找树的形状的思路以及传统决策树模型建立树的思路一致。比方传统决策树在进展节点分割时基于信息熵选择信息熵下降最大的特征进展分割对于XGBoost树模型基于损失函数选
16、择能让损失函数下降最多的特征进展分割。如图5所示虚线框是已经构造好的树形状假如需要在蓝色节点做进一步分裂此时需要按照某种标准选择最好的特征进展分割。在这里XGBoost使用损失函数下降最大的特征作为节点分裂。图5.XGBoost树节点最正确分割点根据公式10可以计算到蓝色节点在分裂前以及分裂后的的损失函数值。两式相减那么得到特征假如作为分裂节点时所能带来的损失函数下降值大小。因此根据如下等式选择能使最大的特征作为分裂节点。5.其它常见问题关于XGBoost的常见经典问题这类问题对于深化理解XGBoost模型很重要因此本文对此也进展了梳理小结。(1)XGBoost为什么需要对目的函数进展泰勒展开
17、根据XGBoost官网如图6所示目的损失函数之间存在较大的差异比方平方损失函数、逻辑损失函数等。对目的函数进展泰勒展开就是为了统一目的函数的形式针对回归以及分类问题使得平方损失或者逻辑损失函数优化求解可以共用同一套算法框架及工程代码。另外对目的函数进展泰勒展开可以使得XGBoost支持自定义损失函数只需要新的损失函数二阶可导即可进而提升算法框架的扩展性。图6.XGBoost目的函数泰勒展开式官方解释相对于GBDT的一阶泰勒展开XGBoost采用二阶泰勒展开可以更精准的逼近真实的损失函数提升算法框架的精准性。另外一阶导数描绘梯度的变化方向二阶导数可以描绘梯度变化方向是怎样变化的利用二阶导数信息更
18、容易找到极值点。因此基于二阶导数信息可以让梯度收敛的更快类似于牛顿法比SGD收敛更快。(2)XGBoost怎样进展采样XGBoost算法框架参考随机森林的Bagging方法支持样本采样以及特征采样。由于XGBoost里没有交代是有放回采样认为这里的样本采样以及特征采样都是无放回采样。每次训练时对数据集采样可以增加树的多样性降低模型过拟合的风险。另外对数据集采样还能减少计算加快模型的训练速度。在降低过拟合风险中对特征采样比对样本采样的效果更显著。样本采样如图7所示默认是不进展样本采样。样本的采样的方式有两种一种是认为每个样本平等程度对样本集进展一样概率采样另外一种认为每个样本是不平等每个样本对应
19、的一阶、二阶导数信息表示优先级导数信息越大的样本越有可能被采到。图7.XGBoost样本采样特征采样如图8所示默认对特征不进展采样。对特征的采样方式有三种第一种是在建立每棵树时进展特征采样第二种特征采样范围是在第一种的根底上对于树的每一层级树的深度进展特征采样第三种特征采样范围是在第二种的根底上对于每个树节点进展特征采样。这三种特征采样方式有串行效果。比方当第一、二、三种的特征采样比例均是0.5时假如特征总量为64个经过这三种采样的综合效果最终采样得到的特征个数为8个。图7.XGBoost样本采样3XGBoost为什么训练会比拟快XGBoost训练速度快这个主要是工程实现优化的结果详细的优化措
20、施如下几点第一、支持并行化训练。XGBoost的并行并不是讲每棵树可以并行训练XGBoost本质上仍然采用Boosting思想每棵树训练前需要等前面的树训练完成后才能开场训练。XGBoost的并行指的是特征维度的并行。在训练之前每个特征按特征值大小对样本进展预排序并存储为Block构造如图8所示在后面查找特征分割点时可以重复使用而且特征已经被存储为一个个Block构造那么在寻找每个特征的最正确分割点时可以利用多线程对每个Block并行计算。图8.样本排序第二、采用近似算法技术得到候选分位点。在构造决策树分裂节点时当采用准确贪心算法穷举计算每个特征下的所有特征值增益假如特征个数多、特征取值大会造
21、成较大的计算量。当样本数据量大时特征值无法完全加载到内存中计算效率低。对于分布式数据集同样会面临无法将特征值全部加载到本地内存的问题。因此基于这两个现实问题采用近似直方图算法将每个特征取值划分为常数个分位点作为候选分割点从中选择相对最优的分割点作为决策树分裂节点。第三、缓存感悟访问技术。对于有大量数据或讲分布式系统来讲不可能将所有的数据都放进内存里面。因此需要将其放在外存上或将数据分布式存储。但是会有一个问题这样做每次都要从外存上读取数据到内存这将会是特别耗时的操作。在XGBoost中采用预读取的方式将下一块将要读取的数据预先放进内存里面。这个经过是多开了一个线程该线程与训练的线程独立并负责数
22、据读取。此外还要考虑Block的大小问题。假如设置最大的Block来存储所有样本在特征上的值以及梯度Cache未必能一次性处理如此多的梯度做统计。假如设置过小的Block-size这样不能充分利用多线程的优势。这样会出现训练线程已经训练完数据但是预读取线程还没把数据放入内存或cache中。经过测试Block-size设置为216个特征值是效果最好。第四、Blocks核外计算优化技术。为了高效使用系统资源对于机器资源除了CPU以及内存外磁盘空间可以以利用起来处理数据。为了实现这个功能XGBoost在模型训练时会将数据分成多个块并将每个块存储在磁盘上。在计算经过中使用独立的线程将Block预提取到
23、主内存缓冲区这样数据计算以及磁盘读取可以同步进展但由于IO非常耗时所以还采用了两种技术来改良这种核外计算。BlockCompression块压缩并且加载到主内存时由独立的线程进展解压缩。BlockSharding块分片即将数据分片到多个磁盘为每个磁盘分配一个线程将数据提取到内存缓冲区然后每次训练线程的时候交替地从每个缓冲区读取数据有助于在多个磁盘可用时增加读取的吞吐量。除了这些技术XGBoost的特征采样技术可以以提升计算效率。假如设定特征采样比例colsample_by*1.0那么在选择最正确特征分割点作为分裂节点时特征候选集变小挑选最正确特征分割点时计算量降低。4XGBoost怎样处理缺失
24、值问题XGBoost的一个优点是允许特征存在缺失值。对缺失值的处理方式如图9所示在特征上寻找最正确分割点时不会对该列特征missing的样本进展遍历而只对该特征值为non-missing的样本上对应的特征值进展遍历。对于稀疏离散特征通过这个技巧可以大大减少寻找特征最正确分割点的时间开销。在逻辑实现上为了保证完备性会将该特征值missing的样本分别分配到左叶子节点以及右叶子节点两种情形都计算一遍后选择分裂后增益最大的那个方向左分支或者是右分支作为预测时特征值缺失样本的默认分支方向。假如在训练中没有缺失值而在预测中出现缺失那么会自动将缺失值的划分方向放到右子节点。图9.XGBoost缺失值处5X
25、GBoost以及GBDT的区别是什么XGBoost以及GBDT都是基于Boosting思想实现。XGBoost可以认为是在GBDT根底上的扩展。两者的主要不同如下基分类器GBDT是以分类与回归决策树CART作为基分类器XGBoost的基分类器不仅支持CART决策树还支持线性分类器此时XGBoost相当于带L1以及L2正那么化项的Logistic回归分类问题或线性回归回归问题。导数信息GBDT在优化求解时只是用到一阶导数信息XGBoost对代价函数做了二阶泰勒展开同时用到一阶以及二阶导数信息。另外XGBoost工具支持自定义代价函数只要函数可以一阶以及二阶求导即可。正那么项XGBoost在代价函
26、数里参加正那么项用于控制模型的复杂度。正那么项里包含了树的叶子节点个数、每个叶子节点上输出的预测值的模的平方以及。正那么项有利于降低模型的方差variance使学习出来的模型更加简单防止过拟合。GBDT的代价函数中是没有正那么项。缺失值处理对于特征的取值有缺失的样本XGBoost可以自动学习出它的分裂方向。另外XGBoost还做了其它工程优化包括特征值Block化、并行化计算特征增益、近似直方图算法、特征采样技术等6怎样使用XGBoost进展模型训练在使用XGBoost前可以根据官网讲明文档进展安装下面有链接这里不赘述。本文采用的数据集是Kaggle平台房价预测开源数据集地址如参考文章8所示。
27、值得讲明的一点在进展模型训练前一般需要做数据清洗、特征工程、样本划分、模型参数调优这些经过。针对这些经过本文在这里不展开细讲。在进展模型训练前本文已经完成数据清洗、特征工程、模型参数调优经过并得到最终用于模型训练的样本集以及最优模型参数。如下代码是使用XGBoost进展模型训练经过。#导入数据分析根底包#importpandasaspdimportmatplotlibimportnumpyasnpimportscipyasspimportIPythonfromIPythonimportdisplayimportsklearnimportrandomimporttime#导入训练样本#样本集特征
28、X_trainpd.read_csv(./final_train.csv,sept,indexNone)#样本集标签y_trainpd.read_csv(./final_y_train.csv,sept,indexNone)#导入算法模型以及评分标准#fromsklearnimportsvm,tree,linear_model,neighbors,naive_bayes,ensemble,discriminant_analysis,gaussian_processfromxgboostimportXGBClassifier#CommonModelHelpersfromsklearn.prepr
29、ocessingimportOneHotEncoder,LabelEncoderfromsklearnimportfeature_selectionfromsklearnimportmodel_selectionfromsklearnimportmetrics#Visualizationimportmatplotlibasmplimportmatplotlib.pyplotaspltimportmatplotlib.pylabaspylabimportseabornassnsfrompandas.plottingimportscatter_matrix#ConfigureVisualizati
30、onDefaults#%matplotlibinlineshowplotsinJupyterNotebookbrowser%matplotlibinlinempl.style.use(ggplot)sns.set_style(white)pylab.rcParamsfigure.figsize12,8fromsklearn.treeimportDecisionTreeRegressorfromsklearn.linear_modelimportLinearRegression,ElasticNetfromsklearn.ensembleimportRandomForestRegressorfr
31、omsklearn.metricsimportfbeta_score,make_scorer,r2_score,mean_squared_errorfromsklearn.linear_modelimportLassofromsklearn.svmimportSVRfromxgboostimportXGBRegressorfromsklearn.model_selectionimportKFold,cross_val_score,train_test_split#计算平方误差defrmsle(y,y_pred):returnnp.sqrt(mean_squared_error(y,y_pred
32、)#模型Xgboostfromsklearn.model_selectionimportGridSearchCVbest_reg_xgbXGBRegressor(learning_rate0.01,n_estimators5000max_depth4,min_child_weight1.5,gamma0,subsample0.7,colsample_bytree0.6,seed27)best_reg_xgb.fit(X_train,y_train)pred_y_XGBbest_reg_xgb.predict(X_train)#print(rmsle(pred_y_XGB,y_train)6.小
33、结本文从目的函数构建、目的函数优化、树构造信息表示、树形状确定等四局部对XGBoost算法框架进展解析。最后针对XGBoost的常见问题进展小结。通过本文洞悉XGBoost框架的底层算法原理。在用户行为预判、用户标签预测、用户信誉评分等数据分析业务中经常会使用到XGBoost算法框架。假如对XGBoost算法原理理解透彻在实际业务中的模型训练经过中有利于较好地理解模型参数对模型调参经过帮助较大。对于文章中表述不妥的地方欢送私信于我。参考文章(1).陈天奇XGBoost算法原著s:/dl.acm.org/doi/pdf/10.1145/2939672.2939785 (2).20道XGBoost
34、面试题s:/cloud.tencent/developer/article/1500914 (3).XGBoost框架Parameters含义s:/xgboost.readthedocs.io/en/latest/parameter.html (4).XGBoost提升树官方介绍s:/xgboost.readthedocs.io/en/latest/tutorials/model.html (5).XGBoost官方论坛s:/discuss.xgboost.ai/ (6).GBDT提升树官方介绍s:/scikit-learn.org/stable/modules/ensemble.html#gradient-tree-boosting (7).XGBoost安装官网讲明s:/xgboost.readthedocs.io/en/latest/build.html (8).Kaggle开源数据s:/kaggle/c/house-prices-advanced-regression-techniques腾讯技术工程