机器学习-生存分析:如何基于随机生存森林训练乳腺癌风险评估模型?

简介: 机器学习-生存分析:如何基于随机生存森林训练乳腺癌风险评估模型?

一、 引言

乳腺癌是女性最常见的恶性肿瘤之一,也是全球范围内女性死亡率最高的癌症之一。据统计,每年全球有超过200万人被诊断为乳腺癌,其中约60万人死于该疾病。因此,乳腺癌的早期诊断和风险评估对于预防和治疗乳腺癌具有非常重要的意义。

近年来,机器学习和生存分析等数据挖掘技术在乳腺癌研究中得到了广泛应用。这些方法可以挖掘患者的临床、基因、影像等多种数据,预测患者的生存期、疾病进展和治疗效果,为临床决策提供科学依据。其中,随机生存森林算法作为一种有效的生存分析方法,已经在乳腺癌研究中得到了广泛应用。

本文旨在探讨基于随机生存森林算法进行乳腺癌风险评估模型训练的方法。具体而言,我们将收集乳腺癌患者临床、基因和影像等多种数据,进行预处理后,使用随机生存森林算法训练乳腺癌风险评估模型,并分析模型性能和特征重要性。通过本研究,我们希望能够为乳腺癌早期诊断和风险评估提供一种新的方法和思路。

二、乳腺癌风险评估模型

2.1 传统风险评估方法局限性

传统的乳腺癌风险评估方法主要基于临床特征和家族史等风险因素,如Gail模型和Tyrer-Cuzick模型。然而,这些方法存在一些局限性。首先,它们仅考虑了有限的风险因素,忽略了其他潜在的重要因素,如基因表达和影像学特征等。其次,传统方法通常采用线性回归模型,无法捕捉非线性关系和交互作用。最后,由于传统方法对数据的假设较强,对异常值和缺失值较为敏感。

2.2 随机生存森林算法简介

随机生存森林算法是一种基于决策树的机器学习方法,可以用于生存分析和风险评估。与传统方法相比,随机生存森林算法具有以下优势:

  • 首先,它可以处理多种数据类型,包括连续型、离散型和分类型数据,以及高维数据。
  • 其次,该算法能够自动选择特征,并且能够处理非线性关系和交互作用。
  • 此外,随机生存森林算法对异常值和缺失值具有较好的鲁棒性。

2.3 为何选择随机生存森林

本文选择随机生存森林作为乳腺癌风险评估模型的训练算法,原因如下:首先,随机生存森林算法可以处理多种数据类型,包括临床、基因和影像等多种数据,使得模型能够充分利用多源数据的信息。其次,该算法能够自动选择特征,从而减少了人工特征工程的复杂性。最后,随机生存森林算法能够捕捉非线性关系和交互作用,提高了乳腺癌风险评估模型的预测性能。

通过选择随机生存森林算法作为乳腺癌风险评估模型的训练算法,我们希望能够克服传统方法的局限性,并提高乳腺癌风险评估的准确性和可靠性。

三、实例展示

  • 「数据集准备」
library(survival)
head(gbsg)

结果展示:

pid age meno size grade nodes pgr er hormon rfstime status
1  132  49    0   18     2     2   0  0      0    1838      0
2 1575  55    1   20     3    16   0  0      0     403      1
3 1140  56    1   40     3     3   0  0      0    1603      0
4  769  45    0   25     3     1   0  4      0     177      0
5  130  65    1   30     2     5   0 36      1    1855      0
6 1642  48    0   52     2    11   0  0      0     842      1
  • 「示例数据集介绍」
> str(gbsg)
'data.frame':   686 obs. of  10 variables:
 $ age    : int  49 55 56 45 65 48 48 37 67 45 ...
 $ meno   : int  0 1 1 0 1 0 0 0 1 0 ...
 $ size   : int  18 20 40 25 30 52 21 20 20 30 ...
 $ grade  : int  2 3 3 3 2 2 3 2 2 2 ...
 $ nodes  : int  2 16 3 1 5 11 8 9 1 1 ...
 $ pgr    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ er     : int  0 0 0 4 36 0 0 0 0 0 ...
 $ hormon : int  0 0 0 0 1 0 0 1 1 0 ...
 $ rfstime: int  1838 403 1603 177 1855 842 293 42 564 1093 ...
 $ status : Factor w/ 2 levels "0","1": 1 2 1 1 1 2 2 1 2 2 ...
age:患者年龄
meno:更年期状态(0表示未更年期,1表示已更年期)
size:肿瘤大小
grade:肿瘤分级
nodes:受累淋巴结数量
pgr:孕激素受体表达水平
er:雌激素受体表达水平
hormon:激素治疗(0表示否,1表示是)
rfstime:复发或死亡时间(以天为单位)
status:事件状态(0表示被截尾,1表示事件发生)
  • 「划分训练集和测试集」
# 划分训练集和测试集
set.seed(123)
data <- gbsg[,c(-1)]
train_indices <- sample(x = 1:nrow(data), size = 0.8 * nrow(data), replace = FALSE)
test_indices <- sample(setdiff(1:nrow(data), train_indices), size = 0.2 * nrow(data), replace = FALSE)
train_data <- data[train_indices, ]
test_data <- data[test_indices, ]
  • 「构建随机生存森林模型」
library(randomForestSRC)
rfsrc_fit <- rfsrc(Surv(rfstime,status)~., 
                   ntree = 100,         
                   nsplit = 5,           
                   importance = TRUE,  
                   tree.err=TRUE,      
                   data=train_data)
rfsrc_fit

结果展示:

> rfsrc_fit
                         Sample size: 548
                    Number of deaths: 241
                     Number of trees: 100
           Forest terminal node size: 15
       Average no. of terminal nodes: 24.85
No. of variables tried at each split: 3
              Total no. of variables: 8
       Resampling used to grow trees: swor
    Resample size used to grow trees: 346
                            Analysis: RSF
                              Family: surv
                      Splitting rule: logrank *random*
       Number of random split points: 5
                          (OOB) CRPS: 0.15674136
   (OOB) Requested performance error: 0.29986439
  • 「模型结果可视化(变量重要性和误差)」
plot(rfsrc_fit)

  • 「绘制树结构」
plot(get.tree(rfsrc_fit,3))

  • 「绘制生存曲线」
plot.survival(rfsrc_fit,subset=1:6)

#  绘制前6个特征的生存曲线
matplot(rfsrc_fit$time.interest,
        100*t(rfsrc_fit$survival.oob[1:6,]),
        xlab = "time",
        ylab = "Survival",
        type="l",lty=1,
        lwd=2)

  • 「计算Brier score并绘图」
# 1. 采用km法计算Brier score
bs_km <- get.brier.survival(rfsrc_fit, 
                            cens.model = "km")$brier.score
head(bs_km)
# 2. 采用rfsrc法计算Brier score
bs_rsf <- get.brier.survival(rfsrc_fit, 
                             cens.model = "rfsrc")$brier.score
head(bs_rsf)

结果展示:

# km
> head(bs_km)
  time brier.score
1   72 0.001880723
2   98 0.003769397
3  120 0.007472802
4  160 0.008729987
5  171 0.012496130
6  173 0.014353439
# rfsrc
> head(bs_rsf)
  time brier.score
1   72 0.001880938
2   98 0.003772356
3  120 0.007461321
4  160 0.008692986
5  171 0.012499945
6  173 0.014383175

绘制图形并比较:

plot(bs_km,type="s",col=2,lwd=3)
lines(bs_rsf,type = "s",col=4,lwd=3)
legend("bottomright",
       legend = c("cens.model"="km",
                  "cens.moedl"="rfs"),
       fill = c(2,4))

  • 「变量重要性」
importance <- subsample(rfsrc_fit)
plot(importance)

  • 「绘制部分依赖图(PDP)」
# 1. 连续变量:age对事件发生率的影响
partial_obj <- partial(rfsrc_fit,
                       partial.xvar = "age",
                       partial.type = "mort",
                       partial.values = rfsrc_fit$xvar$age,
                       partial.time = rfsrc_fit$time.interest)
pdta <- get.partial.plot.data(partial_obj)
plot(lowess(pdta$x, pdta$yhat, f = 1/3),
     type = "l", xlab = "age", ylab = "adjusted mortality")

# 2. 分类变量:grade对事件发生率的影响
grade <- quantile(rfsrc_fit$xvar$grade)
partial.obj <- partial(rfsrc_fit,
partial.type = "surv",
partial.xvar = "grade",
partial.values = grade,
partial.time = rfsrc_fit$time.interest)
pdta <- get.partial.plot.data(partial.obj)
     
## plot partial effect of gradefsky on survival
matplot(pdta$partial.time, t(pdta$yhat), type = "l", lty = 1,
        xlab = "time", ylab = "gradefsky adjusted survival")
legend("topright", 
        legend = paste0("grade = ", unique(grade)), fill = 1:3)

  • 「优化节点参数」
tune.nodesize(Surv(rfstime,status) ~ ., data)

结果展示:

> tune.nodesize(Surv(rfstime,status) ~ ., data)
nodesize =  1    error = 33.31% 
nodesize =  2    error = 32.82% 
nodesize =  3    error = 32.01% 
nodesize =  4    error = 33.09% 
nodesize =  5    error = 33.88% 
nodesize =  6    error = 33.13% 
nodesize =  7    error = 33.12% 
nodesize =  8    error = 32.78% 
nodesize =  9    error = 32.79% 
nodesize =  10    error = 31.9% 
nodesize =  15    error = 33.69% 
nodesize =  20    error = 33.31% 
nodesize =  25    error = 33.49% 
nodesize =  30    error = 34.14% 
nodesize =  35    error = 34.17% 
nodesize =  40    error = 33.66% 
nodesize =  45    error = 33.94% 
nodesize =  50    error = 33.13% 
nodesize =  55    error = 34.57% 
nodesize =  60    error = 34.56% 
nodesize =  65    error = 35.26% 
nodesize =  70    error = 35.12% 
nodesize =  75    error = 33.26% 
nodesize =  80    error = 49.99% 
nodesize =  85    error = 49.99% 
nodesize =  90    error = 49.99% 
optimal nodesize: 10 
$nsize.opt
[1] 10
$err
   nodesize       err
1         1 0.3330546
2         2 0.3282237
3         3 0.3201412
4         4 0.3309179
5         5 0.3388146
6         6 0.3312895
7         7 0.3311966
8         8 0.3277592
9         9 0.3279450
10       10 0.3190264
11       15 0.3368636
12       20 0.3330546
13       25 0.3349127
14       30 0.3414158
15       35 0.3416945
16       40 0.3365849
17       45 0.3393720
18       50 0.3313359
19       55 0.3456893
20       60 0.3455964
21       65 0.3526106
22       70 0.3512170
23       75 0.3325901
24       80 0.4999071
25       85 0.4999071
26       90 0.4999071

优化后的最佳节点数为10。

四、结论

本文的研究目的是开发一个乳腺癌风险评估模型,以提高对乳腺癌患者的早期诊断和预测能力。为了实现这一目标,我们介绍了传统风险评估方法的局限性,并引入了随机生存森林算法作为乳腺癌风险评估模型的训练算法。

乳腺癌是女性最常见的恶性肿瘤之一,早期诊断和预测对于患者的治疗和生存率至关重要。本文提出的乳腺癌风险评估模型具有潜在的价值和应用前景。

首先,该模型可以为医生和患者提供更准确的乳腺癌风险评估结果,帮助医生制定个性化的预防和治疗方案。其次,该模型可以帮助筛查高风险人群,并提供早期诊断的指导,从而提高乳腺癌的生存率。此外,该模型还可以用于辅助临床决策、优化资源分配和指导公共卫生政策。

然而,需要注意的是,乳腺癌风险评估模型仍处于研究阶段,还需要进一步的验证和改进。同时,随着技术的不断进步和数据的积累,乳腺癌风险评估模型的性能和应用前景也将进一步提升。

总之,本文的研究为乳腺癌风险评估提供了一种新的方法,并展示了随机生存森林算法在乳腺癌风险评估中的潜力。这一研究对于乳腺癌的早期诊断和预测具有重要的临床意义和实际应用价值。

*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」

目录
相关文章
|
1月前
|
人工智能 JSON 算法
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
|
7天前
|
机器学习/深度学习 数据可视化 大数据
机器学习与大数据分析的结合:智能决策的新引擎
机器学习与大数据分析的结合:智能决策的新引擎
76 15
|
12天前
|
机器学习/深度学习 数据采集 运维
机器学习在运维中的实时分析应用:新时代的智能运维
机器学习在运维中的实时分析应用:新时代的智能运维
63 12
|
15天前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
1月前
|
机器学习/深度学习 PyTorch API
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
Transformer架构自2017年被Vaswani等人提出以来,凭借其核心的注意力机制,已成为AI领域的重大突破。该机制允许模型根据任务需求灵活聚焦于输入的不同部分,极大地增强了对复杂语言和结构的理解能力。起初主要应用于自然语言处理,Transformer迅速扩展至语音识别、计算机视觉等多领域,展现出强大的跨学科应用潜力。然而,随着模型规模的增长,注意力层的高计算复杂度成为发展瓶颈。为此,本文探讨了在PyTorch生态系统中优化注意力层的各种技术,
65 6
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
|
24天前
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程实践:构建你的第一个机器学习模型
在人工智能的巨浪中,每个人都有机会成为弄潮儿。本文将带你一探究竟,从零基础开始,用最易懂的语言和步骤,教你如何构建属于自己的第一个机器学习模型。不需要复杂的数学公式,也不必担心编程难题,只需跟随我们的步伐,一起探索这个充满魔力的AI世界。
44 12
|
1月前
|
机器学习/深度学习 Python
机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况
本文介绍了机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况,而ROC曲线则通过假正率和真正率评估二分类模型性能。文章还提供了Python中的具体实现示例,展示了如何计算和使用这两种工具来评估模型。
55 8
|
1月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
36 6
|
1月前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
53 6
|
1月前
|
机器学习/深度学习 数据采集 算法
从零到一:构建高效机器学习模型的旅程####
在探索技术深度与广度的征途中,我深刻体会到技术创新既在于理论的飞跃,更在于实践的积累。本文将通过一个具体案例,分享我在构建高效机器学习模型过程中的实战经验,包括数据预处理、特征工程、模型选择与优化等关键环节,旨在为读者提供一个从零开始构建并优化机器学习模型的实用指南。 ####