R语言机器学习篇——随机森林

这篇具有很好参考价值的文章主要介绍了R语言机器学习篇——随机森林。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考书籍:陈强.机器学习及R应用.北京:高等教育出版社,2020

随机森林属于集成学习的方法,也称为组台学习,本章介绍随机森林与它的特例方法,装袋法,并分别以例子的形式讨论回归问题与分类问题的随机森林方法。

一 回归问题的随机森林

对于回归问题,调用MASS包数据框Boston作为数据集,分析波士顿房价的相关情况,选取70%左右的数据作为训练集,代码如下:

library(MASS)
dim(Boston)
set.seed(1)
train <- sample(506,354)  #随机选取70%数据

1.装袋法估计

使用R中的随机森林包进行装袋法估计,注意参数中的“mtry=13”表示在该例中使用全部的特征变量,“importance=TRUE”计算变量重要性。最后代码及输出结果如下

library(randomForest)
set.seed(123)
bag.fit <- randomForest(medv~.,data=Boston,subset=train,mtry=13,importance=TRUE,replace=T)
bag.fit
#Call:
 randomForest(formula = medv ~ ., data = Boston, mtry = 13, importance = TRUE,      replace = T, subset = train) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 13

          Mean of squared residuals: 11.94245
                    % Var explained: 86.9

结果显示’函数random forest()默认估计500棵决策树(B=500),在每个节点均使用全部的13个变量,根据袋外观测值计算的OOB均方误差为11.94245;而准R方为0.869,即模型可解释响应变量medv86.9%的方差,使用plot()画出袋外误差(OOB均方误差),结果如下:

plot(bag.fit,main="Bagging OOB Errors")
R语言机器学习篇——随机森林

在该图中,横轴为决策树的数目(B),纵轴为袋外误差,由图可见,B>200时,误差就趋于平稳,这时继续增大B,也不会使之下降。

接下来展示变量重要性,如下所示:

#变量重要性
importance(bag.fit)
#          %IncMSE IncNodePurity
crim    16.955901    1112.22516
zn       2.071627      30.37986
indus    7.677858     140.58943
chas     0.339128      44.09888
nox     16.099685     438.55880
rm      68.838872   20374.08905
age     15.675505     493.82123
dis     20.897606    1413.37172
rad      3.470134      90.80601
tax      8.935524     193.32866
ptratio 22.174601     414.80738
black   10.508969     274.43954
lstat   40.192884    6898.26149
> varImpPlot(bag.fit,main="Variable Importance Plot")  #画图

输出结果中的变量重要结果的第1列(IncMSE)表示汇报在模型中去掉某个变量后,使得袋外误差上升的百分比(如去掉变量age,袋外误差上升15.68%);第2列(IncNodePurity)汇报基于训练样本计算的变量重要性。这里需要注意对于回归问题,NodePurity就是残差平方和;对于分类问题,则是基尼系数。

R语言机器学习篇——随机森林

从图中可以看出,对于响应变量medv(社区房价中位数)影响最大的两个变量都是rm(房间数)和lstat(低端人口比重),若是想看某个变量的偏依赖图,可用以下的代码实现,以变量rm为例,结果如下所示:

#变量偏依赖图
partialPlot(bag.fit,Boston[train,],x.var=rm)
R语言机器学习篇——随机森林

从上图可以看出,变量rm对房价medv的影响为正向,但并非完全线性。特别在rm较小或较大的尾部区域,变量rm对于房价medv的影响很微弱(函数几乎变为水平线)。另外,横轴上的地毯图(mgplot)标出变量rm的十分位数(即l/10,2/I0,…,9/10分位数)。这些分位数表明在rm的尾部区域观测值较少,因此尾部结果并非可信。

下面对测试集进行预测,并画出预测值与实际值之间的散点图,计算出MSE,如下:

bag.pred <- predict(bag.fit,newdata=Boston[-train,])     #得出测试集的预测值
y.test <- Boston[-train,"medv"]   #测试集的真实值
plot(bag.pred,y.test,main="Bagging Prediciton")
abline(0,1)
mean((bag.pred-y.test)^2)   #均方误差
#[1] 22.96509
R语言机器学习篇——随机森林

接下来运用OLS方法,与随机森林方法对比,判断预测效果的优劣。

ols.fit <- lm(medv~.,Boston,subset=train)  
ols.pred <- predict(ols.fit,newdata=Boston[-train,])
mean((ols.pred-y.test)^2)  
#[1] 27.31196

结果显示OLS测试集MSE为27.31,高于装袋法,这表明,对于波士顿房价数据尽管单颗回归树预测效果不及OLS,但集成学习的效果则优于OLS。

可以尝试不同的参数进行装袋法估计,例如以下的例子

bag.fit <- randomForest(medv~.,data=Boston,subset=train,mtry=13,ntree=1000,
nodesize=10)

其中参数“ntree=1000”表示种1000棵树(默认值为500);参数nodesize=10,表示将终节点的最小规模设为10个观测值(默认值为5)。

2.随机森林估计

下面估计随机森林模型,如下所示

set.seed(123)
forest.fit <- randomForest(medv~.,data=Boston,subset=train)
forest.fit
#Call:
 randomForest(formula = medv ~ ., data = Boston, subset = train) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 4

          Mean of squared residuals: 10.33118
                    % Var explained: 88.67

forest.pred <- predict(forest.fit,newdata=Boston[-train,])
mean((forest.pred-y.test)^2)
#[1] 14.65405

对于回归问题,函数randomForest()默认“mtry=p/3“,故在此使用“mtry=4”进行估计(p=13)。计算随机森林的测试误差,为14.65,比装袋法有较大提升。

下面考察随机森林测试误差与决策树数目(B)的关系,以B=100为例,展示如下

MSE.forest <- numeric(100)  # 创建100个空值数字
set.seed(123)
for(i in 1:100){
  fit <- randomForest(medv~.,data=Boston,subset=train,ntree=i)
  pred <- predict(fit,newdata=Boston[-train,])
  y.test <- Boston[-train,"medv"]
  MSE.forest[i] <- mean((pred-y.test)^2)
}    #查看决策树数目从1到100,测试误差的数值变化

下面再查看装袋法测试误差与决策树数目的关系:

MSE.bag <- numeric(100)
set.seed(123)
for(i in 1:100){
  fit <- randomForest(medv~.,data=Boston,subset=train,ntree=i,mtry=13)   #这里与随机森林不同
  pred <- predict(fit,newdata=Boston[-train,])
  y.test <- Boston[-train,"medv"]
  MSE.bag[i] <- mean((pred-y.test)^2)
}

作为对比,计算单颗决策树的测试误差:

library(rpart)
set.seed(123)
tree.fit <- rpart(medv~.,Boston,subset=train)  
min_cp <-  tree.fit$cptable[which.min(tree.fit$cptable[,"xerror"]),"CP"]
tree.prune <- prune(tree.fit, cp = min_cp)
tree.pred <- predict(tree.prune,newdata=Boston[-train,])
mse <- mean((tree.pred-y.test)^2)   
MSE.tree <- rep(mse,100)

最后,通过画图的形式,展示随机森林、单棵决策树、装袋法的测试误差变化,结果如下:

plot(1:100,MSE.forest,type="l",col="blue",ylab="MSE",xlab="Number of Trees",
      main="Test Error",ylim=c(10,55))
lines(1:100,MSE.bag,type="l")
lines(1:100,MSE.tree,type="l",col="black",lty=2)
legend("topright",lty=c(2,1,1),col=c("black","black","blue"),legend=c("Best Single Tree",
       "Bagging","Random Forest"))    #图标,区分不同的线所代表的方法
R语言机器学习篇——随机森林

由图可见,装袋法的测试误差低于最优的单棵树,而随机森林的测试误差比装袋法还更低。随机森林的一个重要调节参数为mtry,即每次用于节点分裂的变量个数,这可以通过最小化袋外误差或交叉验证误差来确定,首先考虑最小化袋外误差:R语言机器学习篇——随机森林

可用R包random forest中的tuneRF()函数,达到上述的目的,该函数需要设定参数“step—Factor”表示随机选择变量个数的缩放倍数,并不考虑mtry的所有可能取值,下面通过计算寻找使袋外误差最小的mtry:

MSE <- numeric(13)  #mtry最多可以取到13因为有13个特征变量
set.seed(123)
for(i in 1:13){
  fit <- randomForest(medv~.,data=Boston,subset=train,mtry=i)
  MSE[i] <- mean(fit$mse[500])
}
MSE
# [1] 19.557467 12.717293 10.658755  9.903552 10.026058  9.815894
 [7]  9.899590 10.344245 10.561024 10.875071 11.038252 11.606371
[13] 11.963906

min(MSE)
which.min(MSE)   #找到哪个mtry值使得MSE最小
plot(1:13,MSE,type="b",xlab = "mtry",main="OOB Errors")
abline(v=which.min(MSE),lty=2)
R语言机器学习篇——随机森林

结果显示,当mtry=6时,袋外误差达到最小,仅为9.81589,不过mtry=4~7之间的结果差别不大。

下面使用另一种方式——交叉验证误差,来选择mtry的最优值,可使用rfcv()函数,但该函数同样不考虑所有mtry取值,因此还是通过计算找出。

首先将将训练数据随机分为大致相等的5折(训练数据为354个,10折的话就很小,会造成结果不够准确)

Boston_train <- Boston[train,]
set.seed(12345)
foldid <- sample(1:5,size=354,replace=TRUE) # use the same folds 
head(foldid)
#[1] 3 2 4 2 5 3

其中’训练集定义为Boston_train。通过从1:5中有放回地抽取354次,可得到训练集中每个观测值的分组归属。

其次,初始化MSE为一个13×5的矩阵,其中MSE(i,j)元素用于记录当mtry=i,而以第j折作为验证集的均方误差:

MSE <- matrix(rep(0,65),ncol=5)   # initialize CV error for mtry 
for (i in 1:13){
  for (j in 1:5){
    train_cv <- Boston_train[foldid!=j,]
    holdout <- Boston_train[foldid==j,]
    fit <- randomForest(medv~.,data=train_cv,mtry=i)
    pred <- predict(fit,newdata=holdout)
    y.test <- holdout[,"medv"]
    MSE[i,j] <- mean((pred-y.test)^2)
  }
}
cv.error <- apply(MSE,1,mean)
min(cv.error)
#[1] 16.21452
which.min(cv.error)
#[1] 8

其中,在外面的for循环,考察mtry=1:13的不同情形。给定mtry取值后,在里面的for循环,则依次以第j折作为验证集,计算相应的均方误差。最后,使用apply()函数计算矩阵MSE每行的平均值,即为对应于不同mtry取值的交叉验证误差。

结果显示’在mtry=8时,交叉验证误差达到最小值,但交叉验证误差的最小值明显高于袋外误差的最小值,由于在进行交叉验证时,每次仅使用训练集的4/5进行估计,故可能高估测试误差.更直观地,画交叉验证误差图,如下所示:

plot(1:13,cv.error,type="b",xlab="mtry",main="Cross-Validation Error")
abline(v=which.min(cv.error),lty=2)
R语言机器学习篇——随机森林

最后,通过for循环,通过测试集误差来选择最优mtry:

MSE <- numeric(13)
set.seed(123)
for(i in 1:13){
  fit <- randomForest(medv~.,data=Boston,subset=train,mtry=i)
  pred <- predict(fit,newdata=Boston[-train,])
  y.test <- Boston[-train,"medv"]
  MSE[i] <- mean((pred-y.test)^2)
}
min(MSE)
#[1] 14.65984
which.min(MSE)
#[1] 4
plot(1:13,MSE,type="b",xlab = "mtry",main="Test Error")
abline(v=which.min(MSE),lty=2)
R语言机器学习篇——随机森林

严格来说,如果使用测试集来选择调节参数,则无法再使用测试集估计测试误差,因为测

试集的信息已经通过选中的调节参数而提前“泄露”。

更为专业的做法为’将全样本一分为三,其中一部分作为训练集,—部分作为验证集,而另一部分作为测试集。其中,训练集用于训练数据,验证集用于选择调节参数,而测试集则仅用于测试。

这就是关于回归的随机森林方法,接下来讨论分类的随机森林。

二 分类问题的随机森林

在讨论分类问题时,使用R包mlbench的声呐数据Sonar来演示,它包含208个观测值与61个变量,其中响应变量为因子class,表示声呐的回音来自“金属筒”(M)还是“岩石”(R),特征变量共60个(V1~V60),表示不同角度与频道下声呐反射信号的能量。研究的目的在于区分声呐信号来自于金属还是岩石。

首先导入数据集,考察数据的基本特征,并选取训练集和测试集

library(mlbench)
data(Sonar)
dim(Sonar)    #考察数据的维度
#[1] 208  61
table(Sonar$Class)  #考察响应变量的分布情况
# M   R 
111  97 

set.seed(1)
train <- sample(208,158)   #随机选取70%数据作为训练集

其次估计决策树与逻辑回归算法,作为比较随机森林算法的基准

#决策树
library(rpart)
set.seed(123)
fit <- rpart(Class~.,data=Sonar,subset=train)  
min_cp <-  fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"]
min_cp
fit_best <- prune(fit, cp = min_cp)
pred <- predict(fit_best,newdata=Sonar[-train,],type="class")
y.test <- Sonar[-train,"Class"]
(table <- table(pred,y.test))   #混淆矩阵
#    y.test
pred  M  R
   M 24 15
   R  4 22
(error_rate <- 1-sum(diag(table))/sum(table))  #错误率
#[1] 0.2923077

通过单颗修枝后的决策树结果可得出,预测的错误率为28%,其次考虑逻辑回归的预测结果:

#Logit
fit <- glm(Class~.,data=Sonar,subset=train,family=binomial)
prob <- predict(fit,newdata=Sonar[-train,],type="response")
pred <- prob >= 0.5
(table <- table(pred,y.test))
#       y.test
pred     M  R
  FALSE  20  9
  TRUE   6 15
(error_rate <- 1-sum(diag(table))/sum(table))
#[1] 0.3

通过逻辑回归的结果可得出,预测的错误率为30%,下面进行随机森林的估计

#随机森林
fit <- randomForest(Class~.,data=Sonar,subset=train,importance=TRUE)
fit
#Call:
 randomForest(formula = Class ~ ., data = Sonar, importance = TRUE,      subset = train) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 7

        OOB estimate of  error rate: 17.09%
Confusion matrix:
   M  R class.error
M 78  7  0.08235294
R 20 53  0.27397260

结果显示,函数randomForest()默认使用mtry=7个变量作为候选分裂变量,因为

R语言机器学习篇——随机森林,袋外误差为18.99%,但金属类的袋外误差为9.41%,而岩石类的袋外误差高达30.14%。使用plot()函数即可同时画这三个袋外误差:

plot(fit,main="OOB Errors",col=c(4,1,1))
legend("topright", colnames(fit$err.rate),lty=1:3,col=c(4,1,1))
R语言机器学习篇——随机森林

在上图中,蓝色实线为整个样本的OOB误差,而另外两条虚线则分别为金属(M类)与岩石(R类)样例的袋外误差。下面查看变量重要性以及影响最大的V11变量的偏依赖图,如下所示

varImpPlot(fit,main="Variable Importance Plot")
partialPlot(fit,Sonar[train,],x.var=V11)
R语言机器学习篇——随机森林
R语言机器学习篇——随机森林

最后考察随机森林的预测效果,如下:

pred <- predict(fit,newdata=Sonar[-train,])
(table <- table(pred, y.test))
#    y.test
pred  M  R
   M 25  7
   R  1 17
(error_rate <- 1-sum(diag(table))/sum(table))
#[1] 0.16

结果显示,随机森林的预测错误率为14%,仅是单棵决策树测错误率的一半,因此随机森林算法在此例的预测效果要优于另外两种方法。文章来源地址https://www.toymoban.com/news/detail-446266.html

到了这里,关于R语言机器学习篇——随机森林的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习——决策树/随机森林

    决策树可以做分类也可以做回归,决策树容易过拟合 决策树算法的基本原理是依据信息学熵的概念设计的(Logistic回归和贝叶斯是基于概率论),熵最早起源于物理学,在信息学当中表示不确定性的度量,熵值越大表示不确定性越大。 ID3算法就是一种通过熵的变化,构造决策

    2024年02月07日
    浏览(27)
  • 机器学习笔记:随机森林

    集成学习通过构建多个学习器采用加权的方式来完成学习任务 一般来讲,多个学习器同属于一种模型,比如决策树,线性模型,而不会交叉用多种模型 为了保证集成学习的有效性,多个弱分类器之间应该满足两个条件 准确性 :个体学习器要有一定的准确性,这样才能有好的

    2024年02月16日
    浏览(50)
  • 【机器学习】python实现随机森林

    目录 一、模型介绍 1. 集成学习 2. bagging 3. 随机森林算法 二、随机森林算法优缺点 三、代码实现 四、疑问 五、总结 本文使用mnist数据集,进行随机森林算法。 集成学习通过训练学习出多个估计器,当需要预测时通过结合器将多个估计器的结果整合起来当作最后的结果输出。

    2024年02月05日
    浏览(34)
  • 机器学习(十八):Bagging和随机森林

    全文共10000余字,预计阅读时间约30~40分钟 | 满满干货(附数据及代码),建议收藏! 本文目标:理解什么是集成学习,明确Bagging算法的过程,熟悉随机森林算法的原理及其在Sklearn中的各参数定义和使用方法 代码及数据集下载点这里 在机器学习的众多算法中,随机森林无疑是

    2024年02月13日
    浏览(42)
  • 机器学习——决策树与随机森林

    机器学习——决策树与随机森林 决策树和随机森林都是常见的机器学习算法,用于分类和回归任务,本文将对这两种算法进行介绍。 决策树算法是一种基于树结构的分类和回归算法。它通过对数据集进行 递归地二分 ,选择最佳的特征进行划分,直到达到终止条件。 决策树

    2024年02月09日
    浏览(27)
  • 【机器学习】随机森林 – Random forest

    随机森林是一种由 决策树 构成的 集成算法 ,他在很多情况下都能有不错的表现。 要深入理解上面这句话,请阅读我的另外两篇文章: 【机器学习】决策树 – Decision Tree 【机器学习】集成学习 - Ensemble Learning 随机森林属于 集成学习 中的 Bagging (Bootstrap AGgregation 的简称)

    2024年02月16日
    浏览(37)
  • 机器学习十大算法之七——随机森林

    集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个横型,集成所有模型的建模结果,基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场

    2024年02月11日
    浏览(31)
  • 机器学习框架sklearn之随机森林

    集成学习通过建立几个模型组合来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立的学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。 在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是

    2023年04月22日
    浏览(31)
  • 机器学习5—分类算法之随机森林(Random Forest)

    随机森林(Random Forest) 是Bagging(一种并行式的集成学习方法)的一个拓展体,它的基学习器固定为决策树,多棵树也就组成了森林,而“随机”则在于选择划分属性的随机,随机森林在训练基学习器时,也采用有放回采样的方式添加样本扰动,同时它还引入了一种属性扰动

    2024年02月03日
    浏览(35)
  • sklearn机器学习库(二)sklearn中的随机森林

    集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果, 以此来获取比单个模型更好的回归或分类表现 。 多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包