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_split

import shap

1.创建 XGBoost 数据对象

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

X, y = shap.datasets.nhanesi()
X_display, y_display = shap.datasets.nhanesi(
    display=True
)  # human readable feature values

xgb_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 = 0
    matches = 0
    for i in range(len(labels)):
        for j in range(len(labels)):
            if labels[j] > 0 and abs(labels[i]) > labels[j]:
                total += 1
                if pred[j] > pred[i]:
                    matches += 1
    return 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()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制作一个RISC-V的操作系统一-计算机系统漫游

文章目录 计算机的硬件组成两种架构程序的存储与执行程序语言的设计和进化一个mini计算机 编程语言的进化存储设备的层次结构操作系统 计算机的硬件组成 所有硬件由总线连接起来 两种架构 总线个数不同,Memory储存内容不同 程序的存储与执行 首先编译和链接某…

第九节HarmonyOS 常用基础组件2-Image

一、组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类:基础组件…

确保软件安全性:在软件开发中的关键挑战与最佳实践

目录 引言 安全意识的重要性 软件安全性的挑战 漏洞和脆弱性 数据泄露 拒绝服务攻击 社会工程学攻击 软件安全性的最佳实践 安全的编程实践 安全审查与测试 数据加密和访问控制 网络安全措施 员工培训与安全意识 安全开发生命周期 结论 引言 在当今数字化时代&a…

《React 知识点》第一篇 大括号使用{}

简介 大括号 " {} "可以用于包裹JavaScript的表达式或语句。以便在jsx中动态生成内容。 插入变量与表达式 function expressionTest() {const name "变量测试";return (<p><div>{name}</div><div>表达式 210 {2 100}</div…

Java---接口讲解

文章目录 1. 接口概述2. 接口特点3. 接口成员特点4. 小案例应用5. 类和接口的关系6. 抽象类和接口区别 1. 接口概述 1. 接口是一种公共的规范标准&#xff0c;只要符合规范标准&#xff0c;大家都可以通用。Java中的接口更多的是体现在对行为的抽象。 2. 参考生活中的接口可以理…

【并发编程】什么是死锁?死锁如何解决?线上发生死锁应该怎么办?

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

前端打包添加前缀

vue2添加前缀 router的base加上前缀 export default new Router({mode: history, // 去掉url中的#base: privateDeployUrl, // 这里加上前缀scrollBehavior: () > ({y: 0}),routes: constantRoutes })vue.config.js&#xff0c;publicPath属性加上前缀 publicPath: proces…

大数据Doris(三十二):Doris高级功能

文章目录 Doris高级功能 一、​​​​​​​表结构变更

口罩标准讲解及推荐

一、我国医用口罩质量标准 1、YY/T0969-2013《一次性使用医用口罩》 2、YY0469-2011《医用外科口罩》 3、GB19083-2010《医用防护口罩技术要求》三类医用口罩各项指标对比如下&#xff1a; 结论&#xff1a;防护效果来说&#xff1a;医用防护口罩>医用外科口罩>一次性…

DouyinAPI接口系列丨Douyin商品详情数据接口丨Douyin视频详情数据接口

抖音商品详情API是抖音开放平台提供的一套API接口&#xff0c;用于获取商品详情信息。通过该API&#xff0c;开发者可以获取到商品的详细信息&#xff0c;包括商品ID、名称、描述、价格、销量、评价等信息。 在使用抖音商品详情API之前&#xff0c;需要先注册并登录抖音开放平…

智能优化算法应用:基于模拟退火算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于模拟退火算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于模拟退火算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.模拟退火算法4.实验参数设定5.算法结果6.参考…

博文小调研

感谢信 很高兴认识各位盆友&#xff0c;天南地北一家人&#xff01; 无论身在行业差异&#xff0c;所处职位高低&#xff0c;工作年限长短&#xff0c;这个平台都为爱好学习的人们提供了很好的机会和进步的源动力。 博主今年自11月份开启了新的系列文章&#xff0c;每周发表6…

分享88个节日PPT,总有一款适合您

分享88个节日PPT&#xff0c;总有一款适合您 88个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1mfLrdlB9Y1jqz2vkVIwBNA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

充电桩自检流程

1、常规自检流程介绍 充电桩自检流程通常包括以下几个方面&#xff1a; 外观检查&#xff1a;检查充电桩外观是否完好&#xff0c;无损坏、严重污染等问题。连接检查&#xff1a;检查充电桩与电源的连接是否牢固&#xff0c;线缆是否完整无损。安全性检查&#xff1a;检查充电…

Python教程:ast.literal_eval()的示例用法

ast.literal_eval() 是一个 Python 的内置函数&#xff0c;它用于解析并执行一个包含 Python 文字字面值的抽象语法树&#xff08;AST&#xff09;。这个函数非常有用&#xff0c;因为它可以用来处理那些不包含任何可执行代码的字符串&#xff0c;但需要以一种安全的方式进行。…

神经网络 模型表示2

神经网络 模型表示2 使用向量化的方法会使得计算更为简便。以上面的神经网络为例&#xff0c;试着计算第二层的值&#xff1a; 我们令 z ( 2 ) θ ( 1 ) x {{z}^{\left( 2 \right)}}{{\theta }^{\left( 1 \right)}}x z(2)θ(1)x&#xff0c;则 a ( 2 ) g ( z ( 2 ) ) {{a}…

腾讯云服务器上安装nginx部署前端

1.宝塔面板 安装nginx 2.配置nginx

说一说Java中的JUC

JUC 1.什么是JUC 2.进程和线程 进程 : cpu资源分配的最小单位 线程 : cpu调度和执行的最小单位 并发是指多个任务在同一个时间段内交替执行&#xff0c;通过时间片轮转等方式实现任务间的切换。换句话说&#xff0c;并发是指多个任务能够同时存在&#xff0c;但不一定同时…

SpringBoot-Vue项目初始搭建

SpringBoot-Vue项目初始搭建 1、项目搭建 前提&#xff1a;配置过nodejs环境&#xff0c;安装了vuecli&#xff08;如果未配置&#xff0c;可以参照此教程&#xff1a;https://www.bilibili.com/video/BV18E411a7mC/ p12&#xff09; 新建文件夹(最好不要有中文) 打开cmd …

Azure Machine Learning - 在 Azure 门户中创建AI搜索技能组

你将了解 Azure AI 搜索中的技能组如何通过添加光学字符识别 (OCR)、图像分析、语言检测、文本翻译和实体识别&#xff0c;在搜索索引中创建可搜索文本的内容。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff…