机器学习之集成学习(三)

1.RF和bagging的联系 RF是对bagging的进化版,首先都是有放回的进行采样,获得n个训练集从而训练n个弱分类器,但是RF在随机选取的训练集的基础上对于特征的选择也是随机的,随机的选取一部分的特征进行弱分类器的构建,同时在划分建树的过程中也是从这些随机选取的部分特征中选择最优的特征。 2.AdaBoost和GBDT的区别 它俩都是boost家族的一员都属于加法模型,当前树的建立都是在前一棵树的基础上进行的。GBDT是在建树的过程中不断的对负梯度进行拟合,最后的结果是每棵树结果的加和。而Adaboost是先为训练数据赋予相等的一个权重,然后基于训练数据训练出一个弱分类器,随后计算出该分类器的错误率(错误分类的样本/所有样本的数目),再结合错误率对每个样本的权重进行更新,使得分错的样本其权重变大,同时还会结合错误率为每个分类器赋予不同的权重值,最后的结果对于分类问题是对每棵树进行加权表决,对于回归问题的集成策略为采用的是对加权的弱学习器取权重中位数对应的弱学习器作为强学习器的方法。 3.RF和GBDT的区别 1)随机森林采用的bagging思想,而GBDT采用的boosting思想。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的,树的建立不能并行的进行。 2)组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由CART回归树组成。 3)对于最终的输出结果而言,随机森林对于分类问题采用的集成策略是投票法,对于回归问题采用的集成策略是平均法;而GBDT则是将所有结果累加起来,或者加权累加起来。 4)随机森林对异常值不敏感;GBDT对异常值敏感。(因为GBDT的迭代过程是为了最小化损失函数,有异常数据会影响后面树的创建)对于异常值,相比于GBDT而言RF对于异常值有更好的鲁棒性。RF由于子树建立时的训练样本都使用了子采样,所以异常点的负面作用会被稀释,GBDT不止可以使用健壮的损失函数(例如Huber损失函数,它的思想是对于远离中心的点采用绝对值,近处使用均方差的思想)来减少异常值的影响。使用到的方法还有:第一、通过正则化来减少异常点影响。第二、通过无放回子采样来减少异常点影响。 5)随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。所以说bagging是通过减小方差来提高模型的性能(各个弱分类器所使用的训练集是通过随机采样获取的,因此能够学到更多的数据分布的特性),boosting是通过减小偏差来提高模型的性能。 4.GBDT和XGBoost的比较 1)GBDT只能以cart回归树作为基分类器,XGBoost还支持线性分类器 2)GBDT的目标函数只有损失函数,而XGBoost的目标函数是损失函数+正则项 3)GBDT仅使用了目标函数一阶泰勒展开,而XGBoost使用了二阶的泰勒展开值,加快了收敛速度。(GBDT用的是一阶导数处的值来近似误差,XGB是用二阶导数处的值来近似误差) 4)XGBoost加入了列采样(参照随机森林)用以防止过拟合(但是现在scikit-learn中的GBDT也能列采样了) 5)XGBoost通过预排序的方法(data事先排好序并以block的形式存储,利于并行计算)来实现树的分割点选择时增益计算的并行(并不是树级别的并行),提高了模型的训练效率 6)在进行树的分裂点的选择时XGBoost所利用的增益准则来源于目标函数的推导,而GBDT所利用的和方差最小原则和目标函数无关。 5.决策树与感知机的对比,GBDT和LR的对比 1)从处理的数据方面而言,感知机只能处理线性可分的数据,而决策树是非线性模型,可以处理非线性可分的数据。对于LR,它是广义的线性回归,尽管它可以通过核函数处理非线性可分的数据,但是一般不会这样干,它处理的还是线性可分的,只是通过特征组合融入非线性因素。 2)从决策面而言:在二维的情况下,感知机的决策面是一条直线,LR的决策面如果不考虑使用核函数也是一条直线,而决策树和GBDT相当于多次划分,是多条直线。 6.RF、GBDT以及XGBoost选取重要特征的依据 1)RF选取重要特征的依据 第一、平均不纯度减少(MDI):表示每个特征对误差的平均减少程度。 第二、平均精确率减少(MDA):打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。对于不重要的特征来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的特征来说,打乱顺序就会降低模型的精确率。 2)sklearn GBDT是根据非叶子节点在分裂时加权不纯度减少的程度来衡量的,减少得越多说明特征越重要。 3)XGBoost则有三种方法(get_score) 第一、weight:特征用来作为分裂点的次数 第二、gain:使用特征进行切分的平均增益 第三、cover:某个特征在某个结点进行分裂时所覆盖的样本个数
上一篇:xgboost CV与自定义折叠python


下一篇:python – 为什么xgboost.cv和sklearn.cross_val_score给出不同的结果?