京公网安备 11010802034615号
经营许可证编号:京B2-20210330
简单易学的机器学习算法—AdaBoost
一、集成方法(Ensemble Method)
集成方法主要包括Bagging和Boosting两种方法,随机森林算法是基于Bagging思想的机器学习算法,在Bagging方法中,主要通过对训练数据集进行随机采样,以重新组合成不同的数据集,利用弱学习算法对不同的新数据集进行学习,得到一系列的预测结果,对这些预测结果做平均或者投票做出最终的预测。AdaBoost算法和GBDT(Gradient Boost Decision Tree,梯度提升决策树)算法是基于Boosting思想的机器学习算法。在Boosting思想中是通过对样本进行不同的赋值,对错误学习的样本的权重设置的较大,这样,在后续的学习中集中处理难学的样本,最终得到一系列的预测结果,每个预测结果有一个权重,较大的权重表示该预测效果较好,详细的思想可见博文“简单易学的机器学习算法——集成方法(Ensemble Method)”。
二、AdaBoost算法思想
,初始时,设定每个样本的权重是相等的,即
,利用第一个弱学习算法
对其进行学习,学习完成后进行错误率
表示被错误分类的样本数目,
表示所有样本的数目。这样便可以利用错误率
计算弱学习算法
的权重
:


表示对第
个样本训练正确,
表示对第
个样本训练错误。
是一个归一化因子:

及其权重
。对新的分类数据,分别计算t个弱分类器的输出
,最终的AdaBoost算法的输出结果为:

其中,
是符号函数。具体过程可见下图所示:
上述为AdaBoost的基本原理,下面给出AdaBoost算法的流程:
AdaBoost算法是一种具有很高精度的分类器,其实AdaBoost算法提供的是一种框架,在这种框架下,我们可以使用不同的弱分类器,通过AdaBoost框架构建出强分类器。下面我们使用单层决策树构建一个分类器处理如下的分类问题:
python] view plain copy
#coding:UTF-8
'''''
Created on 2015年6月15日
@author: zhaozhiyong
'''
from numpy import *
def loadSimpleData():
datMat = mat([[1., 2.1],
[2., 1.1],
[1.3, 1.],
[1., 1.],
[2., 1.]])
classLabels = mat([1.0, 1.0, -1.0, -1.0, 1.0])
return datMat, classLabels
def singleStumpClassipy(dataMat, dim, threshold, thresholdIneq):
classMat = ones((shape(dataMat)[0], 1))
#根据thresholdIneq划分出不同的类,在'-1'和'1'之间切换
if thresholdIneq == 'left':#在threshold左侧的为'-1'
classMat[dataMat[:, dim] <= threshold] = -1.0
else:
classMat[dataMat[:, dim] > threshold] = -1.0
return classMat
def singleStump(dataArr, classLabels, D):
dataMat = mat(dataArr)
labelMat = mat(classLabels).T
m, n = shape(dataMat)
numSteps = 10.0
bestStump = {}
bestClasEst = zeros((m, 1))
minError = inf
for i in xrange(n):#对每一个特征
#取第i列特征的最小值和最大值,以确定步长
rangeMin = dataMat[:, i].min()
rangeMax = dataMat[:, i].max()
stepSize = (rangeMax - rangeMin) / numSteps
for j in xrange(-1, int(numSteps) + 1):
#不确定是哪个属于类'-1',哪个属于类'1',分两种情况
for inequal in ['left', 'right']:
threshold = rangeMin + j * stepSize#得到每个划分的阈值
predictionClass = singleStumpClassipy(dataMat, i, threshold, inequal)
errorMat = ones((m, 1))
errorMat[predictionClass == labelMat] = 0
weightedError = D.T * errorMat#D是每个样本的权重
if weightedError < minError:
minError = weightedError
bestClasEst = predictionClass.copy()
bestStump['dim'] = i
bestStump['threshold'] = threshold
bestStump['inequal'] = inequal
return bestStump, minError, bestClasEst
def adaBoostTrain(dataArr, classLabels, G):
weakClassArr = []
m = shape(dataArr)[0]#样本个数
#初始化D,即每个样本的权重
D = mat(ones((m, 1)) / m)
aggClasEst = mat(zeros((m, 1)))
for i in xrange(G):#G表示的是迭代次数
bestStump, minError, bestClasEst = singleStump(dataArr, classLabels, D)
print 'D:', D.T
#计算分类器的权重
alpha = float(0.5 * log((1.0 - minError) / max(minError, 1e-16)))
bestStump['alpha'] = alpha
weakClassArr.append(bestStump)
print 'bestClasEst:', bestClasEst.T
#重新计算每个样本的权重D
expon = multiply(-1 * alpha * mat(classLabels).T, bestClasEst)
D = multiply(D, exp(expon))
D = D / D.sum()
aggClasEst += alpha * bestClasEst
print 'aggClasEst:', aggClasEst
aggErrors = multiply(sign(aggClasEst) != mat(classLabels).T, ones((m, 1)))
errorRate = aggErrors.sum() / m
print 'total error:', errorRate
if errorRate == 0.0:
break
return weakClassArr
def adaBoostClassify(testData, weakClassify):
dataMat = mat(testData)
m = shape(dataMat)[0]
aggClassEst = mat(zeros((m, 1)))
for i in xrange(len(weakClassify)):#weakClassify是一个列表
classEst = singleStumpClassipy(dataMat, weakClassify[i]['dim'], weakClassify[i]['threshold'], weakClassify[i]['inequal'])
aggClassEst += weakClassify[i]['alpha'] * classEst
print aggClassEst
return sign(aggClassEst)
if __name__ == '__main__':
datMat, classLabels = loadSimpleData()
weakClassArr = adaBoostTrain(datMat, classLabels, 30)
print "weakClassArr:", weakClassArr
#test
result = adaBoostClassify([1, 1], weakClassArr)
print result
最终的决策树序列:
weakClassArr: [{'threshold': 1.3, 'dim': 0, 'inequal': 'left', 'alpha': 0.6931471805599453}, {'threshold': 1.0, 'dim': 1, 'inequal': 'left', 'alpha': 0.9729550745276565}, {'threshold': 0.90000000000000002, 'dim': 0, 'inequal': 'left', 'alpha': 0.8958797346140273}]
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
【核心关键词】客户、数据分析、指标体系、数据采集、数据指标、业务数据、分析思路、业务需求、分析方法 【专访摘要】本次 CDA ...
2026-07-24在数据分析、业务建模与数字化运营体系中,原始业务数据普遍存在缺失、重复、异常、口径不一致等质量问题,直接用于分析与建模会 ...
2026-07-24 很多数据分析师能熟练计算均值、标准差,但当被问到“如何用一张图让业务方3秒内看懂核心结论”“面对不同数据类型该怎么选 ...
2026-07-24在数据驱动的精细化运营体系中,指标是业务判断、效果复盘、策略优化的核心依据。随着企业数据化程度提升,指标数量持续膨胀,但 ...
2026-07-23在用户运营与产品增长体系中,留存是衡量产品真实价值与用户粘性的核心标尺,也是决定用户生命周期价值、获客投产比的底层因素。 ...
2026-07-23 很多数据分析师精通Excel、SQL、Python等工具,但当被问到“面对一个具体的业务问题,该用什么分析方法”“描述性分析和诊断 ...
2026-07-23【核心关键词】埋点、产品、互联网、数据库、决策、数据分析、产品经理、商业模式、移动互联网、指标体系、运营模块、大数据平 ...
2026-07-22在高并发、大数据量的业务系统中,单表数据量达到千万级甚至亿级后,会出现查询性能骤降、索引维护成本飙升、存储扩容困难等问题 ...
2026-07-22 很多企业团队并非缺乏指标,而是陷入“指标失控”:仪表盘上堆满实时跳动的数据,却无法回答“当前瓶颈在哪、下一步该做什么 ...
2026-07-22在金融风控、企业运营、行业研究等数据分析场景中,大量数据以面板数据形态存在:例如多家分支机构连续多个季度的风险指标、多位 ...
2026-07-21 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-07-21一、活动介绍 2026暑期CDA备考冲刺季,为想利用假期拿证的你量身打造。考点胶囊内容搭配多重硬核福利,让你在旅行、实习、居家 ...
2026-07-21金融行业的运营风险贯穿业务全流程,涵盖交易欺诈、操作违规、流程漏洞、合规偏差、客户信用异常等多元场景,是银行、保险、证券 ...
2026-07-17财产保险作为金融行业的核心板块,涵盖车险、家财险、责任险、企财险等多元品类,是个人与企业抵御财产风险、经营风险的重要保障 ...
2026-07-17 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-07-17【核心关键词】模块、餐饮、客户、门店、企业、订单、供应链、多样化、产品、生产计划、数据分析、生产管理、物料管理、业务分 ...
2026-07-16在数字化分析时代,原始数据本身不具备业务价值,只有通过科学的统计学方法加工、拆解、验证与解读,才能挖掘数据背后的规律、差 ...
2026-07-16 很多数据分析师能熟练地写SQL、做透视表、算描述性统计,但当被问到“如何预测用户流失概率”“如何归因销量下滑的关键因素 ...
2026-07-16在描述性统计分析、数据预处理、异常值排查与多组数据分布对比工作中,箱线图(Box Plot)是应用最广泛的可视化与统计工具之一。 ...
2026-07-15在企业数据存储、业务统计与数据分析工作中,绝大多数业务数据都带有时间维度属性,例如订单创建时间、用户注册时间、支付完成时 ...
2026-07-15