【机器学习系列】基于决策树的集成模型——随机森林方法介绍

健康   2024-12-31 07:49   浙江  
【本文章由高校教师徐博士撰写】
看过我们前面几篇机器学习系列文章后,相信大家现在对机器学习的理论都有了一定的了解。
今天我们继续介绍机器学习最经典也是使用最为广泛的模型——随机森林(Random Forest)该模型自2001年由Leo Breiman提出以来,就成为机器学习领域重要的分析工具。
在今天这篇文章中,我们将简单探讨随机森林的基本原理以及如何用R语言进行实践,大家也可以用文中的代码进行尝试。

什么是随机森林?


开门见山,随机森林这个名称真的非常符合这一模型的特点,我们结合下面的示意图来看随机森林模型的具体运算步骤:

随机森林模型运算过程示意图

从上述示意图中,我们也能得出随机森林模型基本的分析思路:
1.从原始训练数据集中通过自助采样法(bootstrap sampling)有放回地随机抽取一定数量的数据,数量一般和原观测数相等,形成多个不同的子数据集;

2. 对每个子数据集训练一棵决策树,但决策树的每个决策节点不使用所有特征,而是随机选取部分特征,再从这些特征中根据数据“纯度”指标选择特征进行数据划分;

3.按照上述方式得到多棵不尽相同的决策树形成森林,对于测试数据集,综合所有决策树的预测结果得到最终预测结果。

  • 例如对于分类任务,可以取所有决策树预测类别中数量最多的那一类作为个体的最终分类结果;

  • 对于回归任务,可以取所有决策树预测结果的平均值作为个体的预测值。

可以发现随机森林能分成「随机」+「森林」两部分来理解,这个名称和模型特点相当贴切了。

上面3个步骤都不复杂,只要看懂了上一篇决策树的推文——《15分钟带你吃透决策树模型的三大经典算法》,相信很快就能够理解随机森林模型是怎么一回事了。

√除此之外,模型的开发动机、核心参数等问题也是有必要了解的,我们也借此机会解答大家最关心的三个问题:

提问 1

既然已经有了决策树算法,为什么还要开发随机森林算法呢?

回答

核心原因是决策树算法存在容易过拟合、模型结构不稳定的缺点,随机森林能够通过袋装法(Bagging)集成多棵决策树提高模型的泛化能力和稳健性。

通俗的说,就算决策树是诸葛亮,随机森林也至少是多个臭皮匠,多人决策的结果未必是最好的,但是是最中肯的,能避免过激的决策。

提问 2

为什么要用随机抽样和随机特征选取来构建决策树?

回答

在个体分类器的错误率相互独立的条件下,根据Hoeffding不等式可知,随着集成模型中个体分类器数量的增加,集成模型的错误率将指数级下降,最终趋向于0。

在实际中,个体分类器是为解决同一个问题训练出来的,分类错误率显然并不是相互独立的。尽管我们在实际中无法做到个体学习器间的完全独立,但可以设法让个体学习器尽可能不同,随机抽样和随机特征选取就是这样的两种办法。

提问 3

随机森林的核心超参数有哪些?

回答

随机森林最重要的超参数有两个,一个是决策树的数量,另一个是生成单棵决策树时每个决策节点随机选取的变量数,这两个超参数设置是否合理对预测效果影响较大。

另外所有决策树的最大深度、节点分裂最小样本数也是较重要的。

R语言随机森林预测模型实例

我们还是利用MASS包中的biopsy数据集,数据集详细介绍见公众号推文
机器学习入门(5)| Logistic回归模型
√首先是加载并处理数据集:
## 加载数据 ##library(MASS)data(biopsy)## 数据预处理 ##library(dplyr)biopsy_2 <- biopsy %>%  dplyr::select(-ID) %>% #去掉id列  filter(complete.cases(.)) %>% #去掉变量有缺失值的观测  rename(nd=V1, jyd.size=V2, jyd.shape=V3,         nzd=V4, size.dsp=V5, lxbh=V6,         rsz=V7, hr=V8, ysfl=V9) #改变细胞特征变量的变量名,方便后面查看
  • 细胞特征变量包括:细胞浓度(nd)、细胞大小均匀度(jyd.size)、细胞形状均匀度(jyd.shape)、边缘黏着度(nzd)、单上皮细胞大小(size.dsp)、裸细胞核(lxbh)、平和染色质(rsz)、正常核仁(hr)、有丝分裂状态(ysfl)。

  • class变量是肿瘤良恶性诊断结果,“benign”是良性,“malignant”是恶性,该变量是我们分析的结果变量。

√其次将数据集按7:3比例随机划分为训练集和测试集:

## 数据集划分 ##set.seed(0) #设置随机种子数,用于复现结果index.train <- sample(1:nrow(biopsy_2), 0.7*nrow(biopsy_2)) #训练集的观测索引index.test <- setdiff(1:nrow(biopsy_2),index.train) #测试集的观测索引data.train <- biopsy_2[index.train, ] #训练集data.test <- biopsy_2[index.test, ] #测试集

√接着训练随机森林模型并查看过程中的一些信息:

## 构建随机森林模型 ##library(randomForest)#加载随机森林的包set.seed(12345678) rf.trained <- randomForest(class ~ ., data = data.train)#训练好的随机森林模型rf.trained#查看训练过程的信息

randomForest()函数默认的决策树算法是CART,树的数量ntree是500棵,对于分类任务,默认的生成单棵决策树时每个决策节点随机选取的变量数mtry,即自变量数量的根号后取整。
我们的数据有9个自变量,因此mtry等于3。
模型的袋外数据错分率是2.51%,我们画出表示树的数量和袋外数据错分率的关系图:

plot(rf.trained)#决策树数量和袋外数据分类误差的关系图

黑线表示全部袋外数据的错分率,绿线、红线分别表示袋外数据中malignant类别、benign类别的错分率。

从图中可以看到袋外数据错分率并不是在ntree=500时达到最小,而是150左右

我们以此调整模型结构,重新训练模型。

√接下来调整随机森林中树的数量,重新训练:

## 调整决策树数量 ##ntrees.minerr <- which.min(rf.trained$err.rate[, 1])#袋外数据(“验证集”)分类误差最小时的决策树数量ntrees.minerr#147棵set.seed(12345678) rf.trained.best <- randomForest(class ~ ., data = data.train, ntree=ntrees.minerr)#用147棵决策树构建随机森林rf.trained.best#查看训练过程的信息

袋外数据错分率最小时的决策树数量是147棵,对应的错分率是2.09%。袋内和袋外数据中共有10条观测被错分,包括有7条实际为malignant的观测被错分为benign,3条实际为benign的观测被错分为malignant。

√最后评估调参后的随机森林模型的测试集预测效果:

## 测试集评价最优模型预测效果 ##predicted_probs.test <- predict(rf.trained.best, newdata = data.test,                                type = "prob")[,2]#对测试集的结局预测,输出为malignant的概率predicted_values.test <- predict(rf.trained.best, newdata = data.test,                                 type = "class")#测试集的结局预测,输出分类结果# 查看预测效果confusion_matrix <- table(Predicted = predicted_values.test, Actual = data.test$class)# 创建混淆矩阵library(caret)confusionMatrix(confusion_matrix)#输出模型预测准确率、灵敏度、特异度
library(pROC)roc_curve <- roc(data.test$class, predicted_probs.test) #构建ROC曲线roc_curve$auc#输出模型AUC值plot(roc_curve, main = "ROC曲线", col = "blue",      lwd = 2, lty = 1,     xlab = "1-特异度", ylab = "灵敏度",     print.auc = TRUE, grid = TRUE)#可视化ROC曲线
 √此外,还可以查看调参后的随机森林模型中自变量对分类贡献的重要性排序:
## 查看每个变量对分类的重要性 ##varImpPlot(rf.trained.best)
默认决策树算法是CART,所以衡量变量重要性的指标是基尼指数平均减少量。
在我们的模型中,分类贡献由大到小的自变量依次是:细胞形状均匀度(jyd.shape)、细胞大小均匀度(jyd.size)、裸细胞核(lxbh)、正常核仁(hr)、单上皮细胞大小(size.dsp)、平和染色质(rsz)、细胞浓度(nd)、边缘黏着度(nzd)、有丝分裂状态(ysfl)。
在实际中,我们也可以考虑用贡献度大的部分自变量来构建预测模型。

随机森林模型的优缺点

√优点:
1.预测表现稳定:通过集成多棵决策树的结果,随机森林的预测表现往往相对较优。

2.抗过拟合能力强:通过随机抽样和特征子集随机选择生成多棵不尽相同的决策树,降低了单一决策树容易过拟合的风险。

3.模型结果稳定:模型对异常值、噪声数据不敏感,模型效果不容易被小部分异常数据影响。

4.能够并行训练决策树:树和树之间不存在依赖关系,每棵树的训练过程是独立进行的,训练时间相比需要串行训练的同类模型短。

5.袋外数据评估模型效果:有放回随机重复抽样过程中,约有36.8%的样本始终不会被抽到用于训练模型,这部分袋外数据可以用来充当“验证集”评估模型效果,而不需单独划分验证集。

√缺点:

1.计算开销大:需要训练大量决策树,当数据量较大时训练时间较长。

2.模型解释性较差:决策过程相对不透明,不像单棵决策树那样能直观理解每个决策过程,不易于向不熟悉该算法的个体解释具体决策过程。

3.偏好于取值数目多的特征:如果构成随机森林的决策树是ID3或CART算法,可能会导致随机森林的效果过度依赖这些特征。
【本文章由高校教师徐博士撰写】,欢迎交流

关于郑老师团队及公众号 

大型医学统计服务公众号平台,专注于医学生、医护工作者学术研究统计支持,我们是你们统计助理

我们开展对临床预测模型、机器学习、医学免费数据库NHANES、GBD数据库、孟德尔随机化方法、MIMIC 一对一R语言指导开展统计分析(一年内不限时间,周末、晚上均统计师一对一指导)

①指导学习R语言基本技巧

②全程指导课程学习

③课程R语言代码运行bug修复

④支持学员一篇SCI论文的数据分析

1对1R语言指导详情介绍


详情联系助教小董咨询(微信号aq566665

医学论文与统计分析
本号为高校统计学老师所设,介绍医学论文进展与统计学方法,SPSS分析方法、真实世界研究、R语言与数据挖掘。关注后,发送关键词“33”到公众号就可以获取常见的统计软件比如Spss,sas,PASS(绝对无毒)等
 最新文章