机器学习实战之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爱好者社区”。
相关文章
|
6天前
|
机器学习/深度学习 数据采集 算法
数据挖掘和机器学习算法
数据挖掘和机器学习算法
|
6天前
|
机器学习/深度学习 人工智能 算法
利用机器学习预测股市趋势:一个实战案例
【9月更文挑战第5天】在这篇文章中,我们将探索如何使用机器学习技术来预测股市趋势。我们将通过一个简单的Python代码示例来演示如何实现这一目标。请注意,这只是一个入门级的示例,实际应用中可能需要更复杂的模型和更多的数据。
|
5天前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
14 1
|
9天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
81 1
|
14天前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
53 1
|
14天前
|
机器学习/深度学习 存储 算法
强化学习实战:基于 PyTorch 的环境搭建与算法实现
【8月更文第29天】强化学习是机器学习的一个重要分支,它让智能体通过与环境交互来学习策略,以最大化长期奖励。本文将介绍如何使用PyTorch实现两种经典的强化学习算法——Deep Q-Network (DQN) 和 Actor-Critic Algorithm with Asynchronous Advantage (A3C)。我们将从环境搭建开始,逐步实现算法的核心部分,并给出完整的代码示例。
30 1
|
13天前
|
机器学习/深度学习 存储 算法
图解最常用的 10 个机器学习算法!
图解最常用的 10 个机器学习算法!
|
4月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
198 14
|
4月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
83 1
|
4月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)