机器学习之集成学习与sklearn使用

一、个体与集成

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,集成学习的一般结构:先产生一组“个体学习器”,再用某种策略将它们结合起来。
sklearn中文sklearn英文.
目的:把多个使用给定学习算法构建的基学习器的预测结果结合起来,从而获得比单个学习器更好的泛化能力/鲁棒性。
集成学习方法分类:根据个体学习器的生成方式,分类两大类:
   (1)序列方法:个体学习器之间存在强依赖关系,必须串行生成的序列化方法,也就是基学习器是依次构建的,依次减少组合学习器的偏差。代表是Boosting;AdaBoost,梯度提升树等。
   (2)平均方法:个体学习器之间不存在强依赖关系,构建多个独立的估计器,然后取它们预测结果的平均,方差减小了。代表是Bagging和随机森林等。
工作流程
   首先:产生一组个体学习器
   然后:使用某种策略将它们结合起来
注:个体学习器通常由一个或多个现有的学习算法从训练数据中产生,比如决策树算法,BP神经网络算法等。
为什么集成学习会比单一学习器更好呢?
   回答:要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”,也就是学习器间要有具体差异。(在基学习器的误差相互独立的假设条件下)集成中个体分类器数目增大,集成的错误将指数级下降,最终趋向于零。
集成学习 核心问题注意:在现实任务中,个体学习器是为了解决同一个问题训练出来的,不可能相互独立,而且个体学习器的准确性和多样性本身存在冲突,所以如何产生并结合“好而不同”的个体学习器,正是集成学习研究的核心。
单决策树与集成学习:决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不太理想。模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,如randomForest、Adaboost、GBRT等,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病。

二、Boosting

基本概念:Boosting,也称为增强学习或提升法,是一种重要的集成学习技术,能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器。关注降低偏差。是以分类树或回归树为基本分类器的提升方法。以决策树为基函数的提升方法为提升树(boosting tree)。
工作机制:先从初始训练集训练得到一个基学习器,根据基学习器的表现对训练样本分布进行调整,使先前基学习器判断错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;重复进行,直到基学习器数目达到事先指定的数目值T,最终将这T个基学习器进行加权结合。
提升方法两部分:Boosting算法要涉及到两个部分,加法模型和前向分步算法。加法模型就是说强分类器由一系列弱分类器线性相加而成。前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。
样本分布调整:Boosting算法要求基学习器能对特定的数据分布进行学习。
   (1)重赋权法:对于可接受带权样本的基学习算法,这可通过“重赋权法”实施:就是在训练过程的每一轮中,根据样本分布为每一个训练样本重新赋予一个权重。
   (2)重采样法:对于无法接受带权样本的基学习算法,可通过“重采样法”来处理:在每一轮学习中,根据样本分布对训练集进行采样。
注意:以上两种方法并无显著的优劣差别。我们利用得到的样本集对基学习器进行训练。每一轮训练中,算法都要检查当前生成的基学习器是满足基本条件,如果不满足则抛弃,学习过程停止。这时会造成因基学习器过少而性能不佳。但采用重采用法可以进行重启动,避免了训练过程的过早停止,使得学习过程持续到预设的T轮停止。

2.1、AdaBoost

2.1.1、基本原理

   (1)基本概念:由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法。AdaBoost算法是一种迭代算法,训练样本为整个样本集,样本权重和学习器权重根据一定的公式进行更新(即加法模型和前向分步算法)。弱学习器的预测结果通过加权投票(或加权求和)的方式组合, 得到我们最终的预测结果。
   (2)样本权重和学习器权重如何更新
对于第一个问题,AdaBoost改变了训练数据的权值,也就是样本的概率分布,关注被错误分类的样本上,减小上一轮被正确分类的样本权值,提高那些被错误分类的样本权值。
对于第二个问题,AdaBoost采用加权多数表决的方法,加大分类误差率小的弱分类器的权重,减小分类误差率大的弱分类器的权重。

2.1.2、sklearn.ensemble.AdaBoostClassifier

   (1)AdaBoostClassifier类:class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None),链接地址
   (2)使用建议: n_estimators 控制弱学习器数量。 learning_rate 控制每个弱学习器对最终的结果的贡献程度(其实应该就是控制每个弱学习器的权重修改速率)。 弱学习器默认使用决策树。不同的弱学习器可以通过参数 base_estimator 来指定。 获取一个好的预测结果主要需要调整的参数是 n_estimators 和 base_estimator 的复杂度 (例如:对于弱学习器为决策树的情况,树的深度 max_depth 或叶子节点的最小样本数 min_samples_leaf 等都是控制树的复杂度的参数)。初始化时,将所有弱学习器的权重都设置为 ,因此第一次迭代仅仅是通过原始数据训练出一个弱学习器。在接下来的 连续迭代中,样本的权重逐个地被修改,学习算法也因此要重新应用这些已经修改的权重。

2.2、Gradient Tree Boosting 梯度提升树

2.2.1、基本原理

   (1)由来:在Boosting算法中,当采取平方误差损失函数时,损失函数刚好表达的是当前模型的拟合残差,最优化比较方便;当采取指数损失函数时,也很方便(AdaBoost);但对于一般函数时,最优化十分困难。因此,利用最速下降的近似法,即利用损失函数的负梯度在当前模型的值,作为回归问题中Boosting算法的残差的近似值。在回归问题中,这称为梯度提升回归树(GBRT),分类问题则称为梯度提升决策树(GBDT)。GBDT的性能相对于Boosting有一定的提升,它和AdaBoost都是Boosting族方法的一种。之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。
   (2)原理:采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法,与传统的Boost算法对正确、错误的样本进行加权有着极大的区别。它的基学习器都是CART决策树。
   (3)Gradient Boosting与Adaboosting方法的区别是:每一次计算都是为了减少上一次计算的残差(利用残差学模型),为了消除残差,我们会在残差减少的梯度方向上创建一个新的模型。可以看出GB和Boosting都是不断堆加模型的方式,只不过Boosting是为了减少误分样本的数量,而GB的目的是为了减小残差值。

2.2.2、sklearn.ensemble.GradientBoostingClassifier

   (1)GradientBoostingClassifier类:class sklearn.ensemble.GradientBoostingClassifier(loss=’deviance’, learning_rate=0.1, n_estimators=100, subsample=1.0, criterion=’friedman_mse’, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, presort=’auto’, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001),链接地址
   (2)使用建议:弱学习器(例如:回归树)的数量由参数 n_estimators 来控制;每个树的大小可以通过由参数 max_depth 设置树的深度,或者由参数 max_leaf_nodes 设置叶子节点数目来控制。 learning_rate 是一个在 (0,1] 之间的超参数,用来衡量每个弱分类器对于结果的贡献,控制梯度下降的步长,从而控制过拟合。loss 指定损失函数,可以看文档。子采样subsample,可以将GB和bagging结合起来。max_features 进行特征子采样(类似随机森林中的)。特征重要性评估:通过属性feature_importances_查看。
其他一些参数调整看sklearn中文或这里这里

2.3、xgboost(eXtreme Gradient Boosting) 极端梯度提升

2.3.1、相比GBRT的不同:

   (1)损失函数增加了正则化项,将树模型的复杂度加入到正则项中,来避免过拟合,因此泛化性能会优于GBDT。
   (2)损失函数是用泰勒展开式展开的,同时用到了一阶导和二阶导,可以加快优化速度。
   (3)和GBDT只支持CART作为基分类器之外,还支持线性分类器,在使用线性分类器的时候可以使用L1,L2正则化。
   (4)引进了特征子采样,像RandomForest那样,这种方法既能降低过拟合,还能减少计算。
   (5)在寻找最佳分割点时,考虑到传统的贪心算法效率较低,实现了一种近似贪心算法,用来加速和减小内存消耗,除此之外还考虑了稀疏数据集和缺失值的处理,对于特征的值有缺失的样本,XGBoost依然能自动找到其要分裂的方向。
   (6)XGBoost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。这个block也使得并行化成为了可能,其次在进行节点分裂时,计算每个特征的增益,最终选择增益最大的那个特征去做分割,那么各个特征的增益计算就可以开多线程进行。

2.3.2、xgboost的使用:

文档和一些实例使用,入门和调参中文文档中文文档Github链接

三、Bagging和随机森林

3.1、Bagging

3.1.1、基本原理

   (1)基本概念:Bagging是并行集成学习算法最著名的代表,在原始训练集的随机子集上构建估计器的多个实例,然后把这些估计器的预测结果结合起来形成最终的预测结果。 该方法通过在构建模型的过程中引入随机性,关注降低方差。可以减小过拟合,
   (2)样本子集采样方法:基于自助采样法(bootstrap sampling)。在sklearn的bagging方法中的BaggingClassifier主要采用有放回和无放回采样。
   (3)Bagging基本流程:采样出T个含m个样本的采样集,基于每个采样集训练出一个基学习器,再将这些基学习器结合。在对预测输出进行结合时,通常对分类任务使用简单投票法,回归任务使用简单平均法。若分类时,两个类投票数一样,可以随机选一个,或者进一步考虑置信度。
   (4)适用:通常在强分类器和复杂模型上使用时表现的很好(例如,完全决策树)。而 boosting 方法则在弱模型上表现更好(例如,浅层决策树)。复杂度与基学习器算法同阶,与标准AdaBoosting只适合二分类不同,它可以用于多分类和回归问题。每个基学习器只使用初始训练集的63.2%的样本,剩下的可用作验证集对泛化性能进行“包外估计”。

3.1.2、sklearn.ensemble.BaggingClassifier

   (1)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),链接地址
   (2)使用建议:输入的参数和随机子集抽取策略由用户指定。max_samples 和 max_features 控制着子集的大小(样例和特征的规模), bootstrap 和 bootstrap_features 控制着样例和特征的抽取是有放回还是无放回的。 当使用样本子集时,通过设置 oob_score=True ,可以使用袋外(out-of-bag)样本来评估泛化精度。下面是一个以KNeighborsClassifier 为元估计器的 bagging 集成实例。

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

3.2、随机森林(RandomForest)

3.2.1、基本原理

   (1)基本概念:在分类器构造过程中引入随机性来创建一组不同的分类器。集成分类器的预测结果就是单个分类器预测结果的平均值。
   (2)解释:是Bagging的一个扩展变体。它是以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入随机属性选择。也就是不同于传统的决策树在当前结点的属性集合中选一个最优属性作为划分属性,随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,再从该子集中选择一个最优属性用于划分。一般k = log2(d)。
   (3)优点:简单,容易实现,计算开销小,虽然只是对Bagging做了小改动,但与其通过样本扰动获得多样性相比,随机森林还具有属性扰动,使得多样性更好,泛化性能进一步提升。训练效率由于Bagging,因为只需对属性的子集进行考察。
   (4)缺点:它的收敛性与Bagging相似,但起始性能往往较差,因为只包含一个基学习器,且引入属性扰动,个体学习器往往性能有所下降,但是随着个体学习器数目的增加,随机森林会收敛到更低的泛化误差。
   (5)更仔细的解释:与adaboost有所区别,可以说一种改进的装袋组合算法。随机森林(randomForest),不仅对样本进行抽样,还对特征进行抽样。它通过随机的方式建立一个森林,森林里面有许多棵决策树,并且每一棵树之间是没有联系的。在得到森林之后,当有一个新的输入样本进来的时候,就让森林中的每一棵决策树分别对其进行判断,看这个样本应该属于哪一类(就分类算法而言),然后看看哪一类选择最多,就预测这个样本为该类。在建立每一棵决策树的过程中,有两点需要注意,即采样与完全分裂。首先是两个随机采样的过程,RF对输入的数据要进行行采样和列采样。对于行采样,是采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting过拟合。然后进行列采样,从M个feature特征中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个类别。一般很多的决策树算法都一个重要的步骤-剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。按照这种算法得到的随机森林中的每一棵决策树都是非常弱的,但当它们组合在一起的时候,就相当厉害了。随机森林就好比是:每一棵决策树就是一个精通于某一领域的专家(因为我们从M个feature中选择m个让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。随机森林的分类准确率可以与adaboost媲美。它对噪声数据更加鲁棒,运行速度比adaboost也快得多。

3.2.2、sklearn.ensemble.RandomForestClassifier

   (1)RandomForestClassifier类:class sklearn.ensemble.RandomForestClassifier(n_estimators=’warn’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None),链接地址
   (2)使用建议:当然随机森林有分类也有回归,每棵决策树的样本都是由训练集经过有放回抽样得来的。构造树过程中选择的分割点不再是所有特征中最佳分割点,而是特征的一个随机子集中的最佳分割点。 由于这种随机性,森林的偏差通常会有略微的增大(相对于单个非随机树的偏差),但是由于取了平均,其方差也会减小,通常能够补偿偏差的增加,从而产生一个总体上更好的模型。
注意:与西瓜书中不同的是,scikit-learn 的实现是取每个分类器预测概率的平均,而不是让每个分类器对类别进行投票。

3.3、极限随机树(Extremely Randomized Trees)

3.3.1、基本原理

   (1)基本概念:构造树中 计算分割点方法中的随机性进一步增强。不止是从使用随机特征子集,而且每个特征的分割阈值时随机产生的,在这些阈值中选择最佳者作为分割规则。
   (2)与随机森林的区别: 不是寻找最具有区分度的阈值了,而是在这部分引入了随机性。 这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差。

3.3.2、sklearn.ensemble.ExtraTreesClassifier

   (1)ExtraTreesClassifier类:class sklearn.ensemble.ExtraTreesClassifier(n_estimators=’warn’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=False, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None),链接地址

3.3、由随机树组成的森林的使用建议和功能

   (1)参数设置
   A、n_estimators 和 max_features,它俩是主要调整的参数, 前者(n_estimators)通常数量越大,效果越好,但时耗增加,而且当树的数量超过一个临界值之后,算法的效果并不会很显著地变好。 后者(max_features)是分割节点时考虑的特征的随机子集的大小。 这个值越低,方差减小得越多,偏差增大的也越多。 根据经验,回归问题中使用 max_features = n_features , 分类问题使用 max_features = sqrt(n_features)是比较好的默认值。 max_depth = None 和 min_samples_split = 2 结合通常会有不错的效果(即生成完全的树)。
   B、max_depth 和 min_samples_split :max_depth = None 和 min_samples_split = 2 结合通常会有不错的效果(即生成完全的树)。
   C、采样方法:在随机森林中,默认使用自助采样法(bootstrap = True), 然而 extra-trees 的默认策略是使用整个数据集(bootstrap = False)。 当使用自助采样法方法抽样时,泛化精度是可以通过剩余的或者袋外的样本来估算的,设置 oob_score = True 即可实现
   D、最佳参数:默认)值通常不是最佳的,同时还可能消耗大量的内存,最佳参数值应由交叉验证获得。
   E、减低模型复杂度:O(MNlog(N)) , 其中 M 是树的数目, N 是样本数。 可以通过设置以下参数来降低模型复杂度: min_samples_split , min_samples_leaf , max_leaf_nodes和max_depth 。
   F、并行化:n_jobs 参数实现,n_jobs = -1 ,则使用机器的所有核。
   (2)特征重要性评估(可用于特征选择)
   基本原理:特征对于目标变量在预测上的相对重要性,可以通过决策树节点的特征使用相对顺序(也就是深度)来评估。 决策树顶部使用的特征对大部分输入样本的最终预测决策做出更多贡献。使用最终预测结果中,用某特征贡献出的样本比例评估该特征的相对重要性 。通过对多个随机树中的 预期贡献率 (expected activity rates) 取平均,可以减少这种估计的 方差 ,并将其用于特征选择。
使用:训练完成的模型这些估计值存储在 feature_importances_ 属性中。

四、学习器的结合策略

   假设集成包含T个基学习器,下面是对这些学习器进行结合的常见策略。

(1)平均法

   对数值型输出,最常见的结合策略是平均法。分为简单平均法和加权平均法,前者是后者的特例。而且集成学习中的各种结合方法都可以视为加权平均法的特例或变体。对给定的基学习器,不同的集成学习方法可视为通过不同的方式来确定加权平均法中的基学习器权重。
权重确定方法:一般从训练数据中学习而得,现实任务中往往学得权重不完全可靠。所以一般在个体学习器差异较大时使用加权平均法,性能相近时使用简单平均法。

(2)投票法

   对分类任务来说,某个学习器从类别集合中预测一个标记出来,这时就可以使用投票法这种结合策略。分为(1)绝对多数投票法:某标记票数过半数,则预测为该标记。(2)相对多数投票法:得票数最多的标记为预测标记,若多个则随机选择一个。(3)加权投票法,加权投票了就是。
   当个体学习器输出值输出类型不同时:一种是类标记(1或0),一种是类概率(是概率),不同类型的输出值不能混用。基学习器相同时,用类概率效果较好,基学习器不同时只用类标记。

(3)学习法

   也就是通过另一个学习器来结合。Stacking是这种学习方法的代表。这时我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。
   解释:次级训练集的样本并不是从初级学习器的训练集产生的,而是通过交叉验证或留一法,在初级学习器训练完后,使用验证集产生预测结果,对于验证集中的每个样本,都会产生一个次级学习器次级训练集中的一个样本,该样本的特征为每个个体学习器的输出,而该样本对应的标记仍是原来的标记。
   研究表明:次级学习器的输入属性表示和次级学习算法对Stacking集成的泛化能力有很大影响。研究表明,将初级学习器的输出类概率作为次级学习器的输入属性,用多响应线性回归MLR作为次级学习算法比较好。

五、多样性

   (1)误差-分歧分解:反映了个体学习器在样本x上的不一致性,从而一定程度上反映了个体学习器的多样性。只适合回归学习,不适合作为目标来优化。
   (2)多样性度量:度量集成中个体分类器的多样性,估算个体学习器的多样化程度。典型的做法是考虑个体分类器的两两相似/不相似性,有:
@不合度量;@相关系数;@Q-统计量;@k-统计量。
   (3)多样性增强:一般是在学习过程中引入随机性,常见的是对数据样本,输入属性,输出属性,算法参数进行扰动。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值