机器学习shap分析案例

    在进行数据分析和机器学习时经常用到shap,本文对shap相关的操作进行演示。波士顿数据集链接在这里。

SHAP Analysis Guide

Set up

导入必要包

import pandas as pd
import numpy as np
import lightgbm as lgb
import matplotlib
import matplotlib.pyplot as plt
import shap
import seaborn as sns
import warningsplt.style.use("style.mplstyle")

Load Data

数据集原始论文
关于特征B

import pandas as pd# 读取 txt 文件
file_path = "shap/boston.txt"  # 替换为你的文件路径
with open(file_path, "r") as file:lines = file.readlines()# 初始化空列表存储数据
data = []# 按两行一组处理数据
for i in range(0, len(lines), 2):# 第一行:前 11 个数据点row1 = list(map(float, lines[i].strip().split()))# 第二行:后 3 个数据点row2 = list(map(float, lines[i + 1].strip().split()))# 将两行合并为一组完整数据(共 14 个数据点)data.append(row1 + row2)# 定义列名
columns = ["crime rate","% residential zone","% industrial zone","Charles River","NOX concentration","number of rooms","% built before 1940","remoteness","connectedness","tax rate","pupil-teacher ratio","B","% working class",'target'
]# 转换为 DataFrame
df = pd.DataFrame(data, columns=columns)# 查看数据
print(df.head())

可视化部分数据
在这里插入图片描述
删除特征B

# 删除 "B" 列
df = df.drop("B", axis=1)

练习修改数据

# 修改数据(例如将 "% working class" 列乘以 2)
df["% working class"] = df["% working class"] * 2
df['target'] = df['target'] * 1000
X = df.drop("target", axis=1).copy()
# 查看处理后的数据
print(df.head())

打印房间预测值
在这里插入图片描述
保存经过处理后的数据集

df.to_csv("shap/data.csv", index=False)

打印据相关的数值信息
在这里插入图片描述
修改字体(可选)

# 设置字体为系统支持的字体
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans', 'Liberation Sans', 'Helvetica']

数据分布可视化

fig, axs = plt.subplots(ncols=5, nrows=3, figsize=(14, 9))
gs = axs[1, 2].get_gridspec()
for ax in axs[:, -1]:ax.remove()
axbig = fig.add_subplot(gs[:, -1])
axs = axs.flatten()for col, i in zip(X.columns, [0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13]):axs[i].hist(X[col])axs[i].set_xlabel(col, size=16)axs[i].grid()axs[i].set_ylim(0, 490)d = df.copy()
d["house price"] = df["target"]
sns.boxplot(y=d["house price"], color="#d45087")
axbig.set_yticklabels(axbig.get_yticks(), rotation=45)
axbig.get_yaxis().set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ","))
)
axbig.set_xlabel("house price ($)")
axbig.set_ylabel("")
axbig.grid(axis="y")fig.subplots_adjust(hspace=0.5)
fig.text(-0.01, 0.5, "count of instances", va="center", rotation="vertical", size=20)
fig.tight_layout()
fig.show()

在这里插入图片描述

Train Model

训练一个LGBM模型

m = lgb.LGBMRegressor()
m.fit(X, y)

预测并评估模型
在这里插入图片描述

Compute SHAP Values

explainer = shap.Explainer(m)
shap_values = explainer(X)

打印数据维度,可以看出shap值的维度与原始数据的维度相同
在这里插入图片描述
在 SHAP 的回归场景下,base value 等于模型对训练集预测结果的期望
在这里插入图片描述

绘制shap分析图

下图是第一种图,蜂巢图也是summary图,信息最多。红色表示数值大,蓝色表示数值小,点的密集程度表示数据的分布。特征的重要性从上到下排序,横轴左侧表示负相关,右侧表示正相关。
在这里插入图片描述
计算分位点

i_med = np.argsort(y_pred)[len(y_pred)//2]
i_max = np.argmax(y_pred)
i_80 = np.argsort(y_pred)[int(len(y_pred)*0.8)]
i_60 = np.argsort(y_pred)[int(len(y_pred)*0.6)]
i_40 = np.argsort(y_pred)[int(len(y_pred)*0.4)]
i_20 = np.argsort(y_pred)[int(len(y_pred)*0.2)]
i_min = np.argmin(y_pred)

下面是第二种图,瀑布图,可以展示不同特征对最终预测结果具体的影响。
在这里插入图片描述
下图展示了力图,红色越长表示正向作用力越强,模型预测越偏大,反之蓝色会让模型预测偏小。
在这里插入图片描述
在这里插入图片描述
下面是条状图,横轴表示shap值绝对值的平均值,展示了每一种特征对最终结果的影响程度。
在这里插入图片描述
值得注意的是,shap相关的api也是可以进行更改的,用户可以按照自己的喜好更改api进行绘图。如下所示,可以人为的绘制出条状图,并可以将蜂巢图的输出转化成绝对值的形式。

plt.subplot(2, 1, 1)
# plt.gcf()
shap.plots.bar(shap_values.abs.max(0), max_display=99, show=False)
plt.subplot(2, 1, 2)
shap.plots.beeswarm(shap_values.abs, color="shap_red", max_display=99, show=False, plot_size=None
)
ax = plt.gca()
masv = {}
for feature in ax.get_yticklabels():name = feature.get_text()col_ind = X.columns.get_loc(name)mean_abs_sv = np.mean(np.abs(shap_values.values[:, col_ind]))masv[name] = mean_abs_sv
ax.scatter(masv.values(),[i for i in range(len(X.columns))],zorder=99,label="Mean Absolute SHAP Value",c="k",marker="|",linewidths=3,s=100,
)
ax.legend(frameon=True)
plt.tight_layout()
plt.show()

在这里插入图片描述
下图展示的是依赖图

n = 5
fig, ax = plt.subplots(1, n, figsize=(15, 3))for i, (k, v) in enumerate(sorted(masv.items(), key=lambda x: x[1], reverse=True)):if i < n:shap.plots.scatter(shap_values[:, k], ax=ax[i], show=False, alpha=0.6)ax[i].grid(axis="y")if i != 0:ax[i].set_ylabel("")ax[i].spines["left"].set_visible(False)ax[i].set_ylim(ax[0].get_ylim())ax[i].set_yticklabels(["" for _ in range(len(ax[0].get_yticks()))])else:ax[i].set_ylabel("SHAP value")
plt.show()

以前5个特征为例,可以看出每个特征和shap值之间的关系,图一图二可以看出比较明显的线性关系。图四表示距离较近时也有一定的线性关系,但是随着距离增加以后就线性无关了。
在这里插入图片描述
下面展示最后一种散点图,会自动给出对当前特征(工薪阶级)相互作用强的特征作为颜色依据。可以明显的看出,工薪阶级百分比与自身 SHAP 值呈显著负相关,并且工薪阶级占比越大,NOX的排放浓度也越大,房价也越低;反之,工薪阶级占比少,NOX浓度高,房价也高。

fig, ax = plt.subplots()
shap.plots.scatter(shap_values[:, "% working class"], color=shap_values, ax=ax)
plt.show()

在这里插入图片描述

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

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

相关文章

网络编程相关函数

1. 套接字操作相关1.1 socketint socket(int domain, int type, int protocol);参数说明int domain协议族&#xff0c;常用 AF_INET&#xff08;IPv4&#xff09;、AF_INET6&#xff08;IPv6&#xff09;int type套接字类型&#xff0c;SOCK_DGRAM&#xff08;UDP&#xff09;、…

ESLint 自定义 Processor(处理器)

ESLint 自定义 Processor&#xff08;处理器&#xff09; &#x1f539; 什么是 Processor&#xff1f; 在 ESLint 中&#xff0c;Processor&#xff08;处理器&#xff09;是一种扩展机制&#xff0c;允许处理非标准 JavaScript/TypeScript 文件。默认情况下&#xff0c;ESLin…

C++语法 | static静态|单例模式

这里写目录标题static 关键字静态局部变量 vs 局部变量静态全局变量 vs 全局变量静态成员变量 vs 成员变量静态成员函数单例模式static 关键字 在此之前, 先了解一下 static 关键字 静态局部变量 vs 局部变量 在静态局部变量中&#xff0c;变量不会在函数调用结束后销毁&…

KEDA/HPA/VPA 三件套:ABP 后台作业的事件驱动伸缩

&#x1f680; KEDA/HPA/VPA 三件套&#xff1a;ABP 后台作业的事件驱动伸缩 &#x1f4da; 目录&#x1f680; KEDA/HPA/VPA 三件套&#xff1a;ABP 后台作业的事件驱动伸缩0. TL;DR ✨1. 背景与目标 &#x1f3af;2. 架构与协作机制 &#x1f9e9;2.1 系统总览&#xff08;组…

webRTc 为何深受直播实现的青睐?

WebRTC(Web Real-Time Communication)之所以在直播场景中备受青睐,核心原因在于它天然契合了现代直播对低延迟、实时互动、跨平台兼容性的核心需求,同时大幅降低了实时音视频开发的门槛。具体来说,其优势体现在以下几个方面: 1. 超低延迟,满足实时互动需求 传统直播协…

HarmonyOS迷宫游戏鸿蒙应用开发实战:从零构建随机迷宫游戏(初版)

在鸿蒙应用开发中&#xff0c;游戏类应用能很好地锻炼 UI 布局、状态管理与逻辑交互能力。本文将以一个随机迷宫游戏为例&#xff0c;详细拆解从首页设计到迷宫生成、角色控制、通关判定的完整开发流程&#xff0c;带你掌握 ArkUI 框架的核心应用技巧。一、项目整体架构本次开发…

石头科技出海升级:全球电商业财一体化与OMS实践

石头科技作为智能清洁设备领域的独角兽&#xff0c;2023 年海外收入占比超过 60%&#xff0c;产品销往全球 60 多个国家。然而&#xff0c;智能硬件出海的复杂性&#xff0c;让企业在业财管理上面临前所未有的挑战。智能硬件业财痛点 产品生命周期管理&#xff1a;研发、生产到…

《URP管线中后处理效果的创新应用与优化实践》

硬件性能的飞速提升与玩家对画面品质的高要求形成了相互推动的态势,而渲染效果作为游戏视觉体验的核心载体,直接决定了玩家对游戏的第一印象与沉浸感。后处理效果作为URP管线的“点睛之笔”,通过在渲染流程末尾对最终图像进行二次加工,能够模拟真实世界的光学现象(如光线散…

【Java 底层】JVM 垃圾回收机制深度剖析:从对象生死判定到收集器实战

【Java 底层】JVM 垃圾回收机制深度剖析&#xff1a;从对象生死判定到收集器实战 【Java 底层】JVM 垃圾回收机制深度剖析&#xff1a;从对象生死判定到收集器实战 Java 之所以被称为 “开发效率利器”&#xff0c;很大程度上得益于其自动内存管理机制 —— 开发者无需手动分配…

网络问题排查

网络连通性测试&#xff1a;ping ip持续性监测&#xff1a;ping -t ipnetstat 可以查看网络连接状态&#xff0c;可以看到显示系统的网络连接&#xff0c;路由表&#xff0c;接口等信息。netstat -nult 回车-t:显示的是tcp的连接-u:显示udp的连接-l:只显示监听状态的端口-n:显示…

tuple/dict/list 这三个数据类型在取值时候的区别

tuple&#xff08;元组&#xff09;、dict&#xff08;字典&#xff09;、list&#xff08;列表&#xff09;在取值时的区别。 1. list&#xff08;列表&#xff09; &#x1f449; 列表就是“一串有顺序的东西”&#xff0c;像排队的人。 取值方式&#xff1a;用 下标&#xf…

深度解析大模型服务性能评测:AI Ping平台助力开发者精准选型MaaS服务

深度解析大模型服务性能评测&#xff1a;AI Ping平台助力开发者精准选型MaaS服务 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff…

OpenCV物体跟踪:从理论到实战的全面解析

​ 一、引言​ 在计算机视觉的广阔领域中&#xff0c;物体跟踪技术宛如一颗璀璨的明星&#xff0c;散发着独特的魅力与价值&#xff0c;发挥着举足轻重的作用。它致力于在连续的图像帧或视频序列里&#xff0c;精准识别并持续定位特定的目标物体&#xff0c;这一过程看似简单…

【Python】OS模块操作目录

1、概述os模块是一个Python内置的操作目录和查看系统基础信息的模块&#xff0c;可用于让我们对目录进行批量操作&#xff0c;其中包括&#xff1a;查看系统信息&#xff08;环境变量、分隔符、换行符等&#xff09;&#xff0c;对目录进行创建、删除、重命名、查看目录内容等&…

JavaScript中 i++ 与 ++i

在 JavaScript 编程中&#xff0c;i&#xff08;前置自增&#xff09;和i&#xff08;后置自增&#xff09;是两个常用但极易混淆的运算符。它们看似都能实现变量自增 1 的功能&#xff0c;但其执行时机和返回值的差异&#xff0c;常常导致开发者在实际编码中出现逻辑错误。本文…

fastapi 中间件的使用

1. 中间件基础结构from starlette.middleware.base import BaseHTTPMiddlewareclass RequestLoggerMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):# 1. 请求处理前逻辑# 2. 调用后续处理response await call_next(request)# 3. 响应…

网络白菜包子手动安装 Arch Linux

大家好&#xff01;我是大聪明-PLUS&#xff01;针对初学者的 Arch Linux 安装详细教程。我曾经花了不少时间才搞清楚安装过程。本文旨在提供一种“捷径”&#xff0c;让每个人都能轻松上手&#xff0c;无论他们是否有 Linux 使用经验。Arch 的主要特点是极其灵活的系统配置&am…

Linux学习笔记(五)--Linux基础开发工具使用

在Linux中软件包通常是指一个包含了软件程序、元数据、依赖关系信息和安装脚本的压缩文件​​。因为在Linux上如果没有软件包管理器,那么想要下载软件会非常麻烦,不仅需要自己去手动编译和安装,而且难以卸载和管理,所以软件包的出现解决了这些问题.软件包一般是由程序文件(编译…

数据结构(陈越,何钦铭) 第十讲 排序(下)

10.1 快速排序 10.1.1 算法概述10.1.2 选主元10.1.3 子集划分10.1.4 算法实现10.2 表排序 10.2.1 算法概述10.2.2 物理排序10.3 基数排序 10.3.1 桶排序10.3.2 基数排序10.3.3 多关键字的排序10.4 排序算法的比较

vue 使用print.js 打印文本,HTML元素,图片,PDF

vue 使用print.js 打印文本,HTML元素,图片,PDF 安装 npm install print-js --save示例 <template><div class"print-example"><h2>Print.js 打印示例</h2><!-- 打印区域 --><div id"printableArea" class"printable…