Boosting分类器

举报
别团等shy哥发育 发表于 2023/01/09 09:10:41 2023/01/09
【摘要】 @toc 1、提升方法(Boosting) 1.1、相关知识  提升方法(Boosting),是一种可以用来减小监督式学习中偏差的机器学习算法。面对的问题是迈可·肯斯(Michael Kearns)提出的:一组“弱学习者”的集合能否生成一个“强学习者”?弱学习者一般是指一个分类器,它的结果只比随机分类好一点点;强学习者指分类器的结果非常接近真值。  在提升方法中,给每个训练元组一个权重。在迭...

@toc

1、提升方法(Boosting)

1.1、相关知识

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

  在提升方法中,给每个训练元组一个权重。在迭代学习k个基分类器的过程中,学习得到分类器 M i M_i 之后,更新元组的权重。使其后的分类器更关注 M i M_i 误分类的训练元组。最终提升的分类器 M 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时预测为负类

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

在这里插入图片描述

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

   G 1 ( x ) G_1(x) 误差: e 1 = P ( G 1 ( x i ) y i ) = G 1 ( x i ) y i W 1 i = 0.1 + 0.1 + 0.1 = 0.3 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 ) G_1(x) 权重: α 1 = 1 2 ln 1 e 1 e 1 = 1 2 ln 1 0.3 0.3 0.42365 \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 ) = α 1 G 1 ( x ) = 0.42365 G 1 ( x ) f_1(x)=\alpha_1G_1(x)=0.42365G_1(x)

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

image-20220605224400843

w 2 i = w 1 i Z 1 e x p ( y i α 1 G 1 ( x i ) ) = { 0.1 0.9165 e x p ( [ 1 × 0.4236 × 1 ] ) i = 1 , 2 , 3 0.1 0.9165 e x p ( [ ( 1 ) × 0.4236 × ( 1 ) ] ) i = 4 , 5 , 6 , 10 0.1 0.9165 e x p ( [ 1 × 0.4236 × ( 1 ) ] ) i = 7 , 8 , 9 { 0.07143 i = 1 , 2 , 3 0.07143 i = 4 , 5 , 6 , 10 0.16666 i = 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

第二次迭代

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

image-20220605225456008

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

   G 2 ( x ) 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 ) G_2(x) 权重: α 2 = 1 2 ln 1 e 2 e 2 = 1 2 ln 1 0.21429 0.21429 0.64963 \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 ) = α 1 G 2 ( x ) = 0.64963 G 2 ( x ) f_2(x)=\alpha_1G_2(x)=0.64963G_2(x)

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

image-20220605225903744

w 2 i = w 2 i Z 2 e x p ( y i α 2 G 2 ( x i ) ) = { 0.07143 0.82065 e x p ( [ 1 × 0.64963 × 1 ] ) i = 1 , 2 , 3 0.07143 0.82065 e x p ( [ ( 1 ) × 0.64963 × 1 ] ) i = 4 , 5 , 6 0.07143 0.82065 e x p ( [ 1 × 0.64963 × 1 ] ) i = 7 , 8 , 9 0.07143 0.82065 e x p ( [ ( 1 ) × 0.64963 × ( 1 ) ] ) i = 10 { 0.04546 i = 1 , 2 , 3 0.16667 i = 4 , 5 , 6 0.10606 i = 7 , 8 , 9 0.04546 i = 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

第三次迭代

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

image-20220605230731906

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

   G 3 ( x ) G_3(x) 误差: e 3 = P ( G 3 ( x i ) y i ) = G 3 ( x i ) y i W 3 i = 0.04546 + 0.04546 + 0.04546 + 0.04546 = 0.18184 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 ) G_3(x) 权重: α 3 = 1 2 ln 1 e 3 e 3 = 1 2 ln 1 0.18188 0.18184 0.75197 \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 ) = α 1 G 3 ( x ) = 0.75197 G 3 ( x ) f_3(x)=\alpha_1G_3(x)=0.75197G_3(x)

  更新后的权值:

image-20220605231030170

最终分类器

G m ( x ) = s i g n ( 0.42365 G 1 ( x ) + 0.64963 G 2 ( x ) + 0.75197 G 3 ( x ) ) G_{m(x)}=sign(0.42365G_1(x)+0.64963G_2(x)+0.75197G_3(x))

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

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

G 3 ( x ) = { 1 , x < 5.5 1 , x > 5.5 G_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)))

image-20220605231601611

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。