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


集成学习之Adaboost(提升方法)相关推荐

  1. 集成学习和随机森林方法

    集成学习和随机森林方法 介绍 本次实验介绍了集成学习的概念及主要方法,包括 Bootstraping.Bagging.随机森林,随后计算随机森林中各个特征的重要性,找出对模型贡献较大的特征. 知识点 ...

  2. 集成学习之Adaboost

    集成学习之Adaboost 时间:2022/6/13 文章目录 集成学习之Adaboost 1.集成学习 1.1学习器 1.2集成学习算法 1.3学习器的选择 2.AdaBoost 2.1Boosti ...

  3. 04 集成学习 - Boosting - AdaBoost算法构建

    03 集成学习 - Boosting - AdaBoost算法原理 十.AdaBoost算法构建 上一章最后说明了每个基模型的权值α是如何求得的,于是我就可以对模型进行更新操作了. 构建过程一 1.假 ...

  4. EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略

    EL之AdaBoost:集成学习之AdaBoost算法的简介.应用.经典案例之详细攻略 目录 AdaBoost算法的简介 1.理解AdaBoost算法 1.1.从前向逐步递增角度来看理解AdaBoos ...

  5. 【机器学习】集成学习与模型融合方法举例

    [机器学习]集成学习与模型融合方法举例 文章目录 1 概述1.1 什么是集成学习 2 CrossValidation 交叉验证 3 stacking 4 Voting投票器 5 Bagging 1 概 ...

  6. 机器学习的几种方法(knn,逻辑回归,SVM,决策树,随机森林,极限随机树,集成学习,Adaboost,GBDT)

     一.判别模式与生成模型基础知识 举例:要确定一个瓜是好瓜还是坏瓜,用判别模型的方法是从历史数据中学习到模型,然后通过提取这个瓜的特征来预测出这只瓜是好瓜的概率,是坏瓜的概率. 举例:利用生成模型是根 ...

  7. 监督学习 | 集成学习 之AdaBoost、梯度提升及Slearn实现

    文章目录 Boosting 1. AdaBoost 1.1 AdaBoost 原理 1.2 Python 实现 1.3 Sklearn 实现 2. 梯度提升 2.1 梯度提升回归树(GBRT) 2.1 ...

  8. 【机器学习】集成学习之梯度提升树GBDT

    Boosting方法的核心思想是对错分类的样本给予更高关注度,也就是样本权重,在提升树中与之对应的就是残差,在梯度提升树中就是梯度了. Regression Decision Tree:回归树 回归树 ...

  9. 基于 Java 机器学习自学笔记 (第63-65天:集成学习之AdaBoost)

    注意:本篇为50天后的Java自学笔记扩充,内容不再是基础数据结构内容而是机器学习中的各种经典算法.这部分博客更侧重于笔记以方便自己的理解,自我知识的输出明显减少,若有错误欢迎指正! 目录 一.关于集 ...

最新文章

  1. SSE3和SSSE3 Intrinsics各函数介绍
  2. how can a model method trigger binding value refreshed
  3. GoogLeNet的心路历程(二)
  4. Android开发环境搭建与入门Hello World
  5. 【Spring】jpa数据库表实体命名规则 Unknown column ‘user0_.create_time‘ in ‘field list‘
  6. 发光二极管pcb封装图画法_【AD封装】PH2.0座子插件贴片(带3D)
  7. 设计模式之—工厂方法模式
  8. Java基础:接口多态的综合案例 —— 笔记本电脑
  9. 网站备案 应该找域名商还是空间商备案
  10. 华为OD机试真题目录(Java JavaScript)
  11. 关于错误“未能加载文件或程序集”的错误的若干处理办法——对GAC的简单应用
  12. 大数据在职研究生哪个好_大数据在职研究生
  13. 笔记本电脑wlan+开启移动热点+手机转圈圈【已解决】
  14. 2021必看,今日教学:RestTemplate-结合-Ribbon-使用
  15. 11月微博博客日均覆盖数TOP10:网易博客升至第七
  16. SQL语句 SQL Server(代码添加约束:主键约束,外键约束,默认值约束,check约束,规则约束)
  17. [Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述
  18. 华为2020校招软件开发岗全流程,已签约
  19. ES6——super关键字
  20. iphone UINavigationController使用的一些技巧

热门文章

  1. github上成员贡献量_真祖传代码!你的GitHub代码已打包运往北极,传给1000年后人类...
  2. win7系统丢失文件的处理方法
  3. Chrome浏览器如何安装与使用PDFViewer扩展程序
  4. QQ浏览器如何修改截屏快捷键?QQ浏览器修改截屏快捷键的方法
  5. mac下终端命令行下添加mysql命令
  6. SpringBoot——slf4j+logback日志处理及配置详解
  7. 编写并调试一个单道处理系统的作业调度模拟程序_操作系统系列(2):操作系统发展历史...
  8. python对字符串数组进行排序、依据字符数_Python进行数据的排序以及字符串的操作...
  9. 15 - java 继承
  10. centos安装mysql卡住_CentOS 6.4安装MySQL的过程中出现的bug