机器学习中的集成学习(一)+https://developer.aliyun.com/article/1544761?spm=a2c6h.13148508.setting.16.22454f0eHFZZj3
3 高级集成技术
3.1 Bagging💯
Bagging(又称为装袋法),是所有集成方法中最为简单也最为常用的操作之一。Bagging这个名字其实是Bootstrap Aggregating的缩写,顾名思义,Bagging的两个关键点就是引导和聚合。Bagging方法主要是通过结合几个模型的结果来降低方差、避免过拟合,并提高准确率和稳定性。
Bagging方法的执行步骤主要分为两部分:
- 通过随机采样(Bootstrap)的方法产生不同的训练数据集,然后分别基于这些训练集建立多个弱学习器。
- 通过投票法或者平均法对多个弱学习器的结果进行聚合(Aggregating),得到一个相对更优的预测模型(强学习器)。
这个过程中,需要注意的是:
每个采样集都是从原始数据集中有放回的随机抽样出来的,这个方法也叫做自主采样法(Bootstap sampling)。也就是说对于m个样本的原始数据集,每次随机选取一个样本放入采样集,然后把这个样本重新放回原数据集中,然后再进行下一个样本的随机抽样,直到一个采样集中的数量达到m,这样一个采样集就构建好了,然后我们可以重复这个过程,生成n个这样的采样集。也就是说,每个采样集中的样本可能是重复的,也可能原数据集中的某些样本根本就没抽到,并且每个采样集中的样本分布可能都不一样。
- 在Bagging集成当中,我们并行建立多个弱评估器(通常是决策树,也可以是其他非线性算法),并综合多个弱评估器的结果进行输出。当集成算法目标是回归任务时,集成算法的输出结果是弱评估器输出的结果的平均值,当集成算法的目标是分类任务时,集成算法的输出结果是弱评估器输出的结果使用投票法(少数服从多数)。
假设现在一个bagging集成算法当中有7个弱评估器,对任意一个样本而言,输出的结果如下:
import numpy as np r_clf = np.array([0,2,1,1,2,1,0]) np.bincount(r_clf) np.argmax(np.bincount(r_clf)) result_clf = np.argmax(np.bincount(r_clf)) result_clf #集成算法在现在的样本上应该输出的类别 r_clf = np.array([1,1,1,0,0,0,2,2]) result_clf = np.argmax(np.bincount(r_clf)) result_clf r_reg = np.array([-2.082, -0.601, -1.686, -1.001, -2.037, 0.1284, 0.8500]) result_reg = r_reg.mean() result_reg
3.2 Boosting adaboost、gbdt,xgboost💯
boosting又称为提升法,它是一个迭代的过程,用来自适应地改变训练样本的分布,使得弱分类器聚焦到那些很难分类的样本上。它的做法是给每一个训练样本赋予一个权重,在每一轮训练结束时自动地调整权重。
boosting方法的流程,如下图所示:
首先给每个样本一个初始权重D1(通常初始权重为1),使用带着初始权重D1的样本集对模型进行训练得到第一个弱学习器,然后第一个弱学习器对所有的样本进行预测,有些样本会预测正确,有些样本则会预测错误,此时得到一个误差率e1,预测正确的样本就减少这些样本的权重,预测错误的样本就增加这些样本的权重,也就是让模型更加关注预测错误的那些样本,那么之后所有的样本权重就会发生改变,此时样本权重变为D2,继续使用带着权重D2的样本集对模型进行训练得到弱学习器2,然后弱学习器2对所有的样本进行预测……直到训练出N个弱学习器。然后对这N个弱学习器进行加权平均得到一个强学习器。
3.3 Bagging vs Boosting 💯
在Bagging算法中,我们一次性建立多个平行独立的弱评估器,并让所有评估器并行运算。在Boosting集成算法当中,我们逐一建立多个弱评估器(基本是决策树),并且下一个弱评估器的建立方式依赖于上一个弱评估器的评估结果,最终综合多个弱评估器的结果进行输出,因此Boosting算法中的弱评估器之间不仅不是相互独立的、反而是强相关的,同时Boosting算法也不依赖于弱分类器之间的独立性来提升结果,这是Boosting与Bagging的一大差别。如果说Bagging不同算法之间的核心区别在于靠以不同方式实现“独立性”(随机性),那Boosting的不同算法之间的核心区别就在于上一个弱评估器的评估结果具体如何影响下一个弱评估器的建立过程。
与Bagging算法中统一的回归求平均、分类少数服从多数的输出不同,Boosting算法在结果输出方面表现得十分多样。早期的Boosting算法的输出一般是最后一个弱评估器的输出,当代Boosting算法的输出都会考虑整个集成模型中全部的弱评估器。一般来说,每个Boosting算法会其以独特的规则自定义集成输出的具体形式,但对大部分算法而言,集成算法的输出结果往往是关于弱评估器的某种结果的加权平均,其中权重的求解是boosting领域中非常关键的步骤。
4 基于Bagging和Boosting的机器学习算法
4.1 sklearn中的bagging算法💫
在sklearn当中,我们可以接触到两个Bagging集成算法,一个是随机森林(RandomForest),另一个是极端随机树(ExtraTrees),他们都是以决策树为弱评估器的有监督算法,可以被用于分类、回归、排序等各种任务。同时,我们还可以使用bagging的思路对其他算法进行集成,比如使用装袋法分类的类BaggingClassifier对支持向量机或逻辑回归进行集成。
4.2 sklearn中的Boosting算法💫
在sklearn当中,我们可以接触到数个Boosting集成算法,包括Boosting入门算法AdaBoost,性能最稳定、奠定了整个Boosting效果基础的梯度提升树GBDT(Gradient Boosting Decision Tree),以及近几年才逐渐被验证有效的直方提升树(Hist Gradient Boosting Tree)。
在过去5年之间,除了sklearn,研究者们还创造了大量基于GBDT进行改造的提升类算法,这些算法大多需要从第三方库进行调用,例如极限提升树XGBoost(Extreme Gradient Boosting Tree),轻量梯度提升树LightGBM(Light Gradiant Boosting Machine),以及离散提升树CatBoost(Categorial Boosting Tree)。