1 模型介绍

1.1 集成学习概述

集成学习通过构建并结合多个学习器来完成学习任务。对于训练集数据,我们通过训练若干个个体学习器,通过一定的结合策略,最终可以形成一个强学习器,以达到博采众长的目的。即如下图:

结合策略
个体学习器1
强学习器
个体学习器2
个体学习器T

集成学习需要解决两个主要的问题:
1 个体学习器如何获得;
2 如何选择个体学习器的结合策略。
目前个体学习器的选择有两种方式,第一种是所有的个体学习器都是一个种类的,或者说是同质的,比如都是决策树、神经网络;第二种是所有的个体学习器不全是一个种类的,或者说是异质的。比如个体学习器包含有支持向量机、逻辑回归、朴素贝叶斯。
目前,同质个体学习器的应用是最广泛的,一般我们常说的集成学习的方法都是指同质个体学习器,在同质个体学习器中使用最多的模型是 CART 决策树和神经网络。同质个体学习器按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是 boosting 系列算法,比较著名的算法主要有 AdaBoost 算法和梯度提升树(GBDT);第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是 bagging 和随机森林(Random Forest)系列算法。 boosting 与 bagging 的算法原理可以参考这篇文章。

1.2 集成学习的组合策略

1.2.1 平均法

对数值型输出 G i ( x ) G_i(x) Gi​(x) 来说,最常见的结合策略是平均法,即输出 K K K 个训练器的平均值。
1 简单平均法

G ( x ) = 1 K ∑ i = 1 K G i ( x ) G(x)=\dfrac{1}{K}\sum_{i=1}^KG_i(x) G(x)=K1​i=1∑K​Gi​(x)

2 加权平均法

G ( x ) = ∑ i = 1 K w i G i ( x ) G(x)=\sum_{i=1}^Kw_iG_i(x) G(x)=i=1∑K​wi​Gi​(x)
其中 w i w_i wi​ 是个体学习器 G i ( x ) G_i(x) Gi​(x) 的权重,通常有 w i ≥ 0 , ∑ i = 1 T w i = 1 w_i \geq0,\sum_{i=1}^T{w_i}=1 wi​≥0,∑i=1T​wi​=1

1.2.2 投票法

分类问题常用投票法的结合策略,假设预测类别为 { c 1 , c 2 , . . . , c K } \{c_1,c_2,...,c_K\} {c1​,c2​,...,cK​},对于任意一个预测样本 x x x, K K K 个弱分类器的预测结果为 { G 1 ( x ) , G 2 ( x ) , . . . , G K ( x ) } \{G_1(x),G_2(x),...,G_K(x)\} {G1​(x),G2​(x),...,GK​(x)}。
1 绝对多数投票法
常说的票数过半,即不止要求 K K K 个弱分类器预测的类别票数最高,还要求票数过半。否则,拒绝预测。
2 相对多数投票法
少数服从多数原则,即选择 K K K 个弱分类器预测的类别票数最高的预测类别,如果不止一个类别获得最高票,则随机选择一个做最终类别。
3 加权投票法
与加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。

1.2.3 学习法

当训练数据较多时,一种更为强大的结合策略是使用"学习法",即通过另一个学习器来进行结合。其中比较著名的方法是 Stacking,即将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果,我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器。在该方法下将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。

1.3 Adaboost 算法的介绍

Adaboost 算法可以理解成模型为加法模型、损失函数为指数函数、学习算法为前向分步学习算法的分类问题。即需要解决如下 3 个问题:

  • 如何计算学习误差率
  • 如何得到弱学习器权重系数
  • 如何更新样本权重

假设训练样本为:

T = { { x 1 , y 1 } , { x 2 , y 2 } , . . . , { x m , y m } } T=\{\{x_1,y_1\},\{x_2,y_2\},...,\{x_m,y_m\}\} T={{x1​,y1​},{x2​,y2​},...,{xm​,ym​}}

Adaboost 算法的加法模型可以表示成如下形式:

f ( x ) = ∑ k = 1 K α k G k ( x ) f(x)=\sum_{k=1}^K\alpha_kG_k(x) f(x)=k=1∑K​αk​Gk​(x)

则最终的强分类器可以如下:

G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ k = 1 K α k G k ( x ) ) G(x)=sign(f(x))=sign(\sum_{k=1}^K\alpha_kG_k(x)) G(x)=sign(f(x))=sign(k=1∑K​αk​Gk​(x))

若第 k k k 个弱学习器的输出权重为

D ( k ) = { w k 1 , w k 2 , . . . , w k m } D(k)=\{w_{k1},w_{k2},...,w_{km}\} D(k)={wk1​,wk2​,...,wkm​}

对初始的弱分类器则有: w 1 i = 1 m , i = 1 , 2 , . . . , m w_{1i}=\frac{1}{m},i=1,2,...,m w1i​=m1​,i=1,2,...,m 。

由于多元分类是二元分类问题的推广,接下来以二元分类为例进行说明,输出为 { 1 , − 1 } \{1,-1\} {1,−1},则第 k k k 个弱分类器 G k ( x ) G_k(x) Gk​(x) 在训练集上的加权误差率为

e k = P ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i I ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i ∑ y i ≠ G k ( x ) w k i ∑ i = 1 m w k i e_k=P(G_k(x_i)\neq y_i)=\sum_{i=1}^m{w_{ki}}I(G_k(x_i)\neq y_i)=\sum_{i=1}^m{w_{ki}}\dfrac{\sum_{y_i\neq G_k(x)}w_{ki}}{\sum_{i=1}^mw_{ki}} ek​=P(Gk​(xi​)̸​=yi​)=i=1∑m​wki​I(Gk​(xi​)̸​=yi​)=i=1∑m​wki​∑i=1m​wki​∑yi​̸​=Gk​(x)​wki​​

第 k + 1 k+1 k+1 个权重的更新公式如下:

w k + 1 , i = w k i Z k e x p ( − α k y i G k ( x i ) ) w_{k+1,i}=\frac{w_{ki}}{Z_k}exp(-\alpha_ky_iG_k(x_i)) wk+1,i​=Zk​wki​​exp(−αk​yi​Gk​(xi​))

令: Z k = ∑ i = 1 m w k i e x p ( − α k y i G k ( x i ) ) Z_k=\sum_{i=1}^m{w_{ki}}exp(-\alpha_ky_iG_k(x_i)) Zk​=i=1∑m​wki​exp(−αk​yi​Gk​(xi​))

因为 w w w 更新之后和不为1,需要 Z k Z_k Zk​ 对其进行调整,称为归一化因子。

则:
y i G k ( x i ) = ± 1 y_iG_k(x_i)=\pm1 yi​Gk​(xi​)=±1

w k + 1 , i = { w k i Z k e x p − α k , G k ( x i ) = y i w k i Z k e x p α k , G k ( x i ) ≠ y i w_{k+1,i}=\left\{\begin{array}{} \dfrac{w_{ki}}{Z_k}exp^{-\alpha_k}, & G_k(x_i)=y_i\\ \\ \dfrac{w_{ki}}{Z_k}exp^{\alpha_k}, & G_k(x_i)\neq y_i \end{array}\right. wk+1,i​=⎩⎪⎪⎨⎪⎪⎧​Zk​wki​​exp−αk​,Zk​wki​​expαk​,​Gk​(xi​)=yi​Gk​(xi​)̸​=yi​​

接下来推导各弱分类器的占比 α \alpha α 及各样本权重 w w w 。
已知 Adaboost 的损失函数为指数函数、学习算法为前向分步学习,则第 k − 1 k-1 k−1 轮的强学习器为

f k − 1 ( x ) = ∑ i = 1 k − 1 α i G i ( x ) f_{k-1}(x)=\sum_{i=1}^{k-1}\alpha_iG_i(x) fk−1​(x)=i=1∑k−1​αi​Gi​(x)

第 k k k 轮的强学习器为
f k ( x ) = ∑ i = 1 k α i G i ( x ) ⟹ f_{k}(x)=\sum_{i=1}^{k}\alpha_iG_i(x)\Longrightarrow fk​(x)=i=1∑k​αi​Gi​(x)⟹

f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_{k}(x)=f_{k-1}(x)+\alpha_kG_k(x) fk​(x)=fk−1​(x)+αk​Gk​(x)

则第 k k k 轮强学习器的损失函数为

L o s s = ∑ i = 1 m e x p ( − y i f k ( x i ) ) = ∑ i = 1 m e x p ( − y i ( f k − 1 ( x i ) + α k G k ( x i ) ) ) Loss=\sum_{i=1}^mexp(-y_if_k(x_i))=\sum_{i=1}^mexp(-y_i(f_{k-1}(x_i)+\alpha_kG_k(x_i))) Loss=i=1∑m​exp(−yi​fk​(xi​))=i=1∑m​exp(−yi​(fk−1​(xi​)+αk​Gk​(xi​)))

令:

w k i = ∑ i = 1 m e x p ( − y i f k − 1 ( x i ) ) w_{ki}=\sum_{i=1}^mexp(-y_if_{k-1}(x_i)) wki​=i=1∑m​exp(−yi​fk−1​(xi​))

则

L o s s = ∑ i = 1 m e x p ( − y i ( f k − 1 ( x i ) + α k G k ( x i ) ) ) = ∑ i = 1 m w k i e x p ( − y i α k G k ( x i ) ) ) ⟹ Loss=\sum_{i=1}^mexp(-y_i(f_{k-1}(x_i)+\alpha_kG_k(x_i)))=\sum_{i=1}^mw_{ki}exp(-y_i\alpha_kG_k(x_i)))\Longrightarrow Loss=i=1∑m​exp(−yi​(fk−1​(xi​)+αk​Gk​(xi​)))=i=1∑m​wki​exp(−yi​αk​Gk​(xi​)))⟹

L o s s = ∑ y i = G k ( x ) w k i e x p ( − α k ) + ∑ y i ≠ G k ( x ) w k i e x p ( α k ) ⟹ Loss=\sum_{y_i=G_k(x)}w_{ki}exp(-\alpha_k)+\sum_{y_i\neq G_k(x)}w_{ki}exp(\alpha_k)\Longrightarrow Loss=yi​=Gk​(x)∑​wki​exp(−αk​)+yi​̸​=Gk​(x)∑​wki​exp(αk​)⟹

L o s s = ∑ i = 1 m w k i ( ∑ y i = G k ( x ) w k i ∑ i = 1 m w k i e x p ( − α k ) + ∑ y i ≠ G k ( x ) w k i ∑ i = 1 m w k i e x p ( α k ) ) Loss=\sum_{i=1}^mw_{ki}(\dfrac{\sum_{y_i=G_k(x)}w_{ki}}{\sum_{i=1}^mw_{ki}}exp(-\alpha_k)+\dfrac{\sum_{y_i\neq G_k(x)}w_{ki}}{\sum_{i=1}^mw_{ki}}exp(\alpha_k)) Loss=i=1∑m​wki​(∑i=1m​wki​∑yi​=Gk​(x)​wki​​exp(−αk​)+∑i=1m​wki​∑yi​̸​=Gk​(x)​wki​​exp(αk​))

又因为:

e k = ∑ i = 1 m w k i ∑ y i ≠ G k ( x ) w k i ∑ i = 1 m w k i e_k=\sum_{i=1}^m{w_{ki}}\dfrac{\sum_{y_i\neq G_k(x)}w_{ki}}{\sum_{i=1}^mw_{ki}} ek​=i=1∑m​wki​∑i=1m​wki​∑yi​̸​=Gk​(x)​wki​​

损失函数 Loss 进一步可以转化为

L o s s = ( 1 − e k ) e x p ( − α k ) + e k e x p ( α k ) Loss=(1-e_k)exp(-\alpha_k)+e_kexp(\alpha_k) Loss=(1−ek​)exp(−αk​)+ek​exp(αk​)

令 :
∂ L o s s ∂ α k = 0 ⟹ \frac{\partial Loss}{\partial \alpha_k}=0\Longrightarrow ∂αk​∂Loss​=0⟹

α k = 1 2 l o g 1 − e k e k \alpha_k=\dfrac{1}{2}log\dfrac{1-e_k}{e_k} αk​=21​logek​1−ek​​

AdaBoost 的算法流程如下:
样本集、输出均按照上文的假设,迭代次数为 K K K

  • 1 初始化样本权重

D ( 1 ) = { w 11 , w 12 , . . . , w 1 m } ; w 1 i = 1 m , i = 1 , 2 , . . . , m D(1)=\{w_{11},w_{12},...,w_{1m}\}; w_{1i}=\frac{1}{m},i=1,2,...,m D(1)={w11​,w12​,...,w1m​};w1i​=m1​,i=1,2,...,m

  • 2 对于 k = 1 , 2 , ⋅ ⋅ ⋅ , K k=1,2,\cdot\cdot\cdot,K k=1,2,⋅⋅⋅,K
    a) 使用具有权值分布 D k D_k Dk​ 的训练数据集进行学习,得到弱分类器 G k ( x ) G_k(x) Gk​(x)
    b) 计算 G k ( x ) G_k(x) Gk​(x) 在训练集上的误差率:
    e k = P ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i I ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i ∑ y i ≠ G k ( x ) w k i ∑ i = 1 m w k i e_k=P(G_k(x_i)\neq y_i)=\sum_{i=1}^m{w_{ki}}I(G_k(x_i)\neq y_i)=\sum_{i=1}^m{w_{ki}}\dfrac{\sum_{y_i\neq G_k(x)}w_{ki}}{\sum_{i=1}^mw_{ki}} ek​=P(Gk​(xi​)̸​=yi​)=i=1∑m​wki​I(Gk​(xi​)̸​=yi​)=i=1∑m​wki​∑i=1m​wki​∑yi​̸​=Gk​(x)​wki​​
    c) 计算弱分类器 G k ( x ) G_k(x) Gk​(x) 的系数 α k \alpha_k αk​:
    α k = 1 2 l o g 1 − e k e k \alpha_k=\dfrac{1}{2}log\dfrac{1-e_k}{e_k} αk​=21​logek​1−ek​​
    d) 更新训练数据集的权重 w w w:

w k + 1 , i = w k i Z k e x p ( − α k y i G k ( x i ) ) w_{k+1,i}=\frac{w_{ki}}{Z_k}exp(-\alpha_ky_iG_k(x_i)) wk+1,i​=Zk​wki​​exp(−αk​yi​Gk​(xi​))

  • 3 构建最终分类器:

G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ k = 1 K α k G k ( x ) ) G(x)=sign(f(x))=sign(\sum_{k=1}^K\alpha_kG_k(x)) G(x)=sign(f(x))=sign(k=1∑K​αk​Gk​(x))

理论上任何学习器都可以作为 Adaboost 的弱学习器。目前,使用最广泛的 Adaboost 弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了 CART 分类树,而 Adaboost 回归用了 CART 回归树。

2 sklearn中的实现

sklearn 中 AdaBoost 分为两类,即用于分类的 AdaBoostClassifier ,其实现的算法有 SAMME 和 SAMME.R ;用于回归的 AdaBoostRegressor ,其实现的算法为 Adaboost.R2 。依据上述对 Adaboost 算法原理的介绍,主要对 Adaboost 的框架和弱分类器进行调参。下面以 AdaBoostClassifier 的参数为例进行说明。

class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)

参数说明:

  • base_estimator:可选参数,默认为 DecisionTreeClassifier。一般常用的是 CART 决策树或神经网络。默认是决策树,即 AdaBoostClassifier 默认使用 CART 分类树 DecisionTreeClassifier,而 AdaBoostRegressor 默认使用 CART 回归树 DecisionTreeRegressor。若我们选择的 AdaBoostClassifier 算法是 SAMME.R,则弱分类学习器还需要支持概率预测,也就是在 scikit-learn 中弱分类学习器对应的预测方法除了 predict 还需要有 predict_proba。
  • algorithm:可选参数,默认为 SAMME.R。SAMME 与 SAMME.R 的主要区别是弱学习器权重的度量,SAMME 使用对样本集分类效果作为弱学习器权重,而 SAMME.R 使用了对样本集分类的预测概率大小来作为弱学习器权重。由于 SAMME.R 使用了概率度量的连续值,迭代一般比 SAMME 快,因此 AdaBoostClassifier的默认算法 algorithm 的值也是 SAMME.R 。我们一般使用默认的 SAMME.R 就够了,但是要注意的是使用了 SAMME.R, 则弱分类学习器参数 base_estimator 必须限制使用支持概率预测的分类器。SAMME 算法则没有这个限制。
  • n_estimators:整数型,可选参数,默认为 50。弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说 n_estimators 太小,容易欠拟合,n_estimators 太大,又容易过拟合,一般选择一个适中的数值。默认是 50。在实际调参的过程中,我们常常将 n_estimators 和下面介绍的参数 learning_rate 一起考虑。
  • learning_rate:浮点型,可选参数,默认为 1.0。每个弱学习器的权重缩减系数步长,取值范围为 0 到 1,对于同样的训练集拟合效果,较小的步长意味着需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数 n_estimators 和 learning_rate 要一起调参。一般来说,可以从一个小一点的步长开始调参。
  • random_state:随机数,可选参数,默认为 None。

AdaBoostClassifier 算法与 sklearn 中其他算法的调用方法类似,本文以 iris 数据集为例进行说明:

from sklearn.datasets import load_iris 
from sklearn.model_selection import train_test_split 
from sklearn.model_selection import cross_val_score #交叉验证
from sklearn.ensemble import AdaBoostClassifier

iris = load_iris() 
iris_data = iris.data # 数据集 
iris_labels = iris.target # 对应的分类标签
 
# 使用train_test_split对数据集按比例进行随机抽取,本文按37开进行抽取 
X_train, X_test, Y_train, Y_test = train_test_split(iris_data, iris_labels, test_size=0.3, random_state=0) 

# 定义分类器对象 
AdaBoost = AdaBoostClassifier(n_estimators=100)

# 调用所定义的分类器的训练方法,主要接收两个参数:训练数据集及训练标签 
AdaBoost.fit(X_train,Y_train) 

#调用该对象的测试方法,主要接收一个参数:测试数据集 
Y_predict = AdaBoost.predict(X_test) 

#计算各测试样本属于不同类的概率预测值 
probility = AdaBoost.predict_proba(X_test) # 算法为 SAMME.R

# 调用打分方法,计算模型在测试集上的准确率 
score = AdaBoost.score(X_test,Y_test)

# 使用交叉验证进行训练
scores = cross_val_score(AdaBoost, iris_data, iris_labels) #模型 数据集 目标值
scores.mean()
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐