集成学习简单理解就是指采用多个分类器对数据集进行预测,从而提高整体分类器的泛化能力。
集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系。另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合。
1. Bagging
Bagging算法(Bootstrap aggregating,引导聚集算法),又称装袋算法,是机器学习领域的一种集成学习算法。
算法思想:
- For t = 1, 2, …, T Do
- 从数据集S中取样(放回选样)
- 训练得到模型 Ht H t
- 对未知样本
X
X
分类时,每个模型都得出一个分类,得票最高的即为未知样本
X
X
的分类;
对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干和弱学习器的输出进行平均得到最终的预测输出。
1.1随机森林
随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法
算法思想:
- 用来表示训练用例(样本)的个数, M M 表示特征数目。
- 输入特征数目,用于确定决策树上一个节点的决策结果;其中 m m 应远小于。
- 从 N N 个训练用例(样本)中以有放回抽样的方式,取样次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
- 对于每一个节点,随机选择 m m 个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这个特征,计算其最佳的分裂方式。
- 每棵树都会完整成长而不会剪枝(Pruning,这有可能在建完一棵正常树状分类器后会被采用)
2.Boosting
2.1 Adaboost
AdaBoost,是英文”Adaptive Boosting”(自适应增强)的缩写。AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法对于噪声数据和异常数据很敏感。但在一些问题中,AdaBoost方法相对于大多数其它学习算法而言,不会很容易出现过拟合现象。AdaBoost方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。而错误率高于随机分类器的弱分类器也是有用的,因为在最终得到的多个分类器的线性组合中,可以给它们赋予负系数,同样也能提升分类效果。
AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上
步骤:
假设有
n
n
个样本,,
x
x
是特征向量, 是标签
1. 初始化样本
D:{(x1,y1),(x2,y2),...,(xn,yn)}
D
:
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
}
,
x
x
,(最大循环次数),样本分布
Wk(i)=1/n,i=1,...,n
W
k
(
i
)
=
1
/
n
,
i
=
1
,
.
.
.
,
n
2.
k=0
k
=
0
3.
do
d
o
k←k+1
k
←
k
+
1
4. 训练使用按照
Wk(i)
W
k
(
i
)
采样的
D
D
的弱分类器
5.
Ek
E
k
←计算弱分类器
Ck
C
k
的训练误差, 如果
Ek>0.5
E
k
>
0.5
, 则continue
6.
αk←12ln1−EkEk
α
k
←
1
2
ln
1
−
E
k
E
k
, 这里
αk
α
k
就是该分类器的权重
7. 改变样本的分布,提高错分样本的概率,降低正确分类样本的概率
Wk+1(i)←Wk(i)Zk×{e−αk,eαk,if hk(xi)=yiif hk(xi)≠yi
W
k
+
1
(
i
)
←
W
k
(
i
)
Z
k
×
{
e
−
α
k
,
if
h
k
(
x
i
)
=
y
i
e
α
k
,
if
h
k
(
x
i
)
≠
y
i
8.
until
u
n
t
i
l
k=kmax
k
=
k
m
a
x
9.
return
r
e
t
u
r
n
Ck
C
k
和
αk
α
k
,
k=1,...,kmax
k
=
1
,
.
.
.
,
k
m
a
x
(带权值分类器的总体)
10.
end
e
n
d
2.2 Gradient Boosting
2.2.1 Boosting Tree
首先,提升树模型其实就是决策树的加法模型,表现为
fM(x)=∑Mm=1T(x;θm) f M ( x ) = ∑ m = 1 M T ( x ; θ m )
其中, T(x;θm) T ( x ; θ m ) 表示决策树, θm θ m 为树的参数, M为树的个数 M 为 树 的 个 数
回归提升树的分布算法如下:
f0(x)=0 f 0 ( x ) = 0
fm(x)=fm−1(x)+T(x;θm),m=1,2,3,...,M f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) , m = 1 , 2 , 3 , . . . , M
fM(x)=∑Mm=1T(x;θm) f M ( x ) = ∑ m = 1 M T ( x ; θ m )
给定当前模型 fm−1(x) f m − 1 ( x ) ,需要求解第 m m 颗树的参数:
N N 代表总共有个样本。 通过上式,从而得到 θ̂ m θ ^ m , 即第 m m 颗树的参数
如果使用平方误差损失函数,其损失变为
L(yi,fm−1(xi)+T(xi;θm)) L ( y i , f m − 1 ( x i ) + T ( x i ; θ m ) )
=(yi−fm−1(xi)−T(xi;θm))2 = ( y i − f m − 1 ( x i ) − T ( x i ; θ m ) ) 2
=(r−T(xi,θm))2 = ( r − T ( x i , θ m ) ) 2
其中,
r=y−fm−1(x)
r
=
y
−
f
m
−
1
(
x
)
, 即残差,可以理解为是当前模型
fm−1(x)和真是样本之间的误差
f
m
−
1
(
x
)
和
真
是
样
本
之
间
的
误
差
所以,对于回归问题的Boosting Tree来说,每一步只需要拟合当前模型的残差即可。
2.2.2 GBDT(Gradient Boosting Decision Tree)
boosting Tree 提升树利用加法模型实现优化过程时,当损失函数是平方损失函数时,每一步的优化很简单。但对于一般损失函数而言,往往每一步的优化没那么简单,所以引入了梯度提升(Gradient Boosting)算法。
GBDT的目标函数
对于普通的机器学习模型而言,其目标函数可以定义为如下:
obj:∑ni=1l(yi,ŷ i)+∑Kk=1Ω(fk) o b j : ∑ i = 1 n l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k )
其中
n
n
代表有个样本。前面一项是loss函数, 后面一项是正则项。
综合上述加法模型的计算过程,在第
t
t
步,其目标函数是:
=∑ni=1l(yi,ŷ t−1i+ft(xi))+Ω(ft)+constant = ∑ i = 1 n l ( y i , y ^ i t − 1 + f t ( x i ) ) + Ω ( f t ) + c o n s t a n t
此时,优化该目标函数,就能得到 ft(xi) f t ( x i )
负梯度的理论支撑
前面第提到Gradient Boosting时,提及Gradient Boosting以负梯度代替残差来求解基函数,实际上,负梯度的理论支撑则是泰勒公式的一阶展开。即
f(x+Δx)=f(x)+f′(x)Δx f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x
对于在第
t
t
步的目标函数,对做一阶泰勒展开,其中\hat{y}_i^{t-1}相当于泰勒上述公式的
x
x
, 而相当于是
Δx
Δ
x
,我们展开得到:
l(yi,ŷ t−1i+ft(xi))=l(yi,ŷ t−1i)+gift(xi) l ( y i , y ^ i t − 1 + f t ( x i ) ) = l ( y i , y ^ i t − 1 ) + g i f t ( x i )
其中,
gi
g
i
是
l(yi,ŷ t−1i)
l
(
y
i
,
y
^
i
t
−
1
)
关于
ŷ t−1i
y
^
i
t
−
1
的一阶导数
此时,目标函数(不考虑正则项)变成:
obj(t):∑ni=1l(yi,ŷ ti)=∑ni=1l(yi,ŷ t−1i)+gift(xi) o b j ( t ) : ∑ i = 1 n l ( y i , y ^ i t ) = ∑ i = 1 n l ( y i , y ^ i t − 1 ) + g i f t ( x i )
obj(t−1):∑ni=1l(yi,ŷ t−1i) o b j ( t − 1 ) : ∑ i = 1 n l ( y i , y ^ i t − 1 )
我们肯定希望目标函数每步的loss都减小的,即 Obj(t)<Obj(t−1) O b j ( t ) < O b j ( t − 1 ) ,那么关键就在于 gift(xi) g i f t ( x i ) 这一项了。因为我们不知道到底是正还是负,那么只需让 ft(xi)=−αigi f t ( x i ) = − α i g i ( α α 是我们任取的一个正系数)就能 gift(xi) g i f t ( x i ) 让一直恒为负了。