当前位置: 首页 > news >正文

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

在之前用过的马疝病数据集上应用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.0else:retArray[dataMatrix[:, dimen] > threshVal] = -1.0return retArray
def builsStump(dataArr,classLabels,D):dataMatrix=mat(dataArr)labelMat=mat(classLabels).Tm,n=shape(dataMatrix)numSteps=10.0bestStump={}bestClassEst=mat(zeros((m,1)))minError=inffor i in range(n):rangeMin=dataMatrix[:,i].min()rangeMax=dataMatrix[:,i].max()stepSize=(rangeMax-rangeMin)/numStepsfor 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*errArrif weightedError<minError:minError=weightedErrorbestClassEst=predictedVals.copy()bestStump['dim']=ibestStump['thresh']=threshValbestStump['ineq']=inequalreturn 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']=alphaweakClassArr.append(bestStump)#print('classEst:',classEst)#为下一次迭代计算Dexpon=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()/mprint('错误率:',errorRate)if errorRate==0.0:breakreturn weakClassArrdef 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']*classEstprint(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之间的不同数字,并重复上述过程,就会得到不同的错误率结果。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【EI会议征稿通知】第六届光电科学与材料国际学术会议 (ICOSM 2024)
  • Unity补完计划 之Tilemap
  • 白骑士的Matlab教学基础篇 1.2 MATLAB基础语法
  • 常见VPS服务器附加组件一览
  • 牛客JS题(二十五)Symbol
  • 【OpenCV C++20 学习笔记】给图片加边框-copyMakeBorder
  • Flink开发语言使用java还是Scala合适
  • C#中的Hangfire和Quartz.NET 任务调度的区别
  • Android 13修改蓝牙默认名称
  • 【计算机网络】[第二章][自用]
  • vue动态规则
  • 萌新的Java入门日记18
  • C++编程:使用Nanomsg实现高效的文件和图片传输
  • 2-56 基于matlab的图像融合增强技术
  • Java 设计模式之桥接模式(Bridge Pattern)
  • Angular数据绑定机制
  • Git的一些常用操作
  • JavaScript中的对象个人分享
  • JAVA并发编程--1.基础概念
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Node项目之评分系统(二)- 数据库设计
  • npx命令介绍
  • spark本地环境的搭建到运行第一个spark程序
  • SQLServer之创建显式事务
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 无服务器化是企业 IT 架构的未来吗?
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 阿里云服务器购买完整流程
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​插件化DPI在商用WIFI中的价值
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • ***检测工具之RKHunter AIDE
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net core Redis 使用有序集合实现延迟队列
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net core 依赖注入的基本用发
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net和jar包windows服务部署
  • .NET开发不可不知、不可不用的辅助类(一)
  • .Net中的设计模式——Factory Method模式
  • @DataRedisTest测试redis从未如此丝滑
  • [Android]使用Android打包Unity工程
  • [AR]Vumark(下一代条形码)
  • [ARM]ldr 和 adr 伪指令的区别
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5
  • [C#]使用C#部署yolov8的目标检测tensorrt模型
  • [C]编译和预处理详解
  • [EFI]ASUS Vivobook 16x M1603QA 电脑 Hackintosh 黑苹果efi引导文件