随机森林算法框架

随机森林框架梳理

目录

  • 1. 基础知识
    • 1.1 何为集成学习
    • 1.2 集成学习一般流程
    • 1.3 模型融合方法
    • 1.4 如何选择基分类器
  • 2. 随机森林简介
  • 3. 随机森林算法推导
  • 4. 随机森林算法分析
  • 4. 随机森林算法应用场景
  • 5. 随机森林算法sklearn实现
  • 6. 随机森林算法参数调优
  • 7. 参考资料

1. 基础知识

1.1 何为集成学习

面对一个机器学习问题, 通常有两种策略。 一种是研发人员尝试各种模型,选择其中表现最好的模型做重点调参优化。 这种策略类似于奥运会比赛, 通过强强竞争来选拔最优的运动员, 并逐步提高成绩。 另一种重要的策略是集各家之长, 如同贤明的君主广泛地听取众多谋臣的建议, 然后综合考虑, 得到最终决策。 后一种策略的核心, 是将多个分类器的结果统一成一个最终的决策。 使用这类策略的机器学习方法统称为集成学习。 其中的每个单独的分类器称为基分类器

1.2 集成学习一般流程

集成学习一般可分为以下3个步骤。
(1) 找到误差互相独立的基分类器。
(2) 训练基分类器。
(3) 合并基分类器的结果。
合并基分类器的方法有voting和stacking两种。 前者是用投票的方式, 将获得最多选票的结果作为最终的结果。 后者是用串行的方式, 把前一个基分类器的结果输出到下一个分类器, 将所有基分类器的输出结果相加(或者用更复杂的算法融合, 比如把各基分类器的输出作为特征, 使用逻辑回归作为融合模型进行最后的结果预测) 作为最终的输出。

1.3 模型融合方法

  • Boosting

Boosting方法训练基分类器时采用串行的方式, 各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加, 每一层在训练的时候, 对前一层基分类器分错的样本, 给予更高的权重。 测试时, 根据各层分类器的结果的加权得到最终结果。
Boosting的过程很类似于人类学习的过程,我们学习新知识的过程往往是迭代式的, 第一遍学习的时候, 我们会记住一部分知识, 但往往也会犯一些错误, 对于这些错误, 我们的印象会很深。 第二遍学习的时候, 就会针对犯过错误的知识加强学习, 以减少类似的错误发生。 不断循环往复, 直到犯错误的次数减少到很低的程度。

  • Bagging

Bagging与Boosting的串行训练方式不同, Bagging方法在训练过程中, 各基分类器之间无强依赖, 可以进行并行训练。 其中很著名的算法之一是基于决策树基分类器的随机森林(Random Forest) 。 为了让基分类器之间互相独立, 将训练集分为若干子集(当训练样本数量较少时, 子集之间可能有交叠) 。 Bagging方法更像是一个集体决策的过程, 每个个体都进行单独学习, 学习的内容可以相同, 也可以不同, 也可以部分重叠。 但由于个体之间存在差异性, 最终做出的判断不会完全一致。 在最终做决策时, 每个个体单独作出判断, 再通过投票的方式做出最后的集体决策

  • Boosting与Bagging解释

从消除基分类器的偏差和方差的角度来理解Boosting和Bagging方法的差异。 基分类器, 有时又被称为弱分类器, 因为基分类器的错误率要大于集成分类器。 基分类器的错误, 是偏差和方差两种错误之和。 偏差主要是由于分类器的表达能力有限导致的系统性错误, 表现在训练误差不收敛。 方差是由于分类器对于样本分布过于敏感, 导致在训练样本数较少时, 产生过拟合。
Boosting方法是通过逐步聚焦于基分类器分错的样本, 减小集成分类器的偏差。
Bagging方法则是采取分而治之的策略, 通过对训练样本多次采样, 并分别训练出多个不同模型, 然后做综合, 来减小集成分类器的方差。 假设所有基分类器出错的概率是独立的, 在某个测试样本上, 用简单多数投票方法来集成结果, 超过半数基分类器出错的概率会随着基分类器的数量增加而下降。

  • Boosting与Bagging主要区别

样本选择上:Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。
样本权重:Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
预测函数:Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。
并行计算:Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。

下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT

1.4 如何选择基分类器

最常用的基分类器是决策树, 主要有以下3个方面的原因。
(1) 决策树可以较为方便地将样本的权重整合到训练过程中, 而不需要使用过采样的方法来调整样本权重。
(2) 决策树的表达能力和泛化能力, 可以通过调节树的层数来做折中。
(3) 数据样本的扰动对于决策树的影响较大, 因此不同子样本集合生成的决策树基分类器随机性较大, 这样的“不稳定学习器”更适合作为基分类器。 此外,在决策树节点分裂的时候, 随机地选择一个特征子集, 从中找出最优分裂属性,很好地引入了随机性。
除了决策树外, 神经网络模型也适合作为基分类器, 主要由于神经网络模型也比较“不稳定”, 而且还可以通过调整神经元数量、 连接方式、 网络层数、 初始权值等方式引入随机性。

2. 随机森林简介

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

随机森林有许多优点:

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

随机森林的缺点:

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

随机森林的构建过程大致如下:

  1. 从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
  2. 对于n_tree个训练集,我们分别训练n_tree个决策树模型
  3. 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
  4. 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
  5. 将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

3. 随机森林算法推导

3.1 信息、熵以及信息增益的概念

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

引用香农的话来说,信息是用来消除随机不确定性的东西。当然这句话虽然经典,但是还是很难去搞明白这种东西到底是个什么样,可能在不同的地方来说,指的东西又不一样。对于机器学习中的决策树而言,如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:
  I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。
  熵是用来度量不确定性的,当熵越大,X=xi的不确定性越大,反之越小。对于机器学习中的分类问题而言,熵越大即这个类别的不确定性更大,反之越小。

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

3.2 bootstrap 重抽样

bootstrapping 就是一种用来产生数据随机性的统计工具。对同一份数据集,进行不同的重采样(re-sample)以模拟不同的数据集出来,避免了 cross-validation 中数据量的减少。

3.3 算法说明

随机森林算法框架_第1张图片
随机森林算法框架_第2张图片

4. 随机森林算法分析

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

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

随机森林算法框架_第3张图片

5. 随机森林算法sklearn实现

  • 1.分类问题
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
clf = RandomForestClassifier(n_estimators=100)
scores = cross_val_score(clf,iris.data,iris.target)
scores.mean()
  • 2.回归问题
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor

boston = load_boston()
rgm = RandomForestRegressor(n_estimators=100)
scores = cross_val_score(rgm,boston.data,boston.target)
scores.mean()

6. 随机森林算法参数调优

  • 1 框架参数:
  • n_estimators : 指定随机森林中的分类器的个数,默认为10。一般来说n_estimators 太小容易欠拟合,太大计算量大,故需要参数调优选择一个适中的数值;
  • oob_score: 是否采用袋外误差来评估模型,默认为 False;
  • criterion :及CART树划分对特征的评价标准,默认我基尼指数,还可以选择信息增益;
  • 2 决策树参数
  • max_features :建立决策树时选择的最大特征数目(从原始特征中选取多少特征进行建立决策树),默认为auto,意味着考虑sqrt(n_features)个特征;还可以为整数,即直接指定数目;浮点数,即指定百分比;sqrt与auto相同;log2即指定log2(n_features);如果是None,则为最大特征数n_features;
  • max_depth :决策树的最大深度,默认是不进行限制的,如果是模型样本量多,特征也多的情况,推荐限制修改这个,常用的可以取值为10-100之间;
  • min_samples_split :限制子树继续划分的条件,如果某节点的样本数目小于此值,则不会再继续划分,默认为2,样本量非常大的时候,应该增大这个值;
  • min_samples_leaf :叶子节点的最小样本数目,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,默认为1,数据量大的时候可以增大这个值;
  • min_weight_fraction_leaf :叶子节点最小样本权重,这个值限制了叶子节点所有样本权重和最小值,如果小于最小值,则会和兄弟节点被剪枝。默认为0,就是不考虑权重。通常来说,若样本中存在较多的缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时就需要考虑这个值了。
  • max_leaf_nodes :最大叶子节点数,通过限制最大叶子节点数目来防止过拟合,默认为None,即 不进行限制,如果特征分成很多可以加以限制;
  • min_impurity_split :节点划分最小不纯度,这个值限制了决策树的增长,如果某节点的不纯度小于这个阈值,则该节点不在生成子节点,即为叶子节点,一般不推荐改动,默认值为1e-7;
  • min_impurity_decrease :若一个节点被分割,如果这个分割导致大于或等于该值。默认为0;
  • bootstrap :构建树时是否使用bootstrap采样,默认为True;
  • n_jobs :设置程序的并行作业数量,默认为1,如果为-1,则作业数目为核心数;
  • random_state :随机数的设置;
  • verbose :控制构建树过程中的详细程度。

7. 参考资料

白面机器学习
http://blog.csdn.net/a819825294 https://blog.csdn.net/a819825294/article/details/51177435

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