機器學習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
英文地址,請注明出處:http://en.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…