集成算法——Adaboost代码

     集成算法是我们将不同的分类器组合起来,而这种组合结果就被称为集成方法或者是元算法。使用集成方法时会有多种形式:可以是不同算法的集成,也可以是同意算法在不同设置下的集成,还可以是数据集不同部分分配给不同分类器之后的集成。

两种形式:

bagging方法:从原始数据集选择S次后得到S个新数据集,之后将某个学习算法分别作用于数据集,就得到了S个分类器,在对新的数据集进行分类时,使用这些分类器进行分类,同时,选择分类器投票结果中最多的类别作为最后的分类结果。不同的分类器是通过串行训练而获得的,每个新分类器都根据已训练出来的分类器的性能来进行训练。分类器的权重是相等的。

例子:随机森林

boosting方法:使用多个分类器,它是通过集中关注被已有分类器错分的那些数据来获得新的分类器,boosting分类的结果是基于所有分类器的加权求和结果的,权重不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。

例子:Adaboost,GBDT

AdaBoost的思想:

    1.训练数据中的每一个样本,并赋予一个权重,初始化为相等值,这些权重构成了向量D

    2.首先在训练数据上训练出一个弱分类器并计算该分类器的错误率,然后在同一个数据集上再次训练弱分类器。在分类器的第     二次训练中,将会重新调整每个样本的权重。其中第一次分对的样本的权重会降低,而第一次分错的样本的权重会提高。

    3.为了从所有弱分类器中得到最终的分类结果,Adaboost为每个分类器分配了一个权重alpha,这些alpha值是基于每个弱分类器的错误率进行的

                               

4.计算出alpha值后,可以对权重向量D进行更新,以使得那些正确分类的样本的权重降低而错分样本的权重升高。

 正确分类:


错误分类:


计算出D之后,在进行下一轮的迭代,会不断地重复训练和调整权重的过程,直到训练集错误率为0或者是弱分类器的数目达到用户的指定值为止。

代码实现:

import numpy as np
import matplotlib.pyplot as plt
def loadSimpData():dataMat=np.matrix([[1.,2.1],[1.5,1.6],[1.3,1.],[1.,1.],[2.,1.]])classLabels=[1.0 , 1.0 , -1.0 ,-1.0 ,1.0]return dataMat,classLabels
#数组过滤  将数据分成正好相反的两类
def  stumpClassify(dataMatrix,dimen,threshVal,threshIneq): # dimen特征值  threshVal 阈值  threshIneq 代表是lt或者是gtretArray=np.ones((np.shape(dataMatrix)[0],1))  #数组元素全部设置为1if threshIneq=='lt':retArray[dataMatrix[:,dimen]<= threshVal]=-1.0else:retArray[dataMatrix[:,dimen]> threshVal]=-1.0return retArray

构建单层决策树,找到错误率最小的特征和索引

def buildStump(dataArr, classLabels,D): #最佳基于数据的权重向量D来定义的dataMatrix=np.mat(dataArr);labelMat=np.mat(classLabels).Tm,n=np.shape(dataMatrix)numSteps=10.0;bestStump={};bestClasEst= np.mat(np.zeros((m,1)))  #bestStump空字典minError = float('inf');#初始化为无穷大,之后用于寻找可能的最小的错误率 for i in range(n):#所有的特征上进行遍历# 计算出最大的步长rangeMin = dataMatrix[:,i].min();rangeMax = dataMatrix[:,i].max()stepSize = (rangeMax-rangeMin)/numSteps #最大的步长#for j in range(-1,int(numSteps)+1):#大于或小于阈值的for inequal in ['lt','gt']:threshVal=(rangeMin+float(j)*stepSize) #阈值的计算predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#计算加权错误率errArr= np.mat(np.ones((m,1)))errArr[predictedVals== labelMat]=0weightedError=D.T*errArr  print("split:dim %d, thresh %.2f ,thresh ineqal : %s, the weighted error is %.3f" % (i, threshVal,inequal,weightedError))# inequal 类型if weightedError<minError:minError = weightedErrorbestClasEat = predictedVals.copy()bestStump['dim']=ibestStump['thresh']=threshValbestStump['ineq']=inequalreturn bestStump,minError,bestClasEat
首先第一次训练计算出该分类器的错误率,然后继续训练,调整权重,
def adaBoostTrains(dataArr,classLabels,numIt=40):weakClassArr = []m=np.shape(dataArr)[0]D=np.mat(np.ones((m,1))/m)aggClassEst=np.mat(np.zeros((m,1)))for i in range (numIt):#利用buildStump()找到最佳的单层决策树bestStump,error,classEst = buildStump(dataArr,classLabels,D) #D 权重print("D: ",D.T)alpha=float(0.5*np.log((1.0-error)/max(error,1e-16)))  #alpha公式 1e是科学计数法   max确保在没有错误时除以0不会溢出bestStump['alpha']=alphaweakClassArr.append(bestStump)#  转化为listprint("classEst:", classEst.T) #特征#权重的分布expon=np.multiply(-1*alpha*np.mat(classLabels).T,classEst)#如果分对了,则同号,分错了异号,正好对应公式D=np.multiply(D,np.exp(expon))D=D/D.sum()   #  ai*yiaggClassEst += alpha*classEstprint("aggClassEst :" ,aggClassEst.T)#  sign将aggClassEst转化为[1,-1.....]的m*1的矩阵,再与特征矩阵对比,得出[1,0....],其中1为错误分类,转置之后与ones相乘得到错误分类的个数aggErrors=np.multiply(np.sign(aggClassEst)!= np.mat(classLabels).T,np.ones((m,1)))#计算错误率errorRate = aggErrors.sum()/mprint("total error:",errorRate,"\n")if errorRate == 0.0 :breakreturn weakClassArr
dataArr,classLabels=loadSimpData()
weakClassArr,aggClassEst = adaBoostTrains(dataArr,classLabels)
print(weakClassArr)
print(aggClassEst)

输出结果:





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

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

相关文章

年终抽奖来了

时间很快&#xff0c;2020年已经到了12月份&#xff0c;我从2018年开始写公众号&#xff0c;经过了快两年是时间&#xff0c;我收获了4万的读者&#xff0c;非常开心。我自己是一个挺逗逼的人&#xff0c;而且我写公众号并不觉得我比别人厉害&#xff0c;技术上我真的就是一个很…

嵌入式 Linux下永久生效环境变量bashrc

作者&#xff1a;skdkjxy原文&#xff1a;http://blog.sina.com.cn/s/blog_8795b0970101f1f9.html.bashrc文件 在linux系统普通用户目录&#xff08;cd /home/xxx&#xff09;或root用户目录&#xff08;cd /root&#xff09;下&#xff0c;用指令ls -al可以看到4个隐藏文件&am…

回归分析——线性回归

机器学习中&#xff0c;对于离散的数据可以做分类问题&#xff0c;那对于连续的数据就是做回归问题&#xff0c;这里对一元线性回归和多元线性回归做一个简介&#xff0c;帮组理解。回归分析&#xff1a;从一组样本数据出发&#xff0c;确定变量之间的数学关系式&#xff0c;对…

编译原理(五)自底向上分析之算符优先分析法

自底向上分析之算符优先分析法 说明&#xff1a;以老师PPT为标准&#xff0c;借鉴部分教材内容&#xff0c;AlvinZH学习笔记。 基本过程 1. 一般方法&#xff1a;采用自左向右地扫描和分析输入串&#xff0c;从输入符号串开始&#xff0c;通过反复查找当前句型的句柄&#xff0…

做Android开发,要清楚init.rc里面的东西

init.rc 复习看这个之前&#xff0c;先看看大神总结的文章这篇文章总结的非常到位&#xff0c;但是因为代码不是最新的Android版本&#xff0c;对我们最新的Android版本不适用。http://gityuan.com/2016/02/05/android-init/#init rc文件拷贝拷贝其实也就是把文件放到机器的某个…

宏比较值,坑的一B

昨晚上&#xff0c;我准备睡觉&#xff0c;连总给我发了一段代码#include "stdio.h"#define MAX_MACRO(a, b) ((a) > (b) ? (a) : (b)) int MAX_FUNC(int a, int b) {return ((a) > (b) ? (a) : (b)); }int main() {unsigned int a 1;int b -1;printf(&quo…

Linux下Samba服务器搭建

linux文件共享之samba服务器 ——ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 关闭LINUX防火墙命令&#xff1a; #ufwdisable 然后就在windows下ping一下linux的IP&#xff0c;如果能ping通&#xff0c;就可以继续下面的内容&#xff0c;如果p…

搞懂C++为什么难学,看这篇就够了!

学C能干什么&#xff1f; 往细了说&#xff0c;后端、客户端、游戏引擎开发以及人工智能领域都需要它。往大了说&#xff0c;构成一个工程师核心能力的东西&#xff0c;都在C里。跟面向对象型的语言相比&#xff0c;C是一门非常考验技术想象力的编程语言&#xff0c;因此学习起…

看图学源码之FutureTask

RunnableFuture 源码学习&#xff1a; 成员变量 任务的运行状态的转化 package java.util.concurrent; import java.util.concurrent.locks.LockSupport;/**可取消的异步计算。该类提供了Future的基本实现&#xff0c;包括启动和取消计算的方法&#xff0c;查询计算是否完成以…

单片机的引脚,你都清楚吗?

第1课&#xff1a;单片机简叙1.单片机可以做什么&#xff1f;目前单片机渗透到我们生活的各个领域&#xff0c;几乎很难找到哪个领域没有单片机的踪迹。小到电话&#xff0c;玩具&#xff0c;手机&#xff0c;各类刷卡机&#xff0c;电脑键盘&#xff0c;彩电&#xff0c;冰箱&…

Graphviz的安装及纠错

在Anaconda Prompt里边输入conda install graphviz 安装成功之后输入pip install graphviz 它会提示成功安装。 启动 Jupyter Notebook &#xff0c;在文件里边输入 import graphviz 测试&#xff0c;如果没有报错证明&#xff0c;模块安装成功&#xff0c;但是在运行程序…

sklearn——决策树

总结sklearn决策树的使用&#xff0c;方便以后查阅。1.分类决策树 &#xff08;基于CART树&#xff09; 原型&#xff1a;参数&#xff1a;2、回归分类树 原型&#xff1a;参数&#xff1a;3、export_graphviz 当训练完毕一颗决策树时&#xff0c;可以通过sklearn.tree.expor…

Linux下SVN服务器的搭建

Linux下SVN服务器的搭建 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、下载工具&#xff08;下载地址&#xff1a;&#xff09; subversion-1.6.1.tar.gz subversion-deps-1.6.1.tar.gz 2、解压两个包&#xff1a; a) tar -xzvf subvers…

记一次解决问题的掉坑过程

这两天在调试一个音频ADC 芯片&#xff0c;也是之前的项目&#xff0c;但是一直调不出来&#xff0c;我发现我总是在这样的问题上纠结很久&#xff0c;以前踩过的坑后面照样会踩&#xff0c;只不过踩完会迅速把脚拉出来继续前进&#xff0c;我经常听到有人说「做嵌入式真的太容…

sklearn——AdaBoost应用

选自《python大战机器学习》

面试常见的C语言字符串操作

#字符串倒序输出实现逻辑&#xff0c;通过strlen获取字符串长度&#xff0c;然后通过 len/2 进行交叉赋值&#xff0c;这里需要注意&#xff0c;不需要考虑len是奇数还是偶数的问题。如果len是奇数&#xff0c;最后一个字符就不需要倒序&#xff0c;如果是偶数&#xff0c;最后…

HttpHandler:给指定路径下的图片添加水印显示

圣诞节&#xff0c;25日&#xff0c;要交ACCP5.0认证的项目&#xff0c;其中有这样一个要求&#xff1a;书店的所有图书的封面放在了\images\convers\下面&#xff0c;要求所有引用这一路径下的图片都添加书店的店名水印图片。就是说拦截Http请求了&#xff0c;自然想到HttpHan…

Linux 下的复制命令,这几个比较靠谱

平时我们使用Linux复制命令的时候&#xff0c;一般使用 cp命令&#xff0c;但是cp 命令性能比较令人担忧使用tar 命令来拷贝大量文件通过对比下面的几个命令&#xff0c;在拷贝比较多而且比较大的文件的话&#xff0c;用git clone 比较靠谱&#xff0c;特别是复制代码库&#x…

Mendeley文献管理软件使用介绍

<!DOCTYPE html>New DocumentMendeley 是一款免费的跨平台文献管理软件&#xff0c;同时也是一个在线的学术社交网络平台。Mendeley 对 PDF、Bibtex 的支持非常好&#xff0c;可以直接导出 Bibtex 格式&#xff0c;还可以直接导入zotero数据库&#xff0c;决定了其兼容性…

过拟合问题——正则化方法

看了很多资料&#xff0c;本身想放一个正则化的概念的&#xff0c;实在不敢放&#xff0c;怕吓跑一堆人&#xff0c;所以&#xff0c;将就吧。首先&#xff0c;我们知道正则化&#xff08;Regularization&#xff09;是解决过拟合问题的&#xff0c;简单来说&#xff0c;过拟合…