基本流程
自适应提升(Adaptive Boosting,AdaBoost)算法,可作为一种从一系列弱分类器中产生一个强分类器的通用方法。
假设有一个集合 {(x1,y1),(x2,y2),…,(xN,yN)},xi 表示特征矢量;yi 表示对应分类为 {−1,1} 的标签。
AdaBoost 算法通过 M 次迭代得到若干个弱分类器 {k1,k2,…,kM},对于每个样本,弱分类器都会给出分类结果 km(xi)∈{−1,1}。
将 M 个弱分类器进行某种线性组合,得到一个强分类器 Cm。
进行第 m−1 次迭代后,线性组合得到的强分类器为:
Cm−1(xi)=α1k1(xi)+α2k2(xi)+⋯+αm−1km−1(xi)(1)
- αi 为权值,m>1。
进行第 m 次迭代时,AdaBoost通过增加一个弱分类器的方式扩展成一个强分类器:
Cmxi=Cm−1(xi)+αmkm(xi)(2)
定义误差 E,判断 Cm 和 Cm−1 的性能,当 Cm 比 Cm−1 的效果强才有意义。误差用所有样本 xi 的指数损失的总和定义:
E=i=1∑Ne−yiCm(xi)=i=1∑Ne−yi(Cm−1(xi)+αmkm(xi))(3)
令 wi(m) 表示在第 m−1 次迭代后,对训练样本 xi 所分配的权重。
- wi(1)=1,wi(m)=e−yiCm−1(xi)
E=i=1∑Nwi(m)e−yiαmkm(xi)(4)
将上式拆成:
E=yi=km(xi)∑wi(m)e−αm+yi=km(xi)∑wi(m)eαm(5)
- 若 yi=km(xi),则分类结果与实际相符,无论都为 −1 还是 1,乘积为 1。
- 若 yi=km(xi),则分类结果与实际不符,乘积为 −1。
根据对所有 yi=km(xi) 的数据项 xi 的误差求和,对所有 yi=km(xi) 的数据项 xi 的误差求和,再改写成:
E=yi=km(xi)∑wi(m)e−αm+yi=km(xi)∑wi(m)eαm=i=1∑Nwi(m)e−αm+yi=km(xi)∑wi(m)(eαm−e−αm)(6)
可以看出,如果 αm 一定,强分类器 Cm 的误差大小完全取决于第二项中 ∑yi=km(xi)wi(m) 的大小,即取决于这次迭代中被错分类的权值 wi(m) 的大小。
对式5进行求导:
dαmdE=yi=km(xi)∑wi(m)eαm−yi=km(xi)∑wi(m)e−αm(7)
令导数为0,得到权值 αm:
αm=21ln(∑yi=km(xi)wi(m)∑yi=km(xi)wi(m))(8)
令 ϵm 表示误差率:
ϵm=∑i=1Nwi(m)∑yi=km(xi)wi(m)(9)
则 αm 写成:
αm=21ln(ϵm1−ϵ)(10)
得到 AdaBoost 算法:每次迭代中,选择使 ∑yi=km(xi)wi(m) 最小的分类器 km,得到误差率 ϵm,从而计算权值 αm,则最终强分类器由 Cm−1 逐渐提升为 Cm=Cm−1+αmkm。
每次迭代后,得到每个训练样本数据权值 wi(m+1) 为:
wi(m+1)=wi(m)e−yiαmkm(xi)=wi(m)×{e−αm,eαm,分类正确分类错误(11)
AdaBoost的计算步骤:
- 设有 n 个样本 x1,…,xn,分类为 y1,…,yn,yi∈{−1,1}。
- 初始化每个样本的权值 w1(1),…,wn(1),都为 n1。
- 进行迭代:m=1,…,M。
- 找到使得错误率 ϵm 最小的弱分类器 km(x),并得到 ϵm(见式9)。
- 计算 km(x) 的权值 αm(见式10)。
- 得到新的强分类器 Cm(x)(见式2)。
- 更新每个样本的权值 wi(m+1)(见式11)。
- 对权值 wi(m+1) 进行归一化,使 ∑iwi(m+1)=1。
- 得到最终的强分类器:
C(x)=sign(CM(x))=sign(i=1∑Mαmkm(x))(12)
AdaBoost 算法可分为 Discrete AdaBoost、Real AdaBoost、LogitBoost 和 Gentle AdaBoost。
- Discrete AdaBoost 的弱分类输出结果是 1 或 -1,组成强分类器时是离散的形式。
- Real AdaBoost的弱分类器输出结果是该样本属于某一类的概率。
上述讨论即为 Discrete AdaBoost 的迭代过程。
Real AdaBoost 的迭代过程:
- 基于每个样本的权值 wi(m),拟合一个分类概率估计 pm(x)=P(y=1∣x)∈[0,1],表示样本属于分类结果为1的概率。
- 得到这次迭代的弱分类器:km(x)=21ln(1−pm(x)pm(x))。
- 更新权值:wi(m+1)=wi(m)e−yikm(x)。
- 归一化权值。
最终强分类器 C 为:
C(x)=sign(i=1∑Mkm(x))(13)
LogitBoost 是逻辑回归技术在 AdaBoost 的应用。弱分类器的选取基于加权最小二乘法。
设迭代前强分类器 C0(x)=0,每个训练样本数据的概率估计 p0(xi)=0.5,迭代过程如下:
- 计算工作响应 zi(m):
zi(m)=pm−1(xi)[1−pm−1(xi)]yi∗−pm−1(xi)(14)
yi∗=2yi−1(15)
- 计算权值:
wi(m)=pm−1(xi)[1−pm−1(xi)](16)
-
应用权值 wi(m),基于 zi(m) 到 xi 的加权最小二乘回归法,拟合弱分类器 km(xi)。
-
更新 pm(xi)
pm(xi)=eCm−1(xi)+e−Cm−1(xi)eCm−1(xi)=1+e−2Cm−1(xi)1(17)
- 更新强分类器。
Cm(xi)=Cm−1(xi)+21km(xi)(18)
最终强分类器为式13。
Gentle AdaBoost 算法与 LogitBoost 算法相似,但参数选择更简单。弱分类器 km(x) 由基于权值 wi(m) 的从 yi 到 xi 的加权最小二乘法回归拟合得到。
每次迭代得到的强分类器 Cm(x) 和 权值:
Cm(xi)=Cm−1(xi)+km(xi)(19)
wi(m+1)=wi(m)e−yikm(xi)(20)
OpenCV提供的AdaBoost
OpenCV 实现了上述4种 AdaBoost,且弱分类器都采用 CART 决策树的方法。
使用决策树时:
αm=ln(ϵm1−ϵ)(21)
wi(m+1)=wi(m)×{1,eαm,分类正确分类错误(22)
OpenCV 的 ml
中提供了Boost
类,继承自 DTree
类。
类中有部分参数:
BoostType
:Boosting 算法的类型。
1 2 3 4 5 6 7 8 9 10
| enum Types { DISCRETE=0, REAL=1, LOGIT=2, GENTLE=3 };
int getBoostType(); void setBoostType(int val);
|
WeakCount
:弱分类器的数量,也是迭代次数。访问函数:
1 2
| int getWeakCount(); void setWeakCount(int val);
|
WeightTrimRate
:裁剪率,0~1,在迭代过程中,那些归一化后的样本权值 wi(m) 小于该裁剪率的样本将不进入下次迭代。访问函数:
1 2
| double getWeightTrimRate(); void setWeightTrimRate(double val);
|
例子-用户贷款违约预测
数据集地址:https://aistudio.baidu.com/datasetdetail/112664
数据集的属性如下:
- income:用户收入,较大数
- age:用户年龄
- experience_years:用户从业年限
- is_1:是否单身
- city:居住城市,抽象代号
- region:居住地区,抽象代号
- current_job_years:现任职位工作年数
- current_house_years:现居房屋居住年数
- house_ownership:房屋所有权,租用(1)、自有(2)、未有(0)
- car_ownership:是否拥有汽车
- profession:职业,抽象代号
- label:是否存在违约,即响应值
AdaBoost 分类效果如下:
1 2 3 4 5
| Train Data imported: 168000 Test Data imported: 84000 AdaBoost算法(基于OpenCV实现): 计算花费时长:31247ms 准确率:0.890024
|
代码地址:Gitee - AdaBoost