文章目录
1.adaboost算法
1.1 提升方法的基本思路
主要解决两个问题:
- 如何每一轮都改变训练数据的权值或概率分布;
- 如何将弱分类器组合成强分类器。
adaboost的做法是提高上一轮错误分类数据的权值,降低分类正确的样本的权值,起到“分而治之”的作用;对于第二个问题,adaboost采用加权多数表决的方法,加大分类误差小的弱分类器的权值,减小分类误差大的弱分类器的权值。
1.2 AdaBoost算法
-
给每个训练样本( x 1 , x 2 , … . , x N x_{1},x_{2},….,x_{N} x1,x2,….,xN)分配权重,初始权重 w 1 w_{1} w1均为1/N。
-
针对带有权值的样本进行训练,得到模型 G m G_m Gm(初始模型为G1)。
-
计算模型 G m G_m Gm的分类误差率 e m = ∑ i = 1 N w i I ( y i ̸ = G m ( x i ) ) e_m=\sum_{i=1}^Nw_iI(y_i\not= G_m(x_i)) em=∑i=1NwiI(yi̸=Gm(xi)),注: I ( x ) I(x) I(x) 是指示函数。
-
计算模型 G m G_m Gm的系数 α m = 0.5 log 1 − e m e m \alpha_m=0.5\log \frac{1-e_m}{e_m} αm=0.5logem1−em
-
根据误分率e和当前权重向量 w m w_m wm更新权重向量 w m + 1 w_{m+1} wm+1。
-
计算组合模型 f ( x ) = ∑ m = 1 M α m G m ( x i ) f(x)=\sum_{m=1}^M\alpha_mG_m(x_i) f(x)=∑m=1MαmGm(xi)的误分率。
-
当组合模型的误分率或迭代次数低于一定阈值,停止迭代;否则,回到步骤2。
1.3 很硬核的证明adaboost是前向分步算法。
学习的是加法模型,损失函数是指数损失函数。证明从略,我就当定理了。
2. 提升树
基函数是决策树的时候,当损失函数是均方误差或者根均方误差的时候,每一步优化很简单。
2.2 梯度提升
区别于平方损失函数和指数损失函数,对于一般的损失函数而言,使用grandient boosting算法,利用最速下降的近似方法,关键在于利用损失函数的负梯度在当前模型的值:
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
- [ \frac{\partial L (y,f(x_i))} {\partial f(x_i)}]_{f(x)=f_{m-1}(x)}
−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
3.几个数学计算
# 计算alpha
def _alpha(self, error):
return 0.5 * np.log((1-error)/error)
# 规范化因子
def _Z(self, weights, a, clf):
return sum([weights[i]*np.exp(-1*a*self.Y[i]*clf[i]) for i in range(self.M)])
# 权值更新
def _w(self, a, clf, Z):
"""
M是数据的行数,M,N=data.shape
"""
for i in range(self.M):
self.weights[i] = self.weights[i]*np.exp(-1*a*self.Y[i]*clf[i])/ Z
4.sklearn里面的adaboost函数
这里我直接借用官网的例子了,如下图:
官网连接直通车:
sklearn AdaBoostClassifier 0.21.2
sklearn AdaBoostRegressor 0.21.2
以上。