有关数据挖掘中的分类算法有很多,如贝叶斯判别法、Fisher判别法、决策树、支持向量机和随机森林等,本文将对随机森林做一个介绍,并使用R语言实现该算法的应用。

随机森林算法的实质是基于决策树的分类器集成算法,其中每一棵树都依赖于一个随机向量,随机森林的所有向量都是独立同分布的。随机森林就是对数据集的列变量和行观测进行随机化,生成多个分类数,最终将分类树结果进行汇总。

随机森林相比于神经网络,降低了运算量的同时也提高了预测精度,而且该算法对多元共线性不敏感以及对缺失数据和非平衡数据比较稳健,可以很好地适应多达几千个解释变量数据集。

随机森林的组成

随机森林是由多个CART分类决策树构成,在构建决策树过程中,不进行任何剪枝动作,通过随机挑选观测(行)和变量(列)形成每一棵树。对于分类模型,随机森林将根据投票法为待分类样本进行分类;对于预测模型,随机森林将使用单棵树的简单平均值来预测样本的Y值。

随机森林的估计过程

1)指定m值,即随机产生m个变量用于节点上的二叉树,二叉树变量的选择仍然满足节点不纯度最小原则;

2)应用Bootstrap自助法在原数据集中有放回地随机抽取k个样本集,组成k棵决策树,而对于未被抽取的样本用于单棵决策树的预测;

3)根据k个决策树组成的随机森林对待分类样本进行分类或预测,分类的原则是投票法,预测的原则是简单平均。

随机森林性能因素

1)每棵树生长越茂盛,组成森林的分类性能越好;

2)每棵树之间的相关性越差,或树之间是独立的,则森林的分类性能越好。

主要函数

R语言中的randomForest包可以实现随机森林算法的应用,该包中主要涉及5个重要函数,关于这5个函数的语法和参数请见下方:

1)randomForest()函数用于构建随机森林模型

randomForest(formula, data=NULL, ..., subset, na.action=na.fail)

randomForest(x, y=NULL, xtest=NULL, ytest=NULL, ntree=500,

mtry=if (!is.null(y) && !is.factor(y))

max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x))),

replace=TRUE, classwt=NULL, cutoff, strata,

sampsize = if (replace) nrow(x) else ceiling(.632*nrow(x)),

nodesize = if (!is.null(y) && !is.factor(y)) 5 else 1,

maxnodes = NULL,

importance=FALSE, localImp=FALSE, nPerm=1,

proximity, oob.prox=proximity,

norm.votes=TRUE, do.trace=FALSE,

keep.forest=!is.null(y) && is.null(xtest), corr.bias=FALSE,

keep.inbag=FALSE, ...)

formula指定模型的公式形式,类似于y~x1+x2+x3...;

data指定分析的数据集;

subset以向量的形式确定样本数据集;

na.action指定数据集中缺失值的处理方法,默认为na.fail,即不允许出现缺失值,也可以指定为na.omit,即删除缺失样本;

x指定模型的解释变量,可以是矩阵,也可以是数据框;y指定模型的因变量,可以是离散的因子,也可以是连续的数值,分别对应于随机森林的分类模型和预测模型。这里需要说明的是,如果不指定y值,则随机森林将是一个无监督的模型;

xtestytest用于预测的测试集;

ntree指定随机森林所包含的决策树数目,默认为500;

mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值;

replace指定Bootstrap随机抽样的方式,默认为有放回的抽样;

classwt指定分类水平的权重,对于回归模型,该参数无效;

strata为因子向量,用于分层抽样;

sampsize用于指定样本容量,一般与参数strata联合使用,指定分层抽样中层的样本量;

nodesize指定决策树节点的最小个数,默认情况下,判别模型为1,回归模型为5;

maxnodes指定决策树节点的最大个数;

importance逻辑参数,是否计算各个变量在模型中的重要性,默认不计算,该参数主要结合importance()函数使用;

proximity逻辑参数,是否计算模型的临近矩阵,主要结合MDSplot()函数使用;

oob.prox是否基于OOB数据计算临近矩阵;

norm.votes显示投票格式,默认以百分比的形式展示投票结果,也可以采用绝对数的形式;

do.trace是否输出更详细的随机森林模型运行过程,默认不输出;

keep.forest是否保留模型的输出对象,对于给定xtest值后,默认将不保留算法的运算结果。

2)importance()函数用于计算模型变量的重要性

importance(x, type=NULL, class=NULL, scale=TRUE, ...)

x为randomForest对象;

type可以是1,也可以是2,用于判别计算变量重要性的方法,1表示使用精度平均较少值作为度量标准;2表示采用节点不纯度的平均减少值最为度量标准。值越大说明变量的重要性越强;

scale默认对变量的重要性值进行标准化。

3)MDSplot()函数用于实现随机森林的可视化

MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)

rf为randomForest对象,需要说明的是,在构建随机森林模型时必须指定计算临近矩阵,即设置proximity参数为TRUE;

fac指定随机森林模型中所使用到的因子向量(因变量);

palette指定所绘图形中各个类别的颜色;

pch指定所绘图形中各个类别形状;

还可以通过R自带的plot函数绘制随机森林决策树的数目与模型误差的折线图

4)rfImpute()函数可为存在缺失值的数据集进行插补(随机森林法),得到最优的样本拟合值

rfImpute(x, y, iter=5, ntree=300, ...)

rfImpute(x, data, ..., subset)

x为存在缺失值的数据集;

y为因变量,不可以存在缺失情况;

iter指定插值过程中迭代次数;

ntree指定每次迭代生成的随机森林中决策树数量;

subset以向量的形式指定样本集。

5)treesize()函数用于计算随机森林中每棵树的节点个数

treesize(x, terminal=TRUE)

x为randomForest对象;

terminal指定计算节点数目的方式,默认只计算每棵树的根节点,设置为FALSE时将计算所有节点(根节点+叶节点)。

一般treesize()函数生成的结果用于绘制直方图,方面查看随机森林中树的节点分布情况。

应用

在随机森林算法的函数randomForest()中有两个非常重要的参数,而这两个参数又将影响模型的准确性,它们分别是mtry和ntree一般对mtry的选择是逐一尝试,直到找到比较理想的值,ntree的选择可通过图形大致判断模型内误差稳定时的值。

下面使用坦泰尼克号乘客是否存活数据应用到随机森林算法中,看看模型的准确性如何。

library(randomForest)

#读取训练样本和测试样本

train <- read.table(file = 'C:\\Users\\admin\\Desktop\\train.csv', head = TRUE, sep = ',')

test <- read.table(file = 'C:\\Users\\admin\\Desktop\\test.csv', head = TRUE, sep = ',')

#数据结构信息

str(train)

str(test)

发现train数据集中存在缺失值。

#数据类型变换

train$Survived <- as.factor(train$Survived)

#使用rfImpute()函数补齐缺失值

train_impute <- rfImpute(Survived~., data = train)

#选取随机森林mtry值

n <- length(names(train))

set.seed(1234)

for (i in 1:(n-1)){

model <- randomForest(Survived~., data = train_impute, mtry = i)

err <- mean(model$err.rate)

print(err)

}


发现当mtry=2时,模型内平均误差最小,故确定参数mtry=2。

#选取ntree值

set.seed(1234)

model <- randomForest(Survived~., data = train_impute, mtry = 2, ntree=1000)

plot(model)


发现ntree在400左右时,模型内误差基本稳定,故取ntree=400。

set.seed(1234)

fit <- randomForest(Survived~., data = train_impute, mtry = 2, ntree=400, importance = TRUE)

fit


模型内误差为16.4%。

#变量重要性

Importance <- importance(x = fit)

Importance

varImpPlot(fit)


从返回的数据和图形可知,模型中乘客的性别字段最为重要,接下来是年龄(票价)和票价(年龄)。

对待测样本进行预测,发现待测样本中存在缺失值,这里使用多重插补法将缺失值补齐。

library(mice)

Imput <- mice(data = test, m = 10)

Age <- data.frame(Age = apply(Imput$imp$Age,1,mean))

Fare <- data.frame(Fare = apply(Imput$imp$Fare,1,mean))

#添加行标号

test$Id <- row.names(test)

Age$Id <- row.names(Age)

Fare$Id <- row.names(Fare)

#替换缺失值

test[test$Id %in% Age$Id,'Age'] <- Age$Age

test[test$Id %in% Fare$Id,'Fare'] <- Fare$Fare

summary(test)


发现test数据集中不存在缺失值了。

#原数据集模型的准确率分析

pred1 <- predict(object = fit, newdata = train_impute)

Freq1 <- table(pred1,train_impute$Survived)

Freq1

sum(diag(F))/sum(F)


模型的预测精度在90%以上。

#新数据集的预测情况

pred2 <- predict(object = fit, newdata = test)

这里报错,报错的原因是用于建立模型的数据集和test数据集不一致。test数据集中缺少Survived变量,我在想,难道对于新的数据集(没有因变量)随机森林就无法预测了吗?还请阅读者给予帮助和建议。

参考资料:

http://www.36dsj.com/archives/21036

数据挖掘:R语言实战

基于R语言的随机森林算法运用相关推荐

  1. R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray、F1、偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)

    R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray.F1.偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机) ...

  2. R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator

    R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator 目录 R语言构建随机森林模型错误解决:Erro ...

  3. ML之RF:利用Js语言设计随机森林算法【DT之CART算法(gain index)】并应用随机森林算法

    ML之RF:利用Js语言设计随机森林算法[DT之CART算法(gain index)]&并应用随机森林算法 目录 输出结果 设计思路 代码实现(部分代码) 输出结果 设计思路 代码实现(部分代 ...

  4. csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方、mae、rmse

    csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方.mae.rmse #读取训练集 train <- read.csv("tra ...

  5. R语言:随机森林的实现——randomForest

    在前一篇文章中,我们介绍了随机森林,本文我们将着重介绍其R语言的实现. 使用randomForest包中的randomForest函数 数据简介 本文数据选择了红酒质量分类数据集,这是一个很经典的数据 ...

  6. 基于R语言的梯度推进算法介绍

    简介 通常来说,我们可以从两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法.通过大量数据科学竞赛的试炼,我们可以发现人们更钟爱 ...

  7. R语言实战应用精讲50篇(二十七)-R语言实现随机森林(附R语言代码)

    随机森林回归 回归问题指的是因变量或者被预测变量是连续性变量的情形,比如预测身高体重的具体数值是多少的情形.整个代码大致可以分为包.数据.模型.预测评估4个部分,接下来逐一解读. 1.包部分,也就是加 ...

  8. r与python做随机森林_随机森林算法入门(python)

    昨天收到yhat推送了一篇介绍随机森林算法的邮件,感觉作为介绍和入门不错,就顺手把它翻译一下. 目录 1 什么是随机森林 1.1 集成学习 1.2 随机决策树 1.3 随机森林 1.4 投票 2 为什 ...

  9. 基于sklearn随机森林算法对鸢尾花数据进行分类

    随机森林定义 随机森林(Random Forest,RF),顾名思义就是将多棵相互之间并无关联的决策树整合起来形成一个森林,再通过各棵树投票或取均值来产生最终结果的分类器.在介绍随机森林前需要了解几个 ...

最新文章

  1. linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计
  2. 微软nni_实践空间站 | 为微软官方开源项目贡献代码,你准备好了吗?
  3. 采用串口DMA双缓冲方法,快速更新外部FLASH中文字库
  4. 最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:
  5. python的语句_Python的语句
  6. pytorch拟合函数
  7. uniapp 连接夜神模拟器调试
  8. linux bt下载软件推荐,分享|Ubuntu 下五个最好的 BT 客户端
  9. eNSP vlan 划分实验
  10. 基于[三星6818]芯片超声波测距驱动编写
  11. 【理论】基于模型控制和基于数据驱动控制
  12. 【2006NOIP普及组】开心的金明 题解
  13. Revit建模绘制楼板时剖面图上如何修改使其在墙的外边界?
  14. 夜刃CTF小组招募志同道合的CTFer
  15. 聚焦行为识别和异常检测!ECCV 2022 精细视频理解挑战赛(DeeperAction)开启!
  16. [架构之路-3]:架构师 - 软件架构师也是魔法师,架构师应具备的四大方面的技能
  17. mysql:一条sql语句统计环比、同比
  18. Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-GVQWxt/ipython/
  19. Java 框架,黑马 java 视频教程,面试资料分享
  20. ABAQUS粘弹性材料分析_51CAE_新浪博客

热门文章

  1. 七星彩长奖表图_2018够力七星彩奖表
  2. Android JNI 编译so库
  3. 开启springcloud全家桶5:探索负载均衡组件 Ribbon实现与原理
  4. 苹果4怎么越狱_来看iPhone迁移怎么用 除iOS12.4苹果还为旧款设备推送了更新
  5. App中的HTML能在PC中运行吗,得到app电脑版有吗?得到app怎么在电脑上使用教程
  6. 小米路由器 4A 千兆版折腾日志
  7. 野火 RT1052 移植网卡功能(LAN8720A)
  8. Iconfont-阿里巴巴矢量图标库的SVG玩法
  9. c++算法:四数之和---固定两数,用夹逼法
  10. THU.文本处理三剑客