Python Day 22 學習

學習講義Day14安排的內容:SHAP圖的繪制

SHAP模型的基本概念

參考學習的帖子:SHAP 可視化解釋機器學習模型簡介_shap圖-CSDN博客

以下為學習該篇帖子的理解記錄:

Q. 什么是SHAP模型?它與機器學習模型的區別在哪兒?

機器學習模型仿若一個黑盒子,我們只能看到輸入和輸出,但至于“輸入到輸出之間發生了什么”我們是不知道的。這里讓我聯想到語言學家喬姆斯基在語言習得中提到的Black Box,可以與之關聯理解。SHAP模型就可以讓我們清楚地看到從輸入到輸出之間到底發生了什么(已知條件對最終預測結果起到了哪些影響,是正向還是負向)。

Q. SHAP的工作原理是什么?

帖子中寫到“SHAP是一種模型事后解釋的方法”。這里的“模型事后解釋”指的是SHAP是在模型訓練后,通過分析模型的行為來解釋其預測的結果。比如:為什么模型會預測某個客戶會違約?哪些特征對這個預測起了關鍵作用?

SHAP模型的工作原理就是計算特征對模型輸出的邊際貢獻。

? ? ? ? ? Q. 什么是“邊際貢獻”?

SHAP模型從全局和局部對“黑盒模型”進行解釋,并構建了一個“加性的解釋模型”。所有的特征都被視為“貢獻者”(這樣的話,我們就可以量化每個特征的作用。SHAP方法也確保了特征貢獻的分配是公平的,即每個特征的貢獻值是基于所有可能特征組合的平均邊際貢獻計算的)。

? ? ? ? ?Q. 如何理解“全局和局部”?什么是“加性的解釋模型”?

Q. SHAP可以解決哪些實際的問題?

模型調試,指導特征工程,指導數據采集,指導做決策,以及建立模型與人之間的信任。

Q. 為什么會生成shap_values數組?

截圖自講義文件

代碼實現

首先還是運行預處理好的代碼

# 先運行之前預處理好的代碼
import pandas as pd
import pandas as pd    #用于數據處理和分析,可處理表格數據。
import numpy as np     #用于數值計算,提供了高效的數組操作。
import matplotlib.pyplot as plt    #用于繪制各種類型的圖表
import seaborn as sns   #基于matplotlib的高級繪圖庫,能繪制更美觀的統計圖形。
import warnings
warnings.filterwarnings("ignore")# 設置中文字體(解決中文顯示問題)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系統常用黑體字體
plt.rcParams['axes.unicode_minus'] = False    # 正常顯示負號
data = pd.read_csv('data.csv')    #讀取數據# 先篩選字符串變量 
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
# Home Ownership 標簽編碼
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# Years in current job 標簽編碼
years_in_job_mapping = {'< 1 year': 1,'1 year': 2,'2 years': 3,'3 years': 4,'4 years': 5,'5 years': 6,'6 years': 7,'7 years': 8,'8 years': 9,'9 years': 10,'10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# Purpose 獨熱編碼,記得需要將bool類型轉換為數值
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv") # 重新讀取數據,用來做列名對比
list_final = [] # 新建一個空列表,用于存放獨熱編碼后新增的特征名
for i in data.columns:if i not in data2.columns:list_final.append(i) # 這里打印出來的就是獨熱編碼后的特征名
for i in list_final:data[i] = data[i].astype(int) # 這里的i就是獨熱編碼后的特征名# Term 0 - 1 映射
term_mapping = {'Short Term': 0,'Long Term': 1
}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True) # 重命名列
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()  #把篩選出來的列名轉換成列表# 連續特征用中位數補全
for feature in continuous_features:     mode_value = data[feature].mode()[0]            #獲取該列的眾數。data[feature].fillna(mode_value, inplace=True)          #用眾數填充該列的缺失值,inplace=True表示直接在原數據上修改。# 最開始也說了 很多調參函數自帶交叉驗證,甚至是必選的參數,你如果想要不交叉反而實現起來會麻煩很多
# 所以這里我們還是只劃分一次數據集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1)  # 特征,axis=1表示按列刪除
y = data['Credit Default'] # 標簽
# 按照8:2劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%訓練集,20%測試集

基準模型

from sklearn.ensemble import RandomForestClassifier #隨機森林分類器from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于評估分類器性能的指標
from sklearn.metrics import classification_report, confusion_matrix #用于生成分類報告和混淆矩陣
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
# --- 1. 默認參數的隨機森林 ---
# 評估基準模型,這里確實不需要驗證集
print("--- 1. 默認參數隨機森林 (訓練集 -> 測試集) ---")
import time # 這里介紹一個新的庫,time庫,主要用于時間相關的操作,因為調參需要很長時間,記錄下會幫助后人知道大概的時長
start_time = time.time() # 記錄開始時間
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train) # 在訓練集上訓練
rf_pred = rf_model.predict(X_test) # 在測試集上預測
end_time = time.time() # 記錄結束時間print(f"訓練與預測耗時: {end_time - start_time:.4f} 秒")
print("\n默認隨機森林 在測試集上的分類報告:")
print(classification_report(y_test, rf_pred))
print("默認隨機森林 在測試集上的混淆矩陣:")
print(confusion_matrix(y_test, rf_pred))

SHAP模型的代碼實現

import shap
import matplotlib.pyplot as plt# 初始化 SHAP 解釋器
explainer = shap.TreeExplainer(rf_model)# 計算 SHAP 值(基于測試集),這個shap_values是一個numpy數組,表示每個特征對每個樣本的貢獻值
shap_values = explainer.shap_values(X_test) 
shap_values # 每一行代表一個樣本,每一列代表一個特征,值表示該特征對該樣本的預測結果的影響程度。正值表示該特征對預測結果有正向影響,負值表示負向影響。

輸出:

array([[[ 9.07465700e-03, -9.07465700e-03],[ 7.21456498e-03, -7.21456498e-03],[ 4.55189444e-02, -4.55189444e-02],...,[ 7.12857198e-05, -7.12857198e-05],[ 4.67733508e-05, -4.67733508e-05],[ 1.61298135e-04, -1.61298135e-04]],[[-1.02606871e-02,  1.02606871e-02],[ 1.85572634e-02, -1.85572634e-02],[-1.64992848e-02,  1.64992848e-02],...,[ 2.00070852e-04, -2.00070852e-04],[ 5.11798841e-05, -5.11798841e-05],[ 1.02827796e-04, -1.02827796e-04]],[[ 3.21529115e-03, -3.21529115e-03],[ 1.28184070e-02, -1.28184070e-02],[ 1.02124914e-01, -1.02124914e-01],...,[ 1.73012306e-04, -1.73012306e-04],[ 4.74133256e-05, -4.74133256e-05],[ 1.26753231e-04, -1.26753231e-04]],...,[[ 1.15222741e-03, -1.15222741e-03],[-1.71843266e-02,  1.71843266e-02],[-3.04994337e-02,  3.04994337e-02],...,[ 1.44859329e-04, -1.44859329e-04],[ 1.80111014e-05, -1.80111014e-05],[ 1.30107512e-04, -1.30107512e-04]],[[ 1.29249120e-03, -1.29249120e-03],[ 5.66948438e-03, -5.66948438e-03],[ 2.49050264e-02, -2.49050264e-02],...,[ 2.50590715e-06, -2.50590715e-06],[ 4.68839113e-05, -4.68839113e-05],[ 1.15002997e-05, -1.15002997e-05]],[[-1.12640555e-03,  1.12640555e-03],[ 1.42648293e-02, -1.42648293e-02],[ 4.74790019e-02, -4.74790019e-02],...,[ 6.19451775e-05, -6.19451775e-05],[ 3.30996384e-05, -3.30996384e-05],[ 4.45219920e-05, -4.45219920e-05]]])
shap_values.shape # 第一維是樣本數,第二維是特征數,第三維是類別數

輸出:(1500,31,2)

print("shap_values shape:", shap_values.shape)
print("shap_values[0] shape:", shap_values[0].shape)
print("shap_values[:, :, 0] shape:", shap_values[:, :, 0].shape)
print("X_test shape:", X_test.shape)

輸出:

shap_values shape: (1500, 31, 2)
shap_values[0] shape: (31, 2)
shap_values[:, :, 0] shape: (1500, 31)
X_test shape: (1500, 31)

現在對這個輸出結果通過AI進行理解學習:

今日學習到這里。明日繼續這部分SHAP圖繪制的學習。加油!!!@浙大疏錦行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79387.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

48.輻射發射RE和傳導發射CE測試方法分析

輻射發射RE和傳導發射CE測試方法分析 1. 所有測試項目總結2. 輻射發射RE測試方法3. 傳到發射CE測試方法 1. 所有測試項目總結 所有EMC測試項目都是基于模擬現實的。 模擬現實中可能發生的各種真實場景&#xff0c;然后統計總結出各種場景下的真實應力&#xff0c;并通過制造測…

在 Vue 3 中實現刮刮樂抽獎

&#x1f389; 在 Vue 3 中實現刮刮樂抽獎 當項目中需要做一些活動互動頁時&#xff0c;需要實現刮刮樂&#xff0c;請看如下效果&#xff1a; 這里感謝github用戶Choicc分享的組件&#xff0c;具體可點擊傳送門查看 1. 引入組件 將/src/components下ScratchCard.vue復制到自…

c語言第一個小游戲:貪吃蛇小游戲01

hello啊大家好 今天我們用一個小游戲來增強我們的c語言&#xff01; 那就是貪吃蛇 為什么要做一個貪吃蛇小游戲呢&#xff1f; 因為這個小游戲所涉及到的知識有c語言的指針、數組、鏈表、函數等等可以讓我們通過這個游戲來鞏固c語言&#xff0c;進一步認識c語言。 一.我們先…

實戰項目1(02)

目錄 任務場景一 【sw1和sw2的配置如下】 任務場景二 【sw3的配置】 【sw4-6的配置】 任務場景一 某公司有生產、銷售、研發、人事、財務等多個部門&#xff0c;這些部門分別連接在兩臺交換機&#xff08;SW1和SW2&#xff09;上&#xff0c;現要求給每個部門劃分相應的V…

Kubernetes生產實戰(十四):Secret高級使用模式與安全實踐指南

一、Secret核心類型解析 類型使用場景自動管理機制典型字段Opaque (默認)自定義敏感數據需手動創建data字段存儲鍵值對kubernetes.io/dockerconfigjson私有鏡像倉庫認證kubelet自動更新.dockerconfigjsonkubernetes.io/tlsTLS證書管理Cert-Manager可自動化tls.crt/tls.keykube…

Linux: 信號【阻塞和捕捉信號】

Linux&#xff1a; 信號【阻塞和捕捉信號】 &#xff08;一&#xff09;阻塞信號1.信號其他相關的概念2.在內核中表示3.sigset_t4.信號集操作函數5.sigprocmask&#xff08;設置阻塞&#xff09;6.sigpending&#xff08;得到未決狀態&#xff09; &#xff08;二&#xff09;捕…

MySQL 數據庫集群部署、性能優化及高可用架構設計

MySQL 數據庫集群部署、性能優化及高可用架構設計 集群部署方案 1. 主從復制架構 傳統主從復制&#xff1a;配置一個主庫(Master)和多個從庫(Slave)GTID復制&#xff1a;基于全局事務標識符的復制&#xff0c;簡化故障轉移半同步復制&#xff1a;確保至少一個從庫接收到數據…

Java 多態:原理與實例深度剖析

一、多態概述 在 Java 面向對象編程體系中&#xff0c;多態是構建靈活、可擴展程序的核心機制之一&#xff0c;與封裝、繼承并稱為面向對象的三大特性。其本質是同一操作作用于不同對象&#xff0c;產生不同的執行結果&#xff0c;這使得程序在運行時能根據實際對象類型動態調…

解決使用寶塔Linux部署前后端分離項目遇到的問題

問題一&#xff1a;訪問域名轉圈圈&#xff0c;顯示404,403 沒有解決跨域問題&#xff0c;在后端yml中設置content&#xff1a;/prod&#xff08;生產環境&#xff09;&#xff0c;在前端.env文件中將http&#xff1a;//127.0.0.1:8080/替換為公網IP&#xff0c;并在vite.conf…

《Python星球日記》 第54天:卷積神經網絡進階

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、深度CNN架構解析1. LeNet-5&#xff08;1998&#xff09;2. AlexNet&#x…

旅游設備生產企業的痛點 質檢系統在旅游設備生產企業的應用

在旅游設備制造行業&#xff0c;產品質量直接關系到用戶體驗與企業口碑。從景區纜車、觀光車到水上娛樂設施&#xff0c;每一件設備的安全性與可靠性都需經過嚴苛檢測。然而&#xff0c;傳統質檢模式常面臨數據分散、流程不透明、合規風險高等痛點&#xff0c;難以滿足旅游設備…

MySql(進階)

一.數據庫約束 約束類型 NOT NULL - 指示某列不能存儲 NULL 值。 (not null不能為NILL) UNIQUE - 保證某列的每行必須有唯一的值。 &#xff08;unique唯一值&#xff09; DEFAULT - 規定沒有給列賦值時的默認值。 &#xff08;default為空給定默認值&#xff09; PRIMARY…

Three.js + React 實戰系列 - 聯系方式提交表單區域 Contact 組件?(表單綁定 + 表單驗證)

對個人主頁設計和實現感興趣的朋友可以訂閱我的專欄哦&#xff01;&#xff01;謝謝大家&#xff01;&#xff01;&#xff01; 在現代網頁中&#xff0c;一個精致的 Contact 區域不僅僅是表單的堆砌&#xff0c;更是用戶與我們建立聯系的第一印象。 在本節課中&#xff0c;我…

UOJ 164【清華集訓2015】V Solution

Description 給定序列 a ( a 1 , a 2 , ? , a n ) a(a_1,a_2,\cdots,a_n) a(a1?,a2?,?,an?)&#xff0c;另有序列 h h h&#xff0c;初始時 h a ha ha. 有 m m m 個操作分五種&#xff1a; add ? ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v)&#xff1a;…

C++開發過程中的注意事項詳解

目錄 C++開發過程中的注意事項詳解 一、內存管理:避免泄漏與資源浪費 1.1 使用智能指針管理動態內存 1.2 避免手動內存管理的陷阱 1.3 利用RAII機制管理資源 1.4 容器與內存分配 二、安全性:防御攻擊與未定義行為 2.1 輸入驗證與安全編碼 2.2 使用安全的通信協議 2…

Git 時光機:修改Commit信息

前言 列位看官都知道&#xff0c;Git 的每一次 git commit&#xff0c;其中會包含作者&#xff08;Author&#xff09;和提交者&#xff08;Committer&#xff09;的姓名與郵箱。有時可能會因為配置錯誤、切換了開發環境&#xff0c;或者只是單純的手滑&#xff0c;導致 commi…

QSFP+、QSFP28、QSFP-DD接口分別實現40G、100G、200G/400G以太網接口

常用的光模塊結構形式&#xff1a; 1&#xff09;QSFP等效于4個SFP&#xff0c;支持410Gbit/s通道傳輸&#xff0c;可通過4個通道實現40Gbps傳輸速率。與SFP相比&#xff0c;QSFP光模塊的傳輸速率可達SFP光模塊的四倍&#xff0c;在部署40G網絡時可直接使用QSFP光模塊&#xf…

好用的播放器推薦

以下是一些好用的播放器推薦&#xff0c;按照不同平臺和使用場景分類&#xff1a; 電腦端 VLC Media Player 特點&#xff1a;開源、跨平臺&#xff0c;支持幾乎所有的音視頻格式&#xff0c;無需額外安裝解碼器。具備強大的功能&#xff0c;如播放列表管理、視頻和音頻濾鏡、…

Vue基礎(8)_監視屬性、深度監視、監視的簡寫形式

監視屬性(watch)&#xff1a; 1.當被監視的屬性變化時&#xff0c;回調函數(handler)自動調用&#xff0c;進行相關操作。 2.監視的屬性必須存在&#xff0c;才能進行監視&#xff01;&#xff01; 3.監視的兩種寫法&#xff1a; (1).new Vue時傳入watch配置 (2).通過vm.$watc…

AI服務器的作用都有哪些?

根據網絡環境的飛速發展&#xff0c;人工智能技術逐漸入駐到各個行業當中&#xff0c;其中AI服務器則是一種專門用來運行人工智能算法和模型的硬件設備&#xff0c;通常具備高性能計算、大容量存儲和并行計算等多種功能&#xff0c;本文就來詳細講解一下AI服務器的作用&#xf…