机器学习——集成学习

1,736 阅读15分钟

image.png

一、集成学习是什么?

集成学习是对其他算法进行组合的方式。 我们将主要学习集成学习中的代表算法AdaBoost算法与随机森林

1.1概念

集成学习有时也被笼统地称作Boosting方法,广泛用于分类和回归任务。它最初的思想很简单:使用一些(不同的)方法改变原始训练样本的分布,从而构建多个不同的分类器,并将这些分类器线性组合得到一个更强大的分类器,来做最后的决策。

集成学习的理论基础来自于Kearns和Valiant提出的基于PAC(probably approximately correct)的可学习性理论 ,PAC 定义了学习算法的强弱:

  • 弱学习算法:识别错误率小于1/2(即准确率仅比随机猜测略高的算法)
  • 强学习算法:识别准确率很高并能在多项式时间内完成的算法

根据这两个概念,后来产生了一个重要的结论: 强可学习与弱可学习是等价的,即:一个概念是强可学习的充要条件是这个概念是弱可学习的。

1.2集成学习的特点

  • 将多个分类方法聚集在一起,以提高分类的准确率。
  • 由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类
  • 严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法
  • 通常一个集成分类器的分类性能会好于单个分类器
  • 如果把单个分类器比作一个决策者,集成学习的方法就相当于多个决策者共同进行一项决策

二、集成学习的分类

image.png

根据集成学习的定义,集成学习是通过构建多个学习器来完成学习任务,根据学习器的生成方式,集成学习方法大概可以分成两类:
1.每个学习器之间存在依赖关系,必须串行运行,每一轮迭代产生一个学习器,即Boosting算法。
2.每个学习器之间不存在依赖关系,可以并行运行,即Bagging、Random Forest(随机森林)

  • Boosting方法的基本思路:将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果加权得到最终结果。这样就利用基础学习器之间的依赖关系。通过对之前训练中错误标记的样本赋值较高的权重,可以提高整体的预测效果。
  • Bagging方法:在训练过程中,参与训练的基学习器之间无强依赖,可以进行并行训练(例如 Random Forest)。为了让基分类器之间相互独立,可以将训练集分为若干子集(训练样本较少时,子集之间可能有交叠)。Bagging方法更像是一个集体决策的过程,每个个体都进行单独学习,学习的内容可以相同也可以不同,也可以部分重叠。但由于个体之间存在差异性,最终做出的判断不会完全一致。在最终决策时,每个个体单独做出判断,在通过投票的方式做出最后的集体决策。并行方法的原理是利用基础学习器之间的独立性,通过平均可以显著降低错误。
  • Stacking算法:Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。

2.1Boosting算法

image.png

2.1.1AdaBoost算法

image.png

image.png AdaBoost算法是Adaptive Boost的简称,由Schapire于1996年提出,是最具体实现boosting方法最典型的代表。AdaBoost在之前学习器的基础上改变样本的权重,增加那些之前被分类错误的样本的比重,降低分类正确的样本比重,这样之后的学习器将重点关注那些被分类错误的样本。最后通过将这些学习器通过加权组合组成一个强学习器,分类正确率高的学习器权重较高,反之,权重较低。 步骤一:假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证了第一步能够在原始数据集上学习基本分类器Gm(x) 步骤二:AdaBoost反复学习基本分类器,在每一轮m=1,2,3,...,M顺次执行下列操作

  • (a)使用当前分布Dm加权的训练数据集,学习基本分类器Gm(x)
  • (b)计算基本分类器Gm(x)在加权训练数据集上的分类误差率,其实是加权训练集上被误分类样本的权值之和,由此可以看出数据权值分布与基本分离器Gm(x)的分类误差率的关系。
  • (c)计算基本分类器Gm(x)的系数αm。αm表示Gm(x)在最终分类器中的重要性,并且(b)得出的分类误差率越小的基本分类器在最终分类器中的作用越大。
  • (d)更新训练数据的权值分布,为下一轮学习基本分类器做准备。此种方法 不改变所给的训练数据,而不断的改变训练数据权值的分布,使得训练数据在基本分类器的学习中起到不同的作用,这是AdaBoost的一个特点。 步骤三:线性组合f(x)实现M个基本分类器的加权表决, 利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点

算法实现

Scikit-learn提供了sklearn.ensemble模块,支持众多集成学习算法和模型。

分类器

首先导入这个算法库,在这个模块中AdaBoost分类器被命名为AdaBoostClassifier(classifier是分类的意思。)
所以导入的语句是: from sklearn.ensemble import AdaBoostClassifier

from sklearn.ensemble import AdaBoostClassifier
print(AdaBoostClassifier)

导入这个模块后,输出AdaBoostClassifier分类器,得出的结果是 class 'sklearn.ensemble._weight_boosting.AdaBoostClassifier',恰好说明这个AdaBoost分类器是一个类,而这个类中包含了很多参数

回归器

AdaBoost回归器也是在sklearn.ensemble模块中实现,是实现的方法大同小异,因为其中集成了算法的步骤与计算方法,所以我们仅仅需要调用就可以了,可根据需要修改算法参数,但是使用AdaBoost回归器时,首先导入这个算法回归器,其导入方法如下:

from sklearn.ensemble import AdaBoostRegressor

回归器语法:

class sklearn.ensemble.AdaBoostRegressor(base_estimator=None,*,n_estimators=50,learning_rate=1.0,loss='linear',random_state=None)

  • base_estimator: 可选参数,默认为DecisionTreeClassifier。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。我们常用的一般是CART决策树或者神经网络MLP。默认是决策树,即AdaBoostClassifier默认使用CART分类树DecisionTreeClassifier,而AdaBoostRegressor默认使用CART回归树DecisionTreeRegressor。另外有一个要注意的点是,如果我们选择的AdaBoostClassifier算法是SAMME.R,则我们的弱分类学习器还需要支持概率预测,也就是在scikit-learn中弱分类学习器对应的预测方法除了predict还需要有predict_proba。
  • loss: 可选参数,默认为linear。{'linear','square','exponential'}可选,每次增强迭代后更新权重时使用的损失函数。 n_estimators: 整数型,可选参数,默认为50。弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
  • learning_rate: 浮点型,可选参数,默认为1.0。每个弱学习器的权重缩减系数,取值范围为0到1,对于同样的训练集拟合效果,较小的v意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的v开始调参,默认是1。
  • random_state: 整数型,可选参数,默认为None。如果RandomState的实例,random_state是随机数生成器; 如果None,则随机数生成器是由np.random使用的RandomState实例

2.2 Bagging算法

image.png

Bagging算法又称(引导聚集算法)装袋算法,是并行式集成学习方法的典型代表,它直接基于自助采样法。

2.2.1基本流程

给定包含m个样本的数据集,我们先随机取出一个样本放入采样中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中。这样,经过m次随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。照这样,我们可采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。

在对预测输出进行结合时,Bagging通常对 分类任务使用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。

算法特点

image.png

算法实现

分类器

分类器算法:from sklearn.ensemble import BaggingClassifier

分类器语法:class sklearn.ensemble.BaggingClassifier(base_estimator=None, n_estimators=10, *, max_samples=1.0, max_features=1.0, bootstrap=True, bootstrap_features=False, oob_score=False, warm_start=False, n_jobs=None, random_state=None, verbose=0)

- base_estimator : 对象或无,可选(默认=无),定义若学习器。如果为None,则基本估计量为决策树。
- bootstrap : 布尔值,可选(默认= True),是否抽取样本进行替换。如果为False,则执行不替换的采样。
- bootstrap_features : 布尔值,可选(默认False),是否使用替换样本描绘特征
- oob_score : 布尔变量,可选(默认为False),是否使用现成的样本来估计泛化误差。
- warm_start : 布尔变量,可选(默认= False),设置为True时,请重用上一个调用的解决方案以适合并为集合添加更多估计量,否则,仅适合一个全新的集合。
- n_jobs : intNone(可选)(默认为None),fit和 并行运行的作业数predict。None除非joblib.parallel_backend上下文中,否则表示1-1表示使用所有处理器。
- random_state : 整型,RandomState实例或无,可选(默认值:无),如果为int,则random_state是随机数生成器使用的种子;否则为false- verbose : 在拟合和预测时控制详细程度。
而需要关注的是三个参数,
- n_estimators : int,可选(默认值为10),随机采样的次数。
- max_samples : intfloat,可选(默认值= 1.0),从X抽取以训练每个基本估计量的样本数。如果为int,则抽取样本 max_samples;如果float,则抽取本 max_samples * X.shape[0]
- max_features : intfloat,可选(默认值= 1.0),从X绘制以训练每个基本估计量的要素数量。如果为int,则绘制特征 max_features;如果是浮动的,则绘制特征 max_features * X.shape[1]
可以适当改变这三个参数,准确率会有所改变。

回归器

  • 回归器算法:from sklearn.ensemble import BaggingRegressor
  • 回归器语法:class sklearn.ensemble.BaggingRegressor(base_estimator=None, n_estimators=10, *, max_samples=1.0, max_features=1.0, bootstrap=True, bootstrap_features=False, oob_score=False, warm_start=False, n_jobs=None, random_state=None, verbose=0)
- base_estimator : 对象或无,可选(默认=无),基本估计量适合数据集的随机子集。如果为None,则基本估计量为决策树。
- n_estimators : int,可选(默认值为10),随机采样的次数。
- max_samples : intfloat,可选(默认值= 1.0),从X抽取以训练每个基本估计量的样本数。如果为int,则抽取样本 max_samples;如果float,则抽取本 max_samples * X.shape[0]
- max_features : intfloat,可选(默认值= 1.0),从X绘制以训练每个基本估计量的要素数量。如果为int,则绘制特征 max_features;如果是浮动的,则绘制特征 max_features * X.shape[1]
- bootstrap : 布尔值,可选(默认= True),是否抽取样本进行替换。如果为False,则执行不替换的采样。
- bootstrap_features : 布尔值,可选(默认False),是否使用替换样本描绘特征
- oob_score : 布尔变量,可选(默认为False),是否使用现成的样本来估计泛化误差。
- warm_start : 布尔变量,可选(默认= False),设置为True时,请重用上一个调用的解决方案以适合并为集合添加更多估计量,否则,仅适合一个全新的集合。
- n_jobs : intNone(可选)(默认为None),fit和 并行运行的作业数predict。None除非joblib.parallel_backend上下文中,否则表示1-1表示使用所有处理器。
- random_state : 整型,RandomState实例或无,可选(默认值:无),如果为int,则random_state是随机数生成器使用的种子;否则为false- verbose : 在拟合和预测时控制详细程度。
需要进行修改的参数是三个参数,分别是

2.3 随机森林

image.png 概念:
随机森林的基础是决策树与Bagging算法,随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树。随机森林的名称中有两个关键词,一个是“随机”,一个就是"森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想--集成思想的体现。

其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

随机森林的特点 在当前所有算法中,具有极好的准确率; 能够有效地运行在大数据集上; 能够处理具有高维特征的输入样本,而且不需要降维; 能够评估各个特征在分类问题上的重要性; 在生成过程中,能够获取到内部生成误差的一种无偏估计; 对于缺省值问题也能够获得很好的结果

算法实现

from sklearn.ensemble import RandomForestClassifier

算法语法

image.png

- criterion: string, optional (default=”gini”) 字符串,可选择(默认值为“gini”)。衡量分裂质量的性能函数,默认是基尼指数,熵达到峰值的过程要相对慢一些。
- min_samples_split: int, float, optional (default=2) 整数,浮点数,可选的(默认值为2)。内部节点再划分所需最小样本数。如果某节点的样本数少于,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
- min_samples_leaf: int, float, optional (default=1) 整数,浮点数,可选的(默认值为1)。叶子节点最少样本数。如果样本量数量级非常大,则推荐增大这个值。
- min_weight_fraction_leaf: float, optional (default=0.) 浮点数,可选的(默认值是0.0)。叶子节点最小的样本权重和。就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
- max_features : int, float, string or None, optional (default=”auto”) 整数,浮点数,字符串或者无值,可选的(默认值为"auto")。最大特征数
- max_leaf_nodes : int or None, optional (default=None) 整数或者无值,可选的(默认值为None)。最大叶子节点数。限制最大叶子节点数,可以防止过拟合。以最优的方法使用max_leaf_nodes来生长树。最好的节点被定义为不纯度上的相对减少。如果为None,那么不限制叶子节点的数量。
- min_impurity_decrease : float, optional (default=0.) 浮点数,可选的(默认值为0)。如果节点的分裂导致的指数的下降程度大于或者等于这个节点的值,那么这个节点将会被分裂。
- min_impurity_split : float, 浮点数。节点划分最小指数。
- bootstrap : boolean, optional (default=True) 布尔值,可选的(默认值为True)。建立决策树时,是否使用有放回抽样。
- oob_score : bool (default=False) bool,(默认值为False)。建议用True,袋外分数反应了一个模型拟合后的泛化能力。
- n_jobs : integer, optional (default=1) 整数,可选的(默认值为1)。用于拟合和预测的并行运行的工作(作业)数量。如果值为-1,那么工作数量被设置为核的数量
- random_state: int, RandomState instance or None, optional (default=None) 整数,RandomState实例,或者为None,可选(默认值为None)。是随机数生成器使用的种子; 如果是RandomState实例,random_state就是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例。
- verbose : int, optional (default=0) 整数,可选的(默认值为0)。控制决策树建立过程的冗余度。
- warm_start : bool, optional (default=False) 布尔值,可选的(默认值为False)。当被设置为True时,重新使用之前决定的解决方案,用来给全体拟合和添加更多的估计器,反之,仅仅只是为了拟合一个全新的森林。