R语言实现随机森林的方法示例

目录
  • 随机森林算法介绍
    • 算法介绍:
    • 决策树生长步骤:
    • 投票过程:
    • 基本思想:
    • 随机森林的优点:
    • 缺点
  • R语言实现
    • 随机森林模型搭建
    • 1:randomForest()函数用于构建随机森林模型
    • 2:importance()函数用于计算模型变量的重要性
    • 3:MDSplot()函数用于实现随机森林的可视化
    • 4:rfImpute()函数可为存在缺失值的数据集进行插补(随机森林法),得到最优的样本拟合值
    • 5:treesize()函数用于计算随机森林中每棵树的节点个数

随机森林算法介绍

算法介绍:

简单的说,随机森林就是用随机的方式建立一个森林,森林里面有很多的决策树,并且每棵树之间是没有关联的。得到一个森林后,当有一个新的样本输入,森林中的每一棵决策树会分别进行一下判断,进行类别归类(针对分类算法),最后比较一下被判定哪一类最多,就预测该样本为哪一类。
随机森林算法有两个主要环节:决策树的生长和投票过程。

决策树生长步骤:

  • 从容量为N的原始训练样本数据中采取放回抽样方式(即bootstrap取样)随机抽取自助样本集,重复k(树的数目为k)次形成一个新的训练集N,以此生成一棵分类树;
  • 每个自助样本集生长为单棵分类树,该自助样本集是单棵分类树的全部训练数据。设有M个输入特征,则在树的每个节点处从M个特征中随机挑选m(m < M)个特征,按照节点不纯度最小的原则从这m个特征中选出一个特征进行分枝生长,然后再分别递归调用上述过程构造各个分枝,直到这棵树能准确地分类训练集或所有属性都已被使用过。在整个森林的生长过程中m将保持恒定;
  • 分类树为了达到低偏差和高差异而要充分生长,使每个节点的不纯度达到最小,不进行通常的剪枝操作。

投票过程:

随机森林采用Bagging方法生成多个决策树分类器。

基本思想:

  • 给定一个弱学习算法和一个训练集,单个弱学习算法准确率不高,可以视为一个窄领域专家;
  • 将该学习算法使用多次,得出预测函数序列,进行投票,将多个窄领域专家评估结果汇总,最后结果准确率将大幅提升。

随机森林的优点:

  • 可以处理大量的输入变量;
  • 对于很多种资料,可以产生高准确度的分类器;
  • 可以在决定类别时,评估变量的重要性;
  • 在建造森林时,可以在内部对于一般化后的误差产生不偏差的估计;
  • 包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;
  • 提供一个实验方法,可以去侦测 variable interactions;
  • 对于不平衡的分类资料集来说,可以平衡误差;
  • 计算各例中的亲近度,对于数据挖掘、侦测偏离者(outlier)和将资料视觉化非常有用;
  • 使用上述。可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;
  • 学习过程很快速。

缺点

  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合;
  • 对于有不同级别的属性的数据,级别划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

R语言实现

寻找最优参数mtry,即指定节点中用于二叉树的最佳变量个数

library("randomForest")
n<-length(names(train_data))     #计算数据集中自变量个数,等同n=ncol(train_data)
rate=1     #设置模型误判率向量初始值

for(i in 1:(n-1)){
  set.seed(1234)
  rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=i,ntree=1000)
  rate[i]<-mean(rf_train$err.rate)   #计算基于OOB数据的模型误判率均值
  print(rf_train)
}

rate     #展示所有模型误判率的均值
plot(rate)

寻找最佳参数ntree,即指定随机森林所包含的最佳决策树数目

set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=1000)
plot(rf_train)    #绘制模型误差与决策树数量关系图
legend(800,0.02,"IS_LIUSHI=0",cex=0.9,bty="n")
legend(800,0.0245,"total",cex=0.09,bty="n")

随机森林模型搭建

set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=400,importance=TRUE,proximity=TRUE)
  • importance设定是否输出因变量在模型中的重要性,如果移除某个变量,模型方差增加的比例是它判断变量重要性的标准之一;
  • proximity参数用于设定是否计算模型的临近矩阵;
  • ntree用于设定随机森林的树数。

输出变量重要性:分别从精确度递减和均方误差递减的角度来衡量重要程度。

importance<-importance(rf_train)
write.csv(importance,file="E:/模型搭建/importance.csv",row.names=T,quote=F)
barplot(rf_train$importance[,1],main="输入变量重要性测度指标柱形图")
box()

提取随机森林模型中以准确率递减方法得到维度重要性值。type=2为基尼系数方法

importance(rf_train,type=1)

varImpPlot(x=rf_train,sort=TRUE,n.var=nrow(rf_train$importance),main="输入变量重要性测度散点图")

信息展示

print(rf_train)    #展示随机森林模型简要信息
hist(treesize(rf_train))   #展示随机森林模型中每棵决策树的节点数
max(treesize(rf_train));min(treesize(rf_train))
MDSplot(rf_train,train_data$IS_OFF_USER,palette=rep(1,2),pch=as.numeric(train_data$IS_LIUSHI))    #展示数据集在二维情况下各类别的具体分布情况

检测

pred<-predict(rf_train,newdata=test_data)
pred_out_1<-predict(object=rf_train,newdata=test_data,type="prob")  #输出概率
table <- table(pred,test_data$IS_LIUSHI)
sum(diag(table))/sum(table)  #预测准确率
plot(margin(rf_train,test_data$IS_LIUSHI),main=观测值被判断正确的概率图)

randomForest包可以实现随机森林算法的应用,主要涉及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值,则随机森林将是一个无监督的模型;
  • xtest和ytest用于预测的测试集;
  • 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()函数生成的结果用于绘制直方图,方面查看随机森林中树的节点分布情况。

到此这篇关于R语言实现随机森林的方法示例的文章就介绍到这了,更多相关R语言 随机森林内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • R语言关于随机森林算法的知识点详解

    在随机森林方法中,创建大量的决策树. 每个观察被馈入每个决策树. 每个观察的最常见的结果被用作最终输出. 新的观察结果被馈入所有的树并且对每个分类模型取多数投票. 对构建树时未使用的情况进行错误估计. 这称为OOB(袋外)误差估计,其被提及为百分比. R语言包"randomForest"用于创建随机森林. 安装R包 在R语言控制台中使用以下命令安装软件包. 您还必须安装相关软件包(如果有). install.packages("randomForest") 包&qu

  • R语言实现随机森林的方法示例

    目录 随机森林算法介绍 算法介绍: 决策树生长步骤: 投票过程: 基本思想: 随机森林的优点: 缺点 R语言实现 随机森林模型搭建 1:randomForest()函数用于构建随机森林模型 2:importance()函数用于计算模型变量的重要性 3:MDSplot()函数用于实现随机森林的可视化 4:rfImpute()函数可为存在缺失值的数据集进行插补(随机森林法),得到最优的样本拟合值 5:treesize()函数用于计算随机森林中每棵树的节点个数 随机森林算法介绍 算法介绍: 简单的说,

  • Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号("")或反引号(``)定义. 双引号:"", 用于单行字符串. 反引号:``,用于定义多行字符串,内部会原样解析. 示例: // 单行 "心有猛虎,细嗅蔷薇" // 多行 ` 大风歌 大风起兮云飞扬. 威加海内兮归故乡. 安得猛士兮守四方! ` 字符串支持转义

  • R语言常用两种并行方法之snowfall详解

    上一篇博客(R中两种常用并行方法之parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂到服务器上进行运行时,更看重的是其稳定性. 这时就要介绍R中的另一个并行利器--snowfall,这也是在平时做模拟时用的最多的一种方法. 针对上篇中的简单例子 首先是一个最简单的并行的例子,这个例子不需要载入任何依赖库.函数.对象等.相对也比较简单: library(snowfall) # 载入snowf

  • R语言常用两种并行方法之parallel详解

    目录 并行计算 在模拟时什么地方可以用到并行? 怎么在R中看我们可以使用并行? parallel(简单) 由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfall,这两种方法各有优缺,但还是推荐snowfall,整体较为稳定,不容易因为内存不足或者并行线程过多等原因而报错. 并行计算 并行计算: 简单来讲,就是同时使用多个计算资源来解决一个计算问题,是提高计算机系统计算速度和处理能力的一种有效手段.(参考:并行计算简介) 一个问题被分解成为一系列可以并发执行的离

  • Python实现孤立随机森林算法的示例代码

    目录 1 简介 2 孤立随机森林算法 2.1 算法概述 2.2 原理介绍 2.3 算法步骤 3 参数讲解 4 Python代码实现 5 结果 1 简介 孤立森林(isolation Forest)是一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或基尼指数来选择. 2 孤立随机森林算法 2.1 算法概述 Isolation,意为孤立/隔离,是名词,其动词为isolate,forest是森林,合起来就是“孤立森林”了,也有叫“独异森林”,好

  • R语言实现PCA主成分分析图的示例代码

    目录 简介 开始作图 1. PCA 分析图本质上是散点图 2. 为不同类别着色 3. 样式微调 简介 主成分分析(Principal Component Analysis,PCA)是一种无监督的数据降维方法,通过主成分分析可以尽可能保留下具备区分性的低维数据特征.主成分分析图能帮助我们直观地感受样本在降维后空间中的分簇和聚合情况,这在一定程度上亦能体现样本在原始空间中的分布情况,这对于只能感知三维空间的人类来说,不失为一种不错的选择. 再举个形象的栗子,假如你是一本养花工具宣传册的摄影师,你正在

  • Go语言中节省内存技巧方法示例

    目录 引言 预先分配切片 结果 结构体中的字段顺序 极端情况 使用 map[string]struct{} 而不是 map[string]bool 结果 引言 GO虽然不消耗大量内存,但是仍有一些小技巧可以节省内存,良好的编码习惯是每一个程序员都应该具备的素质. 预先分配切片 数组是具有连续内存的相同类型的集合.数组类型定义时要指定长度和元素类型. 因为数组的长度是它们类型的一部分,数组的主要问题是它们大小固定,不能调整. 与数组类型不同,切片类型无需指定长度.切片的声明方式与数组相同,但没有数

  • R语言seq()函数的调用方法

    看到有很多读者浏览了这篇文章,心里很是开心,为了能够更好地帮助大家,决定再修改一下,帮助大家更好地理解. --------修改于:2018年4月28日 为了方便大家在开发环境中直接实验测试代码,下面,我将说明和函数的用法全部用英文给出(避免乱码),并加以注释,希望能够对大家有所帮助! 首先,我们来看一个seq()函数应用的实例! x <- seq(0, 10, by = 0.01) y <- sin(x) plot(y) 下面,我们来看函数的主要使用方法! 注意:在本文调用函数时,均采用写出入

  • R语言创建矩阵的实现方法

    矩阵 向量vector用于描述一维数据,是R语言中最基础的数据结构形式 矩阵matrix可以描述二维数据,和向量相似,其内部元素可以是实数.复数.字符.逻辑型数据 矩阵包含行和列,分为单位矩阵.对角矩阵和普通矩阵.矩阵可以进行四则运算,以及进行求特征值.特征向量等运算 矩阵matrix使用两个下标来访问元素,A[i,j]表示矩阵A第i行.第j列的元素 矩阵创建--matrix函数 matrix函数创建矩阵,其格式为: matrix(data = NA,nrow = 1,ncol = 1,byro

随机推荐