目录

0. 前言

1. AdaBoost

2. 单层决策树

3. 非均衡数据

4. 实战案例

4.1. 马病死亡案例


学习完机器学习实战的AdaBoost元算法,简单的做个笔记。文中部分描述属于个人消化后的理解,仅供参考。

所有代码和数据可以访问 我的 github

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

0. 前言

在分类任务中,我们通常可以不仅仅采用一个算法,而是多个算法模型结合使用,综合每个弱分类器的结果,称为集成方法(ensemble method)或元算法(meta-algorithm)。

通常有以下两种方法:

  • bagging:自举汇聚法(bootstrap aggregating),从原数据集中选择若干次与原数据集大小相等的新数据集,每个数据的选择是随机的,即新数据集中,数据可能重复,原数据集中有些数据可能也不会出现在新数据集中。
  • boosting:分类器是串行训练的,新分类器根据已有的分类器性能进行训练,集中关注被已有分类器分错的那些数据。

bagging 中,分类器的权重是相等的,boosting 中,分类器的权重不相等。

本篇中,主要介绍 boosting 中的 AdaBoost(adaptive boosting)。

  • 优点:泛化错误率低,易编码
  • 缺点:对离群点敏感
  • 适用数据类型:数值型和标称型数据

1. AdaBoost

AdaBoost 算法流程可描述如下:

  1. 对每个训练样本设定相等的权重,即数据集构成权重向量 
  2. 训练一个加权错误率最低的最佳弱分类器
  3. 根据加权错误率,计算弱分类器的分类器权重 
  4. 根据权重向量  和弱分类器的分类器权重  ,更新权重向量 
  5. 继续训练下一个弱分类器......
  6. 直到弱分类器达到指定数量,或者弱分类器的训练错误率为  为止
  7. 预测时,将数据通过每个弱分类器,将其结果加权求和

初始时,权重向量  被设定为每个样本相同,即  。

弱分类器的加权错误率  定义为错误样本的权重相加。

弱分类器的分类器权重  定义如下:

更新权重向量  时,若样本分类正确,则权重下降,若样本分类错误,则权重上升:

注:AdaBoost 每次训练的弱分类器,会集中关注那些被分类错误的样本。

2. 单层决策树

单层决策树(decision stump,也称决策树桩),是仅仅基于单个特征进行分类的弱分类器。

在本篇中,使用单层决策树作为弱分类器,使用三重循环构建最佳的单层决策树:

  1. 第一层循环:遍历每一个特征
  2. 第二层循环:遍历此特征的每一个阈值(即小于或者大于阈值,属于一类)
  3. 第三层循环:遍历小于阈值属于正类大于阈值属于反类,和小于阈值属于反类大于阈值属于正类

每一次都计算加权错误率,最后选择加权错误率最小的单层决策树作为这次的弱分类器。

3. 非均衡数据

对于数据是非均匀的情况,可根据实际情况选择:

  • Precision、Recall、F-score(F1-measure)
  • TPR、FPR、TNR、FNR、AUC
  • Accuracy

例如,宁可将反类判成正类,也不愿将正类判成反类,就可以使用 Recall。

这部分可以详见 吴恩达机器学习(九)Precision、Recall、F-score、TPR、FPR、TNR、FNR、AUC、Accuracy

或者可对数据进行欠抽样(undersampling)和过抽样(oversampling):

  • 欠抽样:删除部分样例,可将离决策边界较远的样例删除
  • 过抽样:复制部分样例,或者可加入与已有样例相似的点

4. 实战案例

以下将展示书中案例的代码段,所有代码和数据可以在github中下载:

4.1. 马病死亡案例

# coding:utf-8
from numpy import *
import matplotlib.pyplot as plt"""
马病死亡案例
"""# 加载数据集
def loadDataSet(fileName):numFeat = len(open(fileName).readline().split('\t'))dataMat = []labelMat = []fr = open(fileName)for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')for i in range(numFeat - 1):lineArr.append(float(curLine[i]))dataMat.append(lineArr)labelMat.append(float(curLine[-1]))return dataMat, labelMat# 根据特征和阈值划分数据类别
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):retArray = ones((shape(dataMatrix)[0], 1))if threshIneq == 'lt':retArray[dataMatrix[:, dimen] <= threshVal] = -1.0else:retArray[dataMatrix[:, dimen] > threshVal] = -1.0return retArray# 建立单层决策树
# 第一层循环:遍历每一个特征
# 第二层循环:遍历每一个阈值
# 第三层循环:遍历小于阈值的是正类还是反类
def buildStump(dataArr, classLabels, D):dataMatrix = mat(dataArr)labelMat = mat(classLabels).Tm, n = shape(dataMatrix)# 阈值划分数量numSteps = 10.0# 最佳的决策树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)))errArr[predictedVals == labelMat] = 0# 计算加权错误率weightedError = D.T * errArrif weightedError < minError:minError = weightedErrorbestClasEst = predictedVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequalreturn bestStump, minError, bestClasEst# 构建adaboost分类器
def adaBoostTrainDS(dataArr, classLabels, numIt=40):weakClassArr = []m = shape(dataArr)[0]# 初始化样本权重向量D = mat(ones((m, 1)) / m)# 加权的每个样本分类结果aggClassEst = mat(zeros((m, 1)))# 迭代for i in range(numIt):# 建立单层决策树bestStump, error, classEst = buildStump(dataArr, classLabels, D)print("D:", D.T)# 计算弱分类器权重alpha = float(0.5 * log((1.0 - error) / max(error, 1e-16)))bestStump['alpha'] = alphaweakClassArr.append(bestStump)print("classEst: ", classEst.T)# 更新样本权重向量expon = multiply(-1 * alpha * mat(classLabels).T, classEst)D = multiply(D, exp(expon)) / D.sum()# 更新每个样本的加权分类结果aggClassEst += alpha * classEstprint("aggClassEst: ", aggClassEst.T)# 计算当前加权的错误率aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T, ones((m, 1)))errorRate = aggErrors.sum() / mprint("total error: ", errorRate)if errorRate == 0.0: breakreturn weakClassArr, aggClassEst# 分类函数
def adaClassify(datToClass, classifierArr):dataMatrix = mat(datToClass)m = shape(dataMatrix)[0]# 加权的预测结果aggClassEst = mat(zeros((m, 1)))# 遍历每一个弱分类器for i in range(len(classifierArr)):classEst = stumpClassify(dataMatrix, classifierArr[i]['dim'], \classifierArr[i]['thresh'], \classifierArr[i]['ineq'])aggClassEst += classifierArr[i]['alpha'] * classEstprint(aggClassEst)return sign(aggClassEst)# 画ROC曲线
def plotROC(predStrengths, classLabels):cur = (1.0, 1.0)ySum = 0.0# 正类数量numPosClas = sum(array(classLabels) == 1.0)# 1/正类数量yStep = 1 / float(numPosClas)# 1/反类数量xStep = 1 / float(len(classLabels) - numPosClas)# 按照从小到大,索引排序sortedIndicies = predStrengths.argsort()fig = plt.figure()fig.clf()ax = plt.subplot(111)# 遍历排序后的索引# 表示属于正类的概率# 因排序,属于正类的概率越来越大,条件越来越苛刻# 由初始 TPF->1 FPR->1# 最终 TPR->0 FPR->0for index in sortedIndicies.tolist()[0]:if classLabels[index] == 1.0:delX = 0delY = yStepelse:delX = xStepdelY = 0ySum += cur[1]ax.plot([cur[0], cur[0] - delX], [cur[1], cur[1] - delY], c='b')# 更新curcur = (cur[0] - delX, cur[1] - delY)ax.plot([0, 1], [0, 1], 'b--')plt.xlabel('False positive rate');plt.ylabel('True positive rate')plt.title('ROC curve for AdaBoost horse colic detection system')ax.axis([0, 1, 0, 1])plt.show()# 微积分算AUC面积# 对多个小长方块求面积之和# 小长方块的宽为 xStep# 每一次的长为 cur[1]_i# 即 cur[1]_1 * xStep + ... + cur[1]_n * xStep# 即 ySum * xStepprint("the Area Under the Curve is: ", ySum * xStep)if __name__ == '__main__':datArr, labelArr = loadDataSet('horseColicTraining2.txt')classifierArr, aggClassEst = adaBoostTrainDS(datArr, labelArr, 50)testArr, testLabelArr = loadDataSet('horseColicTest2.txt')pred = adaClassify(testArr, classifierArr)errArr = mat(ones((67, 1)))errNum = errArr[pred != mat(testLabelArr).T].sum()print(float(errNum) / len(testLabelArr))plotROC(aggClassEst.T, labelArr)

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

机器学习实战(六)AdaBoost元算法相关推荐

  1. 机器学习实战 -- 利用AdaBoost 元算法提高分类性能

    组合相似的分类器来提高分类性能 应用AdaBoost算法 处理非均衡分类问题 元算法是对其他算法进行组合的一种方式. 基于数据集多重抽样的分类器 我们可以将不同的分类器组合起来,而这种组合结果被称为集 ...

  2. 《机器学习实战》学习笔记(七):利用AdaBoost 元算法提高分类性能

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

  3. python机器学习实战6:利用adaBoost元算法提高分类性能

    1.adaBoost元算法简介 在之前我们LZ介绍了不同的分类器,如果我们根据实际的要求对这些分类器进行组合,这种组合的结果则被称为集成算法(ensemble method)或者元算法(meta-me ...

  4. 机器学习算法——利用AdaBoost元算法提高分类性能(基于单层决策树构建的弱分类器)

    当做出重要决定时,我们往往会听取多个专家而不只是一个人的意见.元算法正是采用这种思路,元算法是对其他算法进行组合的一种方式,本篇博文主要介绍AdaBoost元算法,该算法是机器学习工具箱中最强有力的工 ...

  5. 使用 AdaBoost 元算法提高分类器性能

    转自穆晨 阅读目录 前言 一种原始的元算法 - bagging (自举汇聚法) boost (提高任意给定学习算法精确度算法) vs bagging (自举汇聚法) AdaBoost 元算法的基本原理 ...

  6. 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)

    <机器学习实战朴素贝叶斯算法实现+使用K折交叉验证> 未经允许,不得擅自转载! 提供数据集如下(永久有效,需要的自行下载): 链接:https://pan.baidu.com/s/1Sv0 ...

  7. 机器学习第七章笔记——利用AdaBoost元算法提高分类性能

    目录 引言 一. 基于数据集多重抽样的分类器 1.1 bagging:基于数据随机重抽样的分类器构建方法 1.2 boosting 二. 训练算法 三.基于单层决策树构建弱分类器 四.完整AdaBoo ...

  8. AdaBoost元算法学习理解与应用实战

    据说在Deep Learning出来之前,SVM和Adaboost是效果最好的 两个算法.上一节,我们已经学习理解了SVM,本节让我们一起学习理解Adaboost并且应用吧! 1.拟解决基本问题描述 ...

  9. 刻意练习:机器学习实战 -- Task01. K邻近算法

    背景 这是我们为拥有 Python 基础的同学推出的精进技能的"机器学习实战" 刻意练习活动,这也是我们本学期推出的第三次活动了. 我们准备利用8周时间,夯实机器学习常用算法,完成 ...

最新文章

  1. html无序列表空心圆_列表样式的使用CSS入门基础(018)
  2. Android中获取手机的IMEI
  3. 支付宝蚂蚁森林合种树,2-4天领证,1/2号车满员,3号车成立
  4. mysql to double_MySQL令人咋舌的隐式转换 - 惊觉...
  5. html并排放多张图片时出现分割的白条
  6. spring中事务配置的3种方式-2
  7. 如果恶魔给你一亿,一年之后必须还两个亿,你会接受吗?
  8. 第一次搭建vue项目--添加依赖包、启动项目
  9. Python批量Excel文件数据导入SQLite数据库的优化方案
  10. python数据库管理软件_MySQL管理工具MySQL Utilities — 介绍与安装(1)
  11. Java三大器之过滤器(Filter)的工作原理和代码演示
  12. mysql case结合group+having使用
  13. android 文件管理 显示缩略图,android将缩略图保存到缩略图文件夹_android_开发99编程知识库...
  14. 《吃透微服务》—服务网关之Gateway
  15. iOS音频掌柜-- AVAudioSession
  16. 时间序列分析(11)| 向量自回归模型(VAR模型)
  17. 服务器Linux系统下常见的软件包有哪些
  18. 用户管理及权限管理的意义
  19. ASPUpload文件上传组件的用法
  20. 如何制作印章水印?教你在线制作电子印章水印

热门文章

  1. 【转】每天一个linux命令(61):wget命令
  2. Python xlwt : More than 4094 XFs (styles) 解决方法
  3. 用java的socket来发送一个类
  4. HDOJ2026 ( 首字母变大写 ) 【水题】
  5. [POJ1961 Period]
  6. js 数组与json的转换
  7. ueditor 后端配置项没有正常加载,上传插件不能正常使用 UTF8 PHP
  8. JS函数生成器,function* () {}
  9. c#开发Mongo笔记第五篇
  10. Windows Phone开发(18):变形金刚第九季——变换 转:http://blog.csdn.net/tcjiaan/article/details/7385056...