当前位置: 首页 > news >正文

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

一、 引言

乳腺癌是女性最常见的恶性肿瘤之一,也是全球范围内女性死亡率最高的癌症之一。据统计,每年全球有超过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。

四、结论

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

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

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

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

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

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

相关文章:

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

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

MySQL学习笔记1: 数据库的简单介绍

目录 1. 数据库是什么2. 数据库这一类软件中的一些典型代表2.1. Oracle2.2. MySQL2.3. SQL Server2.4. SQLite (lite 轻量版) 3. 数据库的类型3.1. 关系型数据库3.2. 非关系型数据库 4. 总结 1. 数据库是什么 数据库是一类软件&#xff0c;这一类软件可以用来管理数据&#xf…...

【Docker】安装ELK(Docker Compose)

一、创建挂载目录 mkdir -p /docker/elk/elasticsearch/{plugins,data} mkdir -p /docker/elk/logstash 二、给目录授权 chmod 777 /docker/elk/elasticsearch/data 创建logstash配置文件 vim /docker/elk/logstash/logstash.conf input {tcp {mode => "server" h…...

【机器学习:欧氏距离 】机器学习中欧氏距离的理解和应用

【机器学习&#xff1a;欧氏距离 】机器学习中欧氏距离的理解和应用 距离公式二维更高的维度点以外的物体属性欧几里得距离的平方概括历史 在数学中&#xff0c;欧氏距离’是指欧氏空间中任意两点之间的直线距离。这种距离可以通过应用勾股定理来计算&#xff0c;利用两点的笛卡…...

系统安全及应用

1、基本安全措施 1.1、系统账号清理 在Linux系统中&#xff0c;除了用户手动创建的各种账号之外&#xff0c;还包括随系统或程序安装过程而生产的其他大量账号。除了超级用户root之外&#xff0c;其他大量账号只是用来维护系统运作、启动或保持服务进程&#xff0c;一般是不允…...

Danil Pristupov Fork(强大而易用的Git客户端) for Mac/Windows

在当今软件开发领域&#xff0c;团队协作和版本控制是非常重要的方面。在这个过程中&#xff0c;Git成为了最受欢迎的版本控制工具之一。然而&#xff0c;对于Git的使用&#xff0c;一个好的客户端是至关重要的。 今天&#xff0c;我们要为大家介绍一款强大而易用的Git客户端—…...

最新GPT4.0使用教程,AI绘画,ChatFile文档对话总结+GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…...

【ARM 嵌入式 编译系列 7.2 -- GCC 链接脚本中 DEFINED 函数与 “AT>“ 符号详细介绍】

文章目录 GCC 链接脚本中 DEFINED 函数DEFINED() 函数> (放置在哪个区域)AT> (加载地址) (填充字节) 在链接脚本中&#xff0c;组合示例 GCC 链接脚本中 DEFINED 函数 在 ARM GCC 链接脚本&#xff08;.ld 文件&#xff09;中&#xff0c;DEFINED() 是一种内置函数&…...

Linux基础——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …...

国科大图像处理2024速通期末——汇总2017-2019、2023回忆

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2&#xff0c;这将使得显示系统产生比希望的效果更暗的图像&#xff0c;此时伽马校正通常在信号进入显示器前被进行预处理&#xff0c;令p…...

编程笔记 html5cssjs 026 HTML输入类型(2/2)

编程笔记 html5&css&js 026 HTML输入类型&#xff08;2/2&#xff09; 输入类型&#xff1a;date输入类型&#xff1a;color输入类型&#xff1a;range输入类型&#xff1a;month输入类型&#xff1a;week输入类型&#xff1a;time输入类型&#xff1a;datetime输入类型…...

Vue2 - 数据响应式原理

目录 1&#xff0c;总览2&#xff0c;Observer3&#xff0c;Dep4&#xff0c;Watcher5&#xff0c;Schedule 1&#xff0c;总览 vue2官网参考 简单介绍下上图流程&#xff1a;以 Data 为中心来说&#xff0c; Vue 会将传递给 Vue 实例的 data 选项&#xff08;普通 js 对象&a…...

基于华为云解析服务实现网站区域封禁

前言 中国大陆以外的网络攻击不断&#xff0c;个人博客时常遭受不明个人或组织的攻击&#xff0c;给网站的安全运行带来了巨大的风险&#xff0c;同时DDoS、CC攻击等还会消耗服务器的资源&#xff0c;站长可能需要因此支付高昂的服务器、CDN的流量费用。 因此&#xff0c;如果…...

在 Docker 中配置 MySQL 数据库并初始化 Project 项目

1. 文件准备 1.1. 添加 SQL 文件头部内容 每个 SQL 文件的头部需要添加以下内容&#xff1a; DROP DATABASE IF EXISTS xx_..; CREATE DATABASE xx_..; USE xx_..;1.2. 修改 AUTO_INCREMENT 在每个 SQL 文件中&#xff0c;将 AUTO_INCREMENT 修改为 1。 1.3. 插入机型 在 SQL…...

生活中的物理3——神奇陷阱(随机倒下的抽屉柜门)

1实验 材料&#xff1a;大自然&#xff08;风&#xff09;、抽屉门松掉的抽屉 实验 1、找一个大风的日子&#xff0c;打开窗户&#xff08;不要找下雨天&#xff0c;不然你会被你亲爱的嫲嫲KO&#xff09; 2、让风在抽屉面前刮过 3、你发现了什么&#xff1f;&#xff1f;&…...

数模学习day08-拟合算法

这里拟合算法可以和差值算法对比 引入 插值和拟合的区别 与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟 合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所 有的数据点最为接近&#xff0c;即曲线拟…...

第13课 利用openCV检测物体是否运动了

FFmpeg与openCV绝对是绝配。前面我们已经基本熟悉了FFmpeg的工作流程&#xff0c;这一章我们重点来看看openCV。 在前面&#xff0c;我们已经使用openCV打开过摄像头并在MFC中显示图像&#xff0c;但openCV能做的要远超你的想像&#xff0c;比如可以用它来实现人脸检测、车牌识…...

C#之反编译之路(一)

本文将介绍微软反编译神器dnSpy的使用方法 c#反编译之路(一) dnSpy.exe区分64位和32位,所以32位的程序,就用32位的反编译工具打开,64位的程序,就用64位的反编译工具打开(个人觉得32位的程序偏多,如果不知道是32位还是64位,就先用32位的打开试试) 目前只接触到wpf和winform的桌…...

使用CentOS 7.6搭建HTTP隧道代理服务器

在现代网络环境中&#xff0c;HTTP隧道代理服务器因其灵活性和安全性而受到广泛关注。CentOS 7.6&#xff0c;作为一个稳定且功能强大的Linux发行版&#xff0c;为搭建此类服务器提供了坚实的基础。 首先&#xff0c;我们需要明确HTTP隧道代理的基本原理。HTTP隧道代理允许客户…...

Swift爬虫使用代理IP采集唯品会商品详情

目录 一、准备工作 二、代理IP的选择与使用 三、使用Swift编写唯品会商品爬虫 四、数据解析与处理 五、注意事项与优化建议 六、总结 一、准备工作 在开始编写爬虫之前&#xff0c;需要准备一些工具和库&#xff0c;以确保数据抓取的顺利进行。以下是所需的工具和库&…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...