京公网安备 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
在数字化商业环境中,数据已成为企业优化运营、抢占市场、规避风险的核心资产。但商业数据分析绝非“堆砌数据、生成报表”的简单 ...
2026-01-20定量报告的核心价值是传递数据洞察,但密密麻麻的表格、复杂的计算公式、晦涩的数值罗列,往往让读者望而却步,导致核心信息被淹 ...
2026-01-20在CDA(Certified Data Analyst)数据分析师的工作场景中,“精准分类与回归预测”是高频核心需求——比如预测用户是否流失、判 ...
2026-01-20在建筑工程造价工作中,清单汇总分类是核心环节之一,尤其是针对楼梯、楼梯间这类包含多个分项工程(如混凝土浇筑、钢筋制作、扶 ...
2026-01-19数据清洗是数据分析的“前置必修课”,其核心目标是剔除无效信息、修正错误数据,让原始数据具备准确性、一致性与可用性。在实际 ...
2026-01-19在CDA(Certified Data Analyst)数据分析师的日常工作中,常面临“无标签高维数据难以归类、群体规律模糊”的痛点——比如海量 ...
2026-01-19在数据仓库与数据分析体系中,维度表与事实表是构建结构化数据模型的核心组件,二者如同“骨架”与“血肉”,协同支撑起各类业务 ...
2026-01-16在游戏行业“存量竞争”的当下,玩家留存率直接决定游戏的生命周期与商业价值。一款游戏即便拥有出色的画面与玩法,若无法精准识 ...
2026-01-16为配合CDA考试中心的 2025 版 CDA Level III 认证新大纲落地,CDA 网校正式推出新大纲更新后的第一套官方模拟题。该模拟题严格遵 ...
2026-01-16在数据驱动决策的时代,数据分析已成为企业运营、产品优化、业务增长的核心工具。但实际工作中,很多数据分析项目看似流程完整, ...
2026-01-15在CDA(Certified Data Analyst)数据分析师的日常工作中,“高维数据处理”是高频痛点——比如用户画像包含“浏览次数、停留时 ...
2026-01-15在教育测量与评价领域,百分制考试成绩的分布规律是评估教学效果、优化命题设计的核心依据,而正态分布则是其中最具代表性的分布 ...
2026-01-15在用户从“接触产品”到“完成核心目标”的全链路中,流失是必然存在的——电商用户可能“浏览商品却未下单”,APP新用户可能“ ...
2026-01-14在产品增长的核心指标体系中,次日留存率是当之无愧的“入门级关键指标”——它直接反映用户对产品的首次体验反馈,是判断产品是 ...
2026-01-14在CDA(Certified Data Analyst)数据分析师的业务实操中,“分类预测”是高频核心需求——比如“预测用户是否会购买商品”“判 ...
2026-01-14在数字化时代,用户的每一次操作——无论是电商平台的“浏览-加购-下单”、APP的“登录-点击-留存”,还是金融产品的“注册-实名 ...
2026-01-13在数据驱动决策的时代,“数据质量决定分析价值”已成为行业共识。数据库、日志系统、第三方平台等渠道采集的原始数据,往往存在 ...
2026-01-13在CDA(Certified Data Analyst)数据分析师的核心能力体系中,“通过数据建立模型、实现预测与归因”是进阶关键——比如“预测 ...
2026-01-13在企业数字化转型过程中,业务模型与数据模型是两大核心支撑体系:业务模型承载“业务应该如何运转”的逻辑,数据模型解决“数据 ...
2026-01-12当前手游市场进入存量竞争时代,“拉新难、留存更难”成为行业普遍痛点。对于手游产品而言,用户留存率不仅直接决定产品的生命周 ...
2026-01-12