Learning R---randomForest

来源:互联网 发布:如何改淘宝店铺名字 编辑:程序博客网 时间:2024/06/08 18:51

随机森林据说工业中应用很广,正巧工作中也在尝试使用。
主要基于R语言函数包randomForest ,对参数设置以及相关内容做记录和总结。

一、随机森林简介

理论部分,有空好好学习下。完了,整理好。

二、函数简介

1、randomForest

主函数,随机森林算法实现分类和回归。该函数执行的是Breiman的随机森林算法(基于原来的Fortran代码)。也可以用以评估数据点之间的相似性。

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, ...)

参数说明

1 . data 数据框,包含所有模型变量
2 . subset 索引向量,指定哪些行的数据用以建模。如果有这个参数,必须命名
3 . na.action 函数,指定处理缺失值的方法,默认na.fail,即不允许出现缺失值,也可以指定为na.omit(删除缺失样本)。常用na.roughfix,数值型变量用中位数填补,类别型变量用众数,如果有结,随机打乱。
4 . x,formula 预测变量数据框、或者公式
5 . y 响应变量,y是因子型,默认是分类;否则是回归;如果省略,则执行无监督算法,评估数据点之间的相似性
6 . xtest 测试集的特征矩阵或者数据框
7 . ytest 训练集的响应变量
8 . ntree 树的数量。默认是500颗,该参数设置不能太少,以确保每一个输入行(样本)都会被预测多次
9 . mtry 决策树划分时考虑的特征数,普通决策树考虑所有样本,RF中的决策树选择部分特征,这样进一步增加模型的泛化能力。分类默认为sqrt(p)特征,回归(p/3)个特征。
10 . replace 默认是TRUE,即重复抽样
11 . classwt 类的先验分布,和不必为1。回归不用考虑这个因素;貌似这个参数不常用啊
12 . cutoff 和总类数相等长度的向量。某一个观测/样本将会被判为比重最大的那一类。默认1/n,n是类的个数。也就是相同权重的投票决定~
13. strata 因子型变量用于分层抽样
14. sampsize 样本数量。对于分类问题,如果向量sampsize与strata长度相同,那么按照strata进行分层抽样,sampsize的元素代表该层抽样样本的个数
15 . nodesize 指定决策树节点的最小个数,值越大花费时间越小。默认分类是1,回归是5
16 . maxnodes 指定决策树节点的最大个数,如果不指定,默认尽可能的生长
17 . importance 布尔型,是否返回变量重要性排序。默认是FASLE
18 . localImp 和importance只能选一个,具体干嘛不清楚,文档没怎么写清楚
19 . nPerm 回归问题参数。评估变量重要性时,袋外数据排列的次数??大于1时,估计更加稳定。但是不够有效
20 . proximity 是否计算行之间的相似度
21 . oob.prox 是否只对袋外数据计算相似度
22 . norm.votes 默认为TRUE,投票结果以分数表示。如果是FALSE,返回原始的投票统计。回归不用此参数
23 . do.trace 默认为FALSE,如果参数值是TRUE,运行时输出冗长的结果。也可以设置为整数
24 . keep.forest 如果是FASLE,输出结果不保留森林。如果xtest给定,则默认FALSE
25 . corr.bias 校正回归的偏差,默认为FALSE
26 . keep.inbag 默认为FALSE.是否返回n*ntree的矩阵,用以记录哪些样本在哪棵树中被使用

Demo

require(randomForest)## 设置随机数种子set.seed(1)## 载入测试数据data(iris)## 构建随机森林模型(绘制MDS图请加上 proximity 参数)iris.rf <-  randomForest::randomForest(Species ~ ., iris, proximity = TRUE, importance = TRUE)  iris.rf

结果解释:
1 . 模型使用500棵决策树
2 . 决策树划分节点时随机使用两个特征sqrt(4)=2
3 . 袋外误差率4%
4 . versicolor 和 virginica 存在误判

2、importance

重要性排序,具体说明和参数含义如下

参数说明

1 . x 构建的rf模型
2 . type 衡量重要性的方式:
  (1)mean decrease in accuracy 平均精度下降
   1)对于每一颗决策树,利用袋外数据进行预测,得到袋外数据的预测误差(分类为错误率,回归为MSE)
   2)删除该变量,重新计算预测误差
   3)所有决策树两次预测误差差值的平均数,最后标准化所有变量的数据
   4)如果标准化后值为0,说明该变量基本无区分能力
  (2) mean decrease in node impurity 变量分隔节点时杂质的减少量
   1)方法类似type=1,分类为基尼指数,回归是残差平方和
   2)值越大,变量越显著

返回值

返回值为矩阵,每一行是一个变量。列为对应的重要性

Demo

importance(iris.rf)
                setosa versicolor virginica MeanDecreaseAccuracy MeanDecreaseGiniSepal.Length  5.230412   7.651647  8.027949            10.390062         9.000287Sepal.Width   4.334959   1.527737  5.485694             5.266681         2.194394Petal.Length 21.430132  33.032632 27.181685            32.534321        42.796046Petal.Width  23.125172  32.427447 31.396783            33.816092        45.309420

结果说明:
1 . 基尼指数衡量变量的重要性,值越大,变量在该衡量标准下相对更加重要
2 . 平均下降精度指标下,Petal.Length和Petal.Width更为重要

可视化重要性

3、绘制MDS二维图

参数说明

1 . rf 随机森林实体类
2 . fac 响应变量,因子型
3 . k 坐标维度,默认是2,可选3
4 . palette 向量,区分类的颜色,向量长度等于类的个数
5 . pch 向量, 绘制点的符号,长度和样本个数相同

Demo

opar <- par(no.readonly=TRUE)par(pin=c(5,3), mai=c(0.4,0.1, 0.3, 0.1))MDSplot(  iris.rf,  iris$Species,  palette = c("black", "blue", "red"),  pch = as.numeric(iris$Species),  k = 2,main = "多维尺度分析"  )  legend(  "bottomleft",  legend = unique(iris$Species),  col = c("black","red", "blue"),  pch = as.numeric(unique(iris$Species)),  cex = 0.8,inset=0,horiz = F,bty = F  )par(opar)

这里写图片描述

结果说明
1 . 构建模型时,参数proximity必须为TRUE
2 . 明白此处绘图的数据源是iris.rf$err.rate
3 . 可以从图中看出setosa自成一类,virginica和versicolor两类存在较为相似的样本点

4、查看树的节点数(决策树的理论都忘掉了,补上哟)

参数说明

1 . x 随机森林对象
2 . terminal TRUE 统计终端节点个数 FASLE 所有节点个数

treesize(iris.rf)
hist(treesize(iris.rf))

这里写图片描述

5、绘制每棵树的误判率

参数说明

1 . x 随机森林对象
2 . type 画图类型,默认type=”l”。p-点 l-线 b-点&线
3 . main 图形标题
4 . … 其他画图参数

plot(x=iris.rf,type="l",col=c("black","blue","red","green"))legend("topright",legend = colnames(iris.rf$err.rate),col = c("black","blue","red","green"),pch=17,cex=0.8)

这里写图片描述

结果说明
画图的数据源:iris.rf$err.rate
按照如上代码指定各类颜色如下:OOB-红色,setosa-蓝色,versicolor-黑色,virginica-绿色
有说横轴是树的数量,而不是第几棵树,存疑,还没有找到什么合适的方法
从1棵树开始尝试了几次,发现袋外数据大概占比1/3。仅对这份数据而言,容易误分类的样本只有几个很可能没有落入袋外数据中


三、调参&应用

还是用iris数据集举例,简单进行调参的尝试。随机森林主要的参数为。RF的参数主要包括:
1 . Bagging框架参数:ntree(决策树的数量)
2 . CART决策树参数:
  1)mtry(选择变量的个数,默认分类是sqrt(特征总数))。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了
  2)maxnodes 指定决策树节点的最大个数,如果不指定,默认尽可能的生长。数据少或者特征少可以选择默认。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

还有一些决策树的参数看不大懂,补完课再来填坑。

确定决策树数量ntree

以10为单位,从10至200,比较袋外误差是否有差别。

for(i in seq(from = 10,to = 500,by = 10)){  iris_rf <- randomForest::randomForest(Species~.,data = iris,ntree = i,mtry=2)  cat(paste0("ntree = ",i,"; OOB=",(iris_rf$err.rate[i,1])),"\n")}
ntree = 10; OOB=0.0536912751677852 ntree = 20; OOB=0.0733333333333333 ntree = 30; OOB=0.04 ntree = 40; OOB=0.0533333333333333 ntree = 50; OOB=0.0466666666666667 ntree = 60; OOB=0.0533333333333333 ntree = 70; OOB=0.0466666666666667 ntree = 80; OOB=0.0466666666666667 ntree = 90; OOB=0.0466666666666667 ntree = 100; OOB=0.0466666666666667 ntree = 110; OOB=0.0466666666666667 ntree = 120; OOB=0.0466666666666667 ntree = 130; OOB=0.04 ntree = 140; OOB=0.04 ntree = 150; OOB=0.0466666666666667 ntree = 160; OOB=0.0466666666666667 ntree = 170; OOB=0.0466666666666667 ntree = 180; OOB=0.0466666666666667 ntree = 190; OOB=0.0533333333333333 ntree = 200; OOB=0.0533333333333333 ntree = 210; OOB=0.0466666666666667 ntree = 220; OOB=0.0533333333333333 ntree = 230; OOB=0.0466666666666667 ntree = 240; OOB=0.04 ntree = 250; OOB=0.0533333333333333 ntree = 260; OOB=0.0466666666666667 ntree = 270; OOB=0.04 ntree = 280; OOB=0.0466666666666667 ntree = 290; OOB=0.0466666666666667 ntree = 300; OOB=0.0533333333333333 ntree = 310; OOB=0.04 ntree = 320; OOB=0.0466666666666667 ntree = 330; OOB=0.0466666666666667 ntree = 340; OOB=0.0466666666666667 ntree = 350; OOB=0.0533333333333333 ntree = 360; OOB=0.0466666666666667 ntree = 370; OOB=0.04 ntree = 380; OOB=0.04 ntree = 390; OOB=0.04 ntree = 400; OOB=0.0466666666666667 ntree = 410; OOB=0.04 ntree = 420; OOB=0.04 ntree = 430; OOB=0.04 ntree = 440; OOB=0.0466666666666667 ntree = 450; OOB=0.04 ntree = 460; OOB=0.04 ntree = 470; OOB=0.0466666666666667 ntree = 480; OOB=0.04 ntree = 490; OOB=0.04 ntree = 500; OOB=0.04 

100棵决策数就比较合适了

确定选入特征ntree

for(j in seq(from = 1,to = 4,by = 1)){  iris_rf <- randomForest::randomForest(Species~.,data = iris,ntree = 100,mtry = j)  cat(paste0("mtry = ",j,"; OOB=",(iris_rf$err.rate[100,1])),"\n")}
mtry = 1; OOB=0.06 mtry = 2; OOB=0.0533333333333333 mtry = 3; OOB=0.0466666666666667 mtry = 4; OOB=0.04 

选入4个变量时袋外误差最小

变量重要性

iris_rf <- randomForest::randomForest(Species~.,data = iris,ntree = 100,mtry = 4,proximity = TRUE)importance(iris_rf)
             MeanDecreaseGiniSepal.Length         1.155898Sepal.Width          1.348832Petal.Length        43.232810Petal.Width         53.712727

Petal.Width 和 Petal.Length比较重要,考虑只用这两个特征建模

MDS多维度分析

iris_rf <- randomForest::randomForest(Species~.,data = iris[,3:5],ntree = 100,mtry = 2,proximity = TRUE)MDSplot(  iris_rf,  iris$Species,  palette = c("black", "blue", "red"),  pch = as.numeric(iris$Species),  k = 2,main = "多维尺度分析"  )  legend(  "bottomleft",  legend = unique(iris$Species),  col = c("black","red", "blue"),  pch = as.numeric(unique(iris$Species)),  cex = 0.8,inset=0,horiz = F,bty = F  )

这里写图片描述

查看特征

Petal.Length

library(ggplot2) ggplot(data = iris, aes(x = Petal.Length, color = Species,fill=Species)) + #color边框线,fill填充色   geom_density(alpha = .3) +   scale_fill_brewer( type = "seq",palette="Greens") + #指定色系是浅绿到深绿   scale_colour_manual(values=c("red", "yellow", "blue"))#指定边框线

这里写图片描述

Petal.Width

library(ggplot2) ggplot(data = iris, aes(x = Petal.Width, color = Species,fill=Species)) + #color边框线,fill填充色   geom_density(alpha = .3) +   scale_fill_brewer( type = "seq",palette="Greens") + #指定色系是浅绿到深绿   scale_colour_manual(values=c("red", "yellow", "blue"))#指定边框线

这里写图片描述
特征变化方式:可以从图中看出 versicolor 和 virginica 有交叉部分。

原创粉丝点击