集成学习之Adaboost(提升方法)

Adaboost

提升方法就是从弱学习器出发,反复学习,得到一系列弱分类器(基本分类器),然后组合这些弱分类器,构成一个强分类器。

基本思路

待解决问题

1、每一轮如何改变训练数据的权值或概率分布
2、如何将弱分类器组合成强分类器

解决方法

1、高低赋权:提高在前一轮分类中分类错误的样本的权值,降低分类正确的样本的权值(分类问题被一系列弱分类器“分而治之”)
2、加权多数表决:加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用。(因为Adaboost最终目标就是要提高分类效率,分类误差率低作用就好,因此要提高其在整个系统中的权值)

*弱分类器采用串联的形式,后一轮的演变与前一轮的训练结果紧密相关。

Adaboost算法

以二分类训练数据集为例 ,每个样本由实例和标记组成,T={(x~i~, y~i~)} x属于Rn,y属于{1, -1}

步骤

在这里插入图片描述在这里插入图片描述
(2)(a)中I函数表示指数函数,当括号内为True时,输出为1否则输出为0,所以整个et可以理解为所有被分类器误分类的样本占所有样本的比例,即该分类器的出错率。值得强调的一点是,由于第一轮所有样本的权重相同,所以et就是出错率,但是随着新一轮的测试的进行,就要开始调节权重,即前文所提到的高低赋权,着重调高被误分类的样本的权值,调低被正确分类的样本的权值。
此外et=∑P(Ht(xi)≠yi)(被G误分类样本的权值之和)
(b)中的at表示各基本分类器在最终分类器的线性组合中的重要性,因为et是分类错误率,一旦分类错误率大于1/2,那么它对应基本分类器的分类性能就比较弱,分类效果还不如瞎猜的好,那么当错误率小于等于1/2的时候,at>0,而且log函数是一个随着et减小而增大的函数,那么它在最终分类器中的作用就比较强,即分类误差率越小的基本分类器在最终分类器中的作用越大。
©对新一轮权值的更新,误分类样本的权值得到扩大,正确分类的样本权值减小,因为分子位置 会随着正误分类指数的位置为正或负,若指数位置为正的时候相比于负对最终结果影响会大。
在这里插入图片描述
at之和并不为1.其中sign为符号函数,最终结果取决于所有分类器的分类结果,少数服从多数。

import pdb
import numpy as np
import operator
import math
def dataset():data=[0,1,2,3,4,5,6,7,8,9]labels=[1,1,1,-1,-1,-1,1,1,1,-1]return data,labels
def mytree(data,label,D1):    #生成最优决策树,D是权值point=(np.array(data[:-1])+np.array(data[1:]))/2   #取data中相邻两者之间的平均值#结果:array([0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5])一共有九个划分点dic={}sign={}for i in point:      #遍历分割点predict1=np.array(data<i)       #判断分割点左边为1 生成[true,false]predict1=(predict1+0)+(predict1-1)    #将true和false结果转换为[1,-1] predict=[0,1]  2*predict-1=[1,-1]result1=sum(abs(predict1-label)/2*D1)  #误差predict2 = np.array(data > i)    #判断右边为1predict2 = (predict2 + 0) + (predict2 - 1) result2 = sum(abs(predict2 - label) / 2 * D1)  #误差em   abs函数是取绝对值   当predict和label相同的时候被抵消,相异的时候变成原来的二倍if  result1<=result2:   #保存符号和左右边哪个结果更好dic[i]=result1sign[i]='<'else:dic[i]=result2sign[i]='>'bestpoint = sorted(dic.items(),key=operator.itemgetter(1))   #对dic列表排序,以item中的第二个元素为索引键,即value#返回一个可调用对象,用于从运算对象中获取元素,其实是采用运算对象的_getitem_()方法。如果指定了多个项目,返回一个元组形式。return bestpoint[0],sign[bestpoint[0][0]]   # bestpoint表示返回列表第一位元素,即错误率最低的元素,sign对象index是i,value是‘<’或者>
def Zm1(label,Gm,a,D1):   #返回当前样本的权重 D1是一个1*10的矩阵sum=0for i in range(len(label)): #label长度为10sum+=D1[i]*math.e**(-a*label[i]*Gm[i]) #sum就是归一化因子newD1=[]  #创建对象,用来存储新一轮各训练数据的权重for i in range(len(label)):w=D1[i]/sum*math.e**(-a*label[i]*Gm[i])newD1.append(w)return newD1
def adaboot1():data,label=dataset()           #获取数据集和标签文件 D1=[1/len(data)]*len(data)     #求每一个样本的初始权重,0.1bestpoint=[]                   #保存目前最佳的分割点besta=[]                       #保存每一棵基决策树对应的权重signall=[]                       #保存每一个最佳分割点对应的符号(大于或小于)result=[]                         #保存每个基决策树对样本分类的结果for i in range(20):ht,sign=mytree(data,label,D1)#???当前最好的树 ,ht是每棵树最终选好的emprint(ht)signall.append(sign)            #保依次存记号bestpoint.append(ht[0])         #保存当前最佳分割点  ht表示bestpoint列表中的两个内容。一个是划分点一个是错误率。if sign==str('>'):Gm= np.array(data > ht[0])    Gm = (Gm+0) + (Gm-1)else:Gm= np.array(data < ht[0])Gm = (Gm+ 0) + (Gm- 1)       #样本代入树中得到当前样本结果a=0.5*(math.log((1-ht[1])/ht[1]))    # 通过误差计算得到基决策树权值besta.append(a)              # 依次保存每棵基决策树对应的权重。result.append(Gm)            #依次保存每个基分类器D1=Zm1(label,Gm,a,D1)                #计算得到每个样本点的权值sum1=[0]*len(data)              # [0]此时是一个int类型,len(data)个int组成sub数组,list类型. print(len(result),len(besta))                                #sum变成list类型 ,输出形式:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]for i in range(len(result)):   #以下循环计算当前结果是否达到最优sum1+=result[i]*besta[i]#result=w1f(x1)+w2f(x2)+..print(sum1)sum1 = np.array(sum1>=0)      sum1 = (sum1 + 0) + (sum1- 1)   if sum(sum1==label)==len(data):    #如果结果相等,则输出以下语句 ,最终误分类点为零个,完成整个建模过程print("一种生成{}棵基函数".format(len(result)))for i in range(len(result)): #result长度为3,要循环3次dic = {}   #创建对象print ("第{}棵决策树是".format(i+1))  #i+1精度加一if signall[i]==str('>'):       #如果最佳分割点对应的符号是‘>’dic['num'+'>' + str(bestpoint[i])]=1    dic['num'+'<' + str(bestpoint[i])] = -1if signall[i] == str('<'):dic['num'+'<' + str(bestpoint[i])] = 1dic['num'+'>' + str(bestpoint[i])] = -1print(dic)print ("权值是{}".format(besta[i]))print()break
adaboot1()在这里插入代码片

代码借鉴https://blog.csdn.net/qq_37960402/article/details/88539253


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

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

相关文章

93没有了_杭州1米93程序员征婚贴火了!年薪50万,孩子随妈姓,没有皇位要继承...

文丨三秋桂子自从二胎政策开放以来&#xff0c;很多宝妈都希望二宝能随自己姓&#xff0c;但有些男方家庭却不同意&#xff0c;双方就孩子的“冠名权”一事争论不休。可最近有位小伙却因为征婚贴火了&#xff0c;原因有两个&#xff0c;一是小伙瞩目的身高&#xff0c;二是小伙…

李航《统计学习方法》之HMM隐马尔可夫模型

李航《统计学习方法》之HMM隐马尔可夫模型 文章目录前言一、基本概念1、语言描述&#xff1a;2、符号表示3、基本假设4、例子5、隐马尔可夫模型解决的三个基本问题二、概率计算算法1、向前算法算法&#xff1a;例题2、向后算法三、学习算法1、监督学习算法背景方法2、无监督学习…

6000毫安以上智能手机_展望2021年智能手机市场:这5大技术要爆发

2020年是极不平凡的一年&#xff0c;在黑天鹅、政治动荡等事件的冲击下&#xff0c;许多行业都按下了暂停键&#xff0c;智能手机行业自然也不例外。销售渠道受阻、供应链生产紧张&#xff0c;导致智能手机市场整体出货量呈现持续下跌的状况&#xff0c;严峻的市场行情让智能手…

无监督学习之聚类方法(K-Means、层次聚类)

一、导入 无监督学习中需要对无标记样本进行训练学习进而找到数据的内在性质和逻辑结构&#xff0c;聚类方法是为了为无监督学习的数据分析提供的基础学习方法。 聚类将数据集划分为若干个子集&#xff08;每个子集称为类或者簇&#xff09;&#xff0c;如果一个样本只属于一个…

js调用python接口_JavaScript如何调用Python后端服务

欢迎关注【无量测试之道】公众号&#xff0c;回复【领取资源】, Python编程学习资源干货、 PythonAppium框架APP的UI自动化、 PythonSelenium框架Web的UI自动化、 PythonUnittest框架API自动化、 资源和代码 免费送啦~ 文章下方有公众号二维码&#xff0c;可直接微信扫一扫关注…

详细地图_一目了然:蒙城学区划分详细地图

从明天(8月5日)起&#xff0c;小学一年级&#xff0c;初中一年级可在网上注册、报名了。根据区域内适龄学生人数、学校分布、学校规模、班额规定、交通状况等因素&#xff0c;以街道、路段、门牌号、居住小区、村组等构成要件&#xff0c;按照确保公平和免试就近入学的原则&…

奇异值分解SVD(证明全部省略)

SVD知识梳理一、引入二、SVD的定义、性质定义例题奇异值分解一定存在紧奇异值分解和截断奇异值分解几何解释三、SVD算法计算过程四、SVD与矩阵近似五、python实现六、应用一、引入 主成分分析PCA、潜在语义分析都会用到SVD 不要求A矩阵是方阵&#xff0c;SVD是线性代数中相似对…

jq 比较两个时间是否在同一天_jq: 属性-class

.aadClass() 添加class用法和前面的text方法一样&#xff0c;可以传字符串&#xff0c;可以传函数。值用空格隔开可以增加多个class<.removeClass() 移出class值<他们在一起也可以链式调用。链式调用: 取值的时候返回return结果&#xff0c;赋值返回this,表示可以继续调用…

李航《统计学习方法》之EM算法及其推广

EM算法是一种迭代方法&#xff0c;可以看作用坐标下降法来最大化对数似然估计下界的过程。 一、引入 &#xff08;一&#xff09;算法介绍 1、例题 有三枚硬币&#xff0c;ABC他们出现正面的概率分别是Π&#xff0c;p和q。进行如下投掷实验&#xff1a;先投掷A&#xff0c…

获取选中_【字节】如何实现选中复制的功能

Barnett Demesne公园中在白雪覆盖的山坡上玩耍的一家&#xff0c;北爱尔兰贝尔法斯特(© Stephen Barnes/Alamy)本题摘自于我 github 上的面试每日一题&#xff1a;https://q.shanyue.tech&#xff0c;并有大厂面经及内推信息&#xff0c;可在左下角打开本题原文链接在一些…

c语言 bool_程序的数据要放到哪里呢?|C语言第二篇

在C语言第一篇里我写到了编译器&#xff0c;在这里补充一个点&#xff0c;文本编辑器&#xff0c;编译器&#xff0c;IDE(集成开发环境)的区别。文本编辑器是用作编写普通文字的应用软件&#xff0c;如window的记事本&#xff0c;atom&#xff0c;sublime&#xff0c;它常用来编…

项目职责_项目经理的9个职责

虽说懂技术是项目经理的一个必要项&#xff0c;但事实上&#xff0c;很多技术出身的人&#xff0c;根本干不好项目经理。当项目经理之前&#xff0c;是活儿管你&#xff0c;让你干什么你就干什么&#xff0c;只对任务结果负责&#xff0c;对整体目标不负责。当项目经理之后&…

jenkins 安装插件失败_Jenkins 自动化安装插件

手工安装 Jenkins 插件的方法通常&#xff0c;我们有两种方法安装 Jenkins 插件。第一种方法是到 Jenkins 插件管理页面搜索插件&#xff0c;然后安装。第二种方法是上传 Jenkins 插件的 hpi 文件安装。这两种方法能满足大多数人的需求。第一种方法&#xff0c;如下图所示&…

anaconda下python中matplotlib画图无法显示中文

第一步&#xff1a;在自己电脑里选择喜欢的字体&#xff0c;搜索位置为C:\Windows\Fonts&#xff0c;我选择的是SimSun 第二步 查找Matplotlib默认字体目录 打开anaconda prompt,输入python&#xff0c;接下来进入查找过程 查找代码如下 import matplotlib print(matplotlib.…

Python编程及高级数据分析

一、介绍&#xff08;11月22日&#xff09; 小问题找函数 大问题找包 python数据分析常用的包 数据库实现的功能的在panda包里面找 其中M\S\P是数据可视化工具 深度学习使用的包是pytorch(facebook支持) 中文的nlp&#xff1a;Jieba、pynlpir 英文的nlp:NLTK 学python前的准…

helm安装_Helm部署和体验jenkins

运行在Kubernetes上的Jenkins下图来自rancher官方博客&#xff0c;在kubernetes环境下&#xff0c;jenkins任务被交给各个pod执行&#xff0c;这些pod在需要时被创建&#xff0c;任务结束后被销毁&#xff0c;这样既能合理利用资源&#xff0c;又能给每个任务提供一致的干净的初…

【无标题】【一周安全资讯1223】一图读懂《工业和信息化部办公厅关于组织开展网络安全保险服务试点工作的通知》;15亿条纽约房产记录泄露

要闻速览 1、一图读懂《工业和信息化部办公厅关于组织开展网络安全保险服务试点工作的通知》 2、国家数据局《“数据要素”三年行动计划 (2024—2026年)》公开征求意见 3、中国信息通信研究院发布《公共数据授权运营发展洞察 (2023年)》 4、15亿条纽约房产记录泄露&#xff0c…

自定义键盘码_无线+矮轴≤299?ikbc S200 2.4G 机械键盘测评

早在18年初&#xff0c;Cherry就发布了适用于笔记本及超薄键盘的全新轴体MX Low Profile&#xff0c;也就是为人所熟知的“矮轴”。之后Ducky、酷冷至尊、FILCO、ikbc等一众厂商也先后推出了搭载Cherry矮轴的超薄机械键盘&#xff0c;不过市场表现一直有些不温不火。在码呆看来…

simpledateformat格式_如何使用SimpleDateFormat?

SimpleDateFormat是一种比较常用的时间类&#xff0c;可以实现对时间按照一定的字符串格式进行处理。DateFormat类的作用把时间对象转化成指定格式的字符串。反之&#xff0c;把指定格式的字符串转化成时间对象。DateFormat是一个抽象类&#xff0c;一般使用它的的子类SimpleDa…

李沐老师的《动手学深度学习PyTorch》中的d2lzh_python包的安装

关于RNN章节 以及模型章节等会使用到d2l的python包 cmd下载地址&#xff1a;pip install d2l -i https://pypi.doubanio.com/simple/