R语言︱决策树族——随机森林算法

article/2025/9/29 13:49:17



每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————


笔者寄语:有一篇《有监督学习选择深度学习还是随机森林或支持向量机?》(作者BioSebastianRaschka)中提到,在日常机器学习工作或学习中,当我们遇到有监督学习相关问题时,不妨考虑下先用简单的假设空间(简单模型集合),例如线性模型逻辑回归。若效果不好,也即并没达到你的预期或评判效果基准时,再进行下换其他更复杂模型来实验。


——————————————————————————————————————————————


一、随机森林理论介绍


1.1 优缺点


优点。

(1)不必担心过度拟合;

(2)适用于数据集中存在大量未知特征;

(3)能够估计哪个特征在分类中更重要;

(4)具有很好的抗噪声能力;

(5)算法容易理解;

(6)可以并行处理。

缺点。

(1)对小量数据集和低维数据集的分类不一定可以得到很好的效果。

(2)执行速度虽然比Boosting等快,但是比单个的决策树慢很多。

(3)可能会出现一些差异度非常小的树,淹没了一些正确的决策。


1.2 生成步骤介绍


1、从原始训练数据集中,应用bootstrap方法有放回地随机抽取k个新的自助样本集,并由此构建k棵分类回归树,每次未被抽到的样本组成了K个袋外数据(out-of-bag,BBB)。

2、设有n 个特征,则在每一棵树的每个节点处随机抽取mtry 个特征,通过计算每个特征蕴含的信息量,特征中选择一个最具有分类能力的特征进行节点分裂。

3、每棵树最大限度地生长, 不做任何剪裁

4、将生成的多棵树组成随机森林, 用随机森林对新的数据进行分类, 分类结果按树分类器投票多少而定。


1.3 随机森林与SVM的比较


(1)不需要调节过多的参数,因为随机森林只需要调节树的数量,而且树的数量一般是越多越好,而其他机器学习算法,比如SVM,有非常多超参数需要调整,如选择最合适的核函数,正则惩罚等。

(2)分类较为简单、直接。随机深林和支持向量机都是非参数模型(复杂度随着训练模型样本的增加而增大)。相较于一般线性模型,就计算消耗来看,训练非参数模型因此更为耗时耗力。分类树越多,需要更耗时来构建随机森林模型。同样,我们训练出来的支持向量机有很多支持向量,最坏情况为,我们训练集有多少实例,就有多少支持向量。虽然,我们可以使用多类支持向量机,但传统多类分类问题的执行一般是one-vs-all(所谓one-vs-all 就是将binary分类的方法应用到多类分类中。比如我想分成K类,那么就将其中一类作为positive),因此我们还是需要为每个类训练一个支持向量机。相反,决策树与随机深林则可以毫无压力解决多类问题。

(3)比较容易入手实践。随机森林在训练模型上要更为简单。你很容易可以得到一个又好且具鲁棒性的模型。随机森林模型的复杂度与训练样本和树成正比。支持向量机则需要我们在调参方面做些工作,除此之外,计算成本会随着类增加呈线性增长。

(4)小数据上,SVM优异,而随机森林对数据需求较大。就经验来说,我更愿意认为支持向量机在存在较少极值的小数据集上具有优势。随机森林则需要更多数据但一般可以得到非常好的且具有鲁棒性的模型。



1.5 随机森林与深度学习的比较


深度学习需要比随机森林更大的模型来拟合模型,往往,深度学习算法需要耗时更大,相比于诸如随机森林和支持向量机那样的现成分类器,安装配置好一个神经网络模型来使用深度学习算法的过程则更为乏味。

但不可否认,深度学习在更为复杂问题上,如图片分类,自然语言处理,语音识别方面更具优势。

另外一个优势为你不需要太关注特征工程相关工作。实际上,至于如何选择分类器取决于你的数据量和问题的一般复杂性(和你要求的效果)。这也是你作为机器学习从业者逐步会获得的经验。

可参考论文《An Empirical Comparison of Supervised Learning Algorithms》。



1.6 随机森林与决策树之间的区别


模型克服了单棵决策树易过拟合的缺点,模型效果在准确性和稳定性方面都有显著提升。


决策树+bagging=随机森林




1.7 随机森林不会发生过拟合的原因


在建立每一棵决策树的过程中,有两点需要注意-采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。

假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting


然后进行列采样,从Mfeature中,选择m(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤-剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting 按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。


可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从Mfeature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。



1.8 随机森林与梯度提升树(GBDT)区别


随机森林:决策树+bagging=随机森林

梯度提升树:决策树Boosting=GBDT


两者区别在于bagging boosting之间的区别,可见:

 

 

bagging

boosting

取样方式

bagging采用均匀取样

boosting根据错误率来采样

精度、准确性

相比之,较低

训练集选择

随机的,各轮训练集之前互相独立

各轮训练集的选择与前面各轮的学习结果相关

预测函数权重

各个预测函数没有权重

boost有权重

函数生成顺序

并行生成

顺序生成

应用

象神经网络这样极为消耗时间的算法,bagging可通过并行节省大量的时间开销

bagingboosting都可以有效地提高分类的准确性

bagingboosting都可以有效地提高分类的准确性

一些模型中会造成模型的退化(过拟合)

boosting思想的一种改进型adaboost方法在邮件过滤,文本分类中有很好的性能

 

随机森林

梯度提升树

 

1.9 决策树的特征选择


本部分参考:随机森林简易教程

特征选择目前比较流行的方法是信息增益、增益率、基尼系数和卡方检验。这里主要介绍基于基尼系数(GINI)的特征选择,因为随机森林采用的CART决策树就是基于基尼系数选择特征的。

基尼系数的选择的标准就是每个子节点达到最高的纯度,即落在子节点中的所有观察都属于同一个分类,此时基尼系数最小,纯度最高,不确定度最小。

决策树中最常用的四种算法:

基尼系数(Gini Index)

基尼系数指出:我们从总体中随机挑选两个样本,如果总体是纯的,那么这两个样本是同类别的概率为1。

  1. 用于处理分类型目标变量“Success”或者“Failure”。
  2. 它只作用于二进制分裂。
  3. 基尼系数越大,纯度越高。
  4. CART(分类和回归树)使用Gini方法创建二进制分裂。

卡方(Chi-Square)

它可以用来衡量子节点和父节点之间是否存在显著性差异。我们用目标变量的观测频率和期望频率之间的标准离差的平方和来计算卡方值。

  1. 它用于处理分类型目标变量“Success”或“Failure”。
  2. 它可以计算两个或多个分裂。
  3. 卡方越高,子节点与父节点之间的差异越显著。
  4. Chi-square = ((Actual – Expected)^2 / Expected)^1/2
  5. 它生成的树称为:CHAID (Chi-square Automatic Interaction Detector)

如何计算一个分裂的卡方:

  1. 通过计算Success和Failure的偏差来计算单个节点的卡方。
  2. 通过计算每个节点的Success和Failure的所有卡方总和计算一个分裂的卡方。

信息增益(Information Gain)

观察下面的图像,想一下哪个节点描述起来更加容易。答案一定是C,因为C图中的所有的值都是相似的,需要较少的信息去解释。相比较,B和A需要更多的信息去描述。用纯度描述,就是:Pure(C) > Pure(B) > Pure(A)。

图片描述

纯度越高的节点,就会需要更少的信息去描述它;相反,不纯度越高,就会需要更多的信息。信息论用熵来定义系统的混乱程度。如果样本中的个体是完全相同类别的,那么系统的熵为0;如果样本是等划分的(50%-50%),那么系统的熵为1。

方差削减(Reduction in Variance)

至此,我们已经讨论了很多关于分类型目标变量的算法。方差削减是用于连续型目标变量的算法(回归问题)。它使用方差公式去挑选最优分裂。方差最小的分裂将会作为分割总体的准则。

图片描述

如何计算方差?

  1. 计算每一个节点的方差。
  2. 计算每一个节点方差的加权平均,作为一个分裂的方差。


——————————————————————————————————————————————


二、随机森林重要性度量指标——重要性评分、Gini指数


(1)重要性评分


定义为袋外数据自变量值发生轻微扰动后的分类正确率与扰动前分类正确率的平均减少量。

(1):对于每棵决策树,利用袋外数据进行预测,将袋外数据的预测误差将记录下来。其每棵树的误差是:vote1,vote2····,voteb;

(2):随机变换每个预测变量,从而形成新的袋外数据,再利用袋外数据进行验证,其每个变量的误差是:vote11,vote12,···,vote1b。

(3):对于某预测变量来说,计算其重要性是变换后的预测误差与原来相比的差的均值。

r语言中代码:

rf <- randomForest(Species ~ ., data=a, ntree=100, proximity=TRUE,importance=TRUE)


(2)gini指数


gini指数表示节点的纯度,gini指数越大纯度越低。gini值平均降低量表示所有树的变量分割节点平均减小的不纯度。对于变量重要度衡量,步骤如同前面介绍,将变量数据打乱,gini指数变化的均值作为变量的重要程度度量。


gini(T)=1−∑j=1np2j


(3)重要性绘图函数——varImpPlot(rf)函数




——————————————————————————————————————————————



三、随机森林模型R语言实践


3.1 随机森林模型几点注意


模型中关于分类任务以及回归预测任务的区别:

随机森林模型,分类和回归预测的操作不同之处在于判断因变量的类型,如果因变量是因子则执行分类任务,如果因变量是连续性变量,则执行回归预测任务。


模型中关于数据结构的要求:

`randomForest`函数要求为数据框或者矩阵,需要原来的数据框调整为以每个词作为列名称(变量)的数据框。在文本挖掘的过程中,需要把词频(横向,long型数据)转化为变量(wide型纵向数据),可以用reshape2、data.table包来中dcast来实现。具体实战见博客:R语言︱监督算法式的情感分析笔记的4.1节。



随机森林的两个参数:

候选特征数K
K越大,单棵树的效果会提升,但树之间相关性也会增强
决策树数量M
M越大,模型效果会有提升,但计算量会变大



R中与决策树有关的Package:

单棵决策树:rpart/tree/C50
随机森林:randomforest/ranger
梯度提升树:gbm/xgboost
树的可视化:rpart.plot


3.2 模型拟合


本文以R语言中自带的数据集iris为例,以setosa为因变量,其他作为自变量进行模型拟合,由于setosa本身就是因子型,所以不用转换形式。


> data <- iris
> library(randomForest)
> system.time(Randommodel <- randomForest(Species ~ ., data=data,importance = TRUE, proximity = FALSE, ntree = 100))
用户 系统 流逝 0    0    0 
> print(Randommodel)Call:randomForest(formula = Species ~ ., data = data, importance = TRUE,      proximity = FALSE, ntree = 100) Type of random forest: classificationNumber of trees: 100
No. of variables tried at each split: 2OOB estimate of  error rate: 3.33%
Confusion matrix:setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         47         3        0.06
virginica       0          2        48        0.04

代码解读:randomForset,执行建模,x参数设定自变量数据集,y参数设定因变量数据列,importance设定是否输出因变量在模型中的重要性,如果移除某个变量,模型方差增加的比例是它判断变量重要性的标准之一,proximity参数用于设定是否计算模型的临近矩阵,ntree用于设定随机森林的树数(后面单独讨论),最后一句输出模型在训练集上的效果。

prInt输出模型在训练集上的效果,可以看出错误率为3.33%,维持在比较低的水平。


3.3 随机森林模型重要性检测


> importance(Randommodel,type=1)  #重要性评分MeanDecreaseAccuracy
Sepal.Length             4.720094
Sepal.Width              1.405924
Petal.Length            16.222059
Petal.Width             13.895115
> importance(Randommodel,type=2)  #Gini指数MeanDecreaseGini
Sepal.Length         9.484106
Sepal.Width          1.930289
Petal.Length        45.873386
Petal.Width         41.894352
> varImpPlot(Randommodel)         #可视化

利用iris数据,可以看到这四个变量的重要性排序是一样的。



3.4 模型的预测功能


predict中有多种参数,比如Nodes,Proximity,predict.all。


predict(object, newdata, type="response",norm.votes=TRUE, predict.all=FALSE, proximity=FALSE, nodes=FALSE,cutoff, ...)
#Nodes判断是否是终点。Proximity判断是否需要进行近邻测量。predict.all判断是否保留所有的预测器。


举例,以前面的随机森林模型进行建模。

predict.all会输出一个150*150的字符矩阵,代表每一颗树的150个预测值(前面预设了ntree=100);

Nodes输出100颗树的节点情况。


prediction <- predict(Randommodel, data[,1:5],type="class")  #还有response回归类型table(observed =data$Species,predicted=prediction) 


table输出混淆矩阵,注意table并不是需要把预测值以及实际值放在一个表格之中,只要顺序对上,用observed以及predicted直接调用也可以。


3.5 补充——随机森林包(party包)


与randomForest包不同之处在于,party可以处理缺失值,而这个包可以。

library(party)#与randomForest包不同之处在于,party可以处理缺失值,而这个包可以
set.seed(42)
crf<-cforest(y~.,control = cforest_unbiased(mtry = 2, ntree = 50), data=step2_1)
varimpt<-data.frame(varimp(crf))


party包中的随机森林建模函数为cforest函数,

mtry代表在每一棵树的每个节点处随机抽取mtry 个特征,通过计算每个特征蕴含的信息量,特征中选择一个最具有分类能力的特征进行节点分裂。

varimp代表重要性函数。跟对着看:笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)




每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————



http://chatgpt.dhexx.cn/article/h3RxoOWV.shtml

相关文章

R语言:画树图

原始数据长这样&#xff1a; “iyear”表示年份&#xff1b;“nkill”表示死亡人数&#xff1b;“region”表示地区&#xff1b;“总计”表示某年份死亡总人数&#xff1b;nkii里的缺失数据自动按“0”运算。 数据存储在名为“ljs”的csv格式里。 应提前下载好treemap包&#…

图解R树的内部结构及操作

本文是在https://blog.csdn.net/baimafujinji/article/details/89810217基础上增加了自己的理解和解释形成的。 R树的基本情况 R树&#xff08;R-tree&#xff09;是一种将&#xff22;树&#xff08;B树和B树统称B树&#xff09;扩展到多维情况下得到的数据结构&#xff0c;…

R树

先搞明白R树搜索、插入、删除过程。 R树是平衡树&#xff0c;可以理解为B树在N维空间上的扩展。 R树一定要满足一下要求&#xff1a; 1&#xff0e;根节点若非叶子节点&#xff0c;则至少有两个子节点&#xff1b; 2&#xff0e;每个非根叶节点和非叶节点包含的实体个数均介…

R tree

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧&#xff1a;查找20英里以内所有的餐厅。如果没有R树你会怎么解决&#xff1f;一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中&#xff0c;…

R树空间索引

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧&#xff1a;查找20英里以内所有的餐厅。如果没有R树你会怎么解决&#xff1f;一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中&#xff0c;…

搜索树之R树

产生背景 地理空间数据涉及各种海量且复杂的数据&#xff0c;找到合适的索引对空间数据的处理至关重要。 传统的B树索引针对字符、数字等一维属性数据的主关键字而设计&#xff0c;不适用于具有多维性的地理空间数据。 在GIS和CAD系统对空间索引需求的推动下&#xff0c;为满足…

R-Tree

R-Tree ​ R-Tree是一颗用来存储高维数据的平衡树&#xff0c;它把B树的思想扩展到了多维空间&#xff0c;采用了B树分割空间思想&#xff0c;并在添加、删除操作时采用合并、分解节点的方法&#xff0c;保证树的平衡性。 数据结构 ​ 每个R树的叶子节点包含了多个指向不同数…

R-tree总结

R-tree R-tree是用来做空间数据存储的树状数据结构。R-tree是B-tree向多维空间发展的另一种形式&#xff0c;并且R树也是平衡树。 R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形&#xff0c;这个最小外接矩形就成为上一层的一个节点…

从B树、B+树、B*树谈到R 树

从B 树、B 树、B* 树谈到R 树 作者&#xff1a;July、weedge、Frankie。编程艺术室出品。 说明&#xff1a;本文从B树开始谈起&#xff0c;然后论述B树、B*树&#xff0c;最后谈到R 树。其中B树、B树及B*树部分由weedge完成&#xff0c;R 树部分由Frankie完成&#xff0c;全文…

R树简介

B树与R树 计算机磁盘的文件管理常使用B树和B树。B树和B树能良好地处理一维空间存储的问题。实际上&#xff0c;B树是一棵平衡树&#xff0c;它是把一维直线分为若干段线段&#xff0c;当我们查找满足某个要求的点的时候&#xff0c;只要去查找它所属的线段即可。这种思想其实是…

高级数据结构之R树(R-tree)

R树(R-tree)是一种将B树扩展到多维情况下得到的数据结构,它最初由Antonin Guttman于1984年提出。B树的结点中会存储一个键的集合,这些键把线分成片段,沿着那条线的点仅属于一个片段。因此,B树使得我们可以很容易地找到点。如果把沿线各处的点表示成B树结点,我们就能…

什么是R树?

什么是R树&#xff1f; R树是用来做空间数据存储的树状数据结构。例如给地理位置&#xff0c;矩形和多边形这类多维数据建立索引。R树是由Antonin Guttman于1984年提出的。 人们随后发现它在理论和应用方面都非常实用。 在现实生活中&#xff0c;R树可以用来存储地图上的空间信…

图解R树的原理及相关操作

B 树的搜索本质上是一维区间的划分过程&#xff0c;每次搜索节点所找到的子节点其实就是一个子区间。R 树是把 B 树的思想扩展到了多维空间&#xff0c; 采用了 B 树分割空间的思想&#xff0c;是一棵用来存储高维数据的平衡树。 ​ 对于一棵 R 树&#xff0c;叶子节点所在层…

算法设计与分析-习题-动态规划法求解多段图的最短路径问题(动态规划法)

问题描述 用动态规划法求解如图所示多段图中从顶点0到9的最短路径。 问题求解 图中顶点编号已经按照多段图的分段顺序编号&#xff0c;用动态规划法求解该多段图的过程如下&#xff1a; 最后&#xff0c;得到最短的路径为0、2、6、7、9&#xff0c;费用是97。

【动态规划法】求解0/1背包问题

问题描述 有5个物品&#xff0c;其重量分别是{2, 2, 6, 5, 4}&#xff0c;价值分别为{6, 3, 5, 4, 6}&#xff0c;背包的容量为10&#xff0c;计算背包所能装入物品的最大价值。 求解思路 在0/1背包问题中&#xff0c;物品i或者被装入背包&#xff0c;或者不被装入背包&#xf…

算法设计之动态规划法

算法设计之动态规划法 一、目的二、内容1.斐波那契数列①自底向上分析解决 ②自顶向下分析解决 2.走棋盘问题分析解决 3.爬台阶问题分析解决 三、反思与总结 一、目的 1.理解动态规划法的特征(多阶段决策\最优子结构\无后效性\子问题重复) 2.理解动态规划法的求解(划分过程\逆…

【动态规划法】求解TSP问题

问题详情 求解下图所示的TSP问题&#xff0c;计算出所经过的城市编号以及最短路径值&#xff0c;城市代价矩阵如图所示&#xff1a; 求解思路 假设从顶点i出发&#xff0c;令d(i, V’ )表示从顶点i出发经过V’ 中各个顶点一次且仅一次&#xff0c;最后回到出发点&#xff08;…

动态规划法求解0/1背包问题

一、求解0/1背包问题 1、问题描述 有n个重量分别为{w1&#xff0c;w2&#xff0c;…&#xff0c;wn}的物品&#xff0c;它们的价值分别为{v1&#xff0c;v2&#xff0c;…&#xff0c;vn}&#xff0c;给定一个容量为C的背包。 设计从这些物品中选取一部分物品放入该背包的方案&…

动态规划法——多段图的最短路径

目录 动态规划法的基本思想 多段图的基本想法 代码块&#xff08;Java&#xff09; 运行结果 动态规划法的基本思想: 将大问题划分成若干个小问题进行解决&#xff0c;从而一步步获取最优解动归从上到下分析问题&#xff0c;从下到上解决问题动归与分治法相似&#xff0c;其…

强化学习——动态规划法

文章目录 前言一、动态规划法简单认识1.基本概念2.适用情况3.求解步骤4.典型案例二、值函数1.累计折扣奖励2.状态值函数3.动作值函数4.状态值函数与动作值函数的关系5.贝尔曼方程&#xff08;动态规划法核心&#xff09; 三、策略评估1.基于状态值函数评估策略2.基于动作值函数…