一、bagging

用于基础模型复杂、容易过拟合的情况,用来减小 variance(比如决策树)。基础模型之间没有太多联系(相对于boosting),训练可以并行。但用 bagging 并不能有助于把数据拟合的更准(那是要减小 bias)。

每次训练一个基础模型,都从 N 条训练数据中有放回的随机抽取出 N' 条作为训练集(虽然一般 N = N',但由于是有放回的抽,所以具体的数据还是不同的)。

模型做预测的时候用 average(回归)或者 voting(分类)。

Out-of-bag validation:

用 bagging 方法不一定要把训练数据切分成训练集和验证集。因为每轮随机采样都会有一部分数据没有被采样到,可以用这部分数据来验证模型的泛化能力。

例如,训练基础模型的数据情况如下表

那就可以用 f2+f4 在 x1 上测试;f2+f3 在 x2 上测试;... ;以此类推。

Random Forest:对 decision tree 的 bagging

特点:

 1. 使用 CART 决策树作为基础模型。

 2. 只是有放回的 resample 训练数据是不够的(只这样做的话,得到每棵树都会差不多)。—— 每次分裂的时候随机限制一些特征不能用(在剩下的 p' 维特征中选择最优特征进行 split),p' 越小意味着得到的决策树模型鲁棒性越好(但同时对训练数据的拟合肯定也会变差),相当于 variance会变小但 bias 会变大,通过交叉验证选择一个合适的 p'。

 3. 对单棵树不剪枝,以此来减小单棵树的 bias(让其“专精于”那一部分特征,所以 RF 中的决策树比较深),再借助 bagging 减小整体模型的variance(相当于从不同的角度解决问题)。

推广:Isolation Forest 用于异常检测

类似 Random Forest ,不同点:

 1. 采样个数 N' 远小于训练样本个数 N。因为只需要部分样本就能够检测出异常点了。

 2. 建立决策树时,随机选择特征 + 随机选择阈值来 split 。

 3. 最大决策树深度选择一个比较小的值,原因同 1 。

对于测试样本 x,把其拟合到 T 棵决策树,计算该样本的叶子结点深度 ht(x),进一步计算出平均深度 h(x)。样本点是异常的概率为:

s(x, N) = 2 -h(x)/c(N) ; 其中 c(N) = 2log(N-1) + ξ - 2(N-1)/N ,  ξ 为欧拉常数。取值范围在[0, 1] ,越大越可能是异常点。

二、boosting

强力的保证:只要基础分类器能够在训练集上实现小于 50% 的错误率,使用 boosting 就能在训练集上实现 0% 错误率。

基础模型的训练是有顺序的(新的基础模型去补强已有的基础模型)。

怎么实现在不同的训练集上训练模型?

 1. resampling

 2. reweighting

 3. 实际应用的时候给样本不同的权重系数就行了。

Adaboost

主要思想:在让 f1(x) 的分类效果变成随机的新的训练集上训练 f2(x) ;... ;以此类推训练新的基础分类器,综合起来就是整体分类器。

怎么做?

在训练集上训练 f1(x) 得到小于 0.5 的错误率;

改变训练样本的权重参数 u ,令 f1(x) 的错误率等于 0.5 ;

在新的训练集上训练 f2(x) 得到小于 0.5 的错误率;...

具体怎么求解新的样本参数 u ?

初始化 u1 = [1, 1, ..., 1]T,N维向量。如果第 i 个样本 xi 被 ft(x) 正确分类,就减小其权重参数 ui (除以dt);反之,如果被分错就增大 ui (乘dt)。

d 的计算也很简单:

dt = ( (1 - εt)/ε)1/2 ,由于前提是 ft(x) 的错误率一定小于 0.5,所以 d > 1。

统一乘除两种情况的形式:令 αt = log dt ;乘 dt 等价于乘 exp(αt),除以 dt 等价于乘 exp(-αt)

想办法把负号和分类情况联系起来,最后结果为:

ut+1i = uti * exp(-yi * ft(xi) * αt )

得到 T 个基础分类器后,综合模型 H(x) = sign(Σ αt * ft(x)),sum for t = 1, 2, ..., T。为什么要做 weighted sum 呢?错误率低的 ft 对应的 αt 比较大,对最后结果影响就更大。

就完事了

证明 Adaboost 能够在训练集上实现 0% 的错误率

计算 H(x) 的错误率,发现其存在上界 exp( -y* g(xi) )

等价于证明上界会越来越小。

设 Zt 是训练 ft 的权重参数之和,可以得到 ZT+1 的表达式,发现exp里面正好出现了g(x) = Σ αt * ft(x)

所以,T个基础分类器构成的模型在训练集的错误率上界,就等于训练第 T+1 个基础分类器的样本权重参数的平均值。

等价于证明训练样本参数的平均值会越来越小。

根据 Z 的递推公式,发现 Z 是随 t 单调减,得证。

margin

Boosting 的一般形式:

定义优化目标为刚才求解出来的错误率上界:

怎么实现这个优化过程呢? —— 用gradient descent

Gradient Boosting

L 对函数 g 求梯度,得到更新公式

要找到一个 ft(x) ,乘上权重 α后加到 gt-1(x) 里面,和梯度下降求解得到的对 g(x) 的更新一样,那就让 ft(x) 和负梯度方向一致,也即内积越大越好。(先看方向。整体损失函数的负梯度拟合第 t 轮的损失值)

所以转换后的优化目标如下,相当于最小化 ft(x) 在权重参数为 ut 的训练集上的误差:( Adaboost 中的训练 ft 的步骤)

而 α如何确定呢?

令 L 对 α偏导数为 0 得到的解, 和Adaboost 中的定义是相同的。

三、stacking

各做各的,然后把前面已经有的模型输出作为最后一个 layer 的 new features,而且训练数据要分成两个部分,一部分用来训练前面的系统,另一部分用来训练 Final classifier。

集成方法 Ensemble的更多相关文章

  1. 【机器学习实战】第7章 集成方法 ensemble method

    第7章 集成方法 ensemble method 集成方法: ensemble method(元算法: meta algorithm) 概述 概念:是对其他算法进行组合的一种形式. 通俗来说: 当做重 ...

  2. 深度学习的集成方法——Ensemble Methods for Deep Learning Neural Networks

    本文主要参考Ensemble Methods for Deep Learning Neural Networks一文. 1. 前言 神经网络具有很高的方差,不易复现出结果,而且模型的结果对初始化参数异 ...

  3. 【Supervised Learning】 集成学习Ensemble Learning & Boosting 算法(python实现)

    零. Introduction 1.learn over a subset of data choose the subset uniformally randomly (均匀随机地选择子集) app ...

  4. 【机器学习实战】第7章 集成方法(随机森林和 AdaBoost)

    第7章 集成方法 ensemble method 集成方法: ensemble method(元算法: meta algorithm) 概述 概念:是对其他算法进行组合的一种形式. 通俗来说: 当做重 ...

  5. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGBT)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 内容: 1.算法概述 1.1 决策树(DT)是一种基本的分类和回归方法.在分类问题中它可以认为是if-the ...

  6. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 内容: 1.算法概述 1.1 决策树(DT)是一种基本的分类和回归方法.在分类问题中它可以认为是if-the ...

  7. 机器学习——打开集成方法的大门,手把手带你实现AdaBoost模型

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第25篇文章,我们一起来聊聊AdaBoost. 我们目前为止已经学过了好几个模型,光决策树的生成算法就有三种.但是我们每 ...

  8. 常用的模型集成方法介绍:bagging、boosting 、stacking

    本文介绍了集成学习的各种概念,并给出了一些必要的关键信息,以便读者能很好地理解和使用相关方法,并且能够在有需要的时候设计出合适的解决方案. 本文将讨论一些众所周知的概念,如自助法.自助聚合(baggi ...

  9. 【Ensemble methods】组合方法&集成方法

    机器学习的算法中,讨论的最多的是某种特定的算法,比如Decision Tree,KNN等,在实际工作以及kaggle竞赛中,Ensemble methods(组合方法)的效果往往是最好的,当然需要消耗 ...

随机推荐

  1. 实现markdown功能

    前言 由于个人一直想弄一个博客网站,所以写博客的功能也就必须存在啦,而之前想过用富文本编辑器来实现的.但是接触了markdown后,发现真的是太好玩了,而且使用markdown的话可以在博客园.CSD ...

  2. 哈工大计算机网络Week2-网络应用数据交换

    目录 网络应用数据交换 P2P应用:原理与文件分发 纯P2P架构 文件分发:客户机/服务器 vs. P2P CS 为什么是这样的?不应该传送和发出难道是并行的??? P2P P2P文件分发典型例子:B ...

  3. 解决webpack打包速度慢的解决办法

    技巧1 webpack在打包的时候第一次总是会做很长的准备工作,包括加载插件之类的.在刚接触webpack的时候总是webpack一下-测一下-改一下-再webpack一下,这种方式最后让很多人崩溃了 ...

  4. 和朱晔一起复习Java并发(二):队列

    和朱晔一起复习Java并发(二):队列 老样子,我们还是从一些例子开始慢慢熟悉各种并发队列.以看小说看故事的心态来学习不会显得那么枯燥而且更容易记忆深刻. 阻塞队列的等待? 阻塞队列最适合做的事情就是 ...

  5. java学习笔记(基础篇)—变量与表达式

    一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ...

  6. 【分治】黑白棋子的移动-C++

    题目描述 有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也 ...

  7. python函数知识三 函数名的使用、格式化、递归

    12.函数名的使用 函数是第一类对象 函数名可以当做值被赋值给变量 def func(): print(1) return a = func print(func) print(a) a() 函数名可 ...

  8. Java零基础个人学习路线总结

    之前学习Java的时候走过一些弯路,一直想写一篇文章来总结下自己对自学Java的认识.趁着这次开通专栏的机会整理一篇文章,既可以巩固所学,也可以为后来境遇相同的人做个参考. 首先提出几个问题 Java ...

  9. 【Go】类似csv的数据日志组件设计

    原文链接:https://blog.thinkeridea.com/201907/go/csv_like_data_logs.html 我们业务每天需要记录大量的日志数据,且这些数据十分重要,它们是公 ...

  10. list模板题

    题面: 设计一个int类型的动态链表L,L中有一个代表当前位置的光标,支持下列操作: insert(x): 在光标前面插入元素x,插入后光标指向新插入的元素x move(d): 如果d为正数,则光标向 ...