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

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

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

一、随机森林理论介绍

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。

 

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

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

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

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

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

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


bagging


boosting


取样方式


bagging采用均匀取样


boosting根据错误率来采样


精度、准确性


相比之,较低



训练集选择


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


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


预测函数权重


各个预测函数没有权重


boost有权重


函数生成顺序


并行生成


顺序生成


应用


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

baging和boosting都可以有效地提高分类的准确性


baging和boosting都可以有效地提高分类的准确性

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

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


随机森林


梯度提升树

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

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

(1)重要性评分

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

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

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

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

r语言中代码:

[plain] view plain copy

print?

  1. 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本身就是因子型,所以不用转换形式。

[plain] view plain copy

print?

  1. > data <- iris
  2. > library(randomForest)
  3. > system.time(Randommodel <- randomForest(Species ~ ., data=data,importance = TRUE, proximity = FALSE, ntree = 100))
  4. 用户 系统 流逝
  5. 0    0    0
  6. > print(Randommodel)
  7. Call:
  8. randomForest(formula = Species ~ ., data = data, importance = TRUE,      proximity = FALSE, ntree = 100)
  9. Type of random forest: classification
  10. Number of trees: 100
  11. No. of variables tried at each split: 2
  12. OOB estimate of  error rate: 3.33%
  13. Confusion matrix:
  14. setosa versicolor virginica class.error
  15. setosa         50          0         0        0.00
  16. versicolor      0         47         3        0.06
  17. virginica       0          2        48        0.04

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

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

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

[plain] view plain copy

print?

  1. > importance(Randommodel,type=1)  #重要性评分
  2. MeanDecreaseAccuracy
  3. Sepal.Length             4.720094
  4. Sepal.Width              1.405924
  5. Petal.Length            16.222059
  6. Petal.Width             13.895115
  7. > importance(Randommodel,type=2)  #Gini指数
  8. MeanDecreaseGini
  9. Sepal.Length         9.484106
  10. Sepal.Width          1.930289
  11. Petal.Length        45.873386
  12. Petal.Width         41.894352
  13. > varImpPlot(Randommodel)         #可视化

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

3.4 模型的预测功能

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

[plain] view plain copy

print?

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

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

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

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

[plain] view plain copy

print?

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

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

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

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

[html] view plain copy

print?

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

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

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

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

时间: 2024-10-19 10:42:41

R语言︱决策树族——随机森林算法的相关文章

web安全之机器学习入门——3.2 决策树与随机森林算法

目录 简介 决策树简单用法 决策树检测P0P3爆破 决策树检测FTP爆破 随机森林检测FTP爆破 简介 决策树和随机森林算法是最常见的分类算法: 决策树,判断的逻辑很多时候和人的思维非常接近. 随机森林算法,利用多棵决策树对样本进行训练并预测的一种分类器,并且其输出的类别是由个别决策树输出的类别的众数决定. 决策树简单用法 使用sklearn自带的iris数据集 # -*- coding: utf-8 -*- from sklearn.datasets import load_iris from

决策树与随机森林算法

决策树 决策树模型是一种树形结构,基于特征对实例进行分类或回归的过程.即根据某个特征把数据分划分到若干个子区域(子树),再对子区域递归划分,直到满足某个条件则停止划分并作为叶子节点,不满足条件则继续递归划分. 一个简单的决策树分类模型:红色框出的是特征. 决策树模型学习过程通常包3个步骤:特征选择.决策树的生成.决策树的修剪. 1.特征选择 选择特征顺序的不同将会产生不同决策树,选择好的特征能使得各个子集下标签更纯净.度量特征对产生子集的好坏有若干方法,如误差率,信息增益.信息增益比和基尼指数等

R语言︱机器学习模型评估方案(以随机森林算法为例)

R语言︱机器学习模型评估方案(以随机森林算法为例) 笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评价模型的方式. 常见的应用在监督学习算法中的是计算平均绝对误差(MAE).平均平方差(MSE).标准平均方差(NMSE)和均值等,这些指标计算简单.容易理解:而稍微复杂的情况下,更多地考虑的是一些高大上的指标,信息熵.复杂度和基尼值等等. 本篇可以用于情感挖

机器学习——随机森林算法及原理

1. 随机森林使用背景 1.1 随机森林定义 随机森林是一种比较新的机器学习模型.经典的机器学习模型是神经网络,有半个多世纪的历史了.神经网络预测精确,但是计算量很大.上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984),通过反复二分数据进行分类或回归,计算量大大降低.2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果.随机森林在运算量没有显著提

Bagging与随机森林算法原理小结

在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合.本文就对集成学习中Bagging与随机森林算法做一个总结. 随机森林是集成学习中可以和梯度提升树GBDT分庭抗礼的算法,尤其是它可以很方便的并行训练,在如今大数据大样本的的时代很有诱惑力. 1.  bagging的原理 在集成学习原理小结中,我们给Bagging画了下面一张原理图. 从上图可以看出,

spark 随机森林算法案例实战

随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数据,列方向上采用无放回随机抽样得到特征子集,并据此得到其最优切分点,这便是随机森林算法的基本原理.图 3 给出了随机森林算法分类原理,从图中可以看到,随机森林是一个组合模型,内部仍然是基于决策树,同单一的决策树分类不同的是,随机森林通过多个决策树投票结果进行分类,算法不容易出现过度拟合问题. 图 3

随机森林 算法过程及分析

简单来说,随机森林就是Bagging+决策树的组合(此处一般使用CART树).即由很多独立的决策树组成的一个森林,因为每棵树之间相互独立,故而在最终模型组合时,每棵树的权重相等,即通过投票的方式决定最终的分类结果. 随机森林算法主要过程: 1.样本集的选择. 假设原始样本集总共有N个样例,则每轮从原始样本集中通过Bootstraping(有放回抽样)的方式抽取N个样例,得到一个大小为N的训练集.在原始样本集的抽取过程中,可能有被重复抽取的样例,也可能有一次都没有被抽到的样例. 共进行k轮的抽取,

随机森林算法demo python spark

关键参数 最重要的,常常需要调试以提高算法效果的有两个参数:numTrees,maxDepth. numTrees(决策树的个数):增加决策树的个数会降低预测结果的方差,这样在测试时会有更高的accuracy.训练时间大致与numTrees呈线性增长关系. maxDepth:是指森林中每一棵决策树最大可能depth,在决策树中提到了这个参数.更深的一棵树意味模型预测更有力,但同时训练时间更长,也更倾向于过拟合.但是值得注意的是,随机森林算法和单一决策树算法对这个参数的要求是不一样的.随机森林由于

【机器学习基础】随机森林算法

引入 我们回顾一下之前学习的两个算法,Bagging算法中,通过bootstrapping得到不一样的数据,通过这些数据送到一个基本算法之后,得到不同的g,最后对这些g取平均得到G:决策树算法中,通过递归方式建立子树,最终得到一棵完整的树. 这两种算法都有其鲜明的特点,决策树对于不同的数据相对会敏感一些,即其算法的variance很大,而Bagging的特点是通过投票和平均的方式来降低variance的效果.如果将这两种方法结合起来,就是该文要介绍的随机森林,random forest. 1.