机器学习实战之AdaBoost元算法

简介:

今天学习的机器学习算法不是一个单独的算法,我们称之为元算法或集成算法(Ensemble)。其实就是对其他算法进行组合的一种方式。俗话说的好:“三个臭皮匠,赛过诸葛亮”。集成算法有多种形式:对同一数据集,使用多个算法,通过投票或者平均等方法获得最后的预测模型;同一算法在不同设置下的集成;同一算法在多个不同实例下的集成。本文着重讲解最后一种集成算法。

bagging

如果训练集有n个样本,我们随机抽取S次,每次有放回的获取m个样本,用某个单独的算法对S个数据集(每个数据集有m个样本)进行训练,这样就可以获得S个分类器。最后通过投票箱来获取最后的结果(少数服从多数的原则)。这就是bagging方法的核心思想,如图所示。

fb546af14f7f1c1d53663db684bc455e18b96281

bagging中有个常用的方法,叫随机森林(random forest),该算法基于决策树,不仅对数据随机化,也对特征随机化。

  • 数据的随机化:应用bootstrap方法有放回地随机抽取k个新的自助样本集。

  • 特征随机化:n个特征,每棵树随机选择m个特征划分数据集。

每棵树无限生长,最后依旧通过投票箱来获取最后的结果。

boosting

boosting方法在模型选择方面和bagging一样:选择单个机器学习算法。但boosting方法是先在原数据集中训练一个分类器,然后将前一个分类器没能完美分类的数据重新赋权重(weight),用新的权重数据再训练出一个分类器,以此循环,最终的分类结果由加权投票决定。 所以:boosting是串行算法(必须依赖上一个分类器),而bagging是并行算法(可以同时进行);boosting的分类器权重不同,bagging相同(下文中详细讲解)。

boosting也有很多版本,本文只讲解AdaBoost(自适应boosting)方法的原理和代码实践。 如图所示,为AdaBoost方法的原理示意图。

  • 首先,训练样本赋权重,构成向量D(初始值相等,如100个数据,那每个数据权重为1/100)。

  • 在该数据上训练一个弱分类器并计算错误率和该分类器的权重值(alpha)。

  • 基于该alpha值重新计算权重(分错的样本权重变大,分对的权重变小)。

  • 循环2,3步,但完成给定的迭代次数或者错误阈值时,停止循环。

  • 最终的分类结果由加权投票决定。

e4b34eea239d11c574db71f00fc8e82071807b17

alpha和D的计算见下图(来源于机器学习实战):

ce98e0ba0e695c68ef21ac0b427de7b68561197c

AdaBoost方法实践

数据来源

数据通过代码创建:


from numpy import *

def loadSimpData():

dataArr = array([[1., 2.1], [2., 1.1], [1.3, 1.], [1., 1.], [2., 1.]])

labelArr = [1.0, 1.0, -1.0, -1.0, 1.0]

return dataArr, labelArr

弱决策树

该数据有两个特征,我们只用一个特征进行分类(弱分类器),然后选择精度最高的分类器。


def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):

retArray = ones((shape(dataMatrix)[0],1))

retArray[dataMatrix[:,dimen] <= threshVal] = -1.0

if threshIneq == 'lt': else:

def buildStump(dataArr, labelArr, D):

retArray[dataMatrix[:,dimen] > threshVal] = -1.0 return retArray

numSteps = 10.0

dataMat = mat(dataArr) labelMat = mat(labelArr).T m, n = shape(dataMat) bestStump = {}

rangeMin = dataMat[:, i].min()

bestClasEst = mat(zeros((m, 1))) minError = inf for i in range(n): rangeMax = dataMat[:, i].max()

threshVal = (rangeMin + float(j) * stepSize)

stepSize = (rangeMax-rangeMin)/numSteps for j in range(-1, int(numSteps)+1): for inequal in ['lt', 'gt']:

errArr[predictedVals == labelMat] = 0

predictedVals = stumpClassify(dataMat, i, threshVal, inequal) # print predictedVals errArr = mat(ones((m, 1))) weightedError = D.T*errArr

minError = weightedError

# print("split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError)) if weightedError < minError: bestClasEst = predictedVals.copy() bestStump['dim'] = i bestStump['thresh'] = threshVal

return bestStump, minError, bestClasEst

bestStump['ineq'] = inequal

AdaBoost算法

该函数用于构造多棵树,并保存每棵树的信息。


def adaBoostTrainDS(dataArr,classLabels, numIt=40):

weakClassArr = [] m = shape(dataArr)[0]

aggClassEst = mat(zeros((m,1)))

D = mat(ones((m,1))/m) for i in range(numIt):

print('D:',D.T)

bestStump,error,classEst = buildStump(dataArr, classLabels, D)

weakClassArr.append(bestStump)

alpha = float(0.5*log((1.0-error)/max(error,1e-16))) bestStump['alpha'] = alpha print('classEst:',classEst.T)

aggClassEst += alpha*classEst

expon = multiply(-1*alpha*mat(classLabels).T,classEst) D = multiply(D, exp(expon)) D = D/D.sum() print('aggClassEst:',aggClassEst.T)

if errorRate == 0:break

aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T, ones((m,1))) errorRate = aggErrors.sum()/m print('total error:',errorRate,'\n')

return weakClassArr

算法优缺点

  • 优点:精度高

  • 缺点:容易过拟合


原文发布时间为:2018-06-23
本文作者:罗罗攀
本文来自云栖社区合作伙伴“ Python爱好者社区”,了解相关信息可以关注“ Python爱好者社区”。
相关文章
|
3月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
367 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
8月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
机器学习/深度学习 缓存 算法
微店关键词搜索接口核心突破:动态权重算法与语义引擎的实战落地
本文详解微店搜索接口从基础匹配到智能推荐的技术进阶路径,涵盖动态权重、语义理解与行为闭环三大创新,助力商家提升搜索转化率、商品曝光与用户留存,实现技术驱动的业绩增长。
|
4月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
3月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
4月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
11月前
|
人工智能 编解码 算法
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
本文介绍了通义灵码2.0 AI程序员在嵌入式开发中的实战应用。通过安装VS Code插件并登录阿里云账号,用户可切换至DeepSeek V3模型,利用其强大的代码生成能力。实战案例中,AI程序员根据自然语言描述快速生成了C语言的base64编解码算法,包括源代码、头文件、测试代码和CMake编译脚本。即使在编译错误和需求迭代的情况下,AI程序员也能迅速分析问题并修复代码,最终成功实现功能。作者认为,通义灵码2.0显著提升了开发效率,打破了编程语言限制,是AI编程从辅助工具向工程级协同开发转变的重要标志,值得开发者广泛使用。
8984 71
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
|
10月前
|
算法 数据安全/隐私保护
基于Adaboost的数据分类算法matlab仿真
本程序基于Adaboost算法进行数据分类的Matlab仿真,对比线性与非线性分类效果。使用MATLAB2022A版本运行,展示完整无水印结果。AdaBoost通过迭代训练弱分类器并赋予错分样本更高权重,最终组合成强分类器,显著提升预测准确率。随着弱分类器数量增加,训练误差逐渐减小。核心代码实现详细,适合研究和教学使用。
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
251 1

热门文章

最新文章