决策树、随机森林、GBDT、xgboost、lightgbm、CatBoost相关分析

基础     

一切树模型的都是基于特征空间划分的条件概率分布,都具有方差大的特性,对量纲无要求,所以我们先介绍几种条件概率公式:

一,条件概率 

二,全概率 

è¿éåå¾çæè¿°

三,贝叶斯 

 è¿éåå¾çæè¿°

1. 决策树

递归树,它将特征空间划分为互不相交的单元。递归划分特征 ,生成多个if-then的规则,每条规则对应一个从根节点到叶子节点的条件概率分布单元,该单元由总的条件概率分布计算得来,表示给定特征条件下的不同类别的概率分布。

特征划分(分裂)算法包括ID3, C4.5, CART三个基本的树生成算法

  • ID3 是一个多叉树,使用了熵作为信息增益,不能处理连续值,而且有偏向性,倾向于选择类别较多的特征,因为IG相对偏大。

  • C4.5 是一个多叉树,使用了熵计算信息增益比,信息增益比进行子节点分裂,对类别较多的特征进行惩罚

  • CART是一棵二叉树,对分类和回归都适用,对于回归树用平方误差最小化,对分类树用基尼指数进行特征选择。分类时和ID3、C4.5类似;回归时会遍历变量j, 对固定的切分变量扫描切分点s,计算MSE,选择使得MSE最小的(j,s)对。

  • CART之所以使用Gini指数是因为熵需要计算log,速度较慢。

参考:https://samanthachen.github.io/2016/08/06/%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95_%E6%9D%8E%E8%88%AA_%E7%AC%94%E8%AE%B05/


目前的集成学习方法大致分为两大类:即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表就是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)。

2.随机森林

特点:放回抽样,特征和样本随机采样,无剪枝,投票,可以减小方差,CART若学习器。

RandomForest是一种Bagging的集成方法Bagging具有如下特点:

1)一种放回抽样

2)投票表决(分类)或平均误差最小(回归)

3)弱学习器之间属于并列生成,不存在强依赖关系。

RF使用了CART决策树作为弱学习器,并行的训练出多棵互相独立的树,最后通过投票得出结果,进一步在决策树的训练过程中引入了随机特征选择和样本选择。

  • RF有两个随机采样过程: 
    • 行采样:采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本
    • 列采样: 从M个feature中,选择m个(m << M)

通过样本的随机采样和特征的随机采样,RF的鲁棒性非常好,RF包括四个部分:
1,随机选择样本(放回抽样);
2,随机选择特征;

3,构建决策树;

4,分类:随机森林投票。回归:平方误差最小化。 

缓解了树模型方差大的特点,方差减小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。 

在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。  

特征重要性度量

RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。  
优点:
1)在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);

2)能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性;

3)容易做成并行化方法。 

缺点:

在噪声较大的分类或者回归问题上会过拟合。

离群点敏感性。噪声点影响:Adaboost > SVM > RF,IForest可以做异常检测。

参数调优:

n_estimators : integer, optional (default=10),树的棵树

criterion : string, optional (default="gini"),分裂标准,不同分裂标准对应不同基模型

max_features : int, float, string or None, optional (default="auto",log,none),寻找最佳分裂点时要考虑的样本数目,默认为开方,log(nfeatures,2),none=nfeatures

max_depth : integer or None, optional (default=None),树的最大深度,如果没有则节点被扩展到完全纯净

min_samples_split : int, float, optional (default=2),分裂时所需最少样本数目

min_samples_leaf : int, float, optional (default=1),叶子节点上最少样本数,预剪枝相关

min_weight_fraction_leaf : float, optional (default=0.)

Bagging中的分类器权值是一样的,而Boosting中的分类器权重并不相等,每个权重代表对应的分类器在上次迭代中损失的减少程度。

 3.GBDT(Gradient Boosting Decision Tree)

特点:串行,回归树,容易过拟合,减小偏差,最小化错误样本(损失函数),异常值敏感CART弱学习器。

梯度提升树是一种Boosting集成学习方法,Adaboost利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT的迭代使用了前向分布算法,弱学习器限定了只能使用CART回归树模型,每次迭代的目标是找到一个CART回归树模型的弱学习器使得损失函数最小。

GBDT与传统的Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,在残差减小的梯度方向上建立模型,在GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方法,与传统的Boosting中关注正确错误的样本加权有着很大的区别。 关键就是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一棵CART回归树。 GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)。
优缺点:

1)它能灵活的处理各种类型的数据;

2)在相对较少的调参时间下,预测的准确度较高。 
3)当然由于它是Boosting,因此基学习器之前存在串行关系,难以并行训练数据。

 注意点:

GBDT做分类时,每一次迭代需要有k棵树,k是类别数目,每棵树对一个类别进行预测。每个叶子节点也只是输出一个值,可把这颗树看作一个函数f,f将输入样本的特征映射为该值。(注意,该值并不是类别的概率,概率还需要一个logistic转化,logistic regression是:特征x先转化成实值z,然后z经过logistic regression转化成概率p(x),这里叶子节点的值相当于z)。
 

GBDT和随机森林的相同点:

1)都是由多棵树组成
2)最终的结果都是由多棵树一起决定

 

GBDT和随机森林的不同点:

1)组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
2)组成随机森林的树可以并行生成;而GBDT只能是串行生成

3)对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来

4)随机森林对异常值不敏感,GBDT对异常值非常敏感

5)随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成

6)随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

 

参数优化:

loss : {'deviance 对数损失 - sum(log(pi**pi))', 'exponential 指数损失 e**(-y*f(x))'},(默认='deviance')

learning_rate : float, optional (default=0.1),每棵按照学习率做缩减

n_estimators : int (default=100),迭代次数

max_depth : integer, optional (default=3),树的最大深度,限制了每棵树的叶子节点数目

criterion : string, optional (default="friedman_mse"),分裂标准,默认为均方误差

min_samples_split : int, float, optional (default=2),节点分裂时需要的最小样本数目

min_samples_leaf : int, float, optional (default=1),叶子节点最小样本数目,预剪枝

subsample : float, optional (default=1.0),样本采样率

max_features : int, float, string or None, optional (default=None),寻找最优分裂特征时需要的特征数量

min_impurity_split : float,停止生长阈值,预剪枝

max_leaf_nodes : int or None, optional (default=None),叶子节点最大数目

min_impurity_decrease : float, optional (default=0.),节点分裂阈值 

feature_importances_ : array, shape = [n_features],特征重要性

oob_improvement_ : array, shape = [n_estimators],损失变化列表

train_score_ : array, shape = [n_estimators],训练样本得分

loss_ : LossFunction,损失函数 

4.XGBoost: A Scalable Tree Boosting System

论文: https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf 
Slide : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf 
总结:http://blog.csdn.net/sb19931201/article/details/52557382

原论文:https://arxiv.org/pdf/1603.02754v1.pdf

特点:GBDT的变种、特征排序分裂并行、支持线性分类器、低方差、低偏差、二阶泰勒展开损失函数、列抽样、增量训练、正则化减弱单树影响、降低了方差。

GBDT的 一种变种,一个可扩展的端到端树增强系统xgboost。稀疏数据稀疏感知算法和近似树学习加权分位数草图。更重要的是,我们提供有关缓存访问模式、数据压缩和切分的见解,以构建可扩展的树提升系统。 

正则项的作用,可以从几个角度去解释:

• 通过偏差方差分解去解释

• PAC-learning泛化界解释

• Bayes先验解释,把正则当成先验 

 

回归树的学习策略 ?回归树的结构如何确定,我们前面已经推导出其最优的叶节点分数以及对应的最小损失值,问题是怎么确定树的结构? 暴力枚举所有可能的树结构,选择损失值最小的会变成NP难问题 (未必可以在多项式的时间内验证一个解的正确性)。

xgboost采用贪心法,每次尝试分裂一个叶节点,计算分裂前后的增益,选择增益最大的。

• 分裂前后的增益怎么计算?

ID3算法采用信息增益

C4.5算法采用信息增益比

CART采用Gini系数

XGBoost呢?

 

3.4 Sparsity-aware Split Finding

稀疏值: 缺失,类别one-hot编码,大量0值 • 当特征出现缺失值时,XGBoost 可以学习出默认的节点分裂方向

       In many real-world problems, it is quite common for the input x to be sparse. There are multiple possible causes for sparsity: 1) presence of missing values in the data; 2) frequent zero entries in the statistics; and, 3) artifacts of feature engineering such as one-hot encoding. It is important to make the algorithm aware of the sparsity pattern in the data. In order to do so, we propose to add a default direction in each tree node, which is shown in Fig. 4. When a value is missing in the sparse matrix x, the instance is classified into the default direction. There are two choices of default direction in each branch. The optimal default directions are learnt from the data. The algorithm is shown in Alg. 3. The key improvement is to only visit the non-missing entries Ik. The presented algorithm treats the non-presence as a missing value and learns the best direction to handle missing values. The same algorithm can also be applied when the non-presence corresponds to a user specified value by limiting the enumeration only to consistent solutions.

        To the best of our knowledge, most existing tree learning algorithms are either only optimized for dense data, or need specific procedures to handle limited cases such as categorical encoding. XGBoost handles all sparsity patterns in a unified way. More importantly, our method exploits the sparsity to make computation complexity linear to number of non-missing entries in the input. Fig. 5 shows the comparison of sparsity aware and a naive implementation on an Allstate-10K dataset (description of dataset given in Sec. 6). We find that the sparsity apware algorithm runs 50 times faster than the naive version. This confirms the importance of the sparsity aware algorithm.

  

4.1 Column Block for Parallel Learning

4.2 Cache-aware Access

 

 

与gbdt对比:

1)GBDT只能以CART作为基分类器,xgboost还支持线性分类器,此时xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。 可以通过booster [default=gbtree]设置参数:gbtree: tree-based、models/gblinear: linear models

2)GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。 —对损失函数做了改进(泰勒展开,一阶信息g和二阶信息h,上一章节有做介绍)

3)2.1 Regularized Learning Objective,xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性 —正则化包括了两个部分,都是为了防止过拟合,剪枝是都有的,叶子结点输出L2平滑是新增的。

4)shrinkage and column subsampling —还是为了防止过拟合,论文2.3节有介绍。

(1)shrinkage缩减类似于学习速率,在每一步tree boosting之后增加了一个参数n(权重),通过这种方式来减小每棵树的影响力,给后面的树提供空间去优化模型。

(2)column subsampling列(特征)抽样,说是从随机森林那边学习来的,防止过拟合的效果比传统的行抽样还好(行抽样功能也有),并且有利于后面提到的并行化处理算法。

5)split finding algorithms(划分点查找算法):—
(1)exact greedy algorithm—贪心算法获取最优切分点 ,通过
每次尝试分裂一个叶节点,计算分裂前后的增益,选择增益最大的。
(2)approximate algorithm— 近似算法,提出了候选分割点概念,先通过直方图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。详细见论文3.3节 
(3)Weighted Quantile Sketch—分布式加权直方图算法,论文3.4节 
这里的算法(2)、(3)是为了解决数据无法一次载入内存或者在分布式情况下算法(1)效率低的问题,以下引用的还是wepon大神的总结:

可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

6.对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。 —稀疏感知算法,论文3.4节,Algorithm 3: Sparsity-aware Split Finding

7.Built-in Cross-Validation(内置交叉验证)

XGBoost allows user to run a cross-validation at each iteration of the boosting process and thus it is easy to get the exact optimum number of boosting iterations in a single run. 
This is unlike GBM where we have to run a grid-search and only a limited values can be tested.

8.continue on Existing Model(接着已有模型学习)

User can start training an XGBoost model from its last iteration of previous run. This can be of significant advantage in certain specific applications. 
GBM implementation of sklearn also has this feature so they are even on this point.

9.High Flexibility(高灵活性)

**XGBoost allow users to define custom optimization objectives and evaluation criteria. 
This adds a whole new dimension to the model and there is no limit to what we can do.**

10.并行化处理 —系统设计模块,块结构设计等

xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

此外xgboost还设计了高速缓存压缩感知算法,这是系统设计模块的效率提升。 
当梯度统计不适合于处理器高速缓存和高速缓存丢失时,会大大减慢切分点查找算法的速度。 
(1)针对 exact greedy algorithm采用缓存感知预取算法 
(2)针对 approximate algorithms选择合适的块大小

2,xgboost参数

性能参数:

1,booster:所使用的模型,gbtree或gblinear

2,silent:1则不打印提示信息,0则打印,默认为0

3,nthread:所使用的线程数量,默认为最大可用数量

树参数:

1,eta:学习率,默认初始化为0.3,经多轮迭代后一般衰减到0.01至0.2

2,min_child_weight:每个子节点所需的最小权重和,默认为1

3,max_depth:树的最大深度,默认为6,一般为3至10

4,max_leaf_nodes:叶结点最大数量,默认为2^6

5,gamma:拆分节点时所需的最小损失衰减,默认为0

6,max_delta_step:默认为0

7,subsample:每棵树采样的样本数量比例,默认为1,一般取0.5至1

8,colsample_bytree:每棵树采样的特征数量比例,默认为1,一般取0.5至1

9,colsample_bylevel:默认为1

10,lambda:L2正则化项,默认为1

11,alpha:L1正则化项,默认为1

12,scale_pos_weight:加快收敛速度,默认为1

任务参数:

1,objective:目标函数,默认为reg:linear,还可取binary:logistic、multi:softmax、multi:softprob

2,eval_metric:误差函数,回归默认为rmse,分类默认为error,其他可取值包括rmse、mae、logloss、merror、mlogloss、auc

3,seed:随机数种子,默认为0 

 

Learning Task Parameters(学习任务参数) 
1.objective [default=reg:linear]:定义最小化损失函数类型,常用参数: 
binary:logistic –logistic regression for binary classification, returns predicted probability (not class) 
multi:softmax –multiclass classification using the softmax objective, returns predicted class (not probabilities) 
you also need to set an additional num_class (number of classes) parameter defining the number of unique classes 
multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class. 
2.eval_metric [ default according to objective ]: 
The metric to be used for validation data. 
The default values are rmse for regression and error for classification. 
Typical values are: 
rmse – root mean square error 
mae – mean absolute error 
logloss – negative log-likelihood 
error – Binary classification error rate (0.5 threshold) 
merror – Multiclass classification error rate 
mlogloss – Multiclass logloss 
auc: Area under the curve 
3.seed [default=0]: 
The random number seed. 随机种子,用于产生可复现的结果 
Can be used for generating reproducible results and also for parameter tuning.

注意: python sklearn style参数名会有所变化 
eta –> learning_rate 
lambda –> reg_lambda 
alpha –> reg_alpha 

XGBoost实现层面

·        内置交叉验证方法

·        能够输出特征重要性文件辅助特征筛选

XGBoost优势小结:

·        显式地将树模型的复杂度作为正则项加在优化目标

·        公式推导里用到了二阶导数信息,而普通的GBDT只用到一阶

·        允许使用列抽样(column(feature)sampling)来防止过拟合,借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现。

·        实现了一种分裂节点寻找的近似算法,用于加速和减小内存消耗。

·        节点分裂算法能自动利用特征的稀疏性。

·        样本数据事先排好序并以block的形式存储,利于并行计算

·        penalty function Omega主要是对树的叶子数和叶子分数做惩罚,这点确保了树的简单性。

·        支持分布式计算可以运行在MPI,YARN上,得益于底层支持容错的分布式通信框架rabit。

5.LightGBM:更高效的工具包  

特点:比xgboost更高效

https://lightgbm.readthedocs.io/en/latest/Features.html

lightGBM:基于决策树算法的分布式梯度提升框架。

lightGBM与XGBoost的区别:

·        切分算法(切分点的选取)

·        占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。

·        降低了计算的代价:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。(相当于LightGBM牺牲了一部分切分的精确性来提高切分的效率,实际应用中效果还不错)

·        空间消耗大,需要保存数据的特征值以及特征排序的结果(比如排序后的索引,为了后续快速计算分割点),需要消耗两倍于训练数据的内存

·        时间上也有较大开销,遍历每个分割点时都需要进行分裂增益的计算,消耗代价大

·        对cache优化不友好,在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

·        XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;但这种做法有以下缺点

·        LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点在于

·        决策树生长策略上:

·        XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)

·        LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

·         

·        histogram 做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

·        直接支持类别特征:LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开。并在决策树算法上增加了类别特征的决策规则。

·        分布式训练方法上(并行优化)

·        在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;

·        在数据并行中使用分散规约(Reducescatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行(ParallelVoting)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。

·        特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。

·        数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。

·       

LightGBM的优势。

  1. 更快的训练速度和更高的效率:LightGBM使用基于直方图的算法。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。

  2. 更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。

  3. 更高的准确率(相比于其他任何提升算法) 它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 **max-depth** 参数来防止过拟合的发生。

  4. 大数据处理能力相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。

  5. 支持并行学习

LightGBM的重要参数

  • task:默认值=train,可选项=train,prediction;指定我们希望执行的任务,该任务有两种类型:训练预测

  • application:默认值=regression,type=enum,options=options

    • regression:执行回归任务;

    • binary:二分类;

    • multiclass:多分类;

    • lambdarank:lambrank应用;

  • data:type=string;training data,LightGBM将从这些数据中进行训练;

  • num_iterations:默认值为100,类型为int。表示提升迭代次数,也就是提升树的棵树;

  • num_leaves:每个树上的叶子数,默认值为31,类型为int;

  • device:默认值=cpu;可选项:cpu,gpu。也就是我们使用什么类型的设备去训练我们的模型。选择GPU会使得训练过程更快;

  • min_data_in_leaf:每个叶子上的最少数据;

  • feature_fraction:默认值为1;指定每次迭代所需要的特征部分;

  • bagging_fraction:默认值为1;指定每次迭代所需要的数据部分,并且它通常是被用来提升训练速度和避免过拟合的。

  • min_gain_to_split:默认值为1;执行分裂的最小的信息增益;

  • max_bin:最大的桶的数量,用来装数值的;

  • min_data_in_bin:每个桶内最少的数据量;

  • num_threads:默认值为OpenMP_default,类型为int。指定LightGBM算法运行时线程的数量;

  • label:类型为string;指定标签列;

  • categorical_feature:类型为string;指定我们想要进行模型训练所使用的特征类别;

  • num_class:默认值为1,类型为int;仅仅需要在多分类的场合。

对比项XGBoostLightGBM
正则化L1/L2L1/L2
列采样yesyes
Exact Gradientyesyes
近似算法yesno
稀疏数据yesyes
分布式并行yesyes
缓存yesno
out of coreyesno
加权数据yesyes
树增长方式level-wiseleaf-wise
基于算法pre-sortedhistgram
最大树深度控制
dropoutnoyes
Baggingyesyes
用途回归、分类、rank回归、分类、lambdrank
GPU支持noyes
网络通信point-to-pointcollective-communication
CategoricalFeatures无优化优化
Continued train with input GBDT modelnoyes
Continued train with inputnoyes
Early Stopping(both training and prediction)noyes

 

LightGBM的参数调优:

1.为了最好的拟合

  • num_leaves:这个参数是用来设置组成每棵树的叶子的数量。num_leaves 和 max_depth理论上的联系是: num_leaves = 2^(max_depth)。然而,但是如果使用LightGBM的情况下,这种估计就不正确了:因为它使用了leaf_wise而不是depth_wise分裂叶子节点。因此,num_leaves必须设置为一个小于2^(max_depth)的值。否则,他将可能会导致过拟合。LightGBM的num_leave和max_depth这两个参数之间没有直接的联系。因此,我们一定不要把两者联系在一起。

  • min_data_in_leaf : 它也是一个用来解决过拟合的非常重要的参数。把它的值设置的特别小可能会导致过拟合,因此,我们需要对其进行相应的设置。因此,对于大数据集来说,我们应该把它的值设置为几百到几千。

  • max_depth: 它指定了每棵树的最大深度或者它能够生长的层数上限。

2.为了更快的速度

  • bagging_fraction : 它被用来执行更快的结果装袋;

  • feature_fraction : 设置每一次迭代所使用的特征子集;

  • max_bin : max_bin的值越小越能够节省更多的时间:当它将特征值分桶装进不同的桶中的时候,这在计算上是很便宜的。

3.为了更高的准确率

  • 使用更大的训练数据集;

  • num_leaves : 把它设置得过大会使得树的深度更高、准确率也随之提升,但是这会导致过拟合。因此它的值被设置地过高不好。

  • max_bin : 该值设置地越高导致的效果和num_leaves的增长效果是相似的,并且会导致我们的训练过程变得缓慢。

6.CatBoost(categorical boosting):一个自动处理分类数据的机器学习库

CatBoost(categorical boosting)是一种能够很好地处理类别型特征的梯度提升算法库。该库中的学习算法基于GPU实现,打分算法基于CPU实现。

所谓类别型特征,即为这类特征不是数值型特征,而是离散的集合,比如省份名(山东,山西,河北等),城市名(北京,上海,南京等),学历(高中,本科,硕士等)。在梯度提升算法中,最常用的是将这些类别型特征转为数值型来处理,一般类别型特征会转化为一个或多个数值型特征。如果某个类别型特征基数比较低,即该特征的所有值去重后构成的集合元素个数比较少,一般利用one-hot编码方法将特征转为数值型。

将类别型特征转为数值型特征也可以基于统计来做,比如,首先统计该特征中某个取值c1对应的类别标签的总和SumY,然后用该总和SumY除以该特征取值为c1的样本数n1,进而可以将类别型特征转为数值型特征。这种做法容易过拟合,比如取值为c1的样本只有一个的情形。为了避免过拟合,可以将样本集分成两部分,一部分用来统计,另一部分用来训练,这样就减少了训练的样本量,用来统计的样本量也会有所不足。

为了将所有样本用于训练,CatBoost给出了一种解决方案,即首先对所有样本进行随机排序,然后针对类别型特征中的某个取值,每个样本的该特征转为数值型时都是基于排在该样本之前的类别标签取均值,同时加入了优先级和优先级的权重系数。

这种做法可以降低类别特征中低频次特征带来的噪声。

在回归问题中,计算优先级一般通过对标签值取平均得到。针对二分类问题,优先级一般基于正类样本的先验概率得到。

针对类别型特征,也可以将两个类别型特征组合起来,在CatBoost中,第一次分割时不考虑类别型特征的组合,下面的分割中将所有类别型特征之间的组合考虑进来,组合后的特征就会变成数值型的。CatBoost也会把分割得到的两组值作为类别型特征参与后面的组合。

在GBDT中,构建下一棵树包含两步,即选择树的结构以及树结构固定之后设置叶子节点的值。在CatBoost中,对于每个样本Sample,都单独构建一个利用该样本之前的样本点的梯度估计得到的模型Model,针对这些模型Model,估计该样本Sample的梯度,然后利用新模型Model_new重新对样本Sample打分。

容易看出,上面的模型依赖于样本的排序,那么利用多种样本排序可以训练得到多种模型,这样可以减少过拟合现象。

CatBoost具有两大优势,其一,它在训练过程中处理类别型特征,而不是在特征预处理阶段处理类别型特征;其二,选择树结构时,计算叶子节点的算法可以避免过拟合。

另外,在CatBoost中,将浮点型特征,统计值以及one-hot编码的特征二值化,所有这些二值化特征放入向量中,然后在打分过程中利用二值化的特征计算模型的输出。

实验结果如下

我们有多个提升库,比如XGBoost、H2O和LightGBM,所有这些库都能在各种问题上有着出色的表现。CatBoost的开发人员将其性能与标准ML数据集的竞争对手进行了比较:

CatBoost:ä¸ä¸ªèªå¨å¤çåç±»æ°æ®çæºå¨å­¦ä¹ åº

 

二分类示例代码(python):

from catboost import CatBoostClassifier
# Initialize data
cat_features = [0,1,2]
train_data = [["a","b",1,4,5,6],["a","b",4,5,6,7],["c","d",30,40,50,60]]
train_labels = [1,1,-1]
test_data = [["a","b",2,4,6,8],["a","d",1,4,50,60]]
# Initialize CatBoostClassifier
model = CatBoostClassifier(
iterations=2, 
learning_rate=1, 
depth=2, loss_function='Logloss')
# Fit model
model.fit(train_data, train_labels, cat_features)
# Get predicted classes
preds_class = model.predict(test_data)
# Get predicted probabilities for each class
preds_proba = model.predict_proba(test_data)
# Get predicted RawFormulaVal
preds_raw = model.predict(test_data, prediction_type='RawFormulaVal')

 

多分类示例代码(Python):

from catboost import Pool, CatBoostClassifier

TRAIN_FILE = '../data/cloudness_small/train_small'
TEST_FILE = '../data/cloudness_small/test_small'
CD_FILE = '../data/cloudness_small/train.cd'
# Load data from files to Pool
train_pool = Pool(TRAIN_FILE, column_description=CD_FILE)
test_pool = Pool(TEST_FILE, column_description=CD_FILE)
# Initialize CatBoostClassifier
model = CatBoostClassifier(
iterations=2,
learning_rate=1,
depth=2,
loss_function='MultiClass')
# Fit model
model.fit(train_pool)
# Get predicted classes
preds_class = model.predict(test_pool)
# Get predicted probabilities for each class
preds_proba = model.predict_proba(test_pool)
# Get predicted RawFormulaVal
preds_raw = model.predict(test_pool, prediction_type='RawFormulaVal') 
  • 8
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: AdaboostGBDTXGBoostLightGBM都是机器学习中常用的集成学习算法。 Adaboost是一种迭代算法,通过不断调整样本权重和分类器权重,逐步提高分类器的准确率。 GBDT(Gradient Boosting Decision Tree)是一种基于决策树的集成学习算法,通过不断迭代,每次训练一个新的决策树来纠正前面树的错误,最终得到一个强分类器。 XGBoost是一种基于GBDT算法,它在GBDT的基础上引入了正则化和并行化等技术,使得模型更加准确和高效。 LightGBM是一种基于GBDT算法,它采用了基于直方图的决策树算法和互斥特征捆绑技术,使得模型训练速度更快,占用内存更少,同时也具有较高的准确率。 ### 回答2: adaboost(Adaptive Boosting) 是一种基于不同权重的弱分类器的算法,它通过迭代的方式来逐步提高分类器的准确性。在每轮迭代中,它会调整训练样本的权重,使得前一轮分类错误的样本在当前轮得到更多的关注。最终,通过组合这些弱分类器来构建一个强分类器。其优点在于不易过拟合,但需要耗费大量的时间来训练和预测。 gbdt(Gradient Boosting Decision Tree) 是一种基于决策树的集成学习算法,它通过迭代的方式来提升分类器的准确性。基于训练样本和实际输出的误差进行梯度下降,将它们作为下一个分类器的训练数据。每个分类器都在之前所有分类器得到的残差的基础上进行训练,并且将它们组合成一个最终的分类器。在训练过程中,为了避免过拟合,可以限制决策树的深度等参数,并采用交叉验证等技术。gbdt可以处理缺失数据、不平衡分类和高维度数据等问题,但需要注意过拟合的问题。 xgboost(Extreme Gradient Boosting) 是一种基于决策树的集成学习算法,它在gbdt的基础上引入了正则化项和精细的特征选择,进一步提高了分类器的准确性和效率。通过Hessian矩阵对损失函数进行二阶泰勒展开,引入正则化约束,可以优化损失函数,并通过交叉验证等技术选择最优的超参数。xgboost还支持GPU加速,提高模型训练的速度和效率,但需要更多的计算资源。xgboost在分类、回归和排名任务中表现优异,但需要注意过拟合和计算量的问题。 lightgbm是微软旗下一款高效、快速、分布式的梯度提升框架,也是一种基于决策树的集成学习算法,定位在处理高维度数据和大规模数据集上。lightgbm采用了GOSS(Gradient-based One-Side Sampling)技术和EFB(Exclusive Feature Bundling)技术对数据进行处理,大大减少数据的内存占用和训练时间。同时,还支持并行计算和GPU加速,提高了模型的速度和效率。lightgbm在排序、分类、回归等任务中表现出色,只是对离群值敏感,需要对数据进行预处理。 ### 回答3: Adaboost,Gradient Boosting Decision Tree (GBDT),XGBoostLightGBM都是常见的集成学习算法,它们用于提高模型在复杂数据集上的准确度,并处理复杂数据集上遇到的问题。 Adaboost是一种迭代算法,每次迭代它使用提高错误分类样本的加权值,并降低正确分类样本的加权值,以便让前一个弱分类器无法捕捉并由后续分类器学习。Adaboost弱分类器快速训练和预测,且不需要太多超参数调整,但是它倾向于过度拟合数据,并且实力可能不足以解决大型数据集的问题。 GBDT使用决策树作为弱分类器,将每一棵树的预测结果作为下一棵树的预测输入,最后对所有树的预测结果进行加权求和。GBDT可以很好地处理线性和非线性问题,但是它倾向于过度拟合数据,需要进行精细调整参数,并且需要较长时间的训练时间。 XGBoost结合了GBDT的优势和树的强大性质。它采用了一些优秀的技术,如Boosting树算法,Shrinkage,Column Sampling和Pruning Nodes,以提高模型的性能和降低过拟合风险。XGBoost可以处理大规模数据集和高维数据集,并且速度较快,但需要的资源较多,如内存、计算能力和高质量的数据集。 LightGBMXGBoost的新一代版本,采用了GOI(Gradient-based One-side Sampling)算法和Histogram-based Gradient Boosting方法来加快训练速度和降低内存占用。GOI算法通过对数据进行一侧采样来提高训练速度,而直方图梯度提升方法将节点分裂建模为一个直方图分桶过程,以减少节点分裂的计算成本。LightGBM对大数据集的处理能力很强,速度相对较快,但对于处理小数据集的效果可能不明显。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljtyxl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值