Boosting分类器

590 阅读4分钟

本文正在参加 人工智能创作者扶持计划

1、提升方法(Boosting)

1.1、相关知识

提升方法(Boosting),是一种可以用来减小监督式学习中偏差的机器学习算法。面对的问题是迈可·肯斯(Michael Kearns)提出的:一组“弱学习者”的集合能否生成一个“强学习者”?弱学习者一般是指一个分类器,它的结果只比随机分类好一点点;强学习者指分类器的结果非常接近真值。

在提升方法中,给每个训练元组一个权重。在迭代学习k个基分类器的过程中,学习得到分类器M_i之后,更新元组的权重。使其后的分类器更关注M_i误分类的训练元组。最终提升的分类器M^{*}组合每个分类器的表决,其中每个分类器投票的权重是其准确率的函数。

1.2 Boosting提出

提升方法是一个迭代的过程:

  • 通过改变样本分布,使得分类器聚集在那些很难分的样本上,对那些容易错分的数据加强学习,增加错分数据的权重
  • 这样错分的数据再下一轮的迭代就有更大的作用(对错分数据进行提升)。

预览大图

1.3 示例

假如我们现在有如下两种类别的数据:

image-20220605220939322

首选,学习了第一个线性分类器

预览大图

很明显,这个线性分类器存在数据被错分的情况,那么我们在学习第二个模型的时候,那么我们在第二个线性分类器中就要尽可能把第一个线性分类器中分错的数据要分对。

预览大图

生成第二个线性分类器:

预览大图

第二个线性分类器尽管把前面分错的数据分对了,但是又产生了新的错误数据。

预览大图

针对新的错误再学习生成一个分类器,再尽可能把错误的数据分对。

预览大图

这样我们就得到了三个基分类器,越往后的分类器越能关心疑难杂症,对很难分对的数据它能够分对,说明它的分类能力很强,因此给它更高的权重。

预览大图

2、AdaBoost算法

2.1 算法

Boosting算法之一:AdaBoost算法,算法步骤如下

预览大图

2.2 Adaboost例1

假设我们有如下数据训练样本,假设初始时样本权重相同

image-20220605221955271

可以看到,123789为同一类,4,5,6,10为同一类。

根据x>v和x<v来分类。

第一次迭代

第一次迭代: 以2.5为数据的分类界限,x<2.5时预测为正类,x>2,5时预测为负类

G1(x)={1,x<2.51,x>2.5G_1(x)=\left\{\begin{matrix} 1,x<2.5 \\ -1,x>2.5 \end{matrix}\right.

image-20220605222706792

我们发现有三条数据被越策错了。

G_1(x)误差:e_1=P(G_1(x_i)\ne y_i)= {\textstyle \sum_{G_1(x_i)\ne y_i}^{}W_{1i}}=0.1+0.1+0.1=0.3

G_1(x)权重:\alpha_1=\frac{1}{2}\ln_{}{\frac{1-e_1}{e_1} }= \frac{1}{2}\ln_{}{\frac{1-0.3}{0.3} }\approx 0.42365

分类函数:f_1(x)=\alpha_1G_1(x)=0.42365G_1(x)

根据错分的样本调整权值:

image-20220605224400843

w2i=w1iZ1exp(yiα1G1(xi))={0.10.9165exp([1×0.4236×1])i=1,2,30.10.9165exp([(1)×0.4236×(1)])i=4,5,6,100.10.9165exp([1×0.4236×(1)])i=7,8,9{0.07143i=1,2,30.07143i=4,5,6,100.16666i=7,8,9\begin{aligned} w_{2i}&=\frac{w_{1i}}{Z_1} exp(-y_i\alpha _1G_1(x_i))\\ &=\left\{\begin{matrix} \frac{0.1}{0.9165}exp(-[1\times 0.4236\times 1]) & i=1,2,3\\ \frac{0.1}{0.9165}exp(-[(-1)\times 0.4236\times (-1)]) & i=4,5,6,10\\ \frac{0.1}{0.9165}exp(-[1\times 0.4236\times (-1)]) &i=7,8,9 \end{matrix}\right.\\ &\approx \left\{\begin{matrix} 0.07143 & i=1,2,3\\ 0.07143 & i=4,5,6,10\\ 0.16666 &i=7,8,9 \end{matrix}\right. \end{aligned}

更新后的权重为:

image-20220605225325353

第二次迭代

G2(x)={1,x<8.51,x>8.5G_2(x)=\left\{\begin{matrix} 1,x<8.5 \\ -1,x>8.5 \end{matrix}\right.

image-20220605225456008

再次对错分的数据计算误差和权重:

G_2(x)误差:e_2=P(G_2(x_i)\ne y_i)= {\textstyle \sum_{G_2(x_i)\ne y_i}^{}W_{2i}}=0.07143+0.07143+0.07143=0.21429

G_2(x)权重:\alpha_2=\frac{1}{2}\ln_{}{\frac{1-e_2}{e_2} }= \frac{1}{2}\ln_{}{\frac{1-0.21429}{0.21429} }\approx 0.64963

分类函数:f_2(x)=\alpha_1G_2(x)=0.64963G_2(x)

根据错分的样本调整权值:

image-20220605225903744

w2i=w2iZ2exp(yiα2G2(xi))={0.071430.82065exp([1×0.64963×1])i=1,2,30.071430.82065exp([(1)×0.64963×1])i=4,5,60.071430.82065exp([1×0.64963×1])i=7,8,90.071430.82065exp([(1)×0.64963×(1)])i=10{0.04546i=1,2,30.16667i=4,5,60.10606i=7,8,90.04546i=10\begin{aligned} w_{2i}&=\frac{w_{2i}}{Z_2} exp(-y_i\alpha _2G_2(x_i))\\ &=\left\{\begin{matrix} \frac{0.07143}{0.82065}exp(-[1\times 0.64963\times 1]) & i=1,2,3\\ \frac{0.07143}{0.82065}exp(-[(-1)\times 0.64963\times 1]) & i=4,5,6\\ \frac{0.07143}{0.82065}exp(-[1\times 0.64963\times 1]) &i=7,8,9\\ \frac{0.07143}{0.82065}exp(-[(-1)\times 0.64963\times (-1)]) &i=10 \end{matrix}\right.\\ &\approx \left\{\begin{matrix} 0.04546 & i=1,2,3\\ 0.16667 & i=4,5,6\\ 0.10606 &i=7,8,9\\ 0.04546&i=10 \end{matrix}\right. \end{aligned}

更新后的权重为:

image-20220605230553759

第三次迭代

G3(x)={1,x<5.51,x>5.5G_3(x)=\left\{\begin{matrix} -1,x<5.5 \\ 1,x>5.5 \end{matrix}\right.

image-20220605230731906

再次对错分的数据计算误差和权重:

G_3(x)误差:e_3=P(G_3(x_i)\ne y_i)= {\textstyle \sum_{G_3(x_i)\ne y_i}^{}W_{3i}}=0.04546+0.04546+0.04546+0.04546=0.18184

G_3(x)权重:\alpha_3=\frac{1}{2}\ln_{}{\frac{1-e_3}{e_3} }= \frac{1}{2}\ln_{}{\frac{1-0.18188}{0.18184} }\approx 0.75197

分类函数:f_3(x)=\alpha_1G_3(x)=0.75197G_3(x)

更新后的权值:

image-20220605231030170

最终分类器

G_{m(x)}=sign(0.42365G_1(x)+0.64963G_2(x)+0.75197G_3(x))

G1(x)={1,x<2.51,x>2.5G_1(x)=\left\{\begin{matrix} 1,x<2.5 \\ -1,x>2.5 \end{matrix}\right.
G2(x)={1,x<8.51,x>8.5G_2(x)=\left\{\begin{matrix} 1,x<8.5 \\ -1,x>8.5 \end{matrix}\right.
G3(x)={1,x<5.51,x>5.5G_3(x)=\left\{\begin{matrix} -1,x<5.5 \\ 1,x>5.5 \end{matrix}\right.

2.3 Adaboost例2

假设有训练数据集:

image-20220605231320796

第一次迭代:

image-20220605231336233

第二次迭代:

image-20220605231349395

第三次迭代:

image-20220605231400136

最终分类器:

image-20220605231414512

3、其他Boosting算法

不同的损失函数和极小化损失函数方法决定了boosting的最终效果。

预览大图

4、实战

使用Python语言编程,使用 iris 数据集训练一个 AdaBoostClassifier 分类器。AdaBoostClassifierscikit-learn 库的 ensemble 包之中。AdaBoostClassifier 使用很简单,三步:

  • 创建 AdaBoostClassifier 对象
  • 调用 fit 函数
  • 调用 predict 函数进行预测
 # Boosting分类器
 # 导入相关库
 from sklearn.ensemble import AdaBoostClassifier
 from sklearn.model_selection import train_test_split
 from sklearn.metrics import accuracy_score
 from sklearn.datasets import load_iris
 import numpy as np
 ​
 # 下载数据集
 iris = load_iris()
 X = iris["data"]
 y = iris["target"]
 ​
 np.random.seed(0)
 # 划分数据集
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
 ​
 # 创建 AdaBoostClassifier 对象,迭代100次
 ########## Begin ##########
 clf = AdaBoostClassifier(n_estimators=100)
 ##########  End  ##########
 ​
 # 调用 fit 函数执行训练过程
 clf.fit(X_train,y_train)
 ​
 # 打印结果
 print('训练集准确率:', accuracy_score(y_train, clf.predict(X_train)))
 print('测试集准确率:', accuracy_score(y_test, clf.predict(X_test)))