Python 中的随机森林

  • Post author:
  • Post category:python




什么是随机森林


随机森林


众所周知,树模型是高方差、低偏差的模型。因此,它们容易过度拟合训练数据。如果我们不修剪树模型或引入早期停止标准(例如每个叶节点的最小实例数),我们可以概括一下树模型的作用,这很吸引人。好吧,它尝试沿着特征拆分数据,直到实例对于目标特征的值来说是纯的,没有剩下的数据,或者没有剩下的特征可以吐出数据集。如果上述之一成立,我们就会生长一个叶节点。结果是树模型增长到最大深度,并因此尝试尽可能精确地重塑训练数据,这很容易导致过度拟合。像(ID3 或 CART)这样的经典树模型的另一个缺点是它们相对不稳定。


例如,考虑使用分类缩放特征 *A* 作为“根节点特征”的情况。接下来,这个特征从数据集中被替换,不再存在于子树中。现在想象一下我们替换数据集中的单行的情况,这种变化导致现在特征 *B* 分别具有最大的信息增益或方差减少的情况。这意味着什么?好吧,现在特征 *B* 比特征 *A* 更受欢迎,因为它作为“根节点特征”会导致完全不同的树,因为我们改变了数据集中的一个实例。这种情况不仅可能发生在根节点上,也可能发生在树的所有内部节点上。

树模型的不稳定性以及树模型如何随着数据集的微小变化而变化


请注意,在上图中,建议将目标特征列中的“X”作为实际值的通配符。随机森林方法已被证明是解决过度拟合和不稳定问题的最有用的方法之一。


随机森林方法基于两个概念,称为装袋和子空间采样。Bagging 是*bootstrapaggregation* 的缩写形式。在这里,我们创建了大量与从原始数据集提取的原始数据集相同长度的数据集,并进行了替换(装袋中的 *bootstrap*)。然后,我们为每个自举数据集训练一个树模型,并将这些模型的大多数预测作为我们的预测(装袋中的 *聚合*)。这里我们取回归树模型的均值或中位数,以及分类树模型的众数。


你可能会问为什么我们抽取样本有替换?好吧,让我们假设我们的原始数据集有 100 个实例(行),并且我们想要创建一个由 10 棵树组成的随机森林模型,其中每棵树都在与原始数据集长度相同的数据集上进行训练。如果我们现在从原始数据集中抽取 100 个样本而不进行替换,会发生什么?确切地说,没有什么,因为我们形象地说只是将数据集从一个容器转移到另一个容器。如果我们这样做 10 次并在每个数据集上训练一个树模型,我们将获得 10 倍完全相同的数据集(假设模型参数相同)。如果我们现在预测一个看不见的查询实例并对 10 个树模型的结果进行平均,即运行随机森林程序,我们将一无所获。这让我们回到最初的问题,为什么我们使用装袋方法?我们使用bagging方法(记住重采样)是因为我们知道单树模型对数据的变化非常敏感并且有很大的差异。为了解决这个问题,我们在不同组成的数据集上创建多个模型,并取其预测的平均值。这里我们应用了平均多个模型的方差可以减少方差的原理。

均值的方差,由一名枪手向屁股开枪说明。 步枪位置的微小变化可能会完全改变分数,但所有射击的平均值都击中靶心


我们可以通过一个代表不同树模型并从相对较远的距离向目标射击的枪手来用简化的术语来说明这一点。因此,步枪(我们的数据集)的小幅移动将导致完全不同的分数(我们模型的输出)。但平均得分击中了靶心。这意味着平均值的方差小于单个模型的方差


伏一个r(X¯)=σ2n 瓦H电子r电子 σ2=伏一个r(X))


随机森林方法所基于的第二个概念是子空间采样的概念。Bagging 使我们朝着拥有更强大模型创建更准确结果的目标前进。不幸的是,事实证明袋装模型是相关的,因此通常相对相等。也就是说,基于相关性,它们会产生相似的结果。这可以归结为 Bagging 使用每个模型的整个特征集(所有描述性特征)。现在假设有一个或两个非常强大的特征,它们在“预测性”方面超越了所有其他特征(例如,这两个特征的信息增益比其他特征大得多)。即使我们通过替换采样来改变数据的组成,这两个很可能仍然是主要特征,因此将分别作为根节点或第一个隐藏节点层。结果,这些树看起来都非常相似。

创建随机森林模型所需的装袋和子空间采样过程


现在事实证明,如果我们使用纯装袋,数据中隐藏的结构可能会丢失。为了唤起这些隐藏的结构,除了这两个强大的特征之外,我们还必须加强它们,让它们有投票的声音。我们怎样才能做到这一点?好吧,最简单的方法是从我们的数据集中移动这两个。显然,这不是一个好主意,因为我们想要拥有它们,但也想要考虑并合并不那么占优势的特征的声音(投票)。长话短说,我们通过随机绘制一些米⊂p 树中每个分裂的不同特征,其中 p表示每个分割的特征空间。这里文献推荐米=p.bagging 和子空间采样的结合给了我们想要的随机森林模型,它的奥秘在于假设大量弱学习器在预测准确性方面比一个强学习器更好 – 或者你为什么认为“问“观众生命线”被设置为*谁想成为百万富翁*节目中的生命线??-. **完成 – 恭喜!您现在知道随机森林背后的概念。** 这是最强大的机器学习算法之一。



随机森林背后的数学



幸运的是,几乎没有我们以前从未见过的“随机森林”特定数学这样的东西。基本数学原理与

分类



回归树相同



与随机森林的主要区别在于,我们多次执行我们在决策树和回归树上所做的所有步骤。也就是说,如果我们有一个分类缩放的目标特征和平均值或中位数,如果我们有一个连续缩放的目标特征,我们会种植大量的树,让它们做出决策并通过最频繁(模式)的决策来聚合这些决策。因此,对于分类缩放的目标特征:


最大参数吨 ∈ 吨 吨r电子电子米○d电子升秒 在哪里


最大参数 代表模式(多数票), 吨 表示单个树模型的结果(预测), 吨 是树模型创建的结果空间(所有结果)和 吨r电子电子米○d电子升秒 是单树模型,每个模型都产生一个结果 吨. 因此最常发生的结果吨 ∈ 吨 作为预测返回。


随机森林伪代码


如上所述,随机森林算法基于自举聚合和子空间采样原理的组合。因此:


Tree_Outcomes = [] 对于 i=1 到 n:从原始数据创建引导样本 使用通用停止标准在该引导数据上训练树模型,其中: 对于每个分割:子空间样本数 m=sqrt(p)特征空间p在这个节点选择最好的特征(最高IG,最低方差)来分割数据沿特征分割数据删除特征将每棵树的结果添加到Tree_Outcomes Random_Forest_Outcome = Majority vote(模式) Tree_Outcomes 中元素的数量 # 对于分类 Random_Forest_Outcome = Tree_Outcomes 中元素的多数(平均值/中位数)# 对于回归返回 Random_Forest_Outcome



使用 Python 从头开始​​随机森林



幸运的是,对于随机森林分类模型,我们可以使用

分类树

章节中创建的大部分分类树代码(对于随机森林回归模型也是如此)。我们必须在实际的树构建代码中实现的唯一真正改变是我们在每次拆分时使用一个大小为的随机特征样本米=p 在哪里 p表示该节点的特征空间。所有其他更改都是“围绕”树构建代码进行的。也就是说,从代码的角度来看,随机森林是通过为树代码提供一种很好的“超级英雄套件”来创建的。

展示一个树模型,它穿着超级英雄套装,从而成为一个随机森林


我们必须实现的第三个变化是,随机森林模型实际上不能像普通树模型一样可视化,因此可视化部分是过时的事件,内部每棵树都是构建的,我们实际上可以绘制每棵树来推理决策随机森林模型。但是,当树模型的数量增长到数百或数千时,这没有用。


第四个变化是我们必须添加一个列表,其中存储单树模型的预测,最终返回该列表的众数值作为预测。


在这里,只评论了由于随机森林的创建而导致的造树代码的变化。有关树构建代码本身的进一步评论,请参阅

分类树页面

。为了可视化,我们将在 这里使用

UCI 蘑菇数据集


"""
导入需要的python包
""" 
import  pandas  as  pd 
import  numpy  as  np 
from  pprint  import  pprint 
import  



版权声明:本文为pydby01原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。