机器学习算法梳理—随机森林

一、 集成学习

集成学习(Ensemble Learning)指将多个弱分类器构成一个强分类器。跟一般分类算法比,集成学习获得的分类器其精度比较高。结构如下:
机器学习算法梳理—随机森林
集成学习有两个主要的问题需要解决,第一是如何得到若干个分类器(个体学习器),第二是如何选择一种集成策略,将这些个体学习器集合成一个强学习器。
集成学习常见方法有3种:Bagging(装袋法),Boosting(提升),Stacking(堆叠)。

二、个体学习器

个体学习器如上图中通过数据学习得到的很多学习器,其类型有两种:

(1)相同类型的个体学习器:
指所有的个体学习器都是同一个种类的(同质的)。比如都是决策树个体学习器,或者都是神经网络个体学习器。
(2)相同类型的个体学习器:
指所有的个体学习器不全是一个种类的(异质的)。比如我们有一个分类问题,对训练集采用支持向量机个体学习器,逻辑回归个体学习器和朴素贝叶斯个体学习器来学习,再通过某种结合策略来确定最终的分类强学习器。

目前来说,同质个体学习器的应用是最广泛的,同质个体学习器按照个体学习器之间是否存在依赖关系可以分为两类:第一个是个体学习器之间存在强依赖关系,代表算法是boosting系列算法;第二个是个体学习器之间不存在强依赖关系,代表算法是bagging和随机森林系列算法。

三、Boosting 与Bagging

(1)Boosting算法

Boosting算法的工作机制是首先用带有权重的训练集训练出一个弱学习器1,然后根据弱学习器1的学习误差率更新训练集的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,然后基于更新后的权重训练集继续训练得到弱学习器2,如此重复进行,直到最后弱学习器数目达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。即每个弱分类器之间都有相互依赖,过程如下图:
机器学习算法梳理—随机森林

Boosting系列算法里最著名算法主要有AdaBoost算法和**提升树(boosting tree)**系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。

(2)Bagging算法

Bagging的首先通过随机采样得到的得到T个采样集,对于这T个采样集分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。这里的随机采样指是自助采样法(Bootstap sampling),即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回,也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集。该算法得到的每个分类器之前没有强烈依赖关系,过程如下图:
机器学习算法梳理—随机森林

四、结合策略

通过上面的总结,不管用哪种算法,最后得到的弱学习器都要通过一定的结合方法,最后组成强学习器。主要的结合策略有:

(1)平均法

对于回归预测类问题,通常使用的结合策略是平均法,通过对若干个弱学习器的输出进行平均得到最终的预测输出。其中包括算术平均和加权平均:
算术平均:
机器学习算法梳理—随机森林
加权平均:
机器学习算法梳理—随机森林
机器学习算法梳理—随机森林
一般而言,在个体学习器的性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。

(2)投票法

对于分类问题,通常使用的是投票法。为便于讨论,我们将学习器hi将从类别标记集合c1,c2,…,cN中预测出一个标记,
将hi 在样本x上的预测输出表示为一个N维向量(h_i1(x);h_i2(x);…;h_iN(x)),其中hji(x) 是hi在类别标记cj上的输出。
投票法是相对多数投票法绝对多数投票法
**相对多数投票法:**指T个弱学习器的对样本x的预测结果中,数量最多的类别为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。
机器学习算法梳理—随机森林
**绝对多数投票法:**指预测的票数要求过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。
机器学习算法梳理—随机森林
**加权投票法:**指每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
机器学习算法梳理—随机森林

(3)学习法

以上两个方法都是对弱学习器的结果做平均或者投票,相对比较简单,但是可能学习误差较大,于是就有了学习法这种方法,对于学习法,代表方法是stacking,当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。

五、随机森林思想

随机森林属于集成学习(Ensemble Learning)中的bagging算法,是一种特殊的bagging方法,它将决策树用作bagging中的模型。核心思想就是将多个不同的决策树进行组合,利用这种组合降低单一决策树有可能带来的片面性和判断不准确性。
具体来讲,随机森林是用随机的方式建立一个森林,这个随机性表述的含义我们接下来会讲。随机森林是由很多的决策树组成,但每一棵决策树之间是没有关联的。在得到森林之后,当对一个新的样本进行判断或预测的时候,让森林中的每一棵决策树分别进行判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

六、随机森林的推广

在随机森林中,其随机的思想是指在构建随机森林时需要利用两个方面的随机性选取:数据的随机性选取和待选特征的随机选取。

(1)数据的选择

首先,从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。第二,利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。最后,如果有了新的数据需要通过随机森林得到分类结果,就可以通过对子决策树的判断结果的投票,得到随机森林的输出结果了。利用下面的例子来说明随机森林的数据集的选取和判断。
机器学习算法梳理—随机森林
上图有一个原始数据集,利用原始数据集我们根据数据随机选取的方法生成三个新的数据集,然后利用这三个子数据集进行决策树判断。假设随机森林中就有这么3棵子决策树,2棵子树的分类结果是A类,1棵子树的分类结果是B类,那么根据投票原则随机森林的分类结果就是A类。

(2)特征的选择

与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。以下图为例来说明随机选取待选特征的方法。
机器学习算法梳理—随机森林
在上图中,蓝色的方块代表所有可以被选择的特征,也就是目前的待选特征。黄色的方块是分裂特征。左边是一棵决策树的特征选取过程,通过在待选特征中选取最优的分裂特征(利用决策树的ID3算法,C4.5算法,CART算法等等),完成分裂。右边是一个随机森林中的子树的特征选取过程。

七、优缺点

(1)随机森林的优点

a. 在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合;
  b. 在当前的很多数据集上,相对其他算法有着很大的优势,两个随机性的引入,使得随机森林具有很好的抗噪声能力;
  c. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化;
  d. 可生成一个Proximities=(pij)矩阵,用于度量样本之间的相似性: pij=aij/N, aij表示样本i和j出现在随机森林中同一个叶子结点的次数,N随机森林中树的颗数;
  e. 在创建随机森林的时候,对generlization error使用的是无偏估计;
  f. 训练速度快,可以得到变量重要性排序(两种:基于OOB误分率的增加量和基于分裂时的GINI下降量;
  g. 在训练过程中,能够检测到feature间的互相影响;
  h. 容易做成并行化方法;
  i. 实现比较简单。

(2)随机森林的缺点

a. 在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
  b. 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

八、sklearn参数

lass sklearn.ensemble.RandomForestClassifier(
    n_estimators=10, 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=1, 
    random_state=None, verbose=0, warm_start=False, class_weight=None)

因随机森林中的树是决策树,所以关于决策树的大部分参数与决策树模型中的参数意思一致。

(1)sklearn中决策树的参数

1,criterion: ”gini” or “entropy”(default=”gini”)是计算属性的gini(基尼不纯度)还是entropy(信息增益),来选择最合适的节点。

2,splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。

3,max_features: 选择最适属性时划分的特征不能超过此值。

当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
if “auto”, then max_features=sqrt(n_features).
If “sqrt”, thenmax_features=sqrt(n_features).
If “log2”, thenmax_features=log2(n_features).
If None, then max_features=n_features.

4,max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。

5,min_samples_split:根据属性划分节点时,每个划分最少的样本数。

6,min_samples_leaf:叶子节点最少的样本数。

7,max_leaf_nodes: (default=None)叶子树的最大样本数。

8,min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值

9,verbose:(default=0) 是否显示任务进程

(2)随机森林特有的参数:

1,n_estimators=10:决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。

2,bootstrap=True:是否有放回的采样。

3,oob_score=False:oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。

4,n_jobs=1:并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job。

5,warm_start=False:热启动,决定是否使用上次调用该类的结果然后增加新的。

6,class_weight=None:各个label的权重。

九、应用场景

数据维度相对低(几十维),同时对准确性有较高要求时。
因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。

参考文献:

1.https://blog.csdn.net/dm_robin/article/details/80348309
2.https://blog.csdn.net/qq_36330643/article/details/77621232
3.https://blog.csdn.net/chenyukuai6625/article/details/73670473
4.https://yq.aliyun.com/ziliao/515435