前言

本系列为机器学习算法的总结和归纳,目的为了清晰阐述算法原理,同时附带上手代码实例,便于理解。

目录

k近邻(KNN)
决策树
线性回归
逻辑斯蒂回归
朴素贝叶斯
支持向量机(SVM)
组合算法(Ensemble Method)
K-Means
机器学习算法总结
本章为集成学习,简单介绍下Bootstraping, Bagging, Boosting, AdaBoost, RandomForest 和Gradient boosting这些组合型算法.

1.Bootstrapping

Bootstrapping: 名字来自成语“pull up by your own bootstraps”,意思就是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。其核心思想和基本步骤如下:

(1)采用重抽样技术从原始样本中抽取一定数量(自己给定)的样本,此过程允许重复抽样。
(2)根据抽出的样本计算给定的统计量T。
(3)重复上述N次(一般大于1000),得到N个统计量T。
(4)计算上述N个统计量T的样本方差,得到统计量的方差。

应该说Bootstrap是现代统计学较为流行的一种统计方法,在小样本时效果很好。通过方差的估计可以构造置信区间等,其运用范围得到进一步延伸。

2.装袋bagging

装袋算法相当于多个专家投票表决,对于多次测试,每个样本返回的是多次预测结果较多的那个。

装袋算法描述

模型生成令n为训练数据的实例数量对于t次循环中的每一次从训练数据中采样n个实例将学习应用于所采样本保存结果模型
分类对于t个模型的每一个使用模型对实例进行预测返回被预测次数最多的一个

bagging:bootstrap aggregating的缩写。让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现,训练之后可得到一个预测函数序列

最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。

[训练R个分类器f_i,分类器之间其他相同就是参数不同。其中f_i是通过从训练集合中(N篇文档)随机取(取后放回)N次文档构成的训练集合训练得到的。对于新文档d,用这R个分类器去分类,得到的最多的那个类别作为d的最终类别。]

使用scikit-learn测试bagging方法

from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
bagging = BaggingClassifier(KNeighborsClassifier(),
...                      max_samples=0.5, max_features=0.5)

3.提升Boosting与Adaboost

提升算法描述

模型生成赋予每个训练实例相同的权值t次循环中的每一次:将学习算法应用于加了权的数据集上并保存结果模型计算模型在加了权的数据上的误差e并保存这个误差结果e等于0或者大于等于0.5:终止模型对于数据集中的每个实例:如果模型将实例正确分类将实例的权值乘以e/(1-e)将所有的实例权重进行正常化
分类赋予所有类权重为0对于t(或小于t)个模型中的每一个:给模型预测的类加权 -log(e/(1-e))返回权重最高的类

这个模型提供了一种巧妙的方法生成一系列互补型的专家。

boosting: 其中主要的是AdaBoost(Adaptive boosting,自适应boosting)。初始化时对每一个训练例赋相等的权重1/N,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在后续的学习中集中对比较难的训练例进行学习,从而得到一个预测函数序列h1,⋯,hmh1,⋯,hm , 其中h_i也有一定的权重,预测效果好的预测函数权重较大,反之较小。最终的预测函数H对分类问题采用有权重的投票方式,对回归问题采用加权平均的方法对新示例进行判别。

提升算法理想状态是这些模型对于其他模型来说是一个补充,每个模型是这个领域的一个专家,而其他模型在这部分却不能表现很好,就像执行官一样要寻觅那些技能和经验互补的顾问,而不是重复的。这与装袋算法有所区分。

bagging与boosting的区别

二者的主要区别是取样方式不同。bagging采用均匀取样,而Boosting根据错误率来取样,因此boosting的分类精度要优于Bagging。bagging的训练集的选择是随机的,各轮训练集之间相互独立,而boostlng的各轮训练集的选择与前面各轮的学习结果有关;bagging的各个预测函数没有权重,而boosting是有权重的;bagging的各个预测函数可以并行生成,而boosting的各个预测函数只能顺序生成。对于象神经网络这样极为耗时的学习方法。bagging可通过并行训练节省大量时间开销。

bagging和boosting都可以有效地提高分类的准确性。在大多数数据集中,boosting的准确性比bagging高。在有些数据集中,boosting会引起退化— Overfit。

Boosting思想的一种改进型AdaBoost方法在邮件过滤、文本分类方面都有很好的性能。

Gradient boosting(又叫Mart, Treenet):Boosting是一种思想,Gradient Boosting是一种实现Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降

使用scikit-learn测试adaboost算法

from sklearn.cross_validation import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
iris = load_iris()
clf = AdaBoostClassifier(n_estimators=100)
scores = cross_val_score(clf, iris.data, iris.target)
scores.mean()
0.9...

4.Random Forest

Random Forest: 随机森林,顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。 在建立每一棵决策树的过程中,有两点需要注意——采样完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行和列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤——剪枝,但随机森林不这样做,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。 按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。

Random forest与bagging的区别

(1)Random forest是选与输入样本的数目相同多的次数(可能一个样本会被选取多次,同时也会造成一些样本不会被选取到),而bagging一般选取比输入样本的数目少的样本;
(2)bagging是用全部特征来得到分类器,而Random forest是需要从全部特征中选取其中的一部分来训练得到分类器; 一般Random forest效果比bagging效果好!

使用scikit-learn测试随机森林算法

from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)

5.Gradient boosting

梯度提升树或者梯度提升回归树(GBRT)是任意一个不同损失函数的泛化。GBRT是一个灵敏的并且高效程序,可以用在回归和分类中。梯度提升树模型在许多领域中都有使用,如web搜索排行榜和社会生态学中。它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。这句话有一点拗口,损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、偏差均衡的问题,但是这里就假设损失函数越大,模型越容易出错)。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。

GRBT的优势:

  • 混合数据类型的自然处理
  • 预测力强
  • 健壮的输出空间

Boosting主要是一种思想,表示“知错就改”。而Gradient Boosting是在这个思想下的一种函数(也可以说是模型)的优化的方法,首先将函数分解为可加的形式(其实所有的函数都是可加的,只是是否好放在这个框架中,以及最终的效果如何)。然后进行m次迭代,通过使得损失函数在梯度方向上减少,最终得到一个优秀的模型。值得一提的是,每次模型在梯度方向上的减少的部分,可以认为是一个“小”的或者“弱”的模型,最终我们会通过加权(也就是每次在梯度方向上下降的距离)的方式将这些“弱”的模型合并起来,形成一个更好的模型。

参考:http://www.csuldw.com/2015/07/22/2015-07-22%20%20ensemble/

转载于:https://www.cnblogs.com/geo-will/p/10524766.html

机器学习 | 算法笔记- 集成学习(Ensemble Learning)相关推荐

  1. 笔记︱集成学习Ensemble Learning与树模型、Bagging 和 Boosting、模型融合

    基本内容与分类见上述思维导图. 文章目录 一.模型融合方法 . 概述 1.Voting 2.Averaging 3.Bagging 4.Boosting 5. Stacking (1)nfolds 次 ...

  2. bagging算法_集成学习(Ensemble Learning)——Bagging与Random Forest(1)

    一. 什么是集成学习 集成学习是通过构建并结合多个学习器来完成学习任务的一类算法. 根据个体学习器(基学习器)之间是否存在强依赖关系可将集成学习分为两类: Boosting 个体学习器之间存在强依赖关 ...

  3. EL:集成学习(Ensemble Learning)的概念讲解、问题应用、算法分类、关键步骤、代码实现等相关配图详细攻略

    EL:集成学习(Ensemble Learning)的概念讲解.算法分类.问题应用.关键步骤.代码实现等相关配图详细攻略 目录 集成学习Ensemble Learning 1.集成学习中弱分类器选择 ...

  4. 机器学习-集成学习(ensemble learning)

    集成学习ensemble learning:本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务. 可以用两句话形容: 1."三个臭皮匠顶个诸葛亮":一堆 ...

  5. 集成学习(Ensemble Learning)

    在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好).集成学习就是组 ...

  6. RDKit |基于集成学习(Ensemble learning)预测溶解度

    Ensemble learning 集成学习 集成学习(Ensemble learning)是这样一个过程,按照某种算法生成多个模型,如分类器或者称为专家,再将这些模型按照某种方法组合在一起来解决某个 ...

  7. 集成学习(ensemble learning)(四)

    文章目录 一.GBDT概述 二.GDBT原理 1.负梯度拟合 2.GBDT回归算法 3.GBDT分类算法 (1)二元GBDT分类算法 (2)多元GBDT分类算法 4.GBDT常用损失函数 (1)分类任 ...

  8. 集成学习(ensemble learning)(一)

    文章目录 一.集成学习概述 二.个体学习器 三.Boosting 四.Bagging 五.结合策略 1.平均法 2.投票法 3.学习法 (1)核心图解 a.构建新的训练集 b.构建新的测试集 c.最终 ...

  9. 集成学习(ensemble learning)(三)

    集成学习系列第三篇(Boosting相关方法),传送前两篇: 集成学习(ensemble learning)(一) 集成学习(ensemble learning)(二) 文章目录 一.Boosting ...

最新文章

  1. ABAP开发常用的表
  2. VTK:图片之ImageGaussianSmooth
  3. Leveldb二三事
  4. 基于Xilinx FPGA生态,加速提升视频处理质量
  5. 前端学习(3049):vue+element今日头条管理-请求获取数据
  6. 飞书上线“程序员友好”功能 迎接1024程序员节
  7. 简单入门Buffer
  8. sql server2008如果表中已经有很多条记录,再添加一个非空字段
  9. TensorFlow 下 mnist 数据集的操作及可视化
  10. 12.06课堂笔记以及作业
  11. 采用LM1875组成的各种功放电路
  12. dcp-9020cdn复印位置有_兄弟DCP-9020CDN打印机驱动
  13. pad怎么远程服务器,iphone和ipad如何远程控制局域网电脑
  14. Unity 风吹草的实现
  15. 幼儿园网络图怎么绘制_幼儿园主题网络图的绘制要注意什么
  16. 十年互联网 十个风云人物
  17. 唐山大地震:接近尸体
  18. Mac Android Studio 打包APK 出现的问题
  19. surface pro 6 黑苹果_surface pro 6 黑苹果
  20. [JAVA]向上转型与向下转型

热门文章

  1. 如何解决aText for mac不响应的教程
  2. 迁移分支_资料 | 迁移学习简明手册
  3. 【php-laravel框架】第二节:laravel常用的扩展包汇总及安装教程
  4. linux下卸载 dev sd*下硬盘,Linux 磁盘管理(示例代码)
  5. python flag 参数_flag_flagpython_js开关flag - 云+社区 - 腾讯云
  6. Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回
  7. java class _Java Class文件详解
  8. 基于php的成绩管理设计(含源文件)
  9. Qt文档阅读笔记-QLatin1String解析及文本段跨行赋值
  10. Java文档阅读笔记-Guide to the Hibernate EntityManager