机器学习实战笔记--AdaBoost(实例代码)
#coding=utf-8
from numpy import * def loadSimpleData():
dataMat = matrix([[1. , 2.1],
[2. , 1.1],
[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):
#初始化预测结果为array数组,样本数行,1列,值为1
retArry = ones((shape(dataMatrix)[0],1))
if threshIneq == 'lt':
#dataMatrix[:,dimen]表示为某一特征列的所有行,即存为列向量
retArry[dataMatrix[:,dimen] <= threshVal] = -1.0
else:
retArry[dataMatrix[:,dimen] > threshVal] = -1.0
return retArry #D是权重向量,此函数功能是训练出最佳的单个的弱分类器,决策桩。返回最佳的弱分类器详情参数(第几维决策桩,阀值,不等于号,错误率,预测结果)
def buildStump(dataArr,classLabels,D):
dataMatrix = mat(dataArr)
labelMat = mat(classLabels).T
m,n = shape(dataMatrix)
numSteps = 10.0#在特征所有可能值上遍历
bestStump = {}#用于存储单层决策树的信息
bestClasEst = 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
predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)
errArr = mat(ones((m,1)))
errArr[predictedVals == labelMat] = 0
weightedError = D.T * errArr#不同样本的权重是不一样的
#print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError)
if weightedError < minError:
minError = weightedError
#bestClasEst为最佳分类结果
bestClasEst = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump,minError,bestClasEst #此函数控制迭代次数为默认40次(函数中计算总分类器错误率为0时break),训练总分类器weakClassArr,列表里存放元素为每个弱分类器(阀值,不等于号,第几维)
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 = buildStump(dataArr,classLabels,D)
#计算alpha,max(error,1e-16)保证没有错误的时候不出现除零溢出
#alpha表示的是这个分类器的权重,错误率越低分类器权重越高
alpha = float(0.5*log((1.0-error)/max(error,1e-16)))
bestStump['alpha'] = alpha
weakClassArr.append(bestStump)
#classEst 存放弱分类器 预测出的最佳分类结果,为array数组形式,列向量。
#classLabels存放的是 实际的分类结果(列表形式),mat强制转换为矩阵后再转置为列向量。
expon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messy
D = multiply(D,exp(expon)) #Calc New D for next iteration
D = D/D.sum()
#calc training error of all classifiers, if this is 0 quit for loop early (use break)
aggClassEst += alpha*classEst
#print "aggClassEst: ",aggClassEst.T
'''
>>> ones((2,1))!=mat([[-1],[1]])
matrix([[ True],
[False]], dtype=bool)
>>> multiply(ones((2,1))!=mat([[-1],[1]]),ones((2,1)))
matrix([[ 1.],
[ 0.]])
'''
#sign(aggClassEst) != mat(classLabels).T 存放:总分类器的预测结果和实际分类结果作比较后的bool值,预测对为True,预测错为False。
#必须与对应元素相一致的array数组相乘得到矩阵形式的列向量,值为0,1
aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))
errorRate = aggErrors.sum()/m
print "total error: ",errorRate
if errorRate == 0.0:
break
return weakClassArr #dataToClass 表示要分类的点或点集,预测点或点集的分类结果 def adaClassify(datToClass,classifierArr):
dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDS
m = shape(dataMatrix)[0]
aggClassEst = mat(zeros((m,1)))
for i in range(len(classifierArr)):
#总分类器中的每个弱分类器是已知的最佳弱分类器,参数都已定好。直接调用stumpClassify函数进行分类,并输出预测结果classEst
classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],\
classifierArr[i]['thresh'],\
classifierArr[i]['ineq'])#call stump classify
#利用预测结果以及弱分类器的alpha值,算出单个的结果,然后循环算出总分类器f(x)值
aggClassEst += classifierArr[i]['alpha']*classEst
print aggClassEst
#取结果值得符号
return sign(aggClassEst) def main():
#加载数据,赋初始值样本权重为相等的 1/样本数
dataMat,classLabels = loadSimpleData()
D = mat(ones((5,1))/5)
#classifierArr存放:总分类器,元素为弱分类器的详细情况
classifierArr = adaBoostTrainDS(dataMat,classLabels,30)
t = adaClassify([0,0],classifierArr)
print t if __name__ == '__main__':
main()
AdaBoost实例
AdaBoost算法是以PAC理论为基础,实现了它的理想。PAC理论证明了强可学习与弱可学习的等价。AdaBoost算法将弱学习算法提升为强学习算法。是提升算法boosting的代表作。
简述:
它以弱分类器作为基分类器,对训练样本集进行T轮训练,每次训练选择错误率较低的弱分类器,计算错误率。
依据错误率计算弱分类器在最终总分类器中的投票权重
结合投票权重和样本是否预测正确来改变样本分布,也就是更新样本的权重,预测正确的样本权重降低,预测错误的样本权重增加。使得下一轮的训练着重放在那些预测错误的样本上。实现每轮训练的分类器好而不同,增加多样性。
最后将分类器添加到最终总分类器集中组合成为一个强分类器。最终的分类函数使用一种有权重的投票方式,权重较大的基分类器对结果的影响较大。
算法流程:
(1)设定N组训练样本,S=((x1,y1),(x2,y2),...(xN,yN)),其中xi为输入向量且xi∈X,yi∈Y={-1,1};
(2)初始化:样本初始权值
W1(i)=1/N, i=1,2,...N;
(3)进行T次迭代,t=1 to T
1)使用具有权值分布Wt的训练样本,由基于权重的弱分类器进行学习,得到基分类器ht:X→{-1,1};
2)计算ht的错误率
其中,是一个指示函数,其值如下:
3)计算基分类器在总分类器集中的投票权值
4)更新权重(改变样本分布)
i=1,2,...N;
这里,是规范化因子
它使,i=1,2,...N;成为概率分布。
(4)T次迭代结束,得到集成分类器:
机器学习实战笔记--AdaBoost(实例代码)的更多相关文章
- 机器学习实战笔记-k-近邻算法
机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...
- Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果
Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果 一.详细说明及代码 tc.py =============================================== ...
- 机器学习实战笔记7(Adaboost)
1:简单概念描写叙述 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们须要简介几个概念. 1:弱学习器:在二分情况下弱分类器的错误率会低于50%. 事实 ...
- 机器学习实战笔记(Python实现)-06-AdaBoost
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 机器学习实战笔记(Python实现)-00-readme
近期学习机器学习,找到一本不错的教材<机器学习实战>.特此做这份学习笔记,以供日后翻阅. 机器学习算法分为有监督学习和无监督学习.这本书前两部分介绍的是有监督学习,第三部分介绍的是无监督学 ...
- 机器学习实战笔记(Python实现)-08-线性回归
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 机器学习实战笔记(Python实现)-05-支持向量机(SVM)
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 机器学习实战笔记(Python实现)-04-Logistic回归
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 机器学习实战笔记(Python实现)-03-朴素贝叶斯
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
随机推荐
- 树(2)-----leetcode(层、深度、节点)
1.树的类实现: class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = N ...
- RESTful API设计方法
1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...
- Node-Blog整套前后端学习记录
Node-Blog 后端使用node写的一个一整套的博客系统 #### 主要功能 登录 注册 发表文章 编辑/删除文章 添加/删除/编辑文章分类 账号的管理 评论功能 ... 所用技术 node ex ...
- luogu P4756 Added Sequence(凸包+思维)
一眼望去不会. 考虑问题中的\(f(i,j)=|\sum_{p=i}^{j}a_p |\)的实际意义. 其实就是前缀和相减的绝对值. \(f(i,j)=|\ sum[j]-sum[i-1]\ |\ ...
- nyoj256-C小加之级数求和
C小加 之 级数求和 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 最近,C小加 又遇到难题了,正寻求你的帮助. 已知:Sn= 1+1/2+1/3+-+1/n. 显然对 ...
- idea 解决git冲突
1.提交本地代码到本地仓库 2.啦取远程代码 不进行merge 3.冲突文件会显示 >>> head ===== 4.删除 >>> head ===== ...
- Spring 的IOC和DI
IOC:IOC其实就是一种容器,该容器会主动的将资源推送给他所管理的组件, 组件所要做的仅是一种合适的方式来接受资源,这种行为也被称为查找的被动形式! IOC的反转控制:传统应用程序是由我们自己在对象 ...
- ROPI下载安装
ROPI下载安装 官方地址 参考文献 安装过程 wget http://num.math.uni-goettingen.de/~m.goerigk/ropi/0.1.0/ropi-0.1.0.tar. ...
- MyBatis中的大于号小于号表示
可以使用转义字符把大于号和小于号这种直接替换掉: select* from table where '字段1'>=10怎么表示,问题来啦 xml转义可以使用 根据这个规则上面的sql写法应该变成 ...
- STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)
一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...