机器学习:随机森林

随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。

  • 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。
  • 决策树相当于一个大师,通过自己在数据集中学到的知识用于新数据的分类。但是俗话说得好,一个诸葛亮,玩不过三个臭皮匠。随机森林就是希望构建多个臭皮匠,希望最终的分类效果能够超过单个大师的一种算法。

1 什么是随机森林?

如果读者接触过决策树(Decision Tree)的话,那么会很容易理解什么是随机森林。随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想--集成思想的体现。“随机”的含义我们会在下边部分讲到。

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

2  随机森林的相关基础知识

随机森林看起来是很好理解,但是要完全搞明白它的工作原理,需要很多机器学习方面相关的基础知识。在本文中,我们简单谈一下,而不逐一进行赘述,如果有同学不太了解相关的知识,可以参阅其他博友的一些相关博文或者文献。

  1)信息、熵以及信息增益的概念

  这三个基本概念是决策树的根本,是决策树利用特征来分类时,确定特征选取顺序的依据。理解了它们,决策树你也就了解了大概。

  引用香农的话来说,信息是用来消除随机不确定性的东西。当然这句话虽然经典,但是还是很难去搞明白这种东西到底是个什么样,可能在不同的地方来说,指的东西又不一样。对于机器学习中的决策树而言,如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:

  I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。

  熵是用来度量不确定性的,当熵越大,X=xi的不确定性越大,反之越小。对于机器学习中的分类问题而言,熵越大即这个类别的不确定性更大,反之越小。

  信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好。

  这方面的内容不再细述,感兴趣的同学可以看 信息&熵&信息增益 这篇博文。

  2)决策树

  决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART。

  3)集成学习 

  集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。你可以在这找到用python实现集成学习的文档:Scikit 学习文档

      4)bagging 是由不同的分类器(1.数据随机化 2.特征随机化)经过训练,综合得出的出现最多分类结果;boosting 是通过调整已有分类器错分的那些数据来获得新的分类器,得出目前最优的结果。

     5)bagging 中的分类器权重是相等的;而 boosting 中的分类器加权求和,所以权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。

3  随机森林的生成

  1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;

  从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。

  为什么要随机抽样训练集?

  如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;

  为什么要有放回地抽样?

  我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。

  2)如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;

  3)每棵树都尽最大程度的生长,并且没有剪枝过程。

两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。

  随机森林分类效果(错误率)与两个因素有关:

  • 森林中任意两棵树的相关性:相关性越大,错误率越大;
  • 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。

  减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

随机森林有许多优点

  • 具有极高的准确率
  • 随机性的引入,使得随机森林不容易过拟合
  • 随机性的引入,使得随机森林有很好的抗噪声能力
  • 能处理很高维度的数据,并且不用做特征选择
  • 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
  • 训练速度快,可以得到变量重要性排序
  • 容易实现并行化

随机森林的缺点

  • 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
  • 随机森林模型还有许多不好解释的地方,有点算个黑盒模型

sklearn集成方法之一随机森林 

文档地址:http://sklearn.apachecn.org/cn/0.19.0/modules/ensemble.html#id8

 class 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)¶

参数说明:

 n_estimators:估计器个数,默认10

criterion:划分选择标准,默认 ‘gini’,也支持 ‘entropy’       

max_features:划分时考虑最大特征数,可以是整数、浮点、字符串或None,默认‘auto’,主要用于寻找最好划分

①若为整数,则每次划分时考虑的最大特征数为max_features

②若为浮点数,则每次划分时考虑的最大特征数为(max_features * n_features)对应的最大特征数

③若为auto,则max_features=log2(n_features)

④若为log2,则max_features=log2(n_features)

⑤若为None,则考虑所有所有特征数即max_features=n_features

 max_depth:决策树的最大深度,可以是整数或None,默认None,若为None,表示子树的生长不会受数深度影响,直到所有叶节点所有样本均属于同一种类标签或所有叶节点都已达到min_samples_split samples

min_samples_split:内部节点再划分最小样本数,限制子树继续划分的条件,可以是整数、浮点数,默认为2

①若为整数,则最小样本数为min_samples_split

②若为浮点数,则每次节点每次划分的最小样本数为ceil(min_samples_split *n_samples),其中ceil表示上取整

min_samples_leaf:叶子结点最小的样本数,可以为整数、浮点数,默认为1

①若为整数,则表示叶子节点最小样本数为min_samples_leaf

②若为浮点数,则表示叶节点最小样本数为ceil(min_samples_leaf *n_samples)

min_weight_fraction_leaf:所有叶节点权重之和,浮点数,默认为0,若没有提供养样本权重,则代表所有样本具有等同的权重

max_leaf_nodes:叶节点最大数,可以是整数或None,特征过多时,可以限制该参数,可以缓解过拟合问题

min_impurity_split:节点最小划分不纯度,限制树停止生长的阈值,若节点的不纯度大于该阈值,则可以划分,否则为叶节点

bootstrap:布尔型,默认为True,在构建树时,bootstrap样本是否使用标识

oob_score:布尔型,默认False,是否使用袋外样本评估泛化准确率标识

n_jobs:整数,训练与预测时,并行运行的jobs数目,默认为-1

random_state:可以为整数、RandomState instance或None,若为整数,表示用于随机数生成器的随机种子数;若为RandomStateinstance,表示随机数生成器;若为None表示使用np.random随机生成器

verbose:整数,默认0,控制构建树的verbosity

warm_start:布尔型,若为True,表示重用之前的解决方案来训练或添加更多的估计器来集成,否则,训练整个森林

class_weight:可以为字典、列表字典、balanced、balanced_subsample或None,默认None,类标签权重以{class_label: weight}.形式给出

①若为None,则表示各个类标签具有相同的权重

②对于多类输出问题,可以以列表字典形式提供,按照y列的顺序

③若为balanced模式,根据输入的样本数,自动调整为n_samples / (n_classes*np.bincount(y))

④若为balanced_subsample模式,跟balanced模式类似,基本树bootstrap样本计算权重

猜你喜欢

转载自blog.csdn.net/abc_138/article/details/82703978
今日推荐