集成方法(Boosting:以AdaBoost为例)原理以及实现

2024-04-22 23:18

本文主要是介绍集成方法(Boosting:以AdaBoost为例)原理以及实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

集成方法(boosting又称为提升方法)

提升方法重要概念

  • 1.思路:三个臭皮匠顶个诸葛亮
  • 2.重要概念:
    PAC:(Probably approximately correct):概率近似正确
    强可学习:PAC中,面对假设模型,如果存在一个多项式的学习算法能够学习它,且正确率很高,那么这个概念就是强可学习
    弱可学习:PAC中,面对假设模型,如果存在一个多项式的学习算法能够学习它,且正确率仅仅比随机猜测好,那么这个概念就是弱可学习
    注意:强可学习实质上等价于弱可学习

在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的

问题: 弱可学习如果提升为强可学习?

  • 方案:对分类问题而言,提升方法就是弱学习算法出发,反复学习,得出一系列弱分类器,组合这些弱分类器,构成一个强分类器,
  • 提升方法:为改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据调用弱分类器算法

  • 给出方案之后,提升方法的两个问题?
    1.在每一轮中如何改变训练数据的权值或概率分布
    2.如何将弱分类器组合成一个强分类器

AdaBoost给出的解决方案
1.提高那些被前一轮弱分类器错误分类样本的权值,降低被正确分类的样本权值
2.加权多数表决的方法 将弱分类器线性组合起来

AdaBoost

Input:DataSet T={(x1,y2),(x2,y2),...,(xn,yn)}xiχR,yiY=1,+1, T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } x i ∈ χ ⊆ R , y i ∈ Y = − 1 , + 1 , 弱 学 习 分 类 器
Output: G(x) 最 终 分 类 算 法 G ( x )

算法实现过程:

step1: 初始化训练数据的权值分布
D1=(W11,W12,...,W1i,W1N),W1i=1N,i=1,2,...,N D 1 = ( W 11 , W 12 , . . . , W 1 i , W 1 N ) , W 1 i = 1 N , i = 1 , 2 , . . . , N

step2: m=1,2,.....,M 对 m = 1 , 2 , . . . . . , M , 表示有m个弱分类器

  • (a) 使用具有权值分布 Dm D m 的训练数据集学习,得到基本m个基本分类器
    Gm(x):X>1,+1 G m ( x ) : X − > − 1 , + 1
  • (b) 计算 Gm(x) G m ( x ) 在训练集上的分类误差率
    em=P(Gmxiyi=i=1NWmiI(Gm(x)yi) e m = P ( G m x i ≠ y i = ∑ i = 1 N W m i I ( G m ( x ) ≠ y i )
    实质上是错分数据的权值之和
  • (c) 计算 Gm(x) G m ( x ) 的 系 数
    αm=12log1emem α m = 1 2 log ⁡ 1 − e m e m
  • (d) 更新训练数据集的权值分布
    D(m+1)=(Wm+1,1,Wm+1,2,....,Wm+1,i,.......,Wm+1,N D ( m + 1 ) = ( W m + 1 , 1 , W m + 1 , 2 , . . . . , W m + 1 , i , . . . . . . . , W m + 1 , N
    Wm+1,i=WmiZmexp(αmyiGm(xi)) W m + 1 , i = W m i Z m exp ( − α m y i G m ( x i ) )
    实质上是:指数惩罚函数
    yi==Gm(xi):yiGm(xi)=1,αmyiGm(xi)<0, 当 y i == G m ( x i ) 时 : y i G m ( x i ) = 1 , 即 − α m y i G m ( x i ) < 0 , 权 重 减 小
    yi!=Gm(xi):yiGm(xi)=1,αmyiGm(xi)>0, 当 y i ! = G m ( x i ) 时 : y i G m ( x i ) = − 1 , 即 − α m y i G m ( x i ) > 0 , 权 重 增 加

    ZmZm=i=1NWmiexp(alphayiGm(xi)) Z m 是 规 范 化 因 子 Z m = ∑ i = 1 N W m i exp ⁡ ( − a l p h a y i G m ( x i ) )
    这样更新训练数据的权值分布 Dm+1 D m + 1

step3:构建基本分类器的线性组合
f(x)=m=1MαmGm(x) f ( x ) = ∑ m = 1 M α m G m ( x )
得出最终分类器:
G(x)=sign(f(x))=sign(m=1MαmGm(x)) G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) )

AdaBoost算法说明

(1) 假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同===》在此基础上,首先得出基本分类器
(2) AdaBoost A d a B o o s t 反复学习基本分类器,在每一轮 m=1,2,...,M m = 1 , 2 , . . . , M 顺次的执行下列操作:

  • (a)使用当前分布 Dm D m 加权的训练数据集,学习基本分类器 Gm(x) G m ( x )
  • (b)计算基本分类器 Gm(x) G m ( x ) 在加权训练集上的分类误差率
    em=P(Gm(xi)yi)=Gm(xi)yiWmi e m = P ( G m ( x i ) ≠ y i ) = ∑ G m ( x i ) ≠ y i W m i
    Wmim,i,i=1NWmi=1 W m i 表 示 在 第 m 轮 更 新 中 , 第 i 个 实 例 的 权 值 , ∑ i = 1 N W m i = 1
    表明: Gm(x) G m ( x ) 在加权的训练数据集上的分类误差率是被 Gm(x) G m ( x ) 误分类样本的权值之和,由此确定数据权值分布 Dm D m 与基本分类器 Gm(x) G m ( x ) 的分类误差率的关系
  • (c)计算基本分类器 Gm(x)αm,αmGm(x) G m ( x ) 的 系 数 α m , α m 表 示 G m ( x ) 在 最 终 分 类 器 中 的 重 要 性
    αm=12log1emem α m = 1 2 log ⁡ 1 − e m e m
    性质: 当 em12,αm0,αmem, e m ≤ 1 2 时 , α m ≥ 0 , 并 且 α m 随 着 e m 的 减 小 而 增 大 , 所 有 分 类 误 差 率 越 小 的 基 本 分 类 器 在 最 终 分 类 器 中 的 作 用 越 大

  • (d)更新训练数据的权值分布为下一轮做准备
    Wm+1,i=WmiZmeαm,Gmxi=yi W m + 1 , i = W m i Z m e − α m , G m x i = y i
    Wm+1,i=WmiZmeαm,Gmxi=yi W m + 1 , i = W m i Z m e α m , G m x i = y i
    Zm=i=1NWmiexp(alphayiGm(xi)) Z m = ∑ i = 1 N W m i exp ⁡ ( − a l p h a y i G m ( x i ) )

即: 在上述的迭代更新中, 被基本分类器 Gm(x) G m ( x ) 误分类样本的权值得以扩大,而被正确分类样本的权值得以缩小,实质上 e2αm=em1em e 2 α m = e m 1 − e m ,使得误分类样本的作用在下一轮的作用中变得更好
不改变训练数据而改变权值分布, 使得训练数据在基本分类器中其不同的作用

(3)线性组合 f(x)M,αmGm(x),:αm1 f ( x ) 实 现 M 个 基 本 分 类 器 的 加 权 表 决 , 系 数 α m 表 示 基 本 分 类 器 G m ( x ) 的 重 要 性 , 注 意 : 这 里 ∑ α m ≠ 1
- f(x)x f ( x ) 的 符 号 决 定 实 例 x 的 类
- f(x) f ( x ) 的 绝 对 值 表 示 分 类 的 确 信 度
最终: 利用基本分类器的线性组合构建最终分类器

例题及adaboost算法实现:

这里写图片描述

import numpy as npD = None
fx = dict()def loadDataSet(filename):dataSet, labelMat = list(), list()with open(filename, 'r') as fr:for line in fr.readlines():dataSet.append([int(line.split(',')[0])])labelMat.append([int(line.split(',')[1])])return np.mat(dataSet), np.mat(labelMat)# 三个弱分类器
def weekClassify1(x):if x < 2.5:return 1elif x > 2.5:return -1def weekClassify2(x):if x < 8.5:return 1elif x > 8.5:return -1def weekClassify3(x):if x > 5.5:return 1elif x < 5.5:return -1def calcErrorRate(dataSet, labelMat, func):dataSize = np.shape(labelMat)[0]errorIndex = list()for index in range(len(dataSet)):predict = func(dataSet[index])if predict * labelMat[index] < 0:errorIndex.append(index)return errorIndexdef adaBoost(dataSet, labelMat, funcList):""":param dataSet: 训练数据集 input  特征值:param labelMat: 训练数据集 output 类标记:param funcList: 弱分类器的列表集合:returnfx 字典形式的基本分类器的线性组合"""# step1 初始化训练数据的权值分布global Dglobal fxif D is None:dataSize = np.shape(labelMat)[0]D = np.ones((dataSize, 1)) / dataSizeprint(D)  # [[0.1], [0.1], [0.1].....[0.1]]else:# step2 对m=1,2,....,M# (a) 使用具有权值分布D的训练数据集学习 得到基本分类器 Gm(x)# funcList = [weekClassify1, weekClassify2, weekClassify3]# print(funcList)# (b) 计算Gm(x)在训练数据集上的分类误差率 = 错分类数据权值之和# fx 基本分类器的线性组合errorRateList = list()errorIndexList = list()for funcIndex in range(len(funcList)):errorIndex = calcErrorRate(dataSet, labelMat, funcList[funcIndex])errorIndexList.append(errorIndex)errorRate = 0for index in errorIndex:errorRate += float(D[index])print('errorRate:', errorRate)errorRateList.append(errorRate)# print('min_errorRate', min_errorRate)# (c) 计算Gm(x)的系数   选择弱分类器中错分率最低的分类器 优先计算系数min_errorRate = min(errorRateList)min_funcIndex = errorRateList.index(min_errorRate)print('min_errorRate', min_errorRate)print('min_funcIndex', min_funcIndex)print('错分率最低的分类器索引', min_funcIndex)alpha = (1 / 2) * np.log((1 - min_errorRate) / min_errorRate)# print('alpha1', alpha)# print('alpha2', alpha)print('计算Gm(x)的系数', alpha)# (d) 更新训练数据的权值分布print(errorIndexList[min_funcIndex])print('更新权重')for indexD in range(len(D)):if indexD in errorIndexList[min_funcIndex]:# print('D indexD', D[indexD])D[indexD] = D[indexD] / (2 * min_errorRate)else:D[indexD] = D[indexD] / (2 * (1 - min_errorRate))print(D)# step 3 构建基本分类器的线性组合print('构建基本分类器的线性组合')fx[alpha] = funcList[min_funcIndex]# print('fx', fx)sign_errorIndex = strongClassify(fx, dataSet, labelMat)sign_errorRate = (1 - (float(len(sign_errorIndex)) / len(labelMat))) * 100if sign_errorRate > 90.00:print("最终分类器正确率率大于0.9, 正确率为%.2f %%" % sign_errorRate)# print('fx:', fx)return fxelse:print("当前最终分类器正确率为%.2f %%" % sign_errorRate)print('当前最终分类器误分类个数为: %d' % len(sign_errorIndex))print('继续优化最终分类器fx:', fx)return adaBoost(dataSet, labelMat, funcList)# 最终分类器
def sign(fx, testData):result = 0for key, value in fx.items():result += key * value(testData)if result > 0:result = 1else:result = -1return result# 强分类器验证
def strongClassify(fx, testData, labelMat):errorIndex = list()for index in range(len(testData)):predict = sign(fx, testData[index])# print(predict)if predict != float(labelMat[index]):errorIndex.append(index)print('strongClassify errorIndex', errorIndex)return errorIndexdef main():filename = 'test.txt'dataSet, labelMat = loadDataSet(filename)funcList = [weekClassify1, weekClassify2, weekClassify3]fx = adaBoost(dataSet, labelMat, funcList)print(fx)# correctRate = strongClassify(fx, dataSet, labelMat)# print('AdaBoost StrongClassify CorrectRate:%.2f %%' % correctRate)if __name__ == '__main__':main()

AdaBoost算法误差分析

从定理中化简:训练数据的权值分布公式以及 Zm Z m 规范化因子公式

二分类问题Adaboost的训练误差界

Zm=i=1NWmiexp(alphayiGm(xi)) Z m = ∑ i = 1 N W m i exp ⁡ ( − a l p h a y i G m ( x i ) )
此时存在两种情况: :yi=Gm(xi)yi!=Gm(xi) 第 一 种 : y i = G m ( x i ) 第 二 种 : y i ! = G m ( x i )

即: Zm=y=Gm(x)Wmieαm+yGm(x)Wmieαm=(1em)expαm+emexpαm=2e(m1em)=14r2m Z m = ∑ y = G m ( x ) W m i e − α m + ∑ y ≠ G m ( x ) W m i e α m = ( 1 − e m ) exp − α m + e m exp α m = 2 e m ( 1 − e m ) = 1 − 4 r 2 m

其中 em(),rm=12em e m 为 误 分 类 权 重 之 和 ( 误 分 类 率 ) , r m = 1 2 − e m
定理:在二分问题中Adaboost的训练误差为:
m=1MZm=m=1M[2em(1em)=m=1M(14r2m)exp(2m=1Mr2m) ∏ m = 1 M Z m = ∏ m = 1 M [ 2 e m ( 1 − e m ) = ∏ m = 1 M ( 1 − 4 r m 2 ) ≤ exp ⁡ ( − 2 ∑ m = 1 M r m 2 )

Zm,ex1xx=0使 前 三 项 展 开 Z m 可 得 , 后 两 项 由 e x 和 1 − x 在 x = 0 时 使 用 泰 勒 公 式 展 开 推 导 可 得

又由公式: zm=2em(1em) z m = 2 e m ( 1 − e m ) 带入更新训练数据的权值分布中可得
重点:
Gm(xi)=yi,Wm+1,i=Wmi2(1em)Gm(xi)!=yi,Wm+1,i=Wmi2em 当 G m ( x i ) = y i 时 , W m + 1 , i = W m i 2 ( 1 − e m ) 当 G m ( x i ) ! = y i 时 , W m + 1 , i = W m i 2 e m

定理: AdaBoost的训练误差界

1Ni=1N(G(xi)yi)1Niexp(yif(xi))=mZm 1 N ∑ i = 1 N ( G ( x i ) ≠ y i ) ≤ 1 N ∑ i exp ( − y i f ( x i ) ) = ∏ m Z m

其中: G(x)=sign(f(x))=sign(m=1MαmGm(x),f(x)=m=1MαmGm(x),Zm=i=1NWmiexp(alphamyiGm(xi)), G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) , 最 终 分 类 器 f ( x ) = ∑ m = 1 M α m G m ( x ) , 系 数 ∗ 基 本 分 类 器 Z m = ∑ i = 1 N W m i exp ( − a l p h a m y i G m ( x i ) ) , 规 范 化 因 子
证明: G(xi)yi,yif(xi)0,exp(yif(xi))1 当 G ( x i ) ≠ y i 时 , y i f ( x i ) ≤ 0 , 此 时 exp ( − y i f ( x i ) ) ≥ 1
后两项由 Zm Z m 定 义 式 可 证 明
Zm=i=1NWmiexp(alphayiGm(xi)) Z m = ∑ i = 1 N W m i exp ⁡ ( − a l p h a y i G m ( x i ) )
将该式变化可得: Zm+1,i=Wmiexp(alphamyiGm(xi) Z m + 1 , i = W m i exp ( − a l p h a m y i G m ( x i )
可证:
1Niexp(yif(xi))=1Niexp(m=1MαmGm(xi)yi=iW1im=1Mexp(αmyiGm(xi))=Z1iW1im=1Mexp(αmyiGm(xi))=m=1MZm 1 N ∑ i exp ( − y i f ( x i ) ) = 1 N ∑ i exp ( − ∑ m = 1 M α m G m ( x i ) y i = ∑ i W 1 i ∏ m = 1 M exp ( − α m y i G m ( x i ) ) = Z 1 ∑ i W 1 i ∏ m = 1 M exp ( − α m y i G m ( x i ) ) = ∏ m = 1 M Z m

该定理说明: 在AdaBoost中只关注训练误差界的上确界,并且通过不断的选取适当的 Gm G m 可以使得 Zm Z m 最小,从而使得训练误差最小

参考文献
《统计学习方法》李航著;

这篇关于集成方法(Boosting:以AdaBoost为例)原理以及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927135

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程