集成算法(lightgbm和xgboost)

XGBoost

XGBoost(eXtreme Gradient Boosting)极致梯度提升,是一种基于GBDT的算法或者说工程实现。

XGBoost的基本思想和GBDT相同,但是做了一些优化,比如二阶导数使损失函数更精准;正则项避免树过拟合;Block存储可以并行计算等。

XGBoost具有高效、灵活和轻便的特点,在数据挖掘、推荐系统等领域得到广泛的应用

算法思想

该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。

XGBoost目标函数定义为:
在这里插入图片描述

XGBoost的优点

之所以XGBoost可以成为机器学习的大杀器,广泛用于数据科学竞赛和工业界,是因为它有许多优点:
1.使用许多策略去防止过拟合,如:正则化项、Shrinkage and Column Subsampling等。
2. 目标函数优化利用了损失函数关于待求函数的二阶导数
3.支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。
4.添加了对稀疏数据的处理。
5.交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。
6.支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本。

XGBoost参数

  • 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。

  • 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。

  • xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。

  • 降低学习速率,确定理想参数。

XGBoost的使用方法

  • ①使用xgboost自带的数据集格式 + xgboost自带的建模方式
    • 把数据读取成xgb.DMatrix格式(libsvm/dataframe.values给定X和Y)
    • 准备好一个watch_list(观测和评估的数据集)
    • xgb.train(dtrain)
    • xgb.predict(dtest)
  • ②使用pandas的DataFrame格式 + xgboost的sklearn接口
    • estimator = xgb.XGBClassifier()/xgb.XGBRegressor()
    • estimator.fit(df_train.values, df_target.values)

Lightgbm

算法原理

LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升框架。可用于排序,分类,回归以及很多其他的机器学习任务中。

该算法是由微软亚洲研究院的机器学习组所开发,并开源至GitHub。由于其卓越的性能,在GitHub开源三天,就收到了1000+star,200+fork。

LightGBM算法是站在工程的角度上设计实现的,这使其更容易在大规模数据集中做模型的快速迭代,之所以说其性能卓越,主要是基于以下几个特性:

1、直方图优化
我们都知道,原始的GBDT算法在进行决策树节点分裂时,需要对全局数据集中的每一个特征分量进行遍历,以求出当前分裂节点的最优分裂特征值;而后续很多优化版本中都加入了预排序策略,其中包括了Xgboost算法,但是不管是否进行预排序优化,算法总归在构建决策树时需要遍历全局样本,这其实是非常耗时的。基于此,LightGBM采用了直方图优化策略,其主要原理是:在训练前,通过对样本中每一维特征进行排序,在排序后,对特征进行直方图划分(算法默认划分256个直方图),在后续的训练中,算法仅需要使用直方图作为“特征”进行决策树的构建,这大大减少了对样本集的遍历次数(#bins << #features)。

这样的优化,在某种程度上可能造成决策树分裂不能使用全局最优的分裂点,但实验证明,这种“不太准确”的分裂策略,在某种角度上起到了正则的作用,从而提升了模型的鲁棒性。
在这里插入图片描述

2、深度优先分裂策略(leaf-wise)
在LightGBM算法之前,大多数树模型在进行决策树构建时,均采用了层次宽度优先分裂(level-wise策略),即节点分裂时,在同一层的节点可以同时分裂,这在一定程度上可以多线程并行,加快构建决策树速度,但从另外一个角度讲,level-wise策略构建时只会考虑当前节点集合内的样本进行最优分裂,因此存在一种局部最优解的可能,另外,并行生成可能存在在同一层的部分节点没有必要进行额外的分裂(笔者认为即使分裂了,也可能会再决策树构建完毕后进行后剪枝操作,带来额外的开销)。基于此,LightGBM算法采用深度优先分裂策略,即每次对叶节点进行分裂时,均考虑了全局的样本,不会造成局部最优解的问题,同时也减少了后剪枝操作次数的可能。对于深度优先分裂策略,由于树的深度可能更深,造成过拟合,因此模型参数增加了对最大深度的限制,以减少过拟合的风险。

3、梯度单边采样策略(Gradient-based One-Side Sampling, GOSS)
单边采样的策略算法流程如下:

1、选取前a%个较大梯度的值作为大梯度值的训练样本

2、从剩余的1 - a%个较小梯度的值中,我们随机选取其中的b%个作为小梯度值的训练样本

3、对于较小梯度的样本,也就是b% * (1 - 1%) * #samples,我们在计算信息增益时将其放大(1 - a) / b倍

我们都知道原始的GBDT的算法是利用了损失函数的负梯度近似等于残差的思想来实现的。与LightGBM算法相比,其他基于Boosting框架的树模型算法在每一次构建决策树时,使用了随机采样的策略抽取一定数量的样本进行梯度更新,参与决策树的构建,而LightGBM算法使用单边采样的策略,有针对性的对梯度较大的样本全部参与决策树构建,为保证样本的数据分布不被破坏,同时随机采样了梯度较小的样本参与构建决策树,实验证明,LightGBM算法侧单边采样策略好于随机采样策略。(笔者认为,LightGBM算法的单边采样策略一定程度上受到了AdaBoost思想的影响,个人看法)

4、互斥特征捆绑策略(Exclusive Feature Bundling, EFB)
顾名思义,互斥特征捆绑是将样本中不同维度的稀疏特征进行合并,作为一个特征进入模型参与决策树构建。针对特征维度高,而高维的数据通常是稀疏的,能否设计一种无损的方法来减少特征的维度。特别的,稀疏特征空间中,许多特征是互斥的,例如他们从不同时为非零值。因此,我们可以绑定互斥的特征为单一特征,参与最终特征直方图的构建。

5、直接支持类别特征
原始的GBDT算法对于类别特征,需要手动进行one-hot编码,然后传入模型进行训练或预测,但是one-hot编码会给我们的训练或预测带来很多的问题:

维度爆炸
one-hot编码的思想是把类别特征做成独热的向量,如果某个类别特征的特征值个数巨大,比如sku(40+亿),这就需要编码一个40+亿维度的特征向量,很明显这是不合理的。

增加打分时的额外开销
如果样本中的特征进行了one-hot编码,服务端在进行模型打分计算前,需要对相应的原始类别特征进行one-hot编码,这在一定程度上会增加模型打分耗时。

决策树构建中无法进行特征切分
使用one-hot编码的话,意味着在每一个决策节点上只能使用one vs rest方式进行切分,当类别值很多时,每个类别上的数据可能会比较少,这时候切分会产生不平衡,这意味着切分增益也会很小,因为不平衡的切分和不切分没有区别。

弱化决策树的学习能力
决策树构建使用的是样本的统计信息,若按照one-hot编码方式,会有很多样本量很小的类别特征,这样的样本由于数据量较小,很有可能有统计问题,这种统计问题会被带到决策树的学习过程当中,使模型产生过拟合风险。
在这里插入图片描述

为了解决one-hot编码处理类别特征的不足。LightGBM采用了Many vs many的切分方式,实现了类别特征的最优切分。用LightGBM可以直接输入类别特征,并产生如上图右侧的效果。

算法流程如下:

1、在枚举分割点之前,先把直方图按每个类别的均值进行排序;

2、然后按照均值的结果依次枚举最优分割点。从下图可以看到,Sum(y)/Count(y)为类别的均值。当然,这个方法很容易过拟合( 笔者认为,此处的过拟合产生的原因是因为,这里的均值采用的是训练样本的统计信息,决策树很容易学到类别的均值信息,但是在面对预测时,由于预测样本的统计信息与训练样本不尽相同,因此原始训练好的模型会对预测样本预测时不能得到很好的泛化效果,因此此处说容易过拟合),所以在LightGBM中加入了很多对这个方法的约束和正则化。
在这里插入图片描述

下图是一个简单的对比实验,可以看到该最优方法在AUC上提升了1.5个点,并且时间只多了20%。
在这里插入图片描述

6、并行学习
Python版本的LightGBM算法原生支持三种并行模式,分别是:特征并行(Featrue Parallelization)和数据并行(Data Parallelization)以及基于投票的数据并行(Voting Parallelization)。而Spark版本的LightGBM不支持特征并行(笔者认为,特征并行不能很好的解决大数据集上的分布式并行处理,因此Spark取消了这种模式),仅支持数据并行和基于投票的数据并行。

特征并行
特征并行的主要思想是在不同机器、在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
在这里插入图片描述
数据并行
数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。在这里插入图片描述
基于投票的数据并行
在直方图合并的时候,通信代价比较大,基于投票的数据并行能够很好的解决这一点(笔者建议在设置参数时候,尽量设置为数据并行,不要设置投票并行,因为投票并行可能产生局部最优分割点。这是因为投票并行也是基于数据并行,而每个worker只统计了局部数据的最优分割点,可能在投票的过程中这个局部数据的最优分割点不能代表全局最优分割点)。
在这里插入图片描述

基于上述的特性,LightGBM算法可以快速地对超大规模数据集进行训练,并相比于Xgboost算法,直接支持类别特征传入的特性,这对于我们来说是一个巨大的福音。

以下是LightGBM算法与Xgboost算法在不同数据集上实验效果对比,足以见得LightGBM的优越性:
在这里插入图片描述

算法参数

可以见lightgbm中文官方文档查看lightgbm中文官方文档

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值