【机器学习】集成学习解读(ensemble learning)

【机器学习】集成学习解读(ensemble learning)

1. 集成学习(ensemble learning)

1.1 前言

在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型。

  • 但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。

集成学习的出现就是为了去组合多个弱监督模型以期得到一个更好更全面的强监督模型。

  • 集成学习潜在的思想是:即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来
    • 单个学习器我们称为弱学习器(常指泛化性能略优于随机猜测的学习器:例如在二分类问题桑精度略高于50%的分类器)。
    • 相对的,集成学习则是强学习器(通过一定的方式集成一些弱学习器,达到了超过所有弱学习器的准确度的分类器)。

集成学习本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务。集成学习可以用于

  • 分类问题集成、回归问题集成、特征选取集成、异常点检测集成等等,可以说所有的机器学习领域都可以看到集成学习的身影。

常见的集成学习算法包括 Boosting、Bagging(Bootstrap Aggregating)、Voting(其实 voting 严格来说不算)、Stacking 等。
在这里插入图片描述

1.2 什么是集成学习

从下图,对集成学习的思想做一个概括。对于训练集数据,通过训练若干个个体学习器,通过一定的结合策略,来完成学习任务,(常常可以获得比单一学习显著优越的学习器)就可以最终形成一个强学习器。
在这里插入图片描述
集成学习是一种技术框架,其按照不同的思路来组合基础模型,从而达到更好的目的。集成学习有两个主要的问题需要解决:

  • 第一是如何得到若干个个体学习器,
  • 第二是如何选择一种结合策略,将这些个体学习器集合成一个强学习器。

2. 如何得到若干个个体学习器

对于如何得到若干个个体学习器,这里有两种选择。

  • 第一种是所有的个体学习器都是一个种类的,或者说是同质的。
    • 比如都是决策树个体学习器,或者都是神经网络个体学习器。比如 bagging 和 boosting 系列。
  • 第二种是所有的个体学习器不全是一个种类的,或者说是异质的。
    • 比如我们有一个分类问题,对训练集采用支持向量机个体学习器、逻辑回归个体学习器、朴素贝叶斯个体学习器来学习,再通过某种结合策略来确定最终的分类强学习器。这种集成学习成为 Stacking。

同质的个体学习器按照个体学习器之间是否存在依赖关系可以分为两类。

  • 第一种是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是Boosting系列算法。
  • 第二种是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是Bagging系列算法。

2.1 集成学习之 Bagging

  • 代表算法:随机森林(Random Forest)

Bagging(训练多个分类器取平均):从训练集从进行子抽样组成每个基模型所需要的子训练集,然后对所有基模型预测的结果进行综合产生最终的预测结果。
在这里插入图片描述
1)Bagging工作机制:

  • 从原始样本集中抽取训练集。每轮从原始样本集中使用自助采样法(Bootstraping)抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中),共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的);
  • 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等);
  • 对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;
  • 对回归问题:计算上述模型的均值作为最后的结果。(所有模型的重要性相同)。

2)训练集随机采样
Bagging的个体弱学习器的训练集是通过随机采样得到的。

  • 通过T次的随机采样,我们就可以得到T个采样集,对于这T个采样集,我们可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。
  • 对于这里的随机采样,一般采用的是自助采样法(Bootstrap sampling),即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回,也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集,由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。

3)随机森林(Random Forest)
随机森林:很多个决策树并行放在一起,数据采样随机,特征选择随机,都是有放回的随机选取。它是bagging的一个特化进阶版。

  • 所谓的特化是因为随机森林的弱学习器都是决策树。
  • 所谓的进阶是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。

2.2 集成学习之 Boosting

  • 代表算法:AdaBoost, Xgboost,GBDT

Boosting(提升算法,从弱学习器开始加强,通过加权来进行训练):训练过程为阶梯状,基模型按次序一、一进行训练(理论上为串行,但实现上可以做到并行)。

  • 基模型的训练集按照某种策略每次都进行一定的转化。如果某一个数据在这次分错了,那么在下一次我就会给它更大的权重。对所有基模型预测的结果进行线性综合产生最终的预测结果。
    在这里插入图片描述

1)Boosting工作机制:

  • 首先从训练集用初始权重训练出一个弱学习器1;
  • 再根据弱学习的学习误差率表现来更新训练样本的权重,使之前弱学习器1学习误差率高的训练样本点的权重变高,即让误差率高的点在后面的弱学习器2中得到更多的重视;
  • 然后基于调整权重后的训练集来训练弱学习器2;
  • 如此重复进行,直到弱学习器数达到事先指定的数目T;
  • 最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。

2)关于Boosting的两个核心问题:

  • 在每一轮如何改变训练数据的权值或概率分布?

    • 通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
  • 通过什么方式来组合弱分类器?

    • 通过加法模型将弱分类器进行线性组合,
      • 比如:AdaBoost(Adaptive boosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
      • GBDT(Gradient Boost Decision Tree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。

2.3 集成学习之 Stacking

stacking(堆叠各种各样的分类器(KNN,SVM,RF等等),分阶段操作:

  • 第一阶段输入数据特征得出各个基模型的结果;
  • 第二阶段再用前一阶段结果训练得到分类结果。
    • 训练一个模型用于组合各个基模型的结果): 将训练好的所有基模型对训练基进行预测,第 j 个基模型对第 i 个训练样本的预测值将作为新的训练集中第 i 个样本的第 j 个特征值,最后基于新的训练集进行训练。
      • 就相当于,假设又n个样本,有k个基学习器,那么新的训练集就是 n * k 的大小,维度为k。
    • 同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测。

在这里插入图片描述

1)Stacking工作机制:

  • 首先先训练多个不同的模型;
  • 然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。

2)Stacking 训练一个模型用于组合(combine)其他各个基模型。

  • 具体方法是把数据分成两部分,用其中一部分训练几个基模型A1,A2,A3,用另一部分数据测试这几个基模型,把A1,A2,A3的输出作为输入,训练组合模型B。
  • 注意,它不是把模型的结果组织起来,而把模型组织起来。理论上,Stacking可以组织任何模型,实际中常使用单层logistic回归作为模型。(一定有疑问,看起来更像是组织结果?其实组织模型的结果本质上也是组织模型的一种方式。)
  • Sklearn中也实现了stacking模型:StackingClassifier。

2.4 小结

综上按照个体学习器之间的关系,集成学习一般分为Bagging、Boosting、Stacking三大类(我们可以把它简单地看成并行,串行和树型)。

  • Bagging是把各个基模型的结果组织起来,取一个折中的结果;
  • Boosting是根据旧模型中的错误来训练新模型,层层改进;
  • Stacking是把基模型组织起来,注意不是组织结果,而是组织基模型本身,该方法看起来更灵活,也更复杂。

3. 如何选择一种结合策略

假设我们得到的T个弱学习器是: { h 1 , h 2 , . . . h T } \{h_1,h_2,...h_T\} {h1,h2,...hT}

3.1 平均法

对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干个弱学习器的输出进行平均得到最终的预测输出。

  • 最简单的平均是算术平均,也就是说最终预测是: H ( x ) = ∑ i = 1 T h i ( x ) H(x)=\sum_{i=1}^T h_i(x) H(x)=i=1Thi(x)

  • 如果每个个体学习器有一个权重ww,则最终预测是: H ( x ) = ∑ i = 1 T w i h i ( x ) H(x)=\sum_{i=1}^T w_ih_i(x) H(x)=i=1Twihi(x)
    其中 w i w_i wi 是个体学习器 h i h_i hi 的权重,通常有: w i ≥ 0 , ∑ i = 1 T w i = 1 wi≥0, \sum_{i=1}^Tw_i=1 wi0,i=1Twi=1

3.2 投票法

对于分类问题的预测,我们通常使用的是投票法。假设我们的预测类别是{c1,c2,…cK},对于任意一个预测样本x,我们的T个弱学习器的预测结果分别是 {h1(x),h2(x)…hT(x)}。

  • 最简单的投票法是相对多数投票法,也就是我们常说的少数服从多数,也就是T个弱学习器的对样本x的预测结果中,数量最多的类别cici为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。
  • 稍微复杂的投票法是绝对多数投票法,也就是我们常说的要票过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。
  • 更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。

3.3 学习法

上面两类方法都是对弱学习器的结果做平均或者投票,相对比较简单,但是可能学习误差较大,于是就有了学习法这种方法。

  • 对于学习法,代表方法是stacking,当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。
  • 在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。
  • 对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。

4. 总结

集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差(bagging)、偏差(boosting)或改进预测(stacking)的效果。集成学习法的特点:

① 将多个分类方法聚集在一起,以提高分类的准确率。(这些算法可以是不同的算法,也可以是相同的算法。)

② 集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类

③ 严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法。

④ 通常一个集成分类器的分类性能会好于单个分类器

⑤ 如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。

5. 补充

1)Bagging,Boosting二者之间的区别

  • 样本选择上:
    • Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
    • Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
  • 样例权重:
    • Bagging:使用均匀取样,每个样例的权重相等
    • Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
  • 预测函数:
    • Bagging:所有预测函数的权重相等。
    • Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
  • 并行计算:
    • Bagging:各个预测函数可以并行生成
    • Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

2)决策树与这些算法框架进行结合所得到的新的算法:

  • Bagging + 决策树 = 随机森林
  • AdaBoost + 决策树 = 提升树
  • Gradient Boosting + 决策树 = GBDT

参考

【1】https://blog.csdn.net/xiao_yi_xiao/article/details/124040296

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于Python的集成学习代码示例,使用了多个机器学习算法: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier, VotingClassifier from sklearn.svm import SVC from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 读取数据 data = pd.read_csv("data.csv") # 准备数据 X = data.iloc[:, :-1] y = data.iloc[:, -1] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义模型 svm = SVC(probability=True, random_state=42) logreg = LogisticRegression(random_state=42) knn = KNeighborsClassifier() rf = RandomForestClassifier(random_state=42) # 训练模型 svm.fit(X_train, y_train) logreg.fit(X_train, y_train) knn.fit(X_train, y_train) rf.fit(X_train, y_train) # 预测结果 svm_pred = svm.predict(X_test) logreg_pred = logreg.predict(X_test) knn_pred = knn.predict(X_test) rf_pred = rf.predict(X_test) # 计算准确率 svm_acc = accuracy_score(y_test, svm_pred) logreg_acc = accuracy_score(y_test, logreg_pred) knn_acc = accuracy_score(y_test, knn_pred) rf_acc = accuracy_score(y_test, rf_pred) print("SVM准确率:", svm_acc) print("Logistic Regression准确率:", logreg_acc) print("KNN准确率:", knn_acc) print("Random Forest准确率:", rf_acc) # 定义投票集成模型 voting_clf = VotingClassifier(estimators=[("svm", svm), ("logreg", logreg), ("knn", knn), ("rf", rf)], voting="soft") # 训练投票集成模型 voting_clf.fit(X_train, y_train) # 预测结果 voting_pred = voting_clf.predict(X_test) # 计算准确率 voting_acc = accuracy_score(y_test, voting_pred) print("投票集成模型准确率:", voting_acc) ``` 这个代码演示了如何使用SVM、Logistic Regression、KNN和Random Forest等多个机器学习算法,并使用投票集成方法将它们合并在一起。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋冬无暖阳°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值