【Python机器学习】利用AdaBoost元算法提高分类性能——在数据集上应用AdaBoost

news2024/11/14 13:47:50

在之前用过的马疝病数据集上应用AdaBoost。

在一个难数据集上的AdaBoost应用步骤:

1、收集数据:提供的文本文件

2、准备数据:确保类别标签是+1河-1而不是1和0

3、分析数据:手工检查数据

4、训练算法:在数据上,利用adaBoostTrainDS()函数训练出一系列的分类器

5、测试算法:我们拥有两个数据集,在不采用随机抽样的方法下,我们对AdaBoost和Logistic回归的结果进行比较

6、使用算法:观察该例子上的错误率。

在完成上述步骤之前,要有一个向文件中加载数据的方法:

def loadDataSet(fileName):
    numFeat=len(open(fileName).readline().split('\t'))
    dataMat=[]
    labelMat=[]
    fr=open(fileName)
    for line in fr.readlines():
        lineArr=[]
        curLine=line.strip().split('\t')
        for i in range(numFeat-1):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

这里,不必要指定每个文件中的特征数目。函数能够自动检测出特征的数目,同时,该函数也假定最后一个特征是类别标签。

使用基于单层决策树的AdaBoost算法:

from numpy import *

def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
    retArray=ones((shape(dataMatrix)[0],1))
    if threshIneq=='lt':
        retArray[dataMatrix[:,dimen] <= threshVal] = -1.0
    else:
        retArray[dataMatrix[:, dimen] > threshVal] = -1.0
    return retArray
def builsStump(dataArr,classLabels,D):
    dataMatrix=mat(dataArr)
    labelMat=mat(classLabels).T
    m,n=shape(dataMatrix)
    numSteps=10.0
    bestStump={}
    bestClassEst=mat(zeros((m,1)))
    minError=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=mat(ones((m,1)))
                errArr[predictedVals==labelMat]=0
                #计算加权错误率
                weightedError=D.T*errArr
                if weightedError<minError:
                    minError=weightedError
                    bestClassEst=predictedVals.copy()
                    bestStump['dim']=i
                    bestStump['thresh']=threshVal
                    bestStump['ineq']=inequal
    return bestStump,minError,bestClassEst
def adaBoostTrainDS(dataArr,classLabels,numIt=40):
    weakClassArr=[]
    m=shape(dataArr)[0]
    D=mat(ones((m,1))/m)
    aggClassEst=mat(zeros((m,1)))
    for i in range(numIt):
        bestStump,error,classEst=builsStump(dataArr,classLabels,D)
        #print('D:',D.T)
        alpha=float(0.5*log((1.0-error)/max(error,1e-16)))
        bestStump['alpha']=alpha
        weakClassArr.append(bestStump)
        #print('classEst:',classEst)
        #为下一次迭代计算D
        expon=multiply(-1*alpha*mat(classLabels).T,classEst)
        D=multiply(D,exp(expon))
        D=D/D.sum()
        #错误率累加计算
        aggClassEst=aggClassEst+alpha*classEst
        #print('aggClassEst:',aggClassEst.T)
        aggErrors=multiply(sign(aggClassEst)!=mat(classLabels).T,ones((m,1)))
        errorRate=aggErrors.sum()/m
        print('错误率:',errorRate)
        if errorRate==0.0:
            break
    return weakClassArr

def adaClassify(datToClass,classifierArr):
    dataMatrix=mat(datToClass)
    m=shape(dataMatrix)[0]
    aggClassEst=mat(zeros((m,1)))
    for i in range(len(classifierArr)):
        classEst=stumpClassify(dataMatrix,classifierArr[i]['dim'],classifierArr[i]['thresh'],classifierArr[i]['ineq'])
        aggClassEst=aggClassEst+classifierArr[i]['alpha']*classEst
        print(aggClassEst)
    return sign(aggClassEst)

执行代码,计算错误率:

datArr,labelArr=loadDataSet('horseColicTraining2.txt')
classifierArray=adaBoostTrainDS(dataArr=datArr,classLabels=labelArr,numIt=10)
print(classifierArray)

testArr,testLabelArr=loadDataSet('horseColicTest2.txt')
prediction10=adaClassify(testArr,classifierArray)
errArr=mat(ones((67,1)))
print(errArr[prediction10!=mat(testLabelArr).T].sum())

将弱分类器的数目设定为1-10000之间的不同数字,并重复上述过程,就会得到不同的错误率结果。

可以看到,测试错误率在达到了一个最小值之后又开始上升。这类现象被称为过拟合(也称过学习)。

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

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

相关文章

java-面向对象综合练习

1、文字格斗回合制游戏 需求: 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#xff09;&#xff0c;这些信息就应该被确定下来。 举例&#xff1a; 程序运行之后结果为&#xff1a…

加密软件中的RSA和ECC的主要区别是什么

在加密软件中&#xff0c;RSA&#xff08;Rivest-Shamir-Adleman&#xff09;和ECC&#xff08;Elliptic Curve Cryptography&#xff0c;椭圆曲线密码学&#xff09;是两种广泛使用的非对称加密算法&#xff0c;它们之间存在多个关键区别。 1. 算法基础 RSA&#xff1a;基于大…

RPA+AI有什么应用?6大技术融合方向分析 | 实在RPA研究

随着数字化转型的加速&#xff0c;企业正寻求更高效、智能的方法来优化业务流程。机器人流程自动化&#xff08;RPA&#xff09;作为一种快速兴起的技术&#xff0c;已经证明了其在自动化重复性任务方面的能力。然而&#xff0c;当RPA与各种人工智能&#xff08;AI&#xff09;…

外部时钟传送带测量装置

外部时钟&传送带测量装置 1.外部时钟介绍2.循迹模块3.实操过程1.设置2.代码3.效果 链接: keysking-17 1.外部时钟介绍 将GPIO的外部电平接入即可对外部信号进行计数(PS&#xff1a;上面的内部时钟不是所谓的“高速内部时钟”&#xff0c;而是APB1的定时器分支)。当然,GPIO…

zabbix“专家坐诊”第250期问答

问题一 Q&#xff1a;乐维监控社区版监控交换机&#xff0c;能统计出端口的IP流量排名吗&#xff1f; A&#xff1a;社区版没有这个功能 &#xff0c;正式版&#xff0c;流量报表可以实现端口IP流量排行。 问题二 Q&#xff1a;我看了一下乐维有事件平台汇总的功能&#xff0…

浅谈逻辑控制器插件之jp@gc - Parameterized Controller

浅谈逻辑控制器插件之jpgc - Parameterized Controller jpgc - Parameterized Controller是JMeter的一个强大插件&#xff0c;由JMeter Plugins项目提供。此插件允许用户以更加灵活和动态的方式控制测试计划中的采样器执行逻辑。它通过引入参数化概念&#xff0c;使得单个控制…

【学术会议征稿】第四届电气工程与计算机技术国际学术会议(ICEECT2024)

第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09; 2024 4th International Conference on Electrical Engineering and Computer Technology 第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09;将于9月27日-29日在哈尔滨举…

汇编语言入门基础(概述)

目录 概述: 1.1 汇编语言与汇编指令 1.2 汇编语言编写程序的工作过程 1.3 数据的表示 1.4 计算机中的存储单元 1.5 计算机中的总线 1.5.1 三种总线 1.5.2 x86CPU性能一览 1.6 内存的读写与地址空间 1.6.1 CPU对存储器的读写 1.6.2 内存地址空间 1.6.3 内存地址空间…

linux虚拟机设置固定ip

修改/etc/sysconfig/network-scripts目录下ifcfg-eth0文件&#xff0c;各虚拟机这个文件名不一致&#xff0c;ifcfg-XX格式 vim /etc/sysconfig/network-scripts/ifcfg-eth0BOOTPROTO设置为static&#xff0c;然后在最后添加固定IP地址和默认网关、DNS等配置&#xff0c;IP地址…

学习笔记 韩顺平 零基础30天学会Java(2024.8.5)

P460 八大Wrapper类 黄色的父类是number&#xff0c;黑色的是自己独立的 P461 装箱和拆箱 手动装箱示例&#xff1a; int n1 100; Interger interger new Interger(n1);//或者&#xff1a;Interger interger Interger.valueOf(n1); 手动拆箱示例&#xff1a; int i interge…

SSM项目学习:用xml配置文件或注解开发实现控制反转和依赖注入

什么是SSM SSMSpring(Spring Framework)Spring MVC mybatis Spring Framework系统架构 Spring Framework学习线路 IoC(Inversion of Control)和DI(Dependency Injection) 他们解决的问题&#xff1a;代码耦合度高的问题&#xff0c;需要类自己new对象&#xff0c;修改部分代…

洗牌算法 和 杨辉三角

目录 一、洗牌算法 1.1 Poker 1.2 PokerBox 1.3 Test 二、杨辉三角 一、洗牌算法 【业务需求】&#xff1a; 第一步&#xff1a;生成52张牌&#xff0c;没有大小王&#xff0c;一共四种花色({"♠", "♥", "♣", "♦")&#xff0c…

爬虫中使用多进程、多线程的混合方式遇到的数据丢失问题

项目场景&#xff1a; 网络爬虫项目&#xff0c;主要实现多进程、多线程方式快速缓存网页资源到MongoDB&#xff0c;并解析网页数据&#xff0c;将信息写入到csv文件中。 问题描述 在单独使用多线程的过程中&#xff0c;是没有问题的&#xff0c;比如这个爬虫示例是爬取豆瓣电…

成都云飞浩容文化传媒有限公司共绘电商服务新蓝图

在这个日新月异的电商时代&#xff0c;每一家企业都渴望在浩瀚的互联网海洋中脱颖而出&#xff0c;实现品牌的飞跃式增长。而在这场没有硝烟的战争中&#xff0c;专业的电商服务成为了企业破局的关键。成都云飞浩容文化传媒有限公司&#xff0c;作为电商服务领域的佼佼者&#…

(ABC三题完整内容)2024年华数杯大学生数学建模竞赛解题思路完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

【mars3d】加载超图s3m模型说明

建议替换Cesium库&#xff0c;换成 超图版本Cesium mars3d mars3d-supermap &#xff0c;需要引入的资源为&#xff1a; "mars3d": ["Cesium-supermap/Widgets/widgets.css", //超图版本Cesium "Cesium-supermap/Cesium.js","mars3d/plu…

vue使用响应式API和页面组件ref相同名称问题

最近在使用vue3vite学习前端的东西。在学习form表单时发现&#xff0c;<el-form>里面的<el-input>绑定数据时&#xff0c;页面输入框在键盘输入之后没有反应&#xff0c;每次只能输入一各字母。 <template><div class"login-container"><…

电子产品CE认证标准以及欧盟需要做的认证有哪些?

​一、家电产品GB质检报告测试内容有哪些&#xff1f; 1.家用电器的测试内容包括预检测和测试 预检测是指在测试之前判定产品是否符合标准要求的检查&#xff0c;主要包括以下三个方面&#xff1a; 1.1产品铭牌、使用的标志、说明书检查 1.2产品的外观及内部结构检查 1.3产品…

Java程序员接单分享

作为一名Java程序员&#xff0c;这阵子通过承接些小型项目&#xff0c;我顺利跨过了月薪破万的门槛。这些项目虽小&#xff0c;却如同磨刀石般&#xff0c;让我在实战中发现了自身技术栈的棱角与不足&#xff0c;尤其是意识到了在Java这一浩瀚技术海洋中的诸多未知领域。我深知…

Python 爬虫项目实战(六):爬取大众点评商家数据

前言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网页蜘蛛&#xff08;Web Spider&#xff09;或网页机器人&#xff08;Web Bot&#xff09;&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…