import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('california.xlsx')

from sklearn.model_selection import train_test_split

X = df.drop(['price'],axis=1)
y = df['price']

X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 然后將訓(xùn)練集進(jìn)一步劃分為訓(xùn)練集和驗(yàn)證集
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42) # 0.125 x 0.8 = 0.1

# 數(shù)據(jù)集標(biāo)準(zhǔn)化
x_mean = X_train.mean()
x_std = X_train.std()
y_mean = y.mean()
y_std = y.std()
X_train = (X_train - x_mean)/x_std
y_train = (y_train-y_mean)/y_std
X_val = (X_val - x_mean)/x_std
y_val = (y_val - y_mean)/y_std
X_test = (X_test - x_mean)/x_std
y_test = (y_test - y_mean)/y_std

import lightgbm as lgb

# LightGBM模型參數(shù)
params_lgb = {
'learning_rate': 0.02, # 學(xué)習(xí)率,控制每一步的步長(zhǎng),用于防止過擬合。典型值范圍:0.01 - 0.1
'boosting_type': 'gbdt', # 提升方法,這里使用梯度提升樹(Gradient Boosting Decision Tree,簡(jiǎn)稱GBDT)
'objective': 'mse', # 損失函數(shù)
'metric': 'rmse', # 評(píng)估指標(biāo)
'num_leaves': 127, # 每棵樹的葉子節(jié)點(diǎn)數(shù)量,控制模型復(fù)雜度。較大值可以提高模型復(fù)雜度但可能導(dǎo)致過擬合
'verbose': -1, # 控制 LightGBM 輸出信息的詳細(xì)程度,-1表示無輸出,0表示最少輸出,正數(shù)表示輸出更多信息
'seed': 42, # 隨機(jī)種子,用于重現(xiàn)模型的結(jié)果
'n_jobs': -1, # 并行運(yùn)算的線程數(shù)量,-1表示使用所有可用的CPU核心
'feature_fraction': 0.8, # 每棵樹隨機(jī)選擇的特征比例,用于增加模型的泛化能力
'bagging_fraction': 0.9, # 每次迭代時(shí)隨機(jī)選擇的樣本比例,用于增加模型的泛化能力
'bagging_freq': 4 # 每隔多少次迭代進(jìn)行一次bagging操作,用于增加模型的泛化能力
}

model_lgb = lgb.LGBMRegressor(**params_lgb)
model_lgb.fit(X_train, y_train, eval_set=[(X_val, y_val)],
eval_metric='rmse')

將數(shù)據(jù)集劃分為訓(xùn)練集、驗(yàn)證集和測(cè)試集,并對(duì)其進(jìn)行標(biāo)準(zhǔn)化處理,然后使用LightGBM模型進(jìn)行訓(xùn)練,設(shè)置參數(shù)以防止過擬合和提高泛化能力,到目前為止就構(gòu)建了一個(gè)LighGBM模型,對(duì)這個(gè)預(yù)測(cè)結(jié)果進(jìn)行一個(gè)簡(jiǎn)單的可視化

pred_train = model_lgb.predict(X_train)
pred_val = model_lgb.predict(X_val)
pred_test = model_lgb.predict(X_test)

y_train_h = y_train*y_std+y_mean
pred_train_h = pred_train*y_std+y_mean

y_val_h = y_val*y_std+y_mean
pred_val_h = pred_val*y_std+y_mean

y_test_h = y_test*y_std+y_mean
pred_test_h = pred_test*y_std+y_mean

import seaborn as sns
colors = sns.color_palette("husl", 3)

plt.figure(figsize=(15,5),dpi=300)
plt.subplot(3,1,1)
plt.scatter(y_train_h, pred_train_h, label='訓(xùn)練集', alpha=0.3, color=colors[0])
plt.xlabel('真實(shí)值')
plt.ylabel('預(yù)測(cè)值')
plt.legend()
plt.subplot(3,1,2)
plt.scatter(y_val_h, pred_val_h, label='驗(yàn)證集', alpha=0.3, color=colors[1])
plt.xlabel('真實(shí)值')
plt.ylabel('預(yù)測(cè)值')
plt.legend()
plt.subplot(3,1,3)
plt.scatter(y_test_h, pred_test_h, label='測(cè)試集', alpha=0.3, color=colors[2])
plt.xlabel('真實(shí)值')
plt.ylabel('預(yù)測(cè)值')
plt.legend()
plt.tight_layout()
plt.show()

將模型預(yù)測(cè)結(jié)果與真實(shí)值進(jìn)行比較并可視化,但這種簡(jiǎn)單的可視化無法深入解釋模型的決策過程,但是我們可以借助SHAP值進(jìn)一步分析模型特征的重要性和貢獻(xiàn)度

摘要圖(Summary Plot)

import shap
# 構(gòu)建 shap解釋器
explainer = shap.TreeExplainer(model_lgb)
# 計(jì)算測(cè)試集的shap值
shap_values = explainer.shap_values(X_train)
# 特征標(biāo)簽
labels = X_train.columns
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = 'Times new Roman'
plt.rcParams['font.size'] = 13
#cmap="?"配色viridis Spectral coolwar mRdYlGn RdYlBu RdBu RdGy PuOr BrBG PRGn PiYG
plt.figure()
shap.summary_plot(shap_values, X_train, feature_names=labels, plot_type="dot")

摘要圖是SHAP常用的一種可視化方法,用于顯示特征的重要性和特征值的影響方向,摘要圖結(jié)合了特征重要性和特征效應(yīng)圖,展示了每個(gè)特征的SHAP值的分布情況,幫助我們理解每個(gè)特征對(duì)模型預(yù)測(cè)的貢獻(xiàn),這張可視化結(jié)果可在眾多論文當(dāng)中看見,當(dāng)然你也可以通過參數(shù)cmap改變配色避免審美疲勞(”viridis”:從黃色到藍(lán)綠色。”Spectral”:從紅色到藍(lán)色,適用于有正負(fù)影響的特征。”coolwarm”:從冷到暖的顏色圖。”RdYlGn”:從紅到綠的顏色圖。”RdYlBu”:從紅到藍(lán)的顏色圖。”RdBu”:紅藍(lán)雙色圖。”RdGy”:紅灰雙色圖。”PuOr”:從紫色到橙色的顏色圖。”BrBG”:從棕色到藍(lán)綠色的顏色圖。”PRGn”:從紫色到綠色的顏色圖。”PiYG”:從粉紅色到綠色的顏色圖),接下來從不同角度對(duì)可視化進(jìn)行解讀

顏色:

粉紅色點(diǎn):表示特征值在這個(gè)觀察模型中對(duì)模型預(yù)測(cè)產(chǎn)生了正面影響藍(lán)色點(diǎn):表示該特征值在這個(gè)觀察中對(duì)模型預(yù)測(cè)產(chǎn)生負(fù)面影響

水平軸(shap值):

顯示每個(gè)特征對(duì)預(yù)測(cè)結(jié)果的影響大小,點(diǎn)越遠(yuǎn)離中心線(零點(diǎn)),表示該特征對(duì)模型輸出的影響越大正的shap值表示正面影響,負(fù)的shap值表示負(fù)面影響

垂直軸(特征排列):

圖中垂直排列的特征按影響力從上到小進(jìn)行排序,上方的特征對(duì)模型輸出的總影響更大,而下方的特征影響較小

特征影響力解釋:

最上方特征(如:MedInc):

顯示了大量的正面和負(fù)面影響,表明其在不同的觀察值對(duì)模型預(yù)測(cè)的結(jié)果有很大不同的影響

中部特征(如:AveRooms):

也顯示出兩種顏色的點(diǎn),但點(diǎn)的分布更集中,影響相對(duì)較小底部特征(如:Population):對(duì)模型的影響最小,且大部分影響較為接近于零值,表示這些特征對(duì)模型預(yù)測(cè)的貢獻(xiàn)較小

其中如何去理解每個(gè)特征的SHAP值這句話>shap_values值反應(yīng)的其實(shí)就是每一個(gè)樣本,每一個(gè)特征對(duì)輸出結(jié)果的影響

print("shap維度:",shap_values.shape)
print("測(cè)試集維度:",X_train.shape)

可以看見shap_values和測(cè)試集(這里做的摘要圖是對(duì)測(cè)試集進(jìn)行操作)維度是一致的,也就是每一個(gè)shap值實(shí)際和原始數(shù)據(jù)每一個(gè)點(diǎn)是一一對(duì)應(yīng)的,當(dāng)然也可以對(duì)所有數(shù)據(jù)集在一張畫布上展示每一個(gè)特征的排序

# 計(jì)算訓(xùn)練集和測(cè)試集的SHAP值
shap_values_train = explainer.shap_values(X_train)
shap_values_val = explainer.shap_values(X_val)
shap_values_test = explainer.shap_values(X_test)

# 繪制SHAP值總結(jié)圖(Summary Plot)
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
shap.summary_plot(shap_values_train, X_train, plot_type="bar", show=False)
plt.title("X_train")
plt.xlabel('') # 移除 x 軸標(biāo)簽避免x軸重疊

plt.subplot(1, 3, 2)
shap.summary_plot(shap_values_val, X_val, plot_type="bar", show=False)
plt.title("X_val")

plt.subplot(1, 3, 3)
shap.summary_plot(shap_values_test, X_test, plot_type="bar", show=False)
plt.title("X_test")
plt.xlabel('')

plt.tight_layout()
plt.show()

這里計(jì)算的就不在是每一個(gè)點(diǎn)的shap值,而是計(jì)算的每一個(gè)特征的重要程度,特征按影響力從大到小進(jìn)行排序,如何進(jìn)行計(jì)算的呢?

np.abs(shap_values_train).mean(axis=0) # 利用測(cè)試集進(jìn)行演示

就是把SHAP_value樣本取絕對(duì)值的平均值從而得到每個(gè)特征的重要程度

依賴圖(Dependence Plot)

shap.dependence_plot('MedInc', shap_values, X_train, interaction_index='AveOccup')

依賴圖用于顯示一個(gè)特征的SHAP值與該特征值之間的關(guān)系,并可以展示特征之間的交互作用在這里shap.dependence_plot函數(shù)的參數(shù)解釋如下:

‘MedInc’:這是你想要研究的特征名

shap_values:這是通過SHAP計(jì)算得到的特征重要性值

X_train:這是用于生成SHAP值的訓(xùn)練數(shù)據(jù)interaction_index=’AveOccup’:這是指定與主特征(MedInc)交互的特征,SHAP會(huì)在圖中顯示兩者的交互效果最后對(duì)這個(gè)依賴圖進(jìn)行解讀:
正相關(guān)關(guān)系:在這里隨著MedInc的增加,目標(biāo)變量AveOccup也隨之增加 影響的程度:MedInc的值在 3 到 6 的范圍內(nèi),SHAP 值變化并不明顯,表明,在這個(gè)范圍內(nèi),MedInc對(duì)模型預(yù)測(cè)的目標(biāo)變量影響并不大,反之成立

交互效果:通過觀察圖中的顏色變化,可以了解主特征與交互特征之間的關(guān)系以及它們對(duì)模型預(yù)測(cè)的共同影響

力圖(Force Plot)

# 繪制單個(gè)樣本的SHAP解釋(Force Plot)
sample_index = 7 # 選擇一個(gè)樣本索引進(jìn)行解釋
shap.force_plot(explainer.expected_value, shap_values_test[sample_index], X_test.iloc[sample_index], matplotlib=True)

力圖用于直觀地展示單個(gè)樣本的SHAP值及其對(duì)模型預(yù)測(cè)結(jié)果的影響,通過力圖,可以清晰地看到每個(gè)特征對(duì)該樣本預(yù)測(cè)值的貢獻(xiàn)

力圖可視化解釋:

基線值:圖中的起點(diǎn)表示模型的基線值(expected_value)也就是可視化當(dāng)中的base valuc

特征貢獻(xiàn):每個(gè)特征的貢獻(xiàn)通過帶顏色的條表示,條的長(zhǎng)度表示該特征對(duì)最終預(yù)測(cè)值的影響大小,紅色條表示正向貢獻(xiàn),即該特征使預(yù)測(cè)值增加,藍(lán)色條表示負(fù)向貢獻(xiàn),即該特征使預(yù)測(cè)值減少預(yù)測(cè)值:終點(diǎn)表示模型對(duì)該樣本的最終預(yù)測(cè)值,這是基線值加上所有特征貢獻(xiàn)的總和,在這里為-0.31

交互作用摘要圖(Interaction Summary Plot)

shap_interaction_values = explainer.shap_interaction_values(X_train)
shap.summary_plot(shap_interaction_values, X_train)

用于展示特征之間交互作用的重要性和影響的一種可視化方法

特征排序:特征按重要性排序,最重要的特征在圖的頂部,每個(gè)特征的總重要性值是其與所有其他特征交互作用的重要性值之和

SHAP交互作用值分布:每個(gè)點(diǎn)表示一個(gè)樣本的交互作用值,交互作用值越大,表示該特征與另一個(gè)特征的交互對(duì)模型預(yù)測(cè)的影響越大顏色表示交互特征:顏色表示與主特征交互的特征,使用顏色漸變來表示不同的特征交互效果

SHAP熱圖(Heatmap)

# 創(chuàng)建 shap.Explanation 對(duì)象
shap_explanation = shap.Explanation(values=shap_values_test[0:500,:],
base_values=explainer.expected_value,
data=X_test.iloc[0:500,:], feature_names=X_test.columns)
# 繪制熱圖
shap.plots.heatmap(shap_explanation)

熱圖解讀:

左側(cè)y軸為重要性特征排名,特征按影響力從大到小進(jìn)行排序,右側(cè)y軸為其可視化,圖像中顏色深淺表示SHAP值的大小,也就是該特征下值對(duì)模型的影響,顏色越深SHAP值絕對(duì)值越大越影響模型,頂部為模型在這些數(shù)值下的預(yù)測(cè)結(jié)果可視化,這里只從測(cè)試集中選擇了500個(gè)數(shù)據(jù)進(jìn)行可視化,太多的數(shù)據(jù)會(huì)影響運(yùn)行時(shí)間,以及可視化的精美,讀者自行取舍

通過熱圖,可以有效地探索和理解復(fù)雜模型的特征重要性和特征之間的相互關(guān)系,從而提高模型的解釋性和可解釋性

文章轉(zhuǎn)自微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI

上一篇:

數(shù)據(jù)分布與變化:從理論到實(shí)踐指南

下一篇:

Pythorch框架構(gòu)建Attention-lstm時(shí)序模型

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)