随机森林算法

随机森林

随机森林概述

  • 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标。

  • 在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定

  • 这个方法则是结合 Breimans 的 “Bootstrap aggregating” 想法和 Ho 的"random subspace method"以建 造决策树的集合


随机森林就是通过集成学习的Bagging思想将多棵树集成的一种算法:它的基本单元就是决策树。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,其实这也是随机森林的主要思想–集成思想的体现。

思考点: 随即森林为什么随机?

样本随即,特征随机

image-20220719151822699

随机森林即由多个决策树组成,每个决策树并不相同,在构建决策树时,我们从训练数据中有放回的随机选取一部分样本每棵树也不会使用数据的全部特征,而是随机选取部分特征进行训练。每棵树使用的样本和特征都不相同,训练出的结果也不相同。每棵树的数据数量可能不一样

每个决策树都出一个结果,判断数据属于哪一类,少数服从多数原则

image-20220719151836916

这么做的原因:为开始训练前,无法知道哪部分数据存在异常样本,也无法知道哪些特征最能决定分类结果,随机过程降低了两个影响因素对于分类结果的影响

image-20220719151850317

随机森林算法原理

随机森林-Bootstraping

Bootstraping的名称来自成语“pull up by your own bootstraps”,意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法。

随机森林-Bagging的策略
  • bootstrap aggregation(理解: 口袋中有除颜色全部一样的球,有放回的从口袋里面抽样)
  • 从样本集中重采样(有重复的)选出n个样本
  • 在所有属性上,对这n个样本建立分类器(ID3、C4.5、CART、SVM、Logistic回归等)
  • 重复以上两步m次,即获得了m个分类器
  • 将数据放在这m个分类器上,最后根据这m个分类器的投票结果,决定数据属于哪一类
image-20220719152007513

模型训练好之后,传入一条未知数据,大多数的树都告知y=1,则y=1,否则,y=0

随机森林算法原理
  • 随机森林在bagging基础上做了修改
  • 从样本集中用Bootstrap采样选出n个样本;
    • 第一棵树抽取n个数据,第二个数也抽取n个数据,但n并不固定,两个树的数据量很可能不一样
  • 从所有属性中随机选择k个属性,选择最佳分割属性作为节点建立CART决策树;
    • 每颗决策树的数据的属性是一样的,可理解为决策树随即选择属性,而非每一条数据随即选择属性
  • 重复以上两步m次,即建立了m棵CART决策树
  • 这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类

  • 假设训练集 T 的大小为 N ,特征数目为 M ,随机森林的大小为 K ,随机森林算法的具体步骤如下:

  • 遍历随机森林的大小 K 次:

    • 从训练集 T 中有放回抽样的方式,取样N 次形成一个新子训练集 D
    • 随机选择 m 个特征,其中 m < M
    • 使用新的训练集 D 和 m 个特征,学习出一个完整的决策树

    得到随机森林


随机森林/Bagging和决策树的关系
  • 当然可以使用决策树作为基本分类器
  • 但也可以使用SVM、Logistic回归等其他分类器,习惯上,这些分类器组成的“总分类器”,仍然叫做随机森林,但实际上一般就是用决策树作为基分类器
投票机制
  • 一票否决(一致表决)

  • 少数服从多数(一般就用这个)

  • 有效多数(加权)

随机森林构建

那随机森林具体如何构建呢?有两个方面:数据的随机性选取,以及待选特征的随机选取。

1.数据的随机选取:

  • 首先,从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。第二,利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。最后,如果有了新的数据需要通过随机森林得到分类结果,就可以通过对子决策树的判断结果的投票,得到随机森林的输出结果了。如图3,假设随机森林中有3棵子决策树,2棵子树的分类结果是A类,1棵子树的分类结果是B类,那么随机森林的分类结果就是A类。

image-20220719152415511

2.待选特征的随机选取

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

image-20220719152440581

构造随机森林的 4 个步骤:

image-20220719152502447

随机森林优缺点

优点
  • 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计
  • 对于不平衡的分类资料集来说,它可以平衡误差
  • 采用集成算法,准确性高,学习过程很快速(一棵树的时候速度很快)
  • 样本随机,特征随机
  • 抗噪声能力强(噪声指的是异常数据)
  • 能处理特征较多的高维数据
  • 多个决策树相互独立,节省时间(bagging思想里面)

(经验:不知道用什么分类方法时就试试随机森林 )

缺点
  • 会发生过拟合(因为数据会存在特例)(任何算法都会,但随机森林概率要小一点)
  • 随机森林并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。
  • 有许多不好解释的地方,有点算黑盒模型,无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试
  • 对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。
如何解决过拟合问题

运用剪枝手段:

  • 预剪枝:训练前规定条件(如达到某深度就停止训练)
  • 后剪枝:先找到决策树,根据条件限制叶子结点个数

(随机森林里面关于决策树参数,最小节点数,最小叶子数量,最大深度等参数要好好调)



随机森林代码实现

导入模块

from sklearn.ensemble import RandomForestClassifier

随机森林分类器

clf = RandomForestClassifier(n_estimators = 100, random_state = 0).fit(X, y)
随机森林参数介绍

在scikit-learn中,RF的分类器是RandomForestClassifier

RF的参数也包括两部分,第一部分是Bagging框架的参数,第二部分是一棵CART决策树的参数

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_split=1e-07,bootstrap=True,
oob_score=False, n_jobs=1, 
random_state=None, verbose=0,
warm_start=False, class_weight=None)
随机森林参数介绍-Bagging框架参数

下面来看看RF重要的Bagging框架的参数,由于RandomForestClassifier和RandomForestRegressor参数绝大部分相同,这里会将它们一起讲,不同点会指出。

  • \1) n_estimators: 弱学习器(决策树)的个数,不要设置太小。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100。
  • \2) oob_score:即是否采用袋外样本来评估模型的好坏。默认False。推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力(袋外数据:从来没有被使用过的数据,决策树随即抽取数据时,一次都没被抽到过)
  • \3) criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益(information gain)。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。

从上面可以看出, RF重要的框架参数比较少,主要需要关注的是 n_estimators,即森林中决策树的个数。

随机森林参数介绍-决策树参数
  • \1) RF划分时考虑的最大特征数 max_features: 就是之前提到的“在每个节点处,从M中随机选择m个特征维度”中的那个m。默认是"auto",意味着每个节点在划分时随机考虑 [公式] 个特征;如果是"log2"意味着划分时随机考虑 [公 式] 个特征;如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑百分比*总特征维度数取整后的特征数。一般用默认的"auto"就可以了;如果特征数非常多,可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间

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

  • 内部节点再划分所需最小样本数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。


交叉验证

如果有m条数据,使用10折交叉验证.

就是将m条数据,随即抽样,把它分成10份,每次都从10份中选择9份做训练集,剩下的1份做测试集,就会得到10个训练模型,最后将10个训练模型的score的平均值作为最终的score

经验: 工作中建议5折左右

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
# 交叉验证
from sklearn.model_selection import cross_val_score

# 导入乳腺癌数据集
data = load_breast_cancer()

x = data['data']
y = data['target']

rfc = RandomForestClassifier()

cross_val_score(rfc, x, y, cv=5).mean()  #cv 交叉验证的折数

earn.model_selection import cross_val_score

导入乳腺癌数据集

data = load_breast_cancer()

x = data[‘data’]
y = data[‘target’]

rfc = RandomForestClassifier()

cross_val_score(rfc, x, y, cv=5).mean() #cv 交叉验证的折数


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值