一、GBDT
在提升算法中有两个主要思想,一个是Adaboost另一个是Gradient Boosting Decison Tree(梯度提升决策树)。提升树是以分类树或者回归树为基本分类器的提升方法,是目前性能较好的一种方法。在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是
f
t
−
1
(
x
)
f_{t−1}(x)
ft−1(x), 损失函数是
L
(
y
,
f
t
−
1
(
x
)
)
)
L(y,f_{t−1}(x)))
L(y,ft−1(x))), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器
h
t
(
x
)
h_t(x)
ht(x),让本轮的损失函数
L
(
y
,
f
t
(
x
)
=
L
(
y
,
f
t
−
1
(
x
)
+
h
t
(
x
)
)
L(y,f_t(x)=L(y,f_{t−1}(x)+h_t(x))
L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
二、GBDT基本思想
决策树我们一般分为两类,回归树和分类树,GBDT的核心在于累加所有树的结果作为最终结果,显然分类的结果是不适合累加的,因此我们在这里所指的都是回归树(GBDT调整后也可用于分类但不代表GBDT的树是分类树)
GBDT可以表示为:
F
m
(
x
)
=
∑
m
=
1
M
T
(
x
,
c
m
j
)
F_m(x)=\sum_{m=1}^MT(x,c_{mj})
Fm(x)=m=1∑MT(x,cmj)
提升树算法采用加法模型和向前分步算法实现学习的优化过程。当损失函数是平方损失和指数损失的时候,优化是简单可行的,但是如果我们面对的是一般的损失函数这一思路可行性就不那么理想了。所以有学者提出了梯度提升的算法,利用的是最速下降法的近似方法,关键部分是利用损失函数的负梯度在当前模型的值
−
[
d
L
(
y
,
f
(
x
i
)
)
d
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
-[\frac{dL(y,f_{(x_i)})}{df_{(x_i)}}]_{f(x)=f_{m-1}(x)}
−[df(xi)dL(y,f(xi))]f(x)=fm−1(x)
作为回归问题的提升树算法中的残差的近似值,拟合一个回归树。
损失函数主要有平方损失函数
L
(
Y
,
f
(
X
)
)
=
(
Y
−
f
(
X
)
)
2
L(Y, f(X)) = (Y - f(X))^2
L(Y,f(X))=(Y−f(X))2,Y-f(X)表示的是残差
指数损失函数(Adaboost)
f
m
(
x
)
=
f
m
−
1
(
x
)
+
α
m
G
m
(
x
)
f_m(x) = f_{m-1}(x)+\alpha_mG_m(x)
fm(x)=fm−1(x)+αmGm(x)
⟹
\Longrightarrow
⟹
a
r
g
m
i
n
α
,
G
=
∑
i
=
1
N
e
x
p
[
−
y
i
(
f
m
−
1
(
x
i
)
+
α
G
(
x
i
)
)
]
arg \mathop{min}\limits_{\alpha ,G}=\sum_{i=1}^N exp[-y_i(f_{m-1}(x_i)+\alpha G(x_i))]
argα,Gmin=i=1∑Nexp[−yi(fm−1(xi)+αG(xi))]
⟹
\Longrightarrow
⟹ L(y,f(x)=exp[-yf(x)]
Hinge损失函数(svm)
L
(
y
)
=
m
a
x
(
0
,
1
−
y
y
~
,
y
=
±
1
L(y)=max(0,1-y\tilde{y},y=\pm1
L(y)=max(0,1−yy~,y=±1
绝对值损失函数
L
(
Y
,
f
(
x
)
)
=
∣
Y
−
f
(
x
)
∣
L(Y,f(x))=|Y-f(x)|
L(Y,f(x))=∣Y−f(x)∣
下面我们具体说一下梯度提升算法:
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
N
,
y
N
)
}
T=\{(x_1,y_1),(x_2,y_2),...(x_N,y_N)\}
T={(x1,y1),(x2,y2),...(xN,yN)}
损失函数L(y,f(x))
输出:回归树
f
^
(
x
)
\hat{f}(x)
f^(x)
(1)初始化
f
0
(
x
)
=
a
r
g
m
i
n
c
∑
i
=
1
N
L
(
y
i
,
c
)
f_0(x)=arg \mathop{min}\limits_{c} \sum_{i=1}^N L(y_i,c)
f0(x)=argcmini=1∑NL(yi,c)
(2)对m=1,2,3,…M
a)对i=1,2…N,计算
r
m
i
=
−
[
d
L
(
y
i
,
f
(
x
i
)
)
d
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
r_{mi}=-[\frac{dL(y_i,f_{(x_i)})}{df_{(x_i)}}]_{f(x)=f_{m-1}(x)}
rmi=−[df(xi)dL(yi,f(xi))]f(x)=fm−1(x)
b)对
r
m
i
r_{mi}
rmi拟合一个回归树,得到第m棵树的叶节点区域
R
m
j
R_{mj}
Rmj,j=1,2,…J
c)对j=1,2…J计算
c
m
j
=
a
r
g
m
i
n
c
∑
x
i
∈
R
m
j
L
(
y
i
,
f
m
−
1
(
x
i
)
+
c
)
c_{mj}=arg \mathop{min}\limits_{c} \sum_{x_i \in R_{mj}} L(y_i,f_{m-1}(x_i)+c)
cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
d)更新
f
m
(
x
)
=
f
m
−
1
(
x
)
+
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
f_m(x)=f_{m-1}(x)+\sum_{j=1}^J c_{mj}I(x \in R_{mj})
fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj)
(3)得到回归树
f
^
(
x
)
=
f
M
(
x
)
=
∑
m
=
1
M
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
\hat f(x)=f_M(x)=\sum_{m=1}^M \sum_{j=1}^J c_{mj}I(x \in R_{mj})
f^(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
算法第1步初始化,对可以使损失函数极小化的常数值进行估计,第2a步计算损失函数的负梯度在当前模型的值,将它作为残差的估计,对于平方损失函数,他就是我们所说的残差;对于一般损失函数,他是残差的一个近似值。第2b步估计回归树叶节点区域,以拟合残差的近似值。第2c步利用线性搜索估计叶节点区域的值,使损失函数极小化。第2d步更新回归树,最后输出得到的最终模型
f
^
(
x
)
\hat f (x)
f^(x)
三、回归分类和多元分类
回归分类和多元分类
我们假设样本 X 总共有 K类。来了一个样本 x,我们用GBDT来判断x的类别。
第一步 我们在训练的时候,是针对样本 X 每个可能的类都训练一个分类回归树,假如目前样本有三类,也就是 K = 3。样本 x 属于 第二类。那么针对该样本 x 的分类结果,其实我们可以用一个 三维向量 [0,1,0] 来表示。0表示样本不属于该类,1表示样本属于该类。由于样本已经属于第二类了,所以第二类对应的向量维度为1,其他位置为0。
针对样本有 三类的情况,我们实质上是在每轮的训练的时候是同时训练三颗树。第一颗树针对样本x的第一类,输入为(x,0)(x,0)。第二颗树输入针对 样本x 的第二类,输入为(x,1)(x,1)。第三颗树针对样本x 的第三类,输入为(x,0)(x,0)。
在这里每颗树的训练过程其实就是就是我们之前已经提到过的CATR TREE 的生成过程。在此处我们参照之前的生成树的程序 即可以就解出三颗树,以及三颗树对x 类别的预测值
f
1
(
x
)
,
f
2
(
x
)
,
f
3
(
x
)
f_1(x),f_2(x),f_3(x)
f1(x),f2(x),f3(x)。那么在此类训练中,我们仿照多分类的逻辑回归 ,使用softmax 来产生概率,则属于类别 1 的概率
p
1
=
e
x
p
(
f
1
(
x
)
)
/
∑
k
=
1
3
e
x
p
(
f
k
(
x
)
)
p_{1}=exp(f_{1}{(x)})/\sum_{k= 1}^{3}exp(f_{k}{(x)})
p1=exp(f1(x))/k=1∑3exp(fk(x))并且我们我们可以针对类别1 求出 残差
y
11
(
x
)
=
0
−
p
1
y_{11}(x)=0−p_1
y11(x)=0−p1;类别2 求出残差
y
22
(
x
)
=
1
−
p
2
(
x
)
y_{22}(x)=1−p_2(x)
y22(x)=1−p2(x);类别3 求出残差
y
33
(
x
)
=
0
−
p
3
(
x
)
y_{33}(x)=0−p_3(x)
y33(x)=0−p3(x).gbdt使用损失函数的负梯度在当前模型的值来作为残差的近似值
然后开始第二轮训练 针对第一类 输入为
(
x
,
y
11
(
x
)
)
(x,y_{11}(x))
(x,y11(x)), 针对第二类输入为
(
x
,
y
22
(
x
)
)
(x,y_{22}(x))
(x,y22(x)), 针对 第三类输入为
(
x
,
y
33
(
x
)
)
(x,y_{33}(x))
(x,y33(x))继续训练出三颗树。一直迭代M轮,每轮构建 3颗树
F
1
M
(
x
)
=
∑
m
=
1
M
C
1
m
^
I
(
x
ϵ
R
1
m
)
F_{1M}{(x)}=\sum_{m=1}^{M}{\hat{C_{1m}}I(x\epsilon R_{1m})}
F1M(x)=m=1∑MC1m^I(xϵR1m)
F
2
M
(
x
)
=
∑
m
=
1
M
C
2
m
^
I
(
x
ϵ
R
2
m
)
F_{2M}{(x)}=\sum_{m=1}^{M}{\hat{C_{2m}}I(x\epsilon R_{2m})}
F2M(x)=m=1∑MC2m^I(xϵR2m)
F
3
M
(
x
)
=
∑
m
=
1
M
C
3
m
^
I
(
x
ϵ
R
3
m
)
F_{3M}{(x)}=\sum_{m=1}^{M}{\hat{C_{3m}}I(x\epsilon R_{3m})}
F3M(x)=m=1∑MC3m^I(xϵR3m)
当训练完毕以后,新来一个样本 x1 ,我们需要预测该样本的类别的时候,便可以有这三个式子产生三个值,
f
1
(
x
)
,
f
2
(
x
)
,
f
3
(
x
)
f_1(x),f_2(x),f_3(x)
f1(x),f2(x),f3(x)。样本属于 某个类别c的概率为
p
c
=
e
x
p
(
f
c
(
x
)
)
/
∑
k
=
1
3
e
x
p
(
f
k
(
x
)
)
p_{c}=exp(f_{c}{(x)})/\sum_{k= 1}^{3}exp(f_{k}{(x)})
pc=exp(fc(x))/k=1∑3exp(fk(x))
四、正则化
GBDT的正则化
我们需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。
第一种是和Adaboost类似的正则化项,即步长(learning rate)。定义为ν,对于前面的弱学习器的迭代
f
k
(
x
)
=
f
k
−
1
(
x
)
+
h
k
(
x
)
f_k(x)=f_{k−1}(x)+h_k(x)
fk(x)=fk−1(x)+hk(x)
如果我们加上了正则化项,则有
f
k
(
x
)
=
f
k
−
1
(
x
)
+
ν
h
k
(
x
)
f_k(x)=f_{k−1}(x)+νh_k(x)
fk(x)=fk−1(x)+νhk(x)
ν的取值范围为0<ν≤10<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
第二种正则化的方式是通过子采样比例。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
第三种是对于弱学习器即CART回归树进行正则化剪枝。
五、优缺点
GBDT主要的优点有:
1) 可以灵活处理各种类型的数据,包括连续值和离散值。
2) 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点有:
1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
六、应用场景
GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。
七、sklearn参数
- 划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
- 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
- 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
- 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
5)叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。 - 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
- 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
转:http://www.cnblogs.com/pinard/p/6143927.html
参考 :统计学习方法