讲的hin好
GBDT详解
设置参数:节点分裂时的最小样本数;min_samples;
最大深度:max_depth;
最多叶子节点数:max_leaf_nodes;
loss满足约束条件。
(1)计算每个特征在训练集下的特征增益,与所有特征的信息增益之和的比例为权重值。
(2)借鉴投票机制。用相同的参数对 w 每个特征训练一个模型,计算各模型下每个特征正确分类的个数,每个特征正确分类个数与所有正确分类个数之和的比例为权重值。
不是,因为生成单棵决策树时,需要选择最佳分裂点,以拟合残差,寻找最优的拟合值,而这个运算与样本个数N不是线性相关的。
不是,因为每棵树生成的时间复杂度不同。
叶子节点数和每棵树的生成时间复杂度也不成正比。
树的中间节点保存某个特征的分割值,叶节点保存预测时某个类别的概率。
(1)增加样本,移除噪声;
(2)减少特征,保留重要的特征;
(3)对样本进行采样,建树的时候,选择一个子集(GBDT特有的方法,是无放回抽样);每一个子树都采用这个样本子集进行拟合。
(1)这两个步长一样么?答:训练跟预测时,两个步长是一样的,也就是预测时的步长为训练时的步长,从训练的过程可以得知(更新当前迭代模型的时候)。
(2)都有什么用,如果不一样,为什么?答:它的作用就是使得每次更新模型的时候,使得loss能够平稳地沿着负梯度的方向下降,不至于发生震荡。
(3)那么怎么设步长的大小?
答:有两种方法,一种就是按策略来决定步长,另一种就是在训练模型的同时,学习步长。
A. 策略:
a 每个树步长恒定且相等,一般设较小的值;
b 开始的时候给步长设一个较小值,随着迭代次数动态改变或者衰减。
B. 学习:
因为在训练第k棵树的时候,前k-1棵树时已知的,而且求梯度的时候是利用前k-1棵树来获得。所以这个时候,就可以把步长当作一个变量来学习。
(4)(太小?太大?)在预测时,对排序结果有什么影响?
答:如果步长过大,在训练的时候容易发生震荡,使得模型学不好,或者完全没有学好,从而导致模型精度不好。
而步长过小,导致训练时间过长,即迭代次数较大,从而生成较多的树,使得模型变得复杂,容易造成过拟合以及增加计算量。
不过步长较小的话,使训练比较稳定,总能找到一个稳定的局部最优解。
个人觉得过大过小的话,模型的预测值都会偏离真实情况(可能比较严重),从而导致模型精度不好。
(5)跟shrinking里面的步长一样么?答:这里的步长跟shrinking里面的步长是一致的。
A. 计算每个样本的负梯度
B. 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
C. 更新每个样本的负梯度时
D. 最后预测过程中,每个样本将之前的所有树的结果累加的时候
在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。
例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚。
gbdt(又称Gradient Boosted Decision Tree/Gradient Boosted Regression Tree),是一种迭代的决策树算法,该算法由多个决策树组成。
Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,即将弱分类器组装成强分类器的方法。将不同的分类算法套入到此类算法框架中一定程度上会提高了原单一分类器的分类效果,但是也增大了计算量。
首先介绍Bootstraping,即自助法:它是一种有放回的抽样方法(可能抽到重复的样本)。
1、Bagging (bootstrap aggregating)
Bagging即套袋法,其算法过程如下:
2、Boosting
其主要思想是,在PAC(概率近似正确)学习框架下,将弱分类器组装成一个强分类器。
关于Boosting的两个核心问题:
1)在每一轮如何改变训练数据的权值或概率分布?
Adaboost:通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
2)通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。
而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
3、Bagging,Boosting二者之间的区别
1)样本选择与样本权重上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。使用均匀取样,每个样例的权重相等
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整,分类错误率越大则权重越大。
2)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
3)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。但是特征的选择上可以并行。
4、总结
下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT、Xgboost
adaboost是boosting其中的一种,采用了指数损失函数exponential loss function(其实就是用指数的权重),根据不同的loss function还可以有其他算法,比如L2Boosting, logitboost…
1)归一化后加快了梯度下降求最优解的速度;
2)归一化有可能提高精度。
如下左图为未归一化,梯度下降按照“之”字型收敛;
如下右图为归一化结果,梯度下降按照一个方向收敛。
参数说明(sklearn)
n_estimators:控制弱学习器的数量
max_depth:设置树深度,深度越大可能过拟合
max_leaf_nodes:最大叶子节点数
learning_rate:更新过程中用到的收缩步长,(0, 1]
max_features:划分时考虑的最大特征数,如果特征数非常多,我们可以灵活使用其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
min_samples_split:内部节点再划分所需最小样本数,这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。
min_samples_leaf:叶子节点最少样本数,这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
min_weight_fraction_leaf:叶子节点最小的样本权重和,这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
min_impurity_split:节点划分最小不纯度,使用 min_impurity_decrease 替代。
min_impurity_decrease:如果节点的纯度下降大于了这个阈值,则进行分裂。
subsample:采样比例,取值为(0, 1],注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做 GBDT 的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低,一般在 [0.5, 0.8] 之间。
AdaBoost是通过提升错分数据点的权重来定位模型的不足;
Gradient Boosting是通过算梯度(gradient)来定位模型的不足!