AdaBoost的求解流程

news2024/10/6 22:29:14

对于任意Boosting算法,都需要明确以下几点:

        ① 损失函数𝐿(𝑥,𝑦)的表达式是什么?损失函数如何影响模型构建?

        ② 弱评估器𝑓(𝑥)是什么,当下boosting算法使用的具体建树过程是什么?

        ③ 综合集成结果𝐻(𝑥)是什么?集成算法具体如何输出集成结果?

同时,还可能存在其他需要明确的问题,例如:

        ① 是加权求和吗?如果是,加权求和中的权重如何求解?

        ② 训练过程中,拟合的数据𝑋与𝑦分别是什么?

        ③ 模型训练到什么时候停下来最好?

同时,别忘记boosting算法的基本规则:

        依据上一个弱评估器f(x)_{t-1}的结果,计算损失函数L(x,y)
        并使用L(x,y)自适应地影响下一个弱评估器f(x)_{t}的构建。
        集成模型输出的结果,受到整体所有弱评估器f(x)_{0} ~ f(x)_{T}的影响。

在此基本指导思想下,下面将梳理回归算法的基本流程:

AdaBoost.R2

        AdaBoost.R2算法是当前AdaBoost实现流程中使用最多的回归类实践方式,它囊括了对数据进行有放回抽样、按损失函数结果调整样本权重、自动计算弱分类器权重、并输出预测结果等。AdaBoost算法经典的全流程。假设现有数据集N,含有样本𝑀个,任意样本编号为𝑖,同时,弱评估器为决策树𝑓,总共学习𝑇轮,则AdaBoost.R2的基本流程如下所示:

初始化原始数据集的权重w_{i},其中任意w_{i}=\frac{1}{M}

② 在现有数据集𝑁中,有放回抽样𝑀个样本,构成训练集N^{t}。在每次抽取一个样本时,任意样本被抽中的概率为P_{i}^{t}=\frac{w_{i}}{\sum w_{i}},很显然,该概率就是当前样本在训练集N^{t}中的权重。当从初始权重中抽样时,概率P_{i}^{1}=\frac{1}{M},当后续权重变化时,拥有更大权重的样本被抽中的概率会更大。

 在训练集N^{t}上按照CART树规则建立一棵回归树f^{t},训练时所拟合的标签为样本的真实标签y_{i}^{t}

 将N^{t}上所有的样本输入f^{t}进行预测,得出预测结果f^{t}(x_{i}),其中i = 1,2,...M。

⑤ 计算单一样本𝑖上的损失函数L_{i}^{t}=L(f^{t}(x_{i}),y_{i}),计算过程如下所示:

        ◉ 求解D=sup\left | f^{t}(x_{i}-y_{i}) \right |,i=1,2,...,N

        ◉ 选择线性/平方或指数损失函数中的一种计算L_{i}^{t} :(线性损失、平方损失、指数损失)

\left\{\begin{matrix} & L_{i}=\frac{\left | f^{t}(x_{i})-y_{i} \right |}{D}\\ & L_{i}=\frac{\left | f^{t}(x_{i})-y_{i} \right |^{2}}{D^{2}}\\ & L_{i}=1-exp(\frac{\left | -f^{t}(x_{i})-y_{i} \right |}{D}) \end{matrix}\right.

        ◉ 根据AdaBoost的要求,所以损失的值域都在[0,1]之间。

⑥ 计算全样本上的加权平均损失\overline{L^{t}}=\sum _{i=1}^{M}L_{i}^{t}P_{i}^{t}

        注意此时P_{i}^{t}就等于样本的权重。由于P_{i}^{t}=\frac{w_{i}}{\sum w_{i}},所以P_{i}^{t}一定位于[0,1]范围内,并且\sum P_{i}^{t},i=1,2,....M一定为1。
        当权重之和为1时,加权平均值一定会小于等于单一数值的最大值(同时大于等于单一数值的最小值),因此加权平均的值域不会超出单一平均数的值域。由于所有损失的值域都是[0,1],因此加权平均值\overline{L^{t}}的值域也是[0,1]。同时,由于损失的最大值为1,而权重P_{i}^{t}的最大值一定是远远小于1的,因此加权平均值\overline{L^{t}}的最大值一般也是远远小于1的。

 依据加权平均损失\overline{L^{t}}计算衡量当前集成算法的置信度\beta^{t}

\beta ^{t}=\frac{\overline{L^{t}}}{1-\overline{L^{t}}+\lambda },其中\lambda是为了防止分母为零的常数。

        不难发现,当加权平平均损失很高时,\beta^{t}很大,因此置信度小,当加权平均损失很低时,\beta^{t}很小,因此置信度大。置信度越大,集成算法当前的预测结果越好。已知\overline{L^{t}}的理论值域是[0,1],因此\beta^{t}的理论值域是[0,+∞],因此\beta^{t}的值越接近0越好。同时,我们还知道\overline{L^{t}}的实际范围大约都在0.2~0.3之间,因此一般来说\beta^{t}的实际范围基本都是小于1的。

import numpy as np
import matplotlib.pyplot as plt
M = 1000
lambda_ = 1e-6
lt = np.sort(np.random.rand(M))
beta = lt/(1-lt+lambda_)
plt.plot(lt,beta)
plt.ylim(0,5)
plt.vlines(0.5,0,1,linestyles="dotted",color="red")
plt.hlines(1,0,0.5,linestyles="dotted",color="red")
plt.xlabel("lt",fontdict={"fontsize":14})
plt.ylabel("beta",fontdict={"fontsize":14});

 

 依据置信度评估\beta^{t}更新样本权重

w_{i}=w_{i}\beta ^{(1-L_{i})}

        根据L_{i}的范围[0,1],以及𝛽的计算公式,绘制出横坐标为L_{i},纵坐标为\beta ^{(1-L_{i})}的图像。不难发现,单一样本的损失越大、\beta ^{(1-L_{i})}也会越大,因此该样本的权重会被更新得越大

import numpy as np
import matplotlib.pyplot as plt
#假设1000个样本
M = 1000
lambda_ = 1e-6

#1000个样本的损失位于[0,1]之间
l = np.linspace(0,0.8,M)

#1000个样本被抽到的概率加和为1
p = np.random.dirichlet(np.ones(M),size=1)
#p = 1/M

#计算加权平均值与beta
lbar = (l*p).sum()
beta = lbar/(1-lbar+lambda_)

l = np.sort(l,axis=0) #从小到大进行排序

#按照1000个样本的l对beta**(1-l)进行绘图
plt.plot(l,beta**(1-l))
plt.xlabel("L_i",fontdict={"fontsize":14})
plt.ylabel("beta^(1-l)",fontdict={"fontsize":14});
print(lbar, beta)
0.3902868424714614 0.6401144497832878

 求解迭代过程中弱分类器f^{t}所需的权重

\phi ^{t}=log(\frac{1}{\beta ^{t}})

其中log的底数为e或者为2皆可。当𝛽值越接近于0,说明损失越小、置信度越高,则log(\frac{1}{\beta ^{t}})的值越大。所以,损失更小的树对应的权重更大,损失更大的树对应的权重更小。

 求解出当前迭代𝑡下集成算法的输出值:

H^{t}(x_{i})=H^{t-1}(x_{i})+\eta \phi ^{t}f^{t}(x_{i})

在步骤2~10中循环,直到迭代次数被使用完毕。理想上来说,Adaboost至少应该迭代到𝑇次以满足下列条件:

(\sum_{t:H^{t}(x)\leq y}log\frac{1}{\beta ^{t}})\geq (\frac{1}{2}\sum_{t=1}^{T}log\frac{1}{\beta ^{t}})

等同于:

(\sum_{t:H^{t}(x)\leq y}\phi^{t})\geq (\frac{1}{2}\sum_{t=1}^{T}\phi^{t})

并且,最终算法的输出值是上述等式满足“等于”条件时所对应的H^{t}(x)。对于一个正常迭代的AdaBoost来说,每一轮迭代后获得的H(x_{i})都是累加结果,因此H(x_{i})之间应该满足以下关系:

H^{0}(x_{i})< H^{1}(x_{i})<......H^{T}(x_{i})

H^{0}(x_{i})H^{T}(x_{i})过程中,必然只有部分H(x_{i})是小于真实标签y_{i}的,假设有𝑡次迭代中H(x_{i})都小于y_{i},则理想状况下,前𝑡次迭代中权重的累加,应该大于0.5 * 所有𝑇次迭代中权重的累加。当两者相等时,t就是最佳迭代次数,而𝑡对应的H^{t}(x_{i})也就是最佳预测值。

        要完全使用公式来证明以上式子非常困难,但我们可以通过一个简单的小实验来验证该公式的合理性。

ps:原则上应该使用fx计算损失,并且在迭代过程中逐渐计算出权重,但由于计算过程略为复杂,因此在这里简化,直接使用Hx计算损失、beta和权重。这种方法得出的曲线不是最严谨的,但其趋势与使用fx严谨计算的曲线趋势一致,因为原则上来说,只要一个样本被AdaBoost分类正确,这个样本上的损失应该也是越来越小的。

yi = 20
lambda_ = 1e-6
Hx = np.linspace(1,25,1000,endpoint=False) #逐渐增大的Hx

D = np.max(abs(Hx - yi))
L = abs(Hx - yi)/D
beta = L/(1-L+lambda_)

part1 = 0 #用来计算每一轮迭代后的累加值
part1_ = [] #用来保存每一轮迭代后的累加值
part2 = 0
part2_ = []
for t, beta_t in enumerate(beta):
    phi = np.log(1/beta_t)
    #如果Hx小于真实标签yi,则取倒数取对数后放入part1内
    if Hx[t] <= yi:
        part1 += phi
        part1_.append(part1)
    #所有beta取倒数取对数 * 0.5后都放入part2内
    part2 += 0.5*phi
    part2_.append(part2)
plt.plot(range(len(part1_)),part1_,c="red",label = "h < y t")
plt.plot(range(1000),part2_,c="blue",label = "all t")
plt.legend();

#最佳输出值
Hx[len(part1_)-1]
19.984

最终得到的结果为19.984,和最初设置的20非常接近。在AdaBoost回归方法当中,损失函数并没有明显的被“最小化”的过程,而是借助损失函数来自然地调整数据的权重,从而在迭代中不断减小整体损失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这是一个小程序求助帖

求助帖 请问各位大佬们&#xff0c;在vscode中运行android模拟器&#xff0c;报错&#xff1a;执行emulator命令失败, 错误信息&#xff1a;Error: spawn C:\WINDOWS\system32\cmd.exe ENOENT 该如何解决。环境变量什么的我都已经配置过了&#xff0c;电脑也重启过了&#xff…

Rman配置参数详解

using target database control file instead of recovery catalog指的是使用目标数据库控制文件代替恢复目录 1、CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default 设置rman备份过期条件&#xff1a;是用来决定那些备份不再需要了&#xff0c;它一共有三种可选项&…

mybatisPlus之自动填充功能及防全表更新与删除插件

自动填充功能 基本介绍 Mybatis-plus自动填充功能是指在数据库表进行增、删、改、查操作时&#xff0c;自动将某些字段的值进行填充。这些字段的值可以是当前时间、登录用户ID等。 在项目中有一些属性&#xff0c;如果我们不希望每次都填充的话&#xff0c;我们可以设置为自…

Cilium系列-5-Cilium替换KubeProxy

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

数字身份、分布式存储、跨链技术等将如何推动Web3数据的发展?

Web3数据是基于区块链技术、去中心化、可信任的数据&#xff0c;具有较高的安全性和可信度。随着Web3.0时代的到来&#xff0c;Web3数据将会在金融、物联网、医疗、教育、政务等领域发挥重要的作用。其中&#xff0c;数字身份、分布式存储、跨链技术等将会是Web3数据发展的重要…

【教学类-34-07】20230726拼图(彩色图片+菱形凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

作品展示&#xff1a; 背景需求 我尝试将拼图的“圆形凹凸角”变成"正方形凹凸角”&#xff0c;没有成功&#xff0c;但做出了“菱形凹凸角”。 实用性思考&#xff1a; 1、这种菱形凹凸角与正方形结构近似&#xff0c;裁剪难度中等&#xff08;比圆角容易剪&#xff0…

100天软件设计师备考计划

我已经毕业并且刚刚开始工作&#xff0c;目前在一家小公司从事Java开发工作。虽然我的工作轻松&#xff0c;但我希望在空闲时间里能够提升自己。由于我的专业与计算机相关&#xff0c;我有一定的基础&#xff0c;因此我计划在2023年用100天的时间考取软件设计师资格。在学习的过…

GB/T 25000.51解读——软件产品的易用性怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中&#xff0c;我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

怎么在电脑中创建虚拟加密磁盘?

在生活和工作中&#xff0c;我们可以将重要数据存放在电脑加密磁盘中。可是不是每个电脑都拥有加密磁盘的。那么我们该怎么在电脑中创建虚拟加密磁盘呢&#xff1f; 将普通磁盘加密 我们可以将重要数据分类存放在一个磁盘中&#xff0c;随后将该磁盘加密&#xff0c;使其变成加…

Mac 快速生成树形项目结构目录

我这里使用的是通过包管理 Homebrew安装形式。没有安装的话可以自行搜索 Homebrew 安装方式 brew install tree直接到项目的根目录执行 tree 命令 tree 效果如下&#xff1a; or &#xff1a; tree -CfL 3效果如下&#xff1a;

Java的第十三篇文章——JAVA多线程

目录 学习目标 1. 线程的基本概念 1.1 进程 1.2 线程 2. Java实现线程程序 2.1 java.lang.Thread类 2.2 线程的内存图 2.3 Thread类的方法 3. Java实现线程程序 3.1 java.lang.Runnable接口 3.2 实现接口的好处 4. 线程安全 4.1 售票例子 4.2 同步代码块 4.3 同…

大学生活题解

样例输入&#xff1a; 3 .xA ... Bx.样例输出&#xff1a; 6思路分析&#xff1a; 这道题只需要在正常的广搜模板上多维护一个— —方向&#xff0c;如果当前改变方向&#xff0c;就坐标不变&#xff0c;方向变&#xff0c;步数加一&#xff1b;否则坐标变&#xff0c;方向不…

在使用《快递批量查询高手》时从TXT文本导入的快递单号出现乱码如何解决。

在日常 工作中&#xff0c;有没有单号用TXT 文档保存吗&#xff1f;那么没有出现这种情况呢&#xff0c;打开TXT文档进去看都是正常没有问题&#xff0c;一但导入软件中就出现乱码的&#xff1f;遇到这个种情况需要什么解决呢&#xff1f;小编今天就教 您一招解决好方法&#x…

Linux新手小程序——进度条

前言 目录 前言 需要先了解 1.\r和\n 2.缓冲区 一.理解字符的含义&#xff1a; 学习c语言时&#xff0c;我们可以粗略把字符分为可显字符和控制字符. 在按回车换到下一行开始的操作时&#xff0c;实际上是进行了两个操作&#xff1a;1.让光标跳到下一行&#xff08;只…

CSS3新增选择器(属性选择器、结构伪类选择器、伪元素选择器)

1 属性选择器 属性选择器&#xff08;[属性]&#xff09;可以根据元素的属性和属性值来对符合要求的元素进行选择。 属性选择器的基础语法如下表&#xff1a; 语法说明标签[属性] {}选择有目标属性的标签标签[属性"value"] {}选择有目标属性且属性值为"value…

iOS--通知、代理、单例模式总结

通知 概要 观察者和被观察者都无需知晓对方&#xff0c;只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类&#xff0c;从而调用该类的方法。并且在NSNotificationCenter中&#xff0c;观察者可以只订阅某一特定的通知&#xff0c;并对齐做出相应操作&#xf…

管理类联考——数学——记忆篇——不同角度解读——四、数据分析——1.计数原理/排列组合

计数原理 1.计数原理 1.1 加法原理、乘法原理 1.2 排列与排列数 1.3 组合与组合数 PS&#xff1a;图标说明 ⛲️&#xff1a;陈jian &#x1f475;&#xff1a;鑫quan &#x1f469;&#xff1a;张紫chao &#x1f482;&#xff1a;MBA大shi &#x1f63d;&#xff1a;海mian…

小程序UV:衡量用户规模与活跃度的重要指标

什么是UV UV是Unique Visitor&#xff08;独立访客&#xff09;的缩写&#xff0c;指的是在特定时间段内访问某个网站、应用或平台的独立用户数量。UV是根据设备、IP地址、Cookie等来识别不同的用户&#xff0c;对于相同的用户多次访问&#xff0c;只计算为一个UV。UV是衡量网…

linux判断端口是否占用(好用)

netstat 一般的话使用 netstat -tunlp | grep xxx参数作用-t指明显示TCP端口-u指明显示UDP端口-l仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)-p显示进程标识符和程序名称&#xff0c;每一个套接字/端口都属于一个程序。-n不进行…

随机数检测(五)

随机数检测&#xff08;五&#xff09;- 检测工具 1 检测规范2 检测量3 检测项目4 检测工具 1 检测规范 随机数检测应遵循GM/T 0005-2021和GM/T 0062-2018两个标准。 首先根据产品实际情况确定产品类型。 随机数检测量和检测项目可参考GM/T 0062-2018对不同类型产品的要求。不…