随机森林,GBDT,XGBOOST三种集成算法的特点与对比

  • Post author:
  • Post category:其他




目前的集成学习方法大致分为两大类:即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表就是

Boosting,后者的代表是Bagging和“随机森林”(Random Forest)。




随机森林





自助抽样,特征采样,无剪枝,投票,减小方差




1,原理:




提到随机森林,就不得不提

Bagging,Bagging可以简单的理解为:放回抽样,多数表决(分类)或简单平均(回归),同时Bagging的基学习器之间属于并列生成,不存在强依赖关系。Random Forest(随机森林)是Bagging的扩展变体,它在以决策树 为基学习器构建Bagging集成的基础上,进一步在决策树的



训练过程中引入了随机特征选择,因此可以概括

RF包括四个部分:



1,



随机选择样本(放回抽样);




2,



随机选择特征;


3,



构建决策树;


4,



随机森林投票(平均)。




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




在构建决策树的时候,




RF的每棵决策树都最大可能的进行生长而不进行剪枝




;在对预测输出进行结合时,

RF通常对分类问题使用简单投票法,回归任务使用简单平均法。





2,特征重要性度量


RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。







3,


RF和Bagging对比


RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,




因为在单个决策树的构建中,

Bagging使用的是‘确定性’决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。







4,



优点:




1,



在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);


2,



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


3,



容易做成并行化方法。






5,



缺点





在噪声较大的分类或者回归问题上









过拟合












6,离群点敏感性




噪声点影响:

A


daboost > SVM > RF


7,




参数



bagging参数


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.)




GBDT




串行,回归树,容易过拟合,减小偏差,等概率提升错误样本,异常值敏感



Boosting与Bagging不太一样,Bagging中的分类器权值是一样的,






Boosting中的分类器权重并不相等,每个权重代表对应的分类器在上一轮迭代中的成功度。







1,



原理



GBDT与传统的Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,我们可以在残差减小的梯度方向上建立模型,所以说,






GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方法,与传统的Boosting中关注正确错误的样本加权有着很大的区别














GradientBoosting算法中,关键就是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一棵CART回归树。





GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)。






2,



优缺点








1,



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


2,



在相对较少的调参时间下,预测的准确度较高。






3,



当然由于它是

Boosting,因此基学习器之前存在串行关系,难以并行训练数据。






3, 注意点



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





4,


GBDT和随机森林的相同点:


1、都是由多棵树组成


2、最终的结果都是由多棵树一起决定



5,



GBDT和随机森林的不同点:


1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成


2、组成随机森林的树可以并行生成;而GBDT只能是串行生成


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



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


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



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






6,GBDT参数


B


oosting参数


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,损失函数








XGBoost




1,


GBDT和XGBoost区别



1,



传统的

GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);


2,



传统的

GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;


3,


XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。




从权衡方差偏差来看,它降低了模型的方差





,使学习出来的模型更加简单,放置过拟合,这也是

XGBoost优于传统GBDT的一个特性;


4,


shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);


5,



列抽样。

XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;


6,



对缺失值的处理。对于特征的值有缺失的样本,

XGBoost还可以自动 学习出它的分裂方向;


7,


XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是




对特征的值进行排序(因为要确定最佳分割点)







XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,




在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。



8,



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

xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。


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






版权声明:本文为u012155582原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。