王喆《深度学习推荐系统》
文章出处:
https://blog.csdn.net/wuzhongqiang/article/details/108471107
这篇文章中
进行了补充, 今天的重点是GBDT, GBDT全称梯度提升决策树,在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,gbdt在各种竞赛是大放异彩。原因大概有几个,一是效果确实挺不错。二是即可以用于分类也可以用于回归。三是可以筛选特征。这三点实在是太吸引人了,导致在面试的时候大家也非常喜欢问这个算法, 下面就从算法的原理与公式推导, 算法如何选择特征, 如何进行回归和分类等几方面进行一个整理。
PS: 这个算法非常重要, 现在机器学习算法最常用的XGBOOST, Lightgbm, catboost这几大巨头算法都是基于这个算法的基础上进行发展起来的, 面试里面一般会问到的关于这个算法的问题, 大致有下面几个, 由于我也刚开始接触细节部分, 先整理其中的几个, 后面再慢慢加:
gbdt算法的流程?
gbdt如何选择特征?
gbdt如何构建特征?
gbdt如何用于分类
gbdt 通过什么方式减少误差 ?
gbdt的效果相比于传统的LR,SVM效果为什么好一些 ?
gbdt 如何加速训练?
gbdt的参数有哪些,如何调参 ?
gbdt 实战当中遇到的一些问题 ?
gbdt的优缺点 ?
大纲如下
:
GBDT? 我们先从提升树(BDT)开始吧
梯度提升之GBDT的原理(上面问题的1, 2)
从梯度下降的角度再看GBDT,会有一个新的感受(GBDT的残差为啥可以用负梯度近似?)
GBDT如何构建特征(3)
GBDT如何进行分类(4)
为何GBDT受人青睐(6, 10)
Ok let’s go!
白话机器学习算法理论+实战之AdaBoost算法
。 提升树模型可以表示为决策树的加法模型:
这里的L() 是损失函数,回归算法选择的损失函数一般是均方差(最小二乘)或者绝对值误差;而在分类算法中一般的损失函数选择对数函数来表示。 这是李航老师《统计学习方法》里面的原内容, 也是对提升树比较好的总结。
如果对上面的公式一脸懵逼, 那么我们拿一个图来看一下BDT的一个学习流程, 然后再回顾一下上面的这些公式, 就会有一种豁然开朗的感觉(初极狭, 才通人, 复行数十步, 豁然开朗哈哈)
根据这个图先梳理一遍BDT的流程:
boosting方法之前已经提到过, 是由多个弱学习器进行组合得到的一个强学习器, 而每个弱学习器之间是相互关联的, AdaBoost是boosting家族的一员, 它与BDT不同, AdaBoost中弱学习器之间的关联关系是前一轮学习器表现不行的样本, 而GBDT中弱学习器之间的关联是残差。
给我一些训练样本, 我们先训练第一个弱学习器, BDT里面的话就是决策树了, 关于决策树的问题这里依然不多说, 可以参考
白话机器学习算法理论+实战之决策树
, 训练完了第一个学习器, 就可以对样本进行一个预测, 此时会得到一个与真实标签的一个残差, 那么就可以用这个残差来训练后面的学习器, 也就是第二个分类器关注于与前面学习器与真实标签的差距, 这样依次类推, 最后会得到n个弱分类器。 那么我这n个分类器进行加和, 就得到了最终的学习器。最后就是用这个东西进行预测。 关于这个拟合残差的这部分, 在
白话机器学习算法理论+实战番外篇之Xgboost
做了比较详细的赘述, 这里就不再重复了, 因为这篇文章内容也很多, 不要再冗余了哈哈。
根据上面的这个简单过程, 我们再来理解一下《统计学习方法》里面的公式,
提升树实际上是加法模型和前向分布算法
, 表示为:
关于回归问题的提升树算法, 李航老师书上有个比较好的例子, 由于比较细致, 这里只摘一部分, 但是在摘之前, 需要先整理一下CART回归树的生成方式, 因为之前整理决策树全是分类任务, 而这次要整理的BDT或者是下面的GBDT都是用CART回归树作为的基分类器, 所以有必要了解一下CART回归树的生成过程, 这也对应着面试过程中的一个问题, 如何选择特征? 这个细节其实就是CART回归树的生成过程, 因为CART回归树生成的过程就是一个特征选择的过程。(这里PS一下:gbdt的弱分类器默认选择的是CART TREE。其实也可以选择其他弱分类器的,选择的前提是低方差和高偏差, Boosting就是干降低偏差这个事情的。框架服从boosting 框架即可)
然后寻找最优切分点j 和最优切分点s 。 这个是关键, 如何寻找?
具体的求解
遍历所有输入变量, 找到最优切分变量j, 构成一个对(j,s)。 依此将输入空间划分为两个区域。 重复上面的过程, 直到满足条件, 这样就生成了一棵回归树。
如果感觉上面的内容比较头大, 那么可以看下面的这个例子, 这个例子既说明了一下回归树是如何生成的, 又解释了回归问题提升树的原理, 这是李航老师书上的一个例子:
博文总结
。这里写结论:
这样,就回到了XGBoost的本质上去了,是不是也不是那么神秘了哈哈,XGBoost更像是牛顿法在函数空间的求解过程。当然,目前这是我自己的发现哈,没有找到任何参考。
机器学习算法GBDT — 比较详细的一篇
GBDT的原理和应用
梯度提升树(GBDT)原理小结
B站上一个讲集成学习的视频感觉也不错
白话机器学习算法理论+实战之决策树
白话机器学习算法理论+实战番外篇之Xgboost
白话机器学习算法理论+实战番外篇之LightGBM
白话机器学习算法理论+实战之AdaBoost算法
为何常规的gbdt和决策树不适用于高基数特征的场景
这里依然是画几个重点
梯度提升和梯度下降的区别
GBDT使用梯度提升作为训练方法, 而逻辑回归或者神经网络在训练过程中往往采用的是梯度下降作为训练方法, 二者有什么区别吗或者联系吗?
同: 两者都是在每一轮的迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新
异: 在梯度下降中,模型是以参数化形式表示, 从而模型的更新等价于参数的更新, 而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
GBDT在什么情况下比逻辑回归算法差?
高维稀疏的数据集,gbdt对维度超高的稀疏数据集,其正则项约束基本没用,并且决策空间会变成太多零散的决策小空间,具体可见上gbdt为何不好处理高基数类别特征的问题。
而lr的 l1 正则项可以很好的约束没啥用 的稀疏特征,直接w置0即可。
GBDT对输入数据有什么要求,如果效果比较差,可能是什么原因造成的?
如果训练集的效果很差,说明原始数据相对于gbdt算法来说实在太差了,特征基本没什么区分度,xgb这种拟合能力超强的算法都无法很好的拟合;
如果训练集的效果很好测试集很差,并且二者的差距非常大(比如10个点以上),考虑特征分布的问题,应该是有一些强特的分布在训练集和测试集上差异太大了。
如果训练集效果很好,测试集稍差一点,二者差异并不是很大,考虑调参。
GBDT为什么用CART回归树做基学习器?
基于梯度提升算法的学习器叫做GBM(Gradient Boosting Machine)。理论上,GBM可以选择各种不同的学习算法作为基学习器。现实中,用得最多的基学习器是决策树。为什么梯度提升方法倾向于选择决策树(通常是CART树)作为基学习器呢?这与决策树算法自身的优点有很大的关系。
决策树可以认为是if-then规则的集合,易于理解,可解释性强,预测速度快。
同时,决策树算法相比于其他的算法需要更少的特征工程,比如可以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖等。
决策树能够自动组合多个特征,它可以毫无压力地处理特征间的交互关系并且是非参数化的,因此你不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)。
不过,单独使用决策树算法时,有容易过拟合缺点。所幸的是,通过各种方法,抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题。
由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。至于抑制单颗决策树的复杂度的方法有很多,比如限制树的最大深度、限制叶子节点的最少样本数量、限制节点分裂时的最少样本数量、吸收bagging的思想对训练样本采样(subsample),在学习单颗决策树时只使用一部分训练样本、借鉴随机森林的思路在学习单颗决策树时只采样一部分特征、在目标函数中添加正则项惩罚复杂的树结构等。
为何常规的gbdt和决策树不适用于高基数特征的场景
在不加限制的情况下,tree会一直在高维的稀疏特征中生长,从而像左图这样一直分裂下去,当叶子节点的样本数量很小的时候,我们难以直接就根据叶子节点的输出来判定样本的类别或者是样本的回归标签值,举一个简单的例子,加入某个叶节点一共就5个样本,4个正样本,1个负样本,那么我们可以直接判定落在这个叶子节点上的样本是正样本的概率为0.8吗?答案是不能,统计值本身就是建立在大量样本的情况下才有效,少量样本的统计特征相对于全量数据的统计特征存在严重的偏差,在样本数量很小的情况下,概率值是没有意义的。
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true