机器学习系列(6)——集成学习方法与随机森林

本文介绍集成学习方法和随机森林算法,以及随机森林在sklearn中的实现。

 

0x01、集成学习简介

1、集成学习

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning)等。

集成学习的一般结构:先产生一组个体学习器(individual learner),再用某种策略将它们结合起来。

个体学习器通常由一个现有的学习算法从训练数据产生,此时集成中只包含同种类型的个体学习器,这样的集成是同质的(homogeneous),如 Bagging方法和Boosting方法。同质集成中的个体学习器亦称为基学习器(base learner),相应的学习算法称为基学习算法(base learning algorithm)。

集成也可以包含不同类型的个体学习器,称为异质的(heterogenous),如Stacking方法。异质集成中的个体学习器由不同的学习算法生成,这时将个体学习器称为组件学习器(component learner)或直接称为个体学习器。

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

(1)个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是Boosting系列算法。

(2)个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是Bagging系列算法。

2、Bagging方法

Bagging是并行式集成学习方法最著名的代表。它直接基于自助采样法(bootstrap sampling)。给定包含m个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中(有放回采样),这样经过m次随机采样操作,得到含有m个样本的采样集,初始训练集中的样本在采样集里多次出现,有的则从未出现。初始训练集中约有63.2%的样本出现在采样集中。

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

假设基学习器的计算复杂度为  O(m),则Bagging的复杂度大致为 T(O(m)+O(s)) 。考虑到采样与投票/平均过程的复杂度 O(s) 很小,而T通常是一个不太大的常数,因此训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶,这说明Bagging是一个很高效的集成学习算法。Bagging能不经修改地用于多分类、回归等任务。

由于采用自助采样,剩下的约36.8%的样本可用作验证集来对泛化性能进行包外估计(out-of-bag estimate)。当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理。当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险。

从偏差-方差分解的角度看,Bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

 

0x02、随机森林算法概述

随机森林(Random Forest,RF)在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。优点是简单、容易实现、计算开销小。

传统决策树在选择划分属性时是在当前结点的属性集合(假设有d个属性)中选择一个最优属性。在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的集合,然后再从这个子集中选择一个最优属性用于划分,这里的参数k控制了随机性的引入程度。一般情况下,可使用 k=log_2~d 。随机森林的收敛性与Bagging相似。随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。

随机森林的“随机”体现在样本的随机和特征的随机。每棵树生成过程如下:

(1)样本的随机:如果训练集大小为N,对于每棵树而言,从训练样本集中bootstrap随机且有放回地抽取n个训练样本作为该树的训练集,重复K次,生成K组子训练样本;

(2)特征随机:如果每个特征的样本维度为M,指定一个常数m<

(3)利用m个特征对每个子数据集构建最优学习模型,即建立了K棵CART决策树,每棵树尽最大程度的生长,并且没有剪枝过程;

(4)对于新的输入数据,根据这K个CART决策树形成的随机森林模型,通过投票表决结果,决定数据属于哪一类(投票机制有少数服从多数,多数加权等)。

随机森林算法优点:

(1)训练可以高度并行化,对于大样本训练速度有优势;

(2)两个随机性的引入,使得随机森林不易陷入过拟合;且具有良好的抗噪能力,对部分特征缺失不敏感;训练出的模型方差小,泛化能力强;能处理具有高维特征的样本,而且不需要降维;

(3)能够评估各个特征的重要性;

(4)只有在半数以上的基分类器出错时才会做出错误的预测;

随机森林算法缺点:

(1)在某些噪声较大的样本集上,容易陷入过拟合;

(2)计算成本相比决策树更高,需要更多时间来训练;

(3)取值划分比较多的特征容易对随机森林的决策产生较大影响,从而影响拟合的效果。

 

0x03、随机森林算法步骤

输入:样本集 T=\left\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n) \right\},弱分类器迭代次数n;

输出:最终的强分类器 f(x) 。

(1)对于i=1,2,...,n :

        (a). 对训练集进行第 i 次随机采样,共采集 n 次,得到包含 n 个样本的采样集 D_i

        (b). 用采样集 D_i 训练第 i 个决策树模型  G_i(x),在训练决策树模型的结点的时候,在结点上所有的样本特征中选择一部分样本特征,在这些随机选择的部分样本特征中选择一个最优的特征来做决策树的左右子树划分;

(2)如果是分类算法预测,则 n 个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,n 个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。

 

0x04、随机森林在sklearn中的实现

sklearn.ensemble.RandomForestClassifier 参数如下,标粗的为比DecisionTree增加的参数。

参数 参数类型 默认值 参数含义 详细说明
n_estimators int 100 弱学习器的最大个数 即森林中树的个数。
criterion {'gini','entropy'} gini 特征选择标准 对决策树:gini:基尼系数,entropy:信息增益。
对回归树:可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。
max_depth int None 决策树最大深度 None:不限制子树的深度。样本多,特征多时,一般需要限制深度。
min_samples_split int/float 2 内部节点再划分所需最小样本数 限制子树继续划分的条件。如果节点的样本数少于min_samples_split,则不会继续在尝试选择最优特征来进行划分。若样本数量非常大(例如10w),则推荐增大这个值。
min_samples_leaf int/float 1 叶节点所需的最少样本数 若某叶子节点样本数小于min_samples_leaf,则会和兄弟节点一起被剪枝。若样本数量级非常大(例如10w),则推荐增大这个值。
min_weight_fraction_leaf float 0 叶子节点最小的样本权重和 限制叶子节点所有样本权重和的最小值,如果小于这个值则会和兄弟节点一起被剪枝。默认0表示不考虑权重问题。若样本缺失值较多或分布类别偏差很大,则可引入样本权重。
max_features int/float
/{'auto','sqrt','log2'}
auto 划分时考虑的最大特征数 None:考虑所有特征;log2:最多考虑log2N个特征数;sqrt或auto:最多考虑平方根个特征;int:考虑绝对特征数;float:考虑特征百分比。如果特征数不多,使用None,如果特征数非常多,可灵活使用其他,以控制决策树的生成时间。
max_leaf_nodes int None 最大叶子节点数 防止过拟合。默认None即不限制最大叶子节点数。若加限制,则算法会建立在最大叶子节点数内最优的决策树。若特征数量大,则可限制,可通过交叉验证得到。
min_impurity_decrease float 0 节点划分最小不纯度 限制决策树的增长。若某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。
bootstrap bool TRUE 有放回抽样 False:所有样本均参与树的构建
oob_score bool FALSE 袋外样本 是否使用袋外样本来估计泛化精度。
n_jobs int None 并行作业数量 用于拟合和预测的并行运行的作业数量。-1:作业数量即为核的数量
random_state int
/随机状态实例
None 随机性控制 若为RandomState实例,random_state就是随机数生成器;None:随机数生成器是np.random使用的RandomState实例。
verbose int 0   控制决策树建立过程的冗余度
warm_start bool FALSE 热启动 True:重复使用之前的调用,再加入更多弱学习器
class_weight 字典
/{'balanced',
'balanced_subsample'}
  类别权重 指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。Balanced:算法自己计算权重,样本量少的类别权重会高。
不适用于回归树。
cpp_alpha 非负的浮点型 0 用于最小代价复杂度修剪的复杂度参数 将会选择最大代价复杂度小于ccp_alpha的子树。默认不修剪。
max_samples int/float None 训练每棵树所用的最大样本数 None: 取全部个样本;若是整数,则取该整数个样本;若是浮点数,范围须在(0,1),则取该比例的样本;

 

参考:

[1]. 周志华. 机器学习

[2]. 李航. 统计学习方法(第二版)

[3]. 机器学习之集成学习 - 博客园

[4].[Machine Learning & Algorithm] 随机森林(Random Forest)- 博客园

[5]. 随机森林原理与Sklearn参数详解 - 简书

你可能感兴趣的:(机器学习)