R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

很久很久以前给大家写过决策树,非常简单明了的算法。今天给大家写随机(生存)森林,随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。所以今天来写写这类算法。

集成学习方法

Ensemble learning methods are made up of a set of classifiers—e.g. decision trees—and their predictions are aggregated to identify the most popular result.

所谓的集成学习方法,就是把很多的比较简单的学习算法统起来用,比如光看一个决策树,好像效果比较单调,还比较容易过拟合,我就训练好多树,把这些树的结果综合一下,结果应该会好很多,用这么样思路形成的算法就是集成学习算法Ensemble methods,就是利用很多个基础学习器形成一个综合学习器。

Basically, a forest is an example of an ensemble, which is a special type of machine learning method that averages simple functions called base learners.The resulting averaged learner is called the ensemble

集成学习方法最有名的就是bagging 和boosting 方法:

The most well-known ensemble methods are bagging, also known as bootstrap aggregation, and boosting

BAGGing

BAGGing, or Bootstrap AGGregating这个方法把自助抽样和结果合并整合在一起,包括两个步骤,一个就是自助抽样,抽很多个数据集出来,每个数据集来训练一个模型,这样就可以有很多个模型了;第二步就是将这么多模型的结果合并出来最终结果,这个最终结果相对于单个模型结果就会更加稳健。

In the bagging algorithm, the first step involves creating multiple models. These models are generated using the same algorithm with random sub-samples of the dataset which are drawn from the original dataset randomly with bootstrap sampling method

The second step in bagging is aggregating the generated models.

随机森林就可以看作是遵循了bagging方法的一个思路,只不过在每一个抽样样本中的树(模型)是不一样的:

Boosting:

Boosting为强化学习,最大的特点是可以将原来的弱模型变强,逻辑在于算法会先后训练很多模型,后面训练模型的时候会不断地给原来模型表现不好的样本增大权重,使得后面的模型越来越将学习重点放在之前模型表现差的样本上,这么一来,整体模型越来越强。就像人会从之前的错误中反省经验一个意思了。

这么一描述大家就知道,boosting方法的模型训练是有先后顺序的,并行算法就用不了了

Boosting incrementally builds an ensemble by training each model with the same dataset but where the weights of instances are adjusted according to the error of the last prediction.

Boosting方法本身也有很多,常见的如AdaBoost,Gradient Boosting(XGBoost and LightGBM),下图感兴趣的同学可以看看:

上面的算法之后再给大家写,接下来的实操部分还是以随机森林为例子给大家具体介绍:

随机森林

随机森林模型的拟合过程大概可以分为三步:

1.通过有放回的自助抽样形成ntree个抽样样本集(Bootstrap)

2.对每个抽样样本集形成一个决策树,这个树是基于mtry个预测因子的

3.将最终的模型结果就是ntree个抽样样本集得出的结果的最大票数或者均值(AGGregating)

随机森林的整个的流程就如下图:

为了方便理解“最终的模型结果就是ntree个抽样样本集得出的结果的最大票数或者均值”我们用例子做个解释,先看下图:

我们有一个水果集,然后我训练一个3棵树组成的随机森林来判断每一个水果到底是何种类,有两棵树都告诉我是某一个水果是苹果,一棵树告诉我是香蕉,那么最后我们随机森林就会输出该水果是香蕉的结论。

上面的过程有几个超参需要确定

  • mtry: Number of variables randomly sampled as candidates at each split.
  • ntree: Number of trees to grow.

mtry一般需要调参,ntree都是越大越好自己设定就行。在上面的过程中我们每棵树的节点都是不同的,叫做特征随机化,通过特征随机化我们保证了森林中树的多样性,随机森林模型也更加稳健。

Feature randomness, also known as feature bagging or “the random subspace method”, generates a random subset of features, which ensures low correlation among decision trees

随机森林实操

比如我现在有一个数据集,结局变量是class为二分类,我要适用随机森林算法就可以写出如下代码:

rf_default <- train(Class~., data=dataset, method='rf', tuneLength  = 15, trControl=control)
print(rf_default)

输出的结果中有随机调参的过程,共15次,最终发现超参mtry=3的时候模型最优,具体如下:

以上的随机森林模型的简单展示,接着我们再看随机生存森林。

随机生存森林

和随机森林一样,随机生存森林也是一个集成学习方法,区别在于其结局为生存资料。

示例文章

依然我们来看一篇发表在Cancer Med.上的文章,名字如下:

Prognostic risk factor of major salivary gland carcinomas and survival prediction model based on random survival forests

作者用cox进行了变量筛选,使用随机生存森林进行了预测模型构建,并得到了相应的风险分,明确了风险分的最佳截断值(“maxstat” R package),对于模型的表现作者使用了c指数和time-dependent ROC来评估,文章中主要的结果报告如下,包括:

树的数量和模型误差情况,以及变量重要性的结果:

time-dependent ROC曲线结果展示和相应的AUC值:

风险分界址点确定:

高低风险组的组间生存曲线比较:

也是一篇预测模型类文章的常规套路了。挑一个算法,拟合模型后评估,做个风险分,应用风险分划分病人证明模型可用性。我们以这篇文章为例子看随机生存森林预测模型的实操。

随机生存森林实例操作

我现在的数据中ttodead,died两个变量分别是时间和生存状态,此时我想做一个随机生存森林模型就可以写出如下代码:

RF_obj <- rfsrc(Surv(ttodead,died)~., dataSet, ntree = 1000,  membership = TRUE, importance=TRUE)

对代码运行后生成的对象RF_obj进行plot即可出图如下,就得到了原文中的figure2:

然后我们可以画出模型的不同时间点的timeRoc曲线(下面代码中的risk_score为随机生存森林对象的预测值),就得到了原文中的figure3,figure4:

ROC_rsf<-timeROC(T=finaldata.Test$Surv_day,delta=finaldata.Test$status,marker=risk_score,cause=1,times=c(365,365*3,365*5),iid=TRUE)
plot(ROC_lasso,time=365)
plot(ROC_lasso,time=365*3,add = T,col="blue")
plot(ROC_lasso,time=365*5,add = T,col="green")
legend(.8, .3, legend=c("T=1 Year AUC=0.895", "T=3 Year AUC=0.917","T=5 Year AUC=0.926"),col=c("red", "blue","green"), lty=1, cex=0.7,bty = "n")

并且将模型预测值的截断值找出来,验证模型在不同风险组的区分能力。其中找风险分截断值的代码如下:

y.pred <- predict(RF_obj)[["predicted"]]
plot(surv_cutpoint(dataSet, time = "ttodead", event = "died",variables = c("y.pred")), "y.pred", palette = "npg")

运行后得到下图(原文中的figure5),就说明我们这个模型的风险分截断值应该为43.21:

然后根据这个风险分我们就可以将原始人群分为高风险组和低风险组,再做出组间km曲线,到这儿相当于Cancer Med的这篇用随机生存森林的文章就完全复现出来了

以上是给大家介绍的随机生存森林的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/211741.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用XHProf查找PHP性能瓶颈

使用XHProf查找PHP性能瓶颈 XHProf是facebook 开发的一个测试php性能的扩展&#xff0c;本文记录了在PHP应用中使用XHProf对PHP进行性能优化&#xff0c;查找性能瓶颈的方法。 下载 网上很多是编译安装xhprof-0.9.4版本&#xff0c;应该是用php5&#xff0c;在php8.0下编译x…

掌动智能带您深入了解业务连续性演练

业务连续性演练是一种有目的的模拟活动&#xff0c;旨在测试和评估组织业务连续性计划的有效性。这涉及到模拟各种可能的业务中断情况&#xff0c;以便团队可以在真实事件发生时做出迅速、协调的响应。 一、业务连续性演练设计原则 全面性&#xff1a;涵盖所有关键业务流程&…

Node使用Nvm安装双版本切换(node两个版本同时用怎么办?不同的项目Node版本要求不一样怎么办?)

先把node.js卸载 开始—>添加删除程序—>node npm -v node -v //检查是否还存在&#xff0c;卸载成功就行了NVM下载 github下载 百度网盘下载 打开安装包以管理员身份安装&#xff0c;要是记得这个路径并且必须全是英文 使用nvm安装两个使用的node版本 cmd以管理员…

全网最全最有用的网络安全(超详细)学习路线!整理了一个月!

正文&#xff1a; 禁止废话&#xff0c;先看学习路线图&#xff1b; 在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发…

PyTorch包

进入PyTorch的官网&#xff1a; pytorch GitHub 点击GitHub&#xff1a; 进入PyTorch的主目录&#xff1a; 进入Vision reference&#xff1a; detection&#xff1a; 这就是我们在训练过程中会使用到的文件了&#xff1a;

SWT/Jface(2): 表格的编辑

前言 上节说到, 创建和渲染表格需要如下几个步骤: 接收源数据数组(也可以是单个对象或者其他集合类型): TableViewer.setInput(Object)渲染接收的数据 渲染表头: TableViewer.setLabelProvider(IBaseLabelProvider)渲染内容: TableViewer.setContentProvider(IContentProvide…

Springmvc实现增删改差

一、包结构 二、各层代码 (1)数据User public class User {private Integer id;private String userName;private String note;public User() {super();}public User(Integer i, String userName, String note) {super();this.id i;this.userName userName;this.note note;…

【源码分析】zeebe actor模型源码解读

zeebe actor 模型&#x1f64b;‍♂️ 如果有阅读过zeebe 源码的朋友一定能够经常看到actor.run() 之类的语法&#xff0c;那么这篇文章就围绕actor.run 方法&#xff0c;说说zeebe actor 的模型。 环境⛅ zeebe release-8.1.14 actor.run() 是怎么开始的&#x1f308; Lon…

程序员接单,宝藏好平台抄底攻略清单!五大平台精选。

前阵子”双十一“购物节狂欢促销&#xff0c;各种好货清单席卷而来。 程序员购不购物我不知道&#xff0c;但是这个兼职、接单清单相信你一定用得着。 搜罗海量信息&#xff0c;整理大量数据与评价&#xff0c;挖出了5个宝藏平台&#xff0c;绝对个个精选&#xff0c;保证量大…

改善钢棒直线度检测可靠性 在线直线度测量仪替代人工检测

根据GB/T908-2019标准规定&#xff0c;钢棒的尺寸包括直径或边长、长度、弯曲度等。因此钢棒在生产中进行尺寸检测&#xff0c;保证成品符合规格&#xff0c;是降低废品率的重要一环。 有些钢棒的弯曲很明显&#xff0c;肉眼可看&#xff0c;但更有很多不明显的需要借助工具检测…

python -opencv 图像锐化

python -opencv 图像锐化 图像锐化其实&#xff0c;是一种增强图片对比度的技术&#xff0c;我们可以通过计算图像的导数&#xff0c;把导数绝对值数值大于零的数值加回原图像&#xff0c;通过这种方法&#xff0c;可以增强图像的对比度。 实现代码如下&#xff1a; import c…

PHP 语法||PHP 变量

PHP 脚本在服务器上执行&#xff0c;然后将纯 HTML 结果发送回浏览器。 基本的 PHP 语法 PHP 脚本可以放在文档中的任何位置。 PHP 脚本以 <?php 开始&#xff0c;以 ?> 结束&#xff1a; <?php // PHP 代码 ?> 值得一提的是&#xff0c;通过设定php.ini的相…