机器学习算法系列(五):bagging与随机森林对比及随机森林模型参数介绍

Bagging思想

bagging是一种集成模型的思想。其名称来源于“bootstrap aggregating"。这种方法是用来解决模型的过拟合问题。

首先说一下bootstrap方法,中文名称叫做”自助采样法“,是一种有放回的采样方法。比如说样本空间有m个样本,当通过bootstrap方法采样时,我们有放回的采样m次,得到m个样本(其中有重复)。

bagging思想就是以自助采样法为基础进行的。主要流程如下:

机器学习算法系列(五):bagging与随机森林对比及随机森林模型参数介绍_第1张图片

从训练集中利用bootstrap的方法采样T次,得到T个样本集,然后分别用不同的模型进行训练,得到T个学习器。接下来,分别使用这T个学习器对测试集进行预测,得到T组结果。针对分类问题,则采用投票的方式,得到最终的预测结果。对于回归问题,则求T组预测结果的算术平均。

RandomForest(随机森林)模型

随机森林模型是一种基于树模型的bagging的优化版本。

随机性

随机森林的随机性主要体现在两个方面:

**数据集的随机选取:**从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。

为什么要选择有放回的采样方式?

我的理解:如果不采用有放回的方式,第一种可能是每棵树的样本都是样本全集,这种情况下得到的每棵树都是一样的。第二种可能是从数据集中进行随机采样,得到不同的训练子集,这样每棵树的训练数据集都完全不同,而且每棵树仅仅利用了一小部分数据,甚至都不足以进行有效学习。

因此采用这种bootstrap方法, 既保证了每棵树之间的数据具有一定的差异,同时每棵树的训练数据量又和样本总量相同,不会因为数据量过少而导致每棵树的学习能力变弱。

**特征的随机选取:**与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。

通过以上两个随机性来降低过拟合,尽量减少噪声点的影响。因为是有放回的抽样,所以肯定有一些学习器中是不包含噪声点的,因此也就不会学习到噪声点的相关知识,从而减少噪声点的影响,降低过拟合。

优缺点

随机森林的优点:

  • 实现简单,训练速度快,泛化能力强,可以并行实现,因为训练时树与树之间是相互独立的;
  • 相比单一决策树,能学习到特征之间的相互影响,且不容易过拟合;
  • 能处理高维数据(即特征很多),并且不用做特征选择,因为特征子集是随机选取的;
  • 对于不平衡的数据集,可以平衡误差;
  • 相比SVM,不是很怕特征缺失,因为待选特征也是随机选取;
  • 训练完成后可以给出哪些特征比较重要。

随机森林的缺点:

  • 在噪声过大的分类和回归问题还是容易过拟合;
  • 相比于单一决策树,虽然提高了准确度,但是它的随机性让我们难以对模型进行解释。

RF与bagging对比

随机森林与一般的bagging相比:

  • bagging方法的的随机性仅仅来自样本扰动,随机林模型中引入了属性扰动,这样使得最终模型的泛化性能可以通过个体学习器之间的差异度的增加而进一步提升。

  • 和bagging相比,随机森林的起始性能往往比较差,然而随着个体学习器数目的增加,随机森林会收敛到更小的误差。

  • 随机森林的训练效率优于bagging,因为bagging中的每棵树是对所有特征进行考察,而随机森林仅仅考虑一个特征子集。

sklearn中随机森林模型参数介绍

A. max_features:

随机森林允许单个决策树使用特征的最大数量。 Python为最大特征数提供了多个可选项。 下面是其中的几个:

Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。

sqrt :此选项是每颗子树可以利用总特征数的平方根个。 例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个。“log2”是另一种相似类型的选项。

0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。

max_features如何影响性能和速度?

增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。
B. n_estimators:

在利用最大投票数或平均值来预测之前,你想要建立子树的数量。 较多的子树可以让模型有更好的性能,但同时让你的代码变慢。 你应该选择尽可能高的值,只要你的处理器能够承受的住,因为这使你的预测更好更稳定。
C. min_sample_leaf:

如果您以前编写过一个决策树,你能体会到最小样本叶片大小的重要性。 叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。

  1. RF划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log2Nlog2N 个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑N−−√N 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

  2. 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

  3. 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

  4. 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

  5. 叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

  6. 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

  7. 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。

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