2022 高教社杯(国赛数学建模)思路解析

2022高教社杯ABCD赛题思路解析:

https://blog.csdn.net/dc_sinor/article/details/126211983

集成算法概念

在机器学习算法中,有一种算法叫做集成算法,AdaBoost 算法是集成算法的一种。我们先来看下什么是集成算法。

通常,一个 Boss 在做一项决定之前,会听取多个 Leader 的意见。集成算法就是这个意思,它的基本含义就是集众算法之所长。

前面已经介绍过许多算法,每种算法都有优缺点。那么是否可以将这些算法组合起来,共同做一项决定呢?答案是肯定的。这就诞生了集成算法(Ensemble Methods)。

集成算法的基本架构如下:


算法的组合有多种形式,比如将不同的算法集成起来,或者将同一种算法以不同的形式集成起来。

常见的集成算法有四大类:

  • bagging:装袋法,代表算法为 RandomForest(随机森林)。
  • boosting:提升法,代表算法有 AdaBoost,XGBoost 等。
  • stacking:堆叠法。
  • blending:混合法。

多个算法以不同的方式可以组合成集成算法,如果再深入探究的话,不同的集成方法也可以组合起来:

如果将 boosting 算法的输出作为bagging 算法的基学习器,得到的是 MultiBoosting 算法;
如果将 bagging 算法的输出作为boosting 算法的基学习器,得到的是 IterativBagging 算法。
对于集成算法的集成,这里不再过多介绍。

bagging 与 boosting 算法

bagging和 boosting是两个比较著名的集成算法。

bagging 算法

bagging 算法是将一个原始数据集随机抽样成 N 个新的数据集。然后将这N 个新的数据集作用于同一个机器学习算法,从而得到 N 个模型,最终集成一个综合模型。

在对新的数据进行预测时,需要经过这 N 个模型(每个模型互不依赖干扰)的预测(投票),最终综合 N 个投票结果,来形成最后的预测结果。

boosting 算法

boosting 算法的含义为提升学习,它将多个弱分类器组合起来形成一个强分类器。

boosting 算法是将一个原始数据集使用同一个算法迭代学习 N 次,每次迭代会给数据集中的样本分配不同的权重。

分类正确的样本会在下一次迭代中降低权重,而分类错误的样本会在下一次迭代中提高权重,这样做的目的是,使得算法能够对其不擅长(分类错误)的数据不断的加强提升学习,最终使得算法的成功率越来越高。

每次迭代都会训练出一个新的带有权重的模型,迭代到一定的次数或者最终模型的错误率足够低时,迭代停止。最终集成一个强大的综合模型。

在对新的数据进行预测时,需要经过这 N 个模型的预测,每个模型的预测结果会带有一个权重值,最终综合 N 个模型结果,来形成最后的预测结果。


boosting 算法中每个模型的权重是不相等的,而bagging 算法中每个模型的权重是相等的。

AdaBoost 算法

AdaBoost 算法是非常流行的一种 boosting 算法,它的全称为 Adaptive Boosting,即自适应提升学习。

AdaBoost 算法由Freund 和 Schapire 于1995 年提出。这两位作者写了一篇关于AdaBoost 的简介论文,这应该是关于AdaBoost 算法的最权威的资料了。为了防止链接丢失,我将论文下载了,放在了这里。

AdaBoost 算法 和 SVM 算法被很多人认为是监督学习中最强大的两种算法。

AdaBoost 算法的运行过程如下:

    1. 为训练集中的每个样本初始化一个权重 wi,初始时的权重都相等。
    1. 根据样本训练出一个模型 Gi,并计算该模型的错误率 ei 和权重 ai。
    1. 根据权重 ai 将每个样本的权重调整为 wi+1,使得被正确分类的样本权重降低,被错误分类的样本权重增加(这样可以着重训练错误样本)。
    1. 这样迭代第2,3 步,直到训练出最终模型。

这个过程中,我们假设 x 为样本,Gi(x) 为第 i 轮训练出的模型,ai 为 Gi(x) 的权重,一共迭代 n 轮,那么最终模型 G(x) 的计算公式为:

示例代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from numpy import *# 模拟创建数据集
def loadSimpData():datMat = mat([[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 datMat, classLabels# 通过阈值比较对数据进行分类
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):"""Function:   通过阈值比较对数据进行分类Input:      dataMatrix:数据集dimen:数据集列数threshVal:阈值threshIneq:比较方式:lt,gtOutput: retArray:分类结果"""#新建一个数组用于存放分类结果,初始化都为1retArray = ones((shape(dataMatrix)[0],1))#lt:小于,gt;大于;根据阈值进行分类,并将分类结果存储到retArrayif threshIneq == 'lt':retArray[dataMatrix[:, dimen] <= threshVal] = -1.0else:retArray[dataMatrix[:, dimen] > threshVal] = -1.0#返回分类结果return retArray# 找到最低错误率的单层决策树
def buildStump(dataArr, classLabels, D):"""Function:   找到最低错误率的单层决策树Input:      dataArr:数据集classLabels:数据标签D:权重向量Output: bestStump:分类结果minError:最小错误率bestClasEst:最佳单层决策树"""#初始化数据集和数据标签dataMatrix = mat(dataArr); labelMat = mat(classLabels).T#获取行列值m,n = shape(dataMatrix)#初始化步数,用于在特征的所有可能值上进行遍历numSteps = 10.0#初始化字典,用于存储给定权重向量D时所得到的最佳单层决策树的相关信息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 = stumpClassify(dataMatrix, i, threshVal, inequal)#初始化错误计数向量errArr = mat(ones((m,1)))#如果预测结果和标签相同,则相应位置0errArr[predictedVals == labelMat] = 0#计算权值误差,这就是AdaBoost和分类器交互的地方weightedError = D.T * errArr#打印输出所有的值#print("split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError))#如果错误率低于minError,则将当前单层决策树设为最佳单层决策树,更新各项值if weightedError < minError:minError = weightedErrorbestClasEst = predictedVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequal#返回最佳单层决策树,最小错误率,类别估计值return bestStump, minError, bestClasEst# 找到最低错误率的单层决策树
def adaBoostTrainDS(dataArr, classLabels, numIt = 40):"""Function:   找到最低错误率的单层决策树Input:      dataArr:数据集classLabels:数据标签numIt:迭代次数Output: weakClassArr:单层决策树列表aggClassEst:类别估计值"""#初始化列表,用来存放单层决策树的信息weakClassArr = []#获取数据集行数m = shape(dataArr)[0]#初始化向量D每个值均为1/m,D包含每个数据点的权重D = mat(ones((m,1))/m)#初始化列向量,记录每个数据点的类别估计累计值aggClassEst = mat(zeros((m,1)))#开始迭代for i in range(numIt):#利用buildStump()函数找到最佳的单层决策树bestStump, error, classEst = buildStump(dataArr, classLabels, D)#print("D: ", D.T)#根据公式计算alpha的值,max(error, 1e-16)用来确保在没有错误时不会发生除零溢出alpha = float(0.5 * log((1.0 - error) / max(error, 1e-16)))#保存alpha的值bestStump['alpha'] = alpha#填入数据到列表weakClassArr.append(bestStump)#print("classEst: ", classEst.T)#为下一次迭代计算Dexpon = multiply(-1 * alpha * mat(classLabels).T, classEst)D = multiply(D, exp(expon))D = D / D.sum()#累加类别估计值aggClassEst += alpha * classEst#print("aggClassEst: ", aggClassEst.T)#计算错误率,aggClassEst本身是浮点数,需要通过sign来得到二分类结果aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T, ones((m,1)))errorRate = aggErrors.sum() / m# print("total error: ", errorRate)#如果总错误率为0则跳出循环if errorRate == 0.0: break#返回单层决策树列表和累计错误率return weakClassArr#return weakClassArr, aggClassEst# AdaBoost分类函数
def adaClassify(datToClass, classifierArr):"""Function:   AdaBoost分类函数Input:      datToClass:待分类样例classifierArr:多个弱分类器组成的数组Output: sign(aggClassEst):分类结果"""#初始化数据集dataMatrix = mat(datToClass)#获得待分类样例个数m = shape(dataMatrix)[0]#构建一个初始化为0的列向量,记录每个数据点的类别估计累计值aggClassEst = mat(zeros((m,1)))#遍历每个弱分类器for i in range(len(classifierArr)):#基于stumpClassify得到类别估计值classEst = stumpClassify(dataMatrix, classifierArr[i]['dim'], classifierArr[i]['thresh'], classifierArr[i]['ineq'])#累加类别估计值aggClassEst += classifierArr[i]['alpha']*classEst#打印aggClassEst,以便我们了解其变化情况#print(aggClassEst)#返回分类结果,aggClassEst大于0则返回+1,否则返回-1return sign(aggClassEst)datMat, classLabels = loadSimpData()
classifierArr = adaBoostTrainDS(datMat, classLabels, 30)
print(classifierArr)
print(adaClassify([0,0], classifierArr))
print(adaClassify([[5,5],[0,0]], classifierArr))

2022 高教社杯(国赛数学建模)思路解析

2022高教社杯ABCD赛题思路解析:

https://blog.csdn.net/dc_sinor/article/details/126211983

2022国赛数学建模思路 - 案例:集成算法AdaBoost相关推荐

  1. 2022国赛数学建模思路 - 案例:线性优化-粒子群算法

    2022 高教社杯(国赛数学建模)思路解析 2022高教社杯ABCD赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/126211983 1 ...

  2. 2022国赛数学建模思路 - 复盘:生成规划模型

    2022 高教社杯(国赛数学建模)思路解析 2022高教社杯ABCD赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/126211983 0 ...

  3. 2022国赛数学建模思路 - 复盘:校园消费行为分析

    2022 高教社杯(国赛数学建模)思路解析 2022高教社杯ABCD赛题思路解析: https://blog.csdn.net/math_assistant 1. 赛题背景 校园一卡通是集身份认证.金 ...

  4. 2022国赛数学建模思路汇总A题B题C题D题 高教社杯

    一.2022 高教社杯数学建模竞赛 2022国赛数学建模竞赛的时间确定为9月15日(周四)18时至9月18日(周日)20时. A君为大家准备了一系列的学习资料,本次比赛A君也会不断提供赛题资料和思路给 ...

  5. 2022年高教杯国赛数学建模思路分享

    2022年高教杯国赛数学建模思路分享(你不看你获不了奖) 2022年高教杯数学建模竞赛A题思路分享 2022年高教杯数学建模竞赛B题思路分享 2022年高教杯数学建模竞赛C题思路分享 2022年高教杯 ...

  6. 2022国赛数学建模A题B题C题思路分析 高教社杯

    一.思路分析 A题思路分析: (比赛开始后第一时间发布) B题思路分析: (比赛开始后第一时间发布) C题思路分析: (比赛开始后第一时间发布) 二.建模资料免费领取 数模君多次参加国赛.美赛.深圳杯 ...

  7. 2022国赛数学建模A题B题C题资料思路汇总(含有代码可运行)

    占个位置吧,开始在本帖实时更新赛题思路代码,先更新下初步的想法和资料 持续为更新参考思路,可以自行获取. 赛题思路 会持续进行思路模型分析,下自行获取. A题初步思路想法: A题跟前几年的国赛题高温防 ...

  8. 2023美赛数学建模思路 - 案例:线性回归

    2023 美赛(美国大学生数学建模)思路解析 2023美赛ABCDEF赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/128779911 ...

  9. 2022国赛数学建模C题思路分析 高教社杯

    C题更新一下完整的版本,大家多看看 文章内容较多,大家仔细观看,所有内容仅供参考!大家不要直接照抄,切记,防止被查重!! 一.问题的重述 1.1 研究背景 玻璃的主要原料是石英砂,主要化学成分是二氧化 ...

最新文章

  1. Linux驱动开发环境配置(内核源码树构造)
  2. 关于MATLAB FFT频谱泄露和加窗
  3. 读取excel文件错误
  4. 如何在 jetbrick-template 中使用 debug函数?
  5. PPR data model
  6. 干货,记一次解决录音杂音问题
  7. java类型转换 float类型转换_Java类型转换 – float(和long)到int
  8. ANSI C、ISO C、Standard C、C89、C90、C99
  9. Mac安装MySQL8碰到的问题
  10. 【HUSTOJ】1053: 字符图形9-数字正三角
  11. AngularJS - uib-datepicker-popup - 日期控件
  12. 机器学习-数据科学库 12 美国人口数据分析案例
  13. android 图片锯齿,在Android上禁用消除锯齿Imageview
  14. 理想汽车的智能驾驶“方法论”
  15. 农夫、羊、菜和狼的故事
  16. Ext js 下拉框模糊匹配查询,并支持反复输入检索
  17. DNW FOR WIN7
  18. 优化问题---梯度、方向导数、法线
  19. 矽力杰SY8088国产代替料RY3408
  20. sublimeText3配置_首选项-设置-用户

热门文章

  1. android 仿微信demo————微信发现界面实现
  2. 计算机网络的ask表示啥,计算机网络理论知识:物理层
  3. 文字logo设计的作用
  4. windows server 2008解决 远程桌面多帐号同时登录
  5. jQuery 第二篇
  6. 2016年11月前端面试题整理汇总
  7. 安卓直接展示html,Android textView展示html图片,实现图文混排,点击查看大图片
  8. 多点移动电子地图定位
  9. 适合小白的Linux入门学习教程,从安装到实操(涵盖各种常用指令,超详细!)
  10. mysql 统计日活_所谓的日活、月活是如何记录与统计的?