SHAP(四):NHANES I 生存模型

SHAP(四):NHANES I 生存模型

这是一个 Cox 比例风险模型,基于来自 NHANES I 的数据以及来自 NHANES I 流行病学随访研究。 它旨在说明 SHAP 值如何能够以传统上仅由线性模型提供的清晰度解释 XGBoost 模型。 我们在数据中看到有趣的非线性模式,这表明了这种方法的潜力。 请记住,我们尚未对数据进行检查以校准当前的实验室测试,因此您不应将结果视为可操作的医学见解,而应将其视为概念证明。

请注意,对 Cox 损失和 SHAP 交互效果的支持最近才合并,因此您需要最新的 XGBoost 主版本才能运行此笔记本。

import matplotlib.pylab as pl
import xgboost
from sklearn.model_selection import train_test_splitimport shap

1.创建 XGBoost 数据对象

这使用了 SHAP 数据集模块中可用的 NHANES I 数据的预处理子集。

X, y = shap.datasets.nhanesi()
X_display, y_display = shap.datasets.nhanesi(display=True
)  # human readable feature valuesxgb_full = xgboost.DMatrix(X, label=y)# create a train/test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
xgb_train = xgboost.DMatrix(X_train, label=y_train)
xgb_test = xgboost.DMatrix(X_test, label=y_test)

2.训练 XGBoost 模型

# use validation set to choose # of trees
params = {"eta": 0.002, "max_depth": 3, "objective": "survival:cox", "subsample": 0.5}
model_train = xgboost.train(params, xgb_train, 10000, evals=[(xgb_test, "test")], verbose_eval=1000
)
[0]	test-cox-nloglik:7.26952
[1000]	test-cox-nloglik:6.55767
[2000]	test-cox-nloglik:6.48836
[3000]	test-cox-nloglik:6.47129
[4000]	test-cox-nloglik:6.46786
[5000]	test-cox-nloglik:6.46583
[6000]	test-cox-nloglik:6.46623
[7000]	test-cox-nloglik:6.46841
[8000]	test-cox-nloglik:6.46972
[9000]	test-cox-nloglik:6.47175
[9999]	test-cox-nloglik:6.47396
# train final model on the full data set
params = {"eta": 0.002, "max_depth": 3, "objective": "survival:cox", "subsample": 0.5}
model = xgboost.train(params, xgb_full, 5000, evals=[(xgb_full, "test")], verbose_eval=1000
)
[0]	test-cox-nloglik:8.88073
[1000]	test-cox-nloglik:8.17142
[2000]	test-cox-nloglik:8.08556
[3000]	test-cox-nloglik:8.04853
[4000]	test-cox-nloglik:8.0248
[4999]	test-cox-nloglik:8.00511

3.检查性能

C 统计量衡量我们如何根据人们的生存时间对他们进行排序(1.0 是完美排序)。

def c_statistic_harrell(pred, labels):total = 0matches = 0for i in range(len(labels)):for j in range(len(labels)):if labels[j] > 0 and abs(labels[i]) > labels[j]:total += 1if pred[j] > pred[i]:matches += 1return matches / total# see how well we can order people by survival
c_statistic_harrell(model_train.predict(xgb_test, ntree_limit=5000), y_test)
0.835090082176807

4.解释模型对整个数据集的预测

shap_values = shap.TreeExplainer(model).shap_values(X)

4.1 SHAP 摘要图

XGBoost 的 SHAP 值解释了模型的边际输出,即 Cox 比例风险模型的死亡对数几率的变化。 我们可以从下面看到,根据模型,死亡的主要危险因素是年老。 死亡风险的下一个最有力的指标是男性。

该摘要图取代了特征重要性的典型条形图。 它告诉我们哪些特征是最重要的,以及它们对数据集的影响范围。 颜色使我们能够匹配特征值的变化如何影响风险的变化(例如高白细胞计数导致高死亡风险)。

shap.summary_plot(shap_values, X)

在这里插入图片描述

4.2 SHAP 相关图

SHAP 摘要图给出了每个特征的总体概述,而 SHAP 依赖图显示了模型输出如何随特征值变化。 请注意,每个点都是一个人,单个特征值的垂直分散是由模型中的交互效应产生的。 自动选择用于着色的功能来突出显示可能驱动这些交互的因素。 稍后我们将了解如何使用 SHAP 交互值检查模型中是否确实存在交互。 请注意,SHAP 汇总图的行是将 SHAP 相关图的点投影到 y 轴上,然后由特征本身重新着色得到的。

下面我们给出了每个 NHANES I 特征的 SHAP 依赖图,揭示了有趣但预期的趋势。 请记住,其中一些值的校准可能与现代实验室测试不同,因此得出结论时要小心。

# we pass "Age" instead of an index because dependence_plot() will find it in X's column names for us
# Systolic BP was automatically chosen for coloring based on a potential interaction to check that
# the interaction is really in the model see SHAP interaction values below
shap.dependence_plot("Age", shap_values, X)

在这里插入图片描述

# we pass display_features so we get text display values for sex
shap.dependence_plot("Sex", shap_values, X, display_features=X_display)

在这里插入图片描述

# setting show=False allows us to continue customizing the matplotlib plot before displaying it
shap.dependence_plot("Systolic BP", shap_values, X, show=False)
pl.xlim(80, 225)
pl.show()

在这里插入图片描述

shap.dependence_plot("Poverty index", shap_values, X)

在这里插入图片描述

shap.dependence_plot("White blood cells", shap_values, X, display_features=X_display, show=False
)
pl.xlim(2, 15)
pl.show()

在这里插入图片描述

shap.dependence_plot("BMI", shap_values, X, display_features=X_display, show=False)
pl.xlim(15, 50)
pl.show()

在这里插入图片描述

shap.dependence_plot("Serum magnesium", shap_values, X, show=False)
pl.xlim(1.2, 2.2)
pl.show()

在这里插入图片描述

shap.dependence_plot("Sedimentation rate", shap_values, X)

在这里插入图片描述

shap.dependence_plot("Serum protein", shap_values, X)

在这里插入图片描述

shap.dependence_plot("Serum cholesterol", shap_values, X, show=False)
pl.xlim(100, 400)
pl.show()

请添加图片描述

shap.dependence_plot("Pulse pressure", shap_values, X)

在这里插入图片描述

shap.dependence_plot("Serum iron", shap_values, X, display_features=X_display)

在这里插入图片描述

shap.dependence_plot("TS", shap_values, X)

在这里插入图片描述

shap.dependence_plot("Red blood cells", shap_values, X)

在这里插入图片描述

5.计算 SHAP 交互值

有关更多详细信息,请参阅 Tree SHAP 论文,但简单地说,SHAP 交互值是 SHAP 值对更高阶交互的推广。 最新版本的 XGBoost 中使用 pred_interactions 标志实现了成对交互的快速精确计算。 使用此标志,XGBoost 为每个预测返回一个矩阵,其中主效应位于对角线上,交互效应位于非对角线上。 主效应类似于线性模型获得的 SHAP 值,交互效应捕获所有高阶交互,并将它们划分为成对交互项。 请注意,整个交互矩阵的总和是模型当前输出与预期输出之间的差,因此非对角线上的交互效应被分成两半(因为每个都有两个)。 绘制交互效果时,SHAP 包会自动将非对角线值乘以 2,以获得完整的交互效果。

# takes a couple minutes since SHAP interaction values take a factor of 2 * # features
# more time than SHAP values to compute, since this is just an example we only explain
# the first 2,000 people in order to run quicker
shap_interaction_values = shap.TreeExplainer(model).shap_interaction_values(X.iloc[:2000, :]
)

5.1 SHAP 交互值汇总图

SHAP 交互值矩阵的汇总图绘制了汇总图矩阵,其中对角线上有主效应,对角线外有交互效应。

shap.summary_plot(shap_interaction_values, X.iloc[:2000, :])

在这里插入图片描述

5.2 SHAP 交互值依赖图

对 SHAP 交互值 a 运行依赖图可以让我们分别观察主效应和交互效应。

下面我们绘制了年龄的主要影响以及年龄的一些交互影响。 将年龄的主效应图与早期的年龄 SHAP 值图进行比较可以提供丰富的信息。 主效应图没有垂直分散,因为相互作用效应全部以非对角线项捕获。

shap.dependence_plot(("Age", "Age"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

现在我们绘制涉及年龄的交互效应。 这些效应捕获了原始 SHAP 图中存在但上面的主效应图中缺失的所有垂直色散。 下图涉及年龄和性别,显示基于性别的死亡风险差距因年龄而异,并在 60 岁时达到峰值。

shap.dependence_plot(("Age", "Sex"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Age", "Systolic BP"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Age", "White blood cells"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Age", "Poverty index"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Age", "BMI"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Age", "Serum magnesium"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

Now we show a couple examples with systolic blood pressure.

shap.dependence_plot(("Systolic BP", "Systolic BP"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Systolic BP", "Age"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

shap.dependence_plot(("Systolic BP", "Age"),shap_interaction_values,X.iloc[:2000, :],display_features=X_display.iloc[:2000, :],
)

在这里插入图片描述

import matplotlib.pylab as pl
import numpy as np
tmp = np.abs(shap_interaction_values).sum(0)
for i in range(tmp.shape[0]):tmp[i, i] = 0
inds = np.argsort(-tmp.sum(0))[:50]
tmp2 = tmp[inds, :][:, inds]
pl.figure(figsize=(12, 12))
pl.imshow(tmp2)
pl.yticks(range(tmp2.shape[0]), X.columns[inds], rotation=50.4, horizontalalignment="right"
)
pl.xticks(range(tmp2.shape[0]), X.columns[inds], rotation=50.4, horizontalalignment="left"
)
pl.gca().xaxis.tick_top()
pl.show()

在这里插入图片描述

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

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

相关文章

Spring---Bean的作用域和生命周期

文章目录 Bean的作用域Bean的六种作用域设置Bean的作用域 Bean的生命周期Bean(Spring)的执行流程Bean的生命周期 Bean的作用域 我们通过一个例子来认识 Bean 的作用域: 假设现在有一个公共的 Bean 对象提供给用户A和用户B使用,然…

第9课 任务创建、删除和API函数

第9课 任务创建、删除和API函数 任务创建和删除本质是调用FreeRTOS的API函数 API函数描述xTaskCreate()动态方式创建任务xTaskCreateStatic()静态方式创建任务xTaskDelete()删除任务 动态创建任务: 任务的任务控制块以及任务的栈空间所需的内存,均由…

JOSEF约瑟时间继电器ARTD-DC110V-2H2D 0.25-2.5s导轨安装

ARTD系列断电延时继电器: ARTD-220VDC-1H1D断电延时继电器;ARTD-220VDC-2H断电延时继电器; ARTD-220VDC-2H2D断电延时继电器;ARTD-220VDC-4H断电延时继电器; ARTD-110VDC-1H1D断电延时继电器;ARTD-110VD…

SSM框架(四):SSM整合 案例 + 异常处理器 +拦截器

文章目录 一、整合流程图1.1 Spring整合Mybatis1.2 Spring整合SpringMVC 二、表现层数据封装2.1 问题引出2.2 统一返回结果数据格式 代码设计 三、异常处理器3.1 概述3.2 异常处理方案 四、前端五、拦截器5.1 概念5.2 入门案例5.3 拦截器参数5.4 拦截器链 一、整合流程图 1.1 S…

本科毕业生个人简历23篇

刚毕业的本科生如何制作一份令招聘方印象深刻的简历?可以参考以下这23篇精选的本科毕业生应聘简历案例!无论您的专业是什么,都能从中汲取灵感,提升简历质量,轻松斩获心仪职位!小伙伴们快来看看吧&#xff0…

代理模式简单demo(java)

1、背景 mybatis中使用了大量的代理模式,如果了解了代理的使用,可能会对阅读mybatis源码有事半功倍的效果。所以在空闲的时候整理了下java常见的代理和使用demo。 2、关键点介绍 代理模式本质上的目的是为了增强现有代码的功能,其分为静态…

在qt5中使用XShapeCombineRectangles编译报错

linux x11环境中&#xff0c;在qt5中使用XShapeCombineRectangles去实现鼠标穿透 引用了两个头文件&#xff1a; #include <QX11Info> #include <X11/extensions/shape.h>编译的时候会报错&#xff1a; Desktop_Qt_5_12_12_GCC_64bit-Debug/moc_mainwindow.cpp:8…

等保之道:从基础出发,解密网站防护的重要性

随着数字化时代的推进&#xff0c;网站安全问题日益凸显。网站被攻击不仅会导致信息泄漏、服务中断&#xff0c;还可能损害用户信任和企业声誉。为了更好地解决这一问题&#xff0c;我们需从等保的角度审视网站防护&#xff0c;全面提升网络安全水平。 等保背景 等保&#xff0…

C++作业4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 代码&#xff1a; #include <iostream>using namespace std;class Stu {friend const Stu operator*(const Stu &L,const Stu &R);friend bool operator<(const Stu …

抓取检测(Grasp Dection)

抓取检测 抓取检测被定义为能够识别任何给定图像中物体的抓取点或抓取姿势。抓取策略应确保对新物体的稳定性、任务兼容性和适应性&#xff0c;抓取质量可通过物体上接触点的位置和手的配置来测量。为了掌握一个新的对象&#xff0c;完成以下任务&#xff0c;有分析方法和经验…

智慧工地一体化解决方案(里程碑管理)源码

智慧工地为管理人员提供及时、高效、优质的远程管理服务&#xff0c;提升安全管理水平&#xff0c;确保施工安全提高施工质量。实现对人、机、料、法、环的全方位实时监控&#xff0c;变被动“监督”为主动“监控”。 一、建设背景 施工现场有数量多、分布广&#xff0c;总部统…

Woocommerce Private Store私人商店秘密商城插件,适合批发商店,会员制俱乐部

点击访问原文Woocommerce Private Store私人商店秘密商城插件&#xff0c;适合批发商店&#xff0c;会员制俱乐部 - 易服客工作室 WooCommerce Private Store插件是使 WooCommerce 私有的简单方法。密码保护您的整个 WooCommerce 商店并使其隐藏。 非常适合批发商店、会员制俱…

vue 根据动态生成的form表单的整体的数据回显,赋值及校验和提交

主要负责处理表单数据的展示、编辑和提交&#xff0c;以及与后端接口的交互。&#xff08;处理选择地址、处理单选框选中、设置表单验证、提交表单、校验文件是否上传完成、处理上传文件等&#xff09; 公共调用方法mixins文件 import HCommonPop from "/components/comm…

面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题

面试系列&#xff1a; 面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 文章目录 一、前言二、常见65道非技术面试问题…

九、FreeRTOS之FreeRTOS列表和列表项

本节需要掌握以下内容&#xff1a; 1&#xff0c;列表和列表项的简介&#xff08;熟悉&#xff09; 2&#xff0c;列表相关API函数介绍&#xff08;掌握&#xff09; 3&#xff0c;列表项的插入和删除实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌…

微前端qiankun示例 Umi3.5

主应用配置&#xff08;基座&#xff09; 安装包 npm i umijs/plugin-qiankun -D 配置 qiankun 开启 {"private": true,"scripts": {"start": "umi dev","build": "umi build","postinstall": "…

L1-012:计算指数

⭐题目描述⭐ 真的没骗你&#xff0c;这道才是简单题 —— 对任意给定的不超过 10 的正整数 n&#xff0c;要求你输出 2n。不难吧&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过 10 的正整数 n。 输出格式&#xff1a; 在一行中按照格式 2^n 计算结果 输出 2n…

Nacos多数据源插件

Nacos从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 注意:…

Doccker常用的命令

第一部分&#xff1a;基本Docker命令 docker --version //- 查看Docker版本 docker info //- 查看Docker系统信息 docker help //- 获取Docker命令帮助 docker pull //- 拉取Docker镜像 docker push //- 推送Docker镜像 docker run //- 运行Docker容器 docker ps //- 查看运行中…

c++ day 4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载:分别是-&#xff0c;-&#xff0c;<。 #include <iostream>using namespace std; class Stu {friend const Stu operator-(const Stu &L,const Stu &R);friend bool o…