集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略。其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型。集成学习简单的示例图如下:

通过训练得到若干个个体学习器,并通过一定策略得到一个集成学习器。

集成方式因为学习算法的不同又分为“同质”和“异质”,如果个体学习器中只包含一种学习算法,例如都是决策树,或都是神经网络,这样的集成就是同质集成,如果个体学习器中包含了多种学习算法,则称为异质集成。

集成学习的目的是得到一个比单一学习器预测性能更好的集成学习器,这就要求个体学习器“好而不同”,要求个体学习器有一定的准确性,同时又有一定的差异性。

下图是西瓜书中的一个图示,浅显易懂地表示出了个体学习器对集成学习效果的影响,用四个字来归纳就是“好而不同”

现在的集成学习大致可以分为两大类:Boosting和Bagging。

Boosting:个体学习器间存在强依赖关系,根据其表现,对训练样本进行调整,使得之前分类错误的样本后续更受关注,用改变后的样本学习下一个分类器。重复学习N个分类器。

Bagging:个体学习器间不存在强依赖关系,可同时训练生成,要求个体学习器之间有较大的差异性。

-- Boosting

Boosting的算法原理如下图:

Boosting方法可以看做是一个不断迭代训练的方法,首先用初始权重训练一个弱分类器1,根据1的误差来更新训练样本的权重,正确的样本权重下降,错误样本的权重变高,使得前一个分类器中分类错误的样本在下一个弱分类器训练中得到更多的重视。这样经过T个迭代后,得到T个弱分类器,将这T个弱分类器通过一定策略进行组合,最后得到效果较好的强分类器。

Adaboost是Boosting方法的典型代表,下面以Adaboost为例简单讲述下整个集成学习的过程。

1、如下图1所示,有两类共10个数据样本,开始时,训练数据中每个样本被赋予一个相等的初始权重,都为0.1,构成权重向量D

2、在训练集上训练出一个弱分类器并计算该分类器的错误率和分类器权重,我们采用直线对数据集进行分类(实际情况中可能是决策树等经典学习算法),从图上来看,有3个数据样本分类错误,可根据公式计算误差

、分类器权重

,然后再根据公式分别更新正确分类样本权重和错误分类样本权重;

正确分类样本权重更新:

错误分类样本权重更新:

3、第二次迭代再进行分类,如下图,同样有3个点分错了,分类器2的错误率和分类器权重根据公式可计算如下:

4、第三次迭代进行分类,同样可以计算出分类器3的错误率和分类器权重:

5、将每个弱分类器按照分类结果与分类器权重相乘累加的形式组合起来,如果得到的分类结果误差为0或者分类器数目达到用户指定的值,则迭代结束。本例经过3次迭代,最后的集成分类器分类效果如下:

sklearn中已经实现了Adaboost的方法,可直接调用,下面示例代码展示了采用单一分类器和Adaboost方法的准确率的差别,可以看到集成学习在分类准确率上有明显的提升。

-Python 代码

import pandas as pd
from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import AdaBoostClassifier
from sklearn import tree breast_data = datasets.load_breast_cancer()
data = pd.DataFrame(datasets.load_breast_cancer().data)
data.columns = breast_data['feature_names'] data_np = breast_data['data']
target_np = breast_data['target']
x_train, x_test, y_train, y_test = train_test_split(data_np,target_np,test_size = 0.3,random_state = 0) # 采用一个弱分类器(决策树)进行分类
model = tree.DecisionTreeClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print(accuracy_score(y_test, y_pred)) # 基分类器采用决策树的Adaboost分类,迭代10次
model = AdaBoostClassifier(n_estimators=10, algorithm='SAMME')
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print(accuracy_score(y_test, y_pred))
=============================================================
0.9064327485380117
0.9473684210526315

-- Bagging

Bagging的算法原理如下图:

bagging相比boosting最大的不同在于多个弱学习器之间没有依赖关系,可以并行训练生成,通过T次对训练样本的随机采样(有放回的随机采样),可以得到T个训练集,进而可以训练出T个弱分类器。再将这T个分类器按照一定策略进行结合,最终得到分类准确率较高的集成分类器。

随机森林是最有代表性的bagging方法,它是以决策树为基学习算法,通过多个采样训练集训练多个决策树,并通过投票(Voting)或是加权投票的策略确定分类结果的强分类器。

如下示例代码展示了随机森林在sklearn中是如何应用的,同样相比单一的决策树模型,随机森林的分类准确率也有较大的提升:

-Python 代码

import pandas as pd
from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier breast_data = datasets.load_breast_cancer()
data = pd.DataFrame(datasets.load_breast_cancer().data)
data.columns = breast_data['feature_names'] data_np = breast_data['data']
target_np = breast_data['target']
x_train, x_test, y_train, y_test = train_test_split(data_np,target_np, test_size = 0.3,random_state = 0) # 通过决策树模型进行预测
model = tree.DecisionTreeClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print(accuracy_score(y_test, y_pred)) # 通过随机森林进行分类预测
model = RandomForestClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print(accuracy_score(y_test, y_pred))
================================================
0.9181286549707602
0.9649122807017544

作者:华为云专家周捷

机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】的更多相关文章

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

    本杂记摘录自文章<开发 | 为什么说集成学习模型是金融风控新的杀手锏?> 基本内容与分类见上述思维导图. . . 一.机器学习元算法 随机森林:决策树+bagging=随机森林 梯度提升树 ...

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

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

  3. 机器学习笔记(六) ---- 支持向量机(SVM)【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  4. 【华为云技术分享】跟唐老师学习云网络 : Kubernetes网络实现

    当今K8s独霸天下之时,咱们站在更高的角度,好好的看看K8s网络是以什么理念构筑的.以及一个容器集群的好保姆,是如何分别照顾 南北流量和东西流量的. 一.简单介绍下Kubernetes 略..容器集群 ...

  5. 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?【华为云技术分享】

    1 概述 1.1 文章目的 本文通过一个实例介绍如何使用软件开发服务DevCloud完成一个C#Web项目的开发. 1.2 项目详情 1. 项目名称:超级冷笑话网站 2. 项目简介:一个Web网站,包 ...

  6. 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】

    文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...

  7. Spring Boot 最流行的 16 条实践解读!【华为云技术分享】

    置顶:华为云618大促火热进行中,全场1折起,免费抽主机,消费满额送P30 Pro,点此抢购. Spring Boot是最流行的用于开发微服务的Java框架.在本文中,将与大家分享自2016年以来笔者 ...

  8. webpack4.0各个击破(6)—— Loader篇【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  9. 华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】

    1 文章目的 本文主要帮助已经掌握或者想要掌握Git的开发者,如何更好的应用Git,以及更好的将Git与DevCloud结合应用. 2 概述 2.1 版本控制系统介绍 从狭义上来说,版本控制系统是软件 ...

随机推荐

  1. NOIP模拟 23

    曾经有一段真挚的AK摆在skyh面前,但他一直意淫自己AK导致没有AK. 如果非要把这AK加一个期限的话,skyh一辈子都AK不了了. 论爆零选手的爆零原因 我说T3想到了能AC的思路但是爆零了有人同 ...

  2. Scrapy进阶知识点总结(二)——选择器Selectors

    1. Selectors选择器 在抓取网页时,您需要执行的最常见任务是从HTML源提取数据.有几个库可用于实现此目的,例如: BeautifulSoup是Python程序员中非常流行的Web抓取库,它 ...

  3. JAVA项目打包成可运行的exe程序

    前言:本篇文章为原创,转载请注明地址,谢谢. 我们一些时候,可能需要需要把我们完成的java打包,打成jar文件或者exe文件.这时候就请鄙人的这篇文章. 言尽于此,Let‘s go! 一.导出jar ...

  4. RHEL7-Vsftpd匿名用户

    实现:匿名用户创建目录,可以上传.下载文件,但是不可删除文件,禁止本地用户登陆. Vsftpd.conf部分参数 第一步:虚拟机挂载镜像 略 第二步:执行挂载命令 略 第三步:编写yum仓库文件 略 ...

  5. PHP经典算法题

    1.百钱买百鸡 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. 分析:估计现在小学生都能手工推 ...

  6. arduino体感控制简单版

    https://learn.sparkfun.com/tutorials/apds-9960-rgb-and-gesture-sensor-hookup-guide/all 硬件连线 关键 VCC=  ...

  7. celery 启用worker ValueError: not enough values to unpack

    [2018-01-12 19:08:15,545: INFO/MainProcess] Received task: tasks.add[5d387722-5389-441b-9b01-a619b93 ...

  8. 领扣(LeetCode)两句话中的不常见单词 个人题解

    给定两个句子 A 和 B . (句子是一串由空格分隔的单词.每个单词仅由小写字母组成.) 如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的. 返回所有不常用单 ...

  9. JAVA继承中子父类的构造方法

    首先,构造方法本身会有一个隐式的无参构造(默认): ①不写构造方法,类中的第一行代码事实上有一个默认的无参构造(系统会隐式为你写好) public class Student { private St ...

  10. C语言入门教程: 一个简单的实例

    对于学习要保持敬畏! 语言不只是一种工具,还是一种资源,因此,善待它,掌握它!   我们知道,对于未知通常都会充满好奇和畏惧,既想了解它,又害怕神秘面纱隐藏的不确定性.对于一门编程语言同样如此,我将以 ...