《机器学习实战》学习笔记第七章 —— AdaBoost元算法
主要内容:
一.提升方法与AdaBoost算法的简介
二.AdaBoost算法
三.代码解释
一.提升方法与AdaBoost算法的简介
1.提升方法:从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基本分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(权值分布),针对不同的训练数据分布(相同的数据,不同的概率分布)调用弱学习算法学习一系列弱分了器。
所以,对于提升方法来说,需要回答两个问题:
1)在每一轮如何改变训练数据的的权值或概率分布?
2)如何将弱分类器组合成一个强分类器?
2.AdaBoost算法是最具代表性的提升方法。对于上述两个问题,AdaBoost的做法是:
1)提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值,这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮弱分类器的更大关注。于是,分类问题被一系列的弱分类器“分而治之”。
2)加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使得其在表决中起较小的作用。
二.AdaBoost算法
三.代码解释
1 # coding:utf-8 2 3 ''' 4 Created on Nov 28, 2010 5 Adaboost is short for Adaptive Boosting 6 @author: Peter 7 ''' 8 from numpy import * 9 10 def loadSimpData(): #手动生成数据 11 datMat = matrix([[1., 2.1], 12 [2., 1.1], 13 [1.3, 1.], 14 [1., 1.], 15 [2., 1.]]) 16 classLabels = [1.0, 1.0, -1.0, -1.0, 1.0] 17 return datMat, classLabels 18 19 def loadDataSet(fileName): # 从文件中加载数据 20 numFeat = len(open(fileName).readline().split('\t')) # get number of fields 21 dataMat = [] 22 labelMat = [] 23 fr = open(fileName) 24 for line in fr.readlines(): 25 lineArr = [] 26 curLine = line.strip().split('\t') 27 for i in range(numFeat - 1): 28 lineArr.append(float(curLine[i])) 29 dataMat.append(lineArr) 30 labelMat.append(float(curLine[-1])) 31 return dataMat, labelMat 32 33 def stumpClassify(dataMatrix, dimen, threshVal, threshIneq): # just classify the data 34 retArray = ones((shape(dataMatrix)[0], 1)) 35 if threshIneq == 'lt': 36 retArray[dataMatrix[:, dimen] <= threshVal] = -1.0 37 else: 38 retArray[dataMatrix[:, dimen] > threshVal] = -1.0 39 return retArray 40 41 '''构建单层决策树,即只分裂一次''' 42 def buildStump(dataArr, classLabels, D): 43 dataMatrix = mat(dataArr) #把特征X和标签Y都转成numpy的数组 44 labelMat = mat(classLabels).T 45 m, n = shape(dataMatrix) 46 numSteps = 10.0 #步长为10,由于特征的值是连续型的,且在一个区间之内。所以要设置合适的步数,而范围和步数又决定了步长,即精度。 47 bestStump = {} 48 bestClasEst = mat(zeros((m, 1))) #最好的预测值 49 minError = inf # 初始化最小误差 50 for i in range(n): # 枚举每一个特征进行分裂 51 rangeMin = dataMatrix[:, i].min() #该特征的最小值 52 rangeMax = dataMatrix[:, i].max() #该特征的最大值 53 stepSize = (rangeMax - rangeMin) / numSteps #步长,即精度 54 for j in range(-1, int(numSteps) + 1): # 枚举步数,从而确定阈值 55 for inequal in ['lt', 'gt']: # 用大于号还是小于号进行分割,这一步的影响大吗?感觉应该没什么区别 56 threshVal = (rangeMin + float(j) * stepSize) #阈值 57 predictedVals = stumpClassify(dataMatrix, i, threshVal,inequal) # 通过阈值进行分类 58 errArr = mat(ones((m, 1))) #分别错误列表 59 errArr[predictedVals == labelMat] = 0 60 ''' 61 计算错误率。这是决策树,为什么不是用信息增益来衡量呢?等等,信息增益好像不是用来计算错误率的。 62 因为是“单层决策树”,即只分裂一次就可直接得到分类结果了。所以直接用分类错误的比率来衡量决策树的好坏就可以了。 63 ''' 64 weightedError = D.T * errArr 65 if weightedError < minError: #更新最优的分类条件 66 minError = weightedError 67 bestClasEst = predictedVals.copy() 68 bestStump['dim'] = i 69 bestStump['thresh'] = threshVal 70 bestStump['ineq'] = inequal 71 return bestStump, minError, bestClasEst 72 73 '''adaboost算法''' 74 def adaBoostTrainDS(dataArr, classLabels, numIt=40): 75 weakClassArr = [] #弱分类器列表 76 m = shape(dataArr)[0] 77 D = mat(ones((m, 1)) / m) # 每个数据的权值都初始化为1/m 78 aggClassEst = mat(zeros((m, 1))) #用于累加所有分类器的(带系数)结果,从而确定最终的分类。由于有m个数据,所以为长度为m的列表。 79 for i in range(numIt): #迭代次数 80 bestStump, error, classEst = buildStump(dataArr, classLabels, D) # 构建单层决策树,即为一个弱分类器 81 alpha = float(0.5 * log((1.0 - error) / max(error, 1e-16))) # 计算弱分类器的系数alpha,1e-16用于防止溢出 82 bestStump['alpha'] = alpha #保存弱分类器的系数alpha 83 weakClassArr.append(bestStump) # 将弱分类器放到分类器列表的尾部 84 '''''' 85 expon = multiply(-1 * alpha * mat(classLabels).T, classEst) # 从此开始到第三步:重新计算每个数据的权值 86 D = multiply(D, exp(expon)) # Calc New D for next iteration 87 D = D / D.sum() 88 '''''' 89 aggClassEst += alpha * classEst #累加最终分类结果 90 '''''' 91 aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T, ones((m, 1))) #计算分类错误率 92 errorRate = aggErrors.sum() / m 93 print "total error: ", errorRate 94 if errorRate == 0.0: break #如果错误率为0,则可退出 95 return weakClassArr, aggClassEst 96 97 '''根据学习得到的弱分类器队列来对数据进行分类,第一个参数为数据,第二个参数为弱分类器队列''' 98 def adaClassify(datToClass, classifierArr): 99 dataMatrix = mat(datToClass) # do stuff similar to last aggClassEst in adaBoostTrainDS 100 m = shape(dataMatrix)[0] 101 aggClassEst = mat(zeros((m, 1))) #用于累计分类结果 102 for i in range(len(classifierArr)): #将数据输入、通过这m个弱分类器 103 classEst = stumpClassify(dataMatrix, classifierArr[i]['dim'], classifierArr[i]['thresh'],classifierArr[i]['ineq']) 104 aggClassEst += classifierArr[i]['alpha'] * classEst #累加分类结果 105 print aggClassEst 106 return sign(aggClassEst) #将累加结果输入到sign()函数中,得到最终的分类结果
转载于:https://www.cnblogs.com/DOLFAMINGO/p/9468899.html
《机器学习实战》学习笔记第七章 —— AdaBoost元算法相关推荐
- 《Go语言圣经》学习笔记 第七章 接口
<Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...
- Effective C++ 学习笔记 第七章:模板与泛型编程
第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++ 第二章见 Effective C++ 学习笔记 第二章:构造.析构.赋值运算 第三章见 Effective C++ 学习笔记 ...
- 吴恩达机器学习学习笔记第七章:逻辑回归
分类Classification分为正类和负类 (规定谁是正谁是负无所谓) 吴恩达老师举例几个例子:判断邮箱是否是垃圾邮箱 一个在线交易是否是诈骗 一个肿瘤是良性的还是恶性 如果我们用之前学习的lin ...
- 【机器学习-周志华】学习笔记-第七章
记录第一遍没看懂的 记录觉得有用的 其他章节: 第一章 第三章 第五章 第六章 第七章 第八章 ...
- 《机器学习实战》笔记——第三章:决策树实战
1 说明 该书主要以原理简介+项目实战为主,本人学习的主要目的是为了结合李航老师的<统计学习方法>以及周志华老师的西瓜书的理论进行学习,从而走上机器学习的"不归路".因 ...
- 机器学习实战 学习记录 (4-5章)
参考:机器学习实战Peter Harrington (11条消息) 机器学习实战教程(13篇)_chenyanlong_v的博客-CSDN博客_机器学习实战 四.朴素贝叶斯:(1)选择具有最高概率的决 ...
- DSP原理学习笔记--第七章--增强直接存储器访问(EDMA)
第七章 增强直接存储器访问(EDMA) 第七章 增强直接存储器访问(EDMA) DMA 数据传输 EDMA的特点 EDMA控制器的结构 EDMA传输中的术语 EDMA传输方式 同步事件 EDMA通道与 ...
- java学习笔记-第七章:面向对象编程(基础部分)
第七章:面向对象编程(基础部分) 总体内容 类与对象 引出类与对象 类与对象概述 类与对象的关系示意图 属性概念及其细节 类与对象快速入门案例 对象内存布局 类与对象内存分配机制 引申:java内存的 ...
- 《机器学习西瓜书》学习笔记——第七章_贝叶斯分类器_朴素贝叶斯分类器
朴素:特征条件独立:贝叶斯:基于贝叶斯定理. 朴素贝叶斯是经典的机器学习算法之一,也基于概率论的分类算法,属于监督学习的生成模型.朴素贝叶斯原理简单,也很容易实现,多用于文本分类,比如垃圾邮件过滤. ...
最新文章
- Leetcode Excel Sheet Column Number
- 园子-[闪存]chrome插件
- (53)进程结构体EPROCESS,擦除 DebugPort 实现反调试,ActiveProcessLinks 断链实现进程隐藏
- mysql的存储覆盖_mysql覆盖存储
- 面向对象编程02—装饰器、类方法、静态方、访问控制
- 引用和指针的差别,数组和指针的差别
- JDBC查询Oracle全部表名称,如何使用JDBC API从Oracle数据库中的现有表中检索记录?...
- 如何实现两个数据库之间的同步
- 亲试白天使:华硕家用级无线路由RT-N11+
- python os模块手册_Python OS模块常用函数说明
- 记一次python分布式web开发(利用docker)
- 毕业论文可能用到的一些东西
- Java的未来前景怎么样?
- 吉林大学计算机学院高尚教授,高尚 - 吉林大学 - 计算机科学与技术学院
- 基于CAA的CATIA二次开发环境搭建全过程(亲测可用)
- creo绘图属性模板_creo绘图属性
- DNS服务器地址查找不到,DNS服务器地址的查看方法
- jmeter抓取百度热点链接
- idea 设置eplice 前进后退快捷键
- 微信转发软件后缀_微信发送不了100M的视频?其实只需要改个后缀,长知识了...
热门文章
- 腾讯 监控系统服务器数据采集,腾讯天津数据中心机房监控项目
- 零点起飞学php下载,零点起飞学PHP(附光盘)/零点起飞学编程
- 坯子库曲面推拉教程_psd素材丨嘤,今天是仙仙的水墨风建筑表达教程(文末附讲解视频+效果图+贴图素材合集)...
- Learning to Refine Object Segments
- python中的continue和break
- php 日历设置当月节假_带节假日设置的日历
- linux虚拟智能系统下载,RT-Thread v2.1.0alpha 技术预览,智能设备操作系统
- 系统设计(二)——TinyURL系统设计
- 决定零售商生与死的12大关键指标
- kafka原理_Kafka 架构原理,也就这么回事