R随机森林实现

    技术2025-12-17  12

    原文链接:来自公众号生信数据挖掘

    目录

    R实现随机森林随机森林R包估值过程袋外错误率(oob error)R randomForest函数实现安装程序包,查看样本数据结构建模与观察

    R实现随机森林

    该文只简单的讲解关于的R的随机森林具体实现步骤,只简单介绍了随机森林,未对原理进行过多解释

    随机森林模型是一种预测能力较强的数据挖掘模型,常用于进行分类预测和数据回归分析,这里我们只讨论分类预测。

    使用的数据集是R自带的 iris 的数据集 如上图所示, 随机森林模型包含多个树形分类器,预测结果由多个分类器(决策树)投票得出,每个决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类。

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

    随机森林R包

    randomForest::randomForest 该包中主要涉及5个重要函数,关于这5个函数的语法和参数请见下方:

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

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

    formula:指定模型的公式形式,类似于y~x1+x2+x3…;data:指定分析的数据集;.ntree:指定随机森林所包含的决策树数目,默认为500;mtry:指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值;

    估值过程

    指定m值,即随机产生m个变量用于节点上的二叉树,m的选择原则是使错误率最低。应用bootstrap自助法在原数据集中又放回地抽取k个样本集,组成k棵决策树,每个决策树输出一个结果。对k个决策树组成的随机森林对样本进行分类或预测:分类原则:少数服从多数;预测原则:简单平均。

    袋外错误率(oob error)

    如何选择最优的特征个数m,要解决这个问题,我们主要依据计算得到的袋外错误率. 在构建每棵树时,对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言,部分训练实例没有参与这棵树的生成,它们称为第k棵树的oob样本

    袋外错误率(oob error)计算方式如下:

    对每个样本计算它作为oob样本的树对它的分类情况以简单多数投票作为该样本的分类结果最后用误分个数占样本总数的比率作为随机森林的oob误分率

    R randomForest函数实现

    在R语言中,我们调用randomForest包中的randomForest()函数来实现随机森林算法。

    安装程序包,查看样本数据结构

    #R package# install.packages("randomForest") library(randomForest)#选取训练样本(70%)和测试样本(30%) index <- sample(2,nrow(iris),replace = TRUE,prob=c(0.7,0.3)) traindata <- iris[index==1,] testdata <- iris[index==2,]

    遍历比较确定最优mtry值。mtry参数是随机森林建模中,构建决策树分支时随机抽样的变量个数。选择合适的mtry参数值可以降低随机森林模型的预测错误率。示例的数据中共有4个自变量,可通过遍历设定mtry参数1至4进行4次建模,并打印出每次建模的错误率,选择错误率最低的mytry取值。

    - 选择最优mtry参数值

    n <- ncol(iris) -1 errRate <- c(1) for (i in 1:n){ m <- randomForest(Species~.,data=iris,mtry=i,proximity=TRUE) err<-mean(m$err.rate) errRate[i] <- err } print(errRate) [1] 0.05462878 0.04320072 0.04302654 0.04316091#选择平均误差最小的m m= which.min(errRate) print(m)

    输出结果:[1] 3 根据遍历打印结果,当mtry=3时,错误率达到最低,因此本次建模过程中以3作为mtry参数值 选择合适的ntree参数值: ntree参数指出建模时决策树的数量。ntree值设置过低会导制错误率偏高,ntree值过高会提升模型复杂度,降低效率。以mtry=3进行随机森林建模,并将模型错误率与决策树数量的关系可视化,如下:

    - 选择最优ntree参数值

    rf_ntree <- randomForest(Species~.,data=iris) plot(rf_ntree)

    结果图如下: 从图中可以看到,当ntree=100时,模型内的误差就基本稳定了,出于更保险的考虑,我们确定ntree值为100。

    建模与观察

    根据以上结果,以mtry=3,mtree=100为参数建立随机森林模型,并打印模型信息

    m <- randomForest(Species~.,data=traindata,mtry=3, ntree=100, proximity=TRUE) print(m)

    结果如下所示:

    Call: randomForest(formula = Species ~ ., data = traindata, mtry = 3, ntree = 100, proximity = TRUE) Type of random forest: classification Number of trees: 100No. of variables tried at each split: 3 OOB estimate of error rate: 5.41% Confusion matrix: setosa versicolor virginica class.error setosa 39 0 0 0.00000000 versicolor 0 33 3 0.08333333 virginica 0 3 33 0.08333333 MDSplot():函数用于实现随机森林的可视化 specialmds <- cmdscale(1 - m$proximity, eig=TRUE) op <- par(pty="s") pdf("trees_proximity.pdf") pairs(cbind(traindata[,1:length(traindata)-1], specialmds$points), cex=0.6, gap=0,col=c("red", "green", "blue")[as.numeric(traindata$Species)], main=":Predictors and MDS of Proximity Based on RandomForest") par(op) print(specialmds$GOF) dev.off()

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

    结果:

    MeanDecreaseGini Sepal.Length 1.201101 Sepal.Width 1.685455 Petal.Length 32.926760 Petal.Width 37.559478

    绘制重要性图示:

    varImpPlot(m)

    从返回的数据和图形可知,在四个变量中,Petal.Width和Petal.Length最为重要,其次分别是Sepal.Length和Sepal.Width.

    - 接着使用已建立好的随机森林模型进行新数据集的测试

    pred <- predict(m,newdata=testdata)
    Processed: 0.017, SQL: 9