机器学习Pre讲稿
🫂

机器学习Pre讲稿

讲稿
页码
内容
XGBoost的作者是曾在华盛顿大学研究机器学习的大牛陈天齐,XGBoost全称是eXtreme Gradient Boosting,从名称看XGBoost仍然是GBDT,在GBDT基础上优化和增强。XGBoost以出众的效率和较高的预测准确率在各大算法比赛中被广泛使用。这篇文章介绍了XGBoost这种可扩展、端到端的Boosting Tree的新算法。
论文分为如下几个部分,第一部分是简介,然后是主要的算法,接下来是分割算法,然后系统设计,端到端评估。
受限于时间,今天主要讲前面2个算法的部分
为什么选择这个主题呢,因为我个人比较喜欢传统的机器学习
我们都在课上学了AdaBoost,其他这几个算法作为课后去了解
实际上集成学习算法是很受数据科学家青睐的,像GBDT LightGBM CatBoost,都需要我们去了解一下。
也是因为我所在的行业是个很传统的行业,缺乏全面的数据采集手段
极限提升树XGBoost(Extreme Gradient Boosting,XGB,发音/æks-g-boost/)是基于梯度提升树GBDT全面升级的新一代提升算法,也是提升家族中最富盛名、最灵活、最被机器学习竞赛所青睐的算法。
适合竞赛,数据挖掘课最后的final,我想是可以用上它的
面试中经常被问到,因为是个非常经典的模型
很多同学也在找实习,我想不是每个人都能遇到纯数据科学的岗位,在一些传统的企业里,还是需要这样的算法来做主要的数据工作
树的集成模型是机器学习中最为强大的学习器之一,这一族学习器的特点是精确性好、适用于各种场景,但运行缓慢、且过拟合风险很高,因此从学习单一决策树时起,我们就持续为大家提供丰富的剪枝策略,目的就是为了降低各种树模型的模型复杂度,从而控制住过拟合。
树模型的学习能力与过拟合风险之间的平衡,就是预测精确性与模型复杂度之间的平衡,也是经验风险与结构风险之间的平衡,这一平衡对决策树以及树的集成模型来说是永恒的议题。
论文中的数学推导特别多,对此我把它的符号全都整理了出来
xbg的核心算法并不是用的损失函数,而是这个叫做目标函数的式子,当然,左边这个依然是损失函数,右边使用了正则化函数来控制结构风险。
XGBoost使用的都是回归树。我们先来看作者在论文中举的这个例子:按照是否喜欢电脑游戏对一个家庭的5个人进行分类,第一个节点是年龄是否小于15,第二个是是否为男性。最后就得到我们的节点,非常简单对吧。
作者使用的符号比较多,让我们来开始讲解符号。
q来表示树的结构,用来把样本x映射到叶子节点
T是叶子节点的数量
w是叶子节点的权值,实际上就是模型的预测值
fk表示第k颗树,取的是所有树预测结果的求和
这里展示的是我们XGB的建树过程,它是一个加法模型,从0开始迭代,每轮新建的书都加到原有的模型上。迭代到第t轮停止。
由一颗颗羸弱的不堪一击的树人,最终融合成为强大的战争古树
最后可以写成前t-1颗树的值,加上第t颗树.得到的是我最终的模型
根据这个设定,我们把目标函数写成损失函数的形式。
l是每个样本的损失函数,yi是标签,后面的是预测值,再加上正则化项
我们假设损失函数是平方损失的话,就得到了下面的表达式。
当然,除了平方损失,也可以使用其他的方式,比如交叉熵。
正则化项也可以使用L1或L2正则化。
使用了岭回归或者拉索回归,表达式就会变成上面的样子,这些我们应该都非常熟悉了。
定义完了整个目标函数,我们来看这个。
假设它是平方损失的话,我们使用二阶泰勒展开。也就是这个公式,当然前面等号要写作约等于
我们把l看作原函数,yt-1看作自变量,分别对这个式子求一阶导和二阶导。
为了书写间接,我们把它分别记作gi和hi
我们的目标函数就可以写成这样
后面还有常数项,并不影响我们优化,就简单地写在最后
这个式子并不好化简,就需要回到作者在论文中的定义
我们再看一遍这里的定义,q表示树的结构,我们把这里的w叫做叶子权值
可以看到ft输出的函数值是刚好等于这些节点的叶子权重之和的
我们把每颗树分出来的不同类别集合叫做I
如图所示,这三类可以叫做I1 I2 I3
借助上面的定义,我们知道,这项跟这项是相等的
后面的正则化项的自变量是树,而前面的损失函数部分自变量是每个样本
这样我们就要统一一下自变量,把样本改写成树的格式,让样本小i属于这个集合大I
然后大I又属于每个数的叶子节点T
这样就变成了关于每课树作为自变量的函数
为了书写方便,我们再定义大G 和大H
让它们分别等于一阶导和二阶导的求和
这个式子就变成了关于叶子权值w的二次函数,让这个式子取得最小值,可以解出最优解w*
我们的表达式就可以化简成这样子,这就是我们XGB建树的完整算法流程
很巧妙地把损失函数和结构风险同时放到目标函数中,一步就完成了完整的优化
然后我们到了第三章,树结构的生成
我们还是先看作者的例子
I1只有1号样本,I2只有4号, I3有2,3,5三个样本
我们分别计算他们的一阶导、二阶导
根据目标函数的公式,分别计算他们的表达式,当然这些参数也是给定的
这里又到了我们信息增益的环节了,大家很熟悉了吧
在学习决策树的时候,我们使用的是基尼系数,不同的是,在这,作者给出了这个特有的增益计算方式
假设我们按照图上的根据年龄划分,左边的叫左子树,右边的叫右子树
我们分别计算GL和GR
然后代入到信息增益的公式,划分成最大增益的公式,我们就此来分割节点
刚才的这个,使用的是论文中的算法1:
当数据量过大,传统算法就很差用了,由于要遍历每一个分割点,甚至内存都放不下,因此,作者提出了额外一种近似算法2能加快运行时间
另外,在分割的时候,这个系统还能感知稀疏值,咱们给每一个树的结点都加了一个默认方向,当一个值是缺失值时,咱们就把他分类到默认方向,每一个分支有两个选择,具体应该选哪一个?这里提出一个算法,枚举向左和向右的状况,哪一个gain大选哪一个:
这个就是稀疏感知的算法3
受限于今天的时间,我就不作详细展开了
做一个小的总结,可以看下我们算法的迭代过程
先计算样本损失函数的一阶导和二阶导
然后求解模板函数,再根据贪心算法寻找切分点,生成每一轮新的树
有时候我们会在这加一个缩减因子,避免过拟合
第四章开始,讲的是底层的优化了,也阐述了为什么XGB可以这么快,适应这么大规模的数据
这里XGB将全部的列数据都预先排了序。
以压缩形式分别存到block里,不一样的block能够分布式存储,甚至存到硬盘里。在特征选择的时候,能够并行的处理这些列数据,XGB就是在这实现的并行化,用多线程来实现加速。同时这里陈博士还用cache加了一个底层优化
当数据排序后,索引值是乱序的,可能指向了不一样的内存地址,找的时候数据是不连续的,这里加了个缓存,让之后找的时候能找到小批量的连续地址,以实现加速!这里是在每一个线程里申请了一个internal buffer来实现的!这个优化在小数据下看不出来,数据越多越明显。
当使用近似算法时,block结构也非常有用。在这种情况下,可以使用多个block,每个block对应于数据集中的不同的行子集。不同的block可以分布在机器上,或者在非核心设置中存储在磁盘上。使用排序结构,分位数查找步骤在完成排序的列上就变成了线性扫描。这对于在每个分支中频繁更新候选分割点的本地优先算法非常有价值。直方图聚合中的二分搜索也变成了线性时间合并样式算法。
收集每列统计信息这一步骤可以实现并行化,这也给我们提供了一种寻找分割点的并行算法。还有一点重要的是,列的block结构同样支持列子采样,因为从block结构中选择列子集是非常容易的。