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

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

时间:2023-11-23 21:44:06浏览次数:35  
标签:数据分析 集成 生存 模型 学习 实例 随机 解析 森林

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

 

集成学习方法

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的这篇用随机生存森林的文章就完全复现出来了

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

标签:数据分析,集成,生存,模型,学习,实例,随机,解析,森林
From: https://www.cnblogs.com/Codewar/p/17852582.html

相关文章

  • BIT大数据应用算法2022年期末考试A卷解析
    北京理工大学2022年大数据应用算法期末考试A卷一、请简要回答为什么需要设计可合并的\(Sketch\)算法?可合并的\(Sketch\)算法主要是用于什么场景?解答:我谔谔二、给定数据流\(D=(1,2,5,1,4,2,3,3,2,4,5,2)\),假设\(k=3\),请详细描述\(Misra‐Gries\)算法在该数据流上的运......
  • Flink源码解析(六)——数据分区解析
    一、数据分区概念对分布式计算引擎来说,数据分区的主要作用是将现环节的数据进行切分,交给下游位于不同物理节点上的Task计算。二、Flink数据分区接口体系1、顶层接口ChannelSelector(1).setup()方法设置下游算子的通道数量。从该接口中可以看到,算子里的每一个分区器都知道下游......
  • Handler 源码解析,从入门到几乎入门
    AndroidHandler源码解析在Android中,Handler是一种强大的机制,用于在不同的线程之间进行通信。通过Handler,你可以轻松地将任务从一个线程发送到另一个线程,通常用于在后台线程执行任务后更新UI。同时handler机制也是Android主线程运行的原理,了解了主线程的运行原理也就可以知道l......
  • CreateIndex API执行流程_milvus源码解析
    CreateIndexAPI执行流程源码解析milvus版本:v2.3.2整体架构:CreateIndex的数据流向:1.客户端sdk发出CreateIndexAPI请求。importnumpyasnpfrompymilvusimport(connections,FieldSchema,CollectionSchema,DataType,Collection,)num_entities,......
  • CreateIndex API执行流程_milvus源码解析
    CreateIndexAPI执行流程源码解析milvus版本:v2.3.2整体架构:CreateIndex的数据流向:1.客户端sdk发出CreateIndexAPI请求。importnumpyasnpfrompymilvusimport(connections,FieldSchema,CollectionSchema,DataType,Collection,)num_entities,......
  • FPGA入门笔记006——状态机设计实例
    状态分析:状态1:等待“H”的到来,如果检测到“H”,进入状态2,检测“e”,否则一直等待“H”;状态2:检测当前字符是否是“e”,如果是“e”,跳转到状态3,检测“l”,否则,回到状态1,重新等待“H”;状态3:检测当前字符是否是“l”,如果是“l”,跳转到状态4,检测“l”,否则,回到状态1,重新等待“H”;状态4:......
  • 在Vue中使用Mock.js虚拟接口数据实例详解
     在Vue项目中使用Mock.js可以方便地模拟接口数据,用于前端开发和测试。Mock.js是一个生成随机数据的库,可以帮助我们快速构建虚拟接口数据。在本文中,我将通过一个实例来详细讲解在Vue中使用Mock.js虚拟接口数据的方法。首先,我们需要创建一个Vue项目。可以使用VueCLI来快速创建......
  • 营销数智化解析第6期:用友BIP | CRM 销售自动化场景
    用友BIPCRM企业销售管理增效的绝佳选择业务赋能已成为新时代CRM数智化的特征!数智化CRM的服务边际在不断延伸,从核心的销售管理场景,向前延伸到营销场景,提升获客能力;向后延伸到客户服务场景,提升服务质量;向内延伸到集成多业务系统,重构/加强数据赋能业务的能力。用友BIP|CRM......
  • springboot多文件上传代码实例及解析
    这篇文章主要介绍了springboot多文件上传代码实例及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下一说明spingMVC支持文件上传,我们通过Apach的commons-fileupload包的CommonsMultipartResolver去实现了spingMVC的Mu......
  • 数据分析从入门到高级,10分钟帮你构建知识体系!
    数据分析是一种通过收集、整理、解释和可视化数据来获得洞察力和做出决策的过程。它在各行各业都起着至关重要的作用,包括市场营销、金融、医疗保健、人力资源等领域。在本文中,我将为你介绍数据分析的入门知识,并逐步向你介绍一些高级概念和技巧。入门知识1.数据分析的基本概念......