本章内容
- 如何理解AdaBoost基本原理?(理论)
- 如何使用sklearn.ensemble.AdaBoostRegressor/AdaBoostClassifier参数?(案例:手写数据集)
- 如何理解Adaboost回归的数学求解流程?(附:流程示意图)
Adaboost原理
这个过程加重“难以被分类正确的样本”的权重,同时降低“容易被分类正确的样本”的权重,而将后续要建立的弱评估器的注意力引导到难以被分类正确的样本上。
AdaBoost两种类的代码:分类和回归
参数 | 参数含义 |
---|---|
base_estimator | 弱评估器 |
n_estimators | 集成算法中弱评估器的数量 |
learning_rate | 迭代中所使用的学习率 |
algorithm(分类器专属) | 用于指定分类ADB中使用的具体实现方法 |
loss(回归器专属) | 用于指定回归ADB中使用的损失函数 |
random_state | 用于控制每次建树之前随机抽样过程的随机数种子 |
base_estimator简介
案例:base_estimator设定与属性查看
from sklearn.ensemble import AdaBoostClassifier as ABC
from sklearn.ensemble import AdaBoostRegressor as ABR
model_c=ABC(n_estimators=3).fit(X_c,y_c)
model_r=ABR(n_estimators=3).fit(X_g,y_g)
model_c.base_estimator_
model_r.base_estimator_
model_c.estimators_
model_r.estimators_
自建弱评估器
from sklearn.tree import DecisionTreeClassifier as DTC
base_estimator=DTC(max_depth=10,max_features=30,random_state=7)
model=ABC(base_estimator=base_estimator
,n_estimators=3).fit(X_c,y_c)
model.base_estimator_
model.estimators_
注意:为了保证集成算法中的树不一致,AdaBoost会默认消除我们填写在弱评估器中的random_state。
学习率的特点
学习率
Boosting集成算法输出公式如下:
H ( x i ) = ∑ t = 1 T ϕ t f t ( x i ) H(x_i) = \displaystyle \sum_{t=1}^T\phi_tf_t(x_i) H(xi)=t=1∑Tϕtft(xi)
其中, ϕ t \phi_t ϕt为第t棵树的权重。对于第 t t t次迭代来说,则有:
H t ( x i ) = H t − 1 ( x i ) + ϕ t f t ( x i ) H_t(x_i) = H_{t-1}(x_i) + \phi_tf_t(x_i) Ht(xi)=Ht−1(xi)+ϕtft(xi)
在这个一般过程中,每次将本轮建好的决策树加入之前的建树结果时,可以在权重 ϕ \phi ϕ前面增加参数 η \color{red}\eta η,表示为第t棵树加入整体集成算法时的学习率,对标参数learning_rate。
H t ( x i ) = H t − 1 ( x i ) + η ϕ t f t ( x i ) H_t(x_i) = H_{t-1}(x_i) + \boldsymbol{\color{red}\eta} \phi_tf_t(x_i) Ht(xi)=Ht−1(xi)+ηϕtft(xi)
algorithm特点
二分类指数损失
L ( H ( x ) , y ) = e − y H ∗ ( x ) L(H(x),y) = e^{-yH^*(x)} L(H(x),y)=e−yH∗(x)
其中 y y y为真实分类, H ( x ) H^(x) H(x)*则是从集成算法输出的概率结果 H ( x ) H(x) H(x)转换来的向量。
转换规则如下:
H ∗ ( x ) = { 1 i f H ( x ) > 0.5 − 1 i f H ( x ) < 0.5 H^*(x)= \begin{cases} 1& if \ H(x)>0.5 \\ -1& if\ H(x) < 0.5 \end{cases} H∗(x)={1−1if H(x)>0.5if H(x)<0.5
多分类指数损失
L ( H ( x ) , y ) = e x p ( − 1 K y ∗ ⋅ H ∗ ( x ) ) = e x p ( − 1 K ( y ∗ 1 H ∗ 1 ( x ) + y ∗ 2 H ∗ 2 ( x ) + . . . + y ∗ k H ∗ k ( x ) ) ) \begin{aligned} L(H(x),y) &=exp \left( -\frac{1}{K}\boldsymbol{y^* · H^*(x)} \right) \\ & = exp \left( -\frac{1}{K}(y^{*1}H^{*1}(x)+y^{*2}H^{*2}(x) \ + \ ... + y^{*k}H^{*k}(x)) \right)\end{aligned} L(H(x),y)=exp(−K1y∗⋅H∗(x))=exp(−K1(y∗1H∗1(x)+y∗2H∗2(x) + ...+y∗kH∗k(x)))
其中, K K K为总类别数,如四分类时, K = 4 K=4 K=4; y ∗ \boldsymbol{y^*} y∗ ∗ H ∗ ( x ) *\boldsymbol{H^*(x)} ∗H∗(x)是*多分类具体情况、以及集成算法实际输出 H ( x ) H(x) H(x)转化出的向量,其中 y ∗ 1 y^{*1} y∗1与 H ∗ 1 ( x ) H^{*1}(x) H∗1(x)的上标1都表示当前类别。
根据概率转换公式,可得:
H ∗ ( x ) = { 1 i f k = a r g m a x H ( x ) − 1 K − 1 i f k ≠ a r g m a x H ( x ) H^*(x)= \begin{cases} 1& if \ k = argmaxH(x) \\ -\frac{1}{K-1}& if\ k \neq argmaxH(x) \end{cases} H∗(x)={1−K−11if k=argmaxH(x)if k=argmaxH(x)
在softmax函数中,当预测值或真实值不等于 k k k时,赋予的向量值为0,而不是 − 1 K − 1 -\frac{1}{K-1} −K−11。
loss
参数可选三种损失函数,分别是"linear"(线性),“square”(平方),“exponential”(指数)
R2算法线性损失——
L i = ∣ H ( x i ) − y i ∣ D L_i = \frac{|H(x_i) - y_i|}{D} Li=D∣H(xi)−yi∣
R2算法平方损失——
L i = ∣ H ( x i ) − y i ∣ 2 D 2 L_i = \frac{|H(x_i) - y_i|^2}{D^2} Li=D2∣H(xi)−yi∣2
R2算法指数损失——
L i = 1 − e x p ( − ∣ H ( x i ) − y i ∣ D ) L_i = 1 - exp \left( \frac{-|H(x_i) - y_i|}{D} \right) Li=1−exp(D−∣H(xi)−yi∣)
其中 D = s u p ∣ H ( x i ) − y i ∣ , i = 1 , 2 , . . . , N D = sup|H(x_i) - y_i|, i = 1,2,...,N D=sup∣H(xi)−yi∣,i=1,2,...,N,为1~N号样本中真实值与预测值差距最大的那一组差异。
y i y_i yi 为真实标签, H ( x i ) H(x_i) H(xi) 为预测标签,sup表示“取最大值”(数学中,max需要元素固定的数值,sup中的元素可以是表达式)。
由于损失的分母限定为最大差异D,所以损失必然为小于1的数,用这个限定来方便整个AdaBoost算法求解。
☑️ Boosting算法原理的相关基础问题
AdaBoost.R2特点
假设现有数据集N,含有样本 个,任意样本编号为 ,同时,弱评估器为决策树 ,总共学习 轮,则AdaBoost.R2的基本流程如下所示:
开始循环,for t in 1,2,…T:
在现有数据集 中,有放回抽样 个样本,构成训练集 N t N^t Nt 。在每次抽取一个样本时,任意样本被抽中的概率为 P i t = w i ∑ w i P^t_i=\frac{w_i}{∑w_i} Pit=∑wiwi ,很显然,该概率就是当前样本在训练集 N t N^t Nt 中的权重。当从初始权重中抽样时,概率 P i 1 = 1 M P_i^1 = \frac{1}{M} Pi1=M1 ,当后续权重变化时,拥有更大权重的样本被抽中的概率会更大。
在训练集 N t N^t Nt上按照CART树规则建立一棵回归树 f t f^t ft,训练时所拟合的标签为样本的真实标签 y i t y^t_i yit。
将 N t N^t Nt上所有的样本输入 f t f^t ft进行预测,得出预测结果 f t ( x i ) f^t(x_i) ft(xi),其中i = 1,2,…M
计算单一样本 i i i上的损失函数 L i t = L ( f t ( x i ) , y i ) L^t_i = L(f^t(x_i),y_i) Lit=L(ft(xi),yi)
计算全样本上的加权平均损失 L t ˉ = ∑ i = 1 M L i t P i t \bar{L^t} = \sum_{i=1}^ML_i^tP_i^t Ltˉ=∑i=1MLitPit
依据加权平均损失 L t ˉ \bar{L^t} Ltˉ计算衡量当前集成算法的置信度 β t = L t ˉ 1 − L t ˉ + λ \beta^t = \frac{\bar{L^t}}{1-\bar{L^t} + \lambda} βt=1−Ltˉ+λLtˉ
加权平均损失 L t ˉ \bar{L^t} Ltˉ越小, β t \beta^t βt越小,模型效果越好。
依据置信度评估 β t \beta_t βt更新样本权重, w i = w i β ( 1 − L i ) w_i = w_i\beta^{(1-L_i)} wi=wiβ(1−Li)
求解迭代过程中弱分类器 f t f^t ft所需的权重, ϕ t = l o g ( 1 β t ) \phi^t = log(\frac{1}{\beta^t}) ϕt=log(βt1)
求解出当前迭代 t t t下集成算法的输出值:
H t ( x i ) = H t − 1 ( x i ) + η ϕ t f t ( x i ) H^t(x_i) = H^{t-1}(x_i) + \eta \phi^t f^t(x_i) Ht(xi)=Ht−1(xi)+ηϕtft(xi)
AdaBoost的停止条件
( ∑ t : H t ( x ) ≤ y l o g 1 β t ) ≥ ( 1 2 ∑ t = 1 T l o g 1 β t ) \left(\sum_{t:H^t(x) \leq y} log\frac{1}{\beta^t} \right)\ \ \geq \ \ \left(\frac{1}{2}\sum_{t=1}^T log\frac{1}{\beta^t} \right) ⎝⎛t:Ht(x)≤y∑logβt1⎠⎞ ≥ (21t=1∑Tlogβt1)
当上式相等时, H t ( x ) H^t(x) Ht(x)停止迭代计算。