這是二分類XGBoost部署的APP輸出的shap力圖,可以發(fā)現(xiàn)f(X)=-2.50很明顯這不是模型屬于某個(gè)類別的概率,具體解讀會(huì)在接下來(lái)根據(jù)代碼進(jìn)行解釋。

二分類隨機(jī)森林RF

這里是一篇醫(yī)學(xué)柳葉刀頂刊部署的APP,使用的模型為隨機(jī)森林RF,它這里的解釋為f(X)為該預(yù)測(cè)類別的概率,和XGBoost的力圖輸出f(X)存在很大差異,于是我們利用數(shù)據(jù)分別實(shí)現(xiàn)這兩個(gè)模型來(lái)探討一下到底是因?yàn)闉槭裁?,出現(xiàn)了這種情況。

代碼實(shí)現(xiàn)

數(shù)據(jù)讀取處理

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
df = pd.read_csv('Dataset.csv')
# 劃分特征和目標(biāo)變量
X = df.drop(['target'], axis=1)
y = df['target']
# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['target'])
df.head()

讀取數(shù)據(jù),劃分出特征和目標(biāo)變量,然后將數(shù)據(jù)集按照80%訓(xùn)練集和20%測(cè)試集的比例進(jìn)行分割,同時(shí)確保目標(biāo)變量的類別分布在訓(xùn)練集和測(cè)試集中保持一致。

XGBoost模型構(gòu)建

import xgboost as xgb
from sklearn.model_selection import GridSearchCV

# XGBoost模型參數(shù)
params_xgb = {
'learning_rate': 0.02, # 學(xué)習(xí)率,控制每一步的步長(zhǎng),用于防止過(guò)擬合。典型值范圍:0.01 - 0.1
'booster': 'gbtree', # 提升方法,這里使用梯度提升樹(Gradient Boosting Tree)
'objective': 'binary:logistic', # 損失函數(shù),這里使用邏輯回歸,用于二分類任務(wù)
'max_leaves': 127, # 每棵樹的葉子節(jié)點(diǎn)數(shù)量,控制模型復(fù)雜度。較大值可以提高模型復(fù)雜度但可能導(dǎo)致過(guò)擬合
'verbosity': 1, # 控制 XGBoost 輸出信息的詳細(xì)程度,0表示無(wú)輸出,1表示輸出進(jìn)度信息
'seed': 42, # 隨機(jī)種子,用于重現(xiàn)模型的結(jié)果
'nthread': -1, # 并行運(yùn)算的線程數(shù)量,-1表示使用所有可用的CPU核心
'colsample_bytree': 0.6, # 每棵樹隨機(jī)選擇的特征比例,用于增加模型的泛化能力
'subsample': 0.7, # 每次迭代時(shí)隨機(jī)選擇的樣本比例,用于增加模型的泛化能力
'eval_metric': 'logloss' # 評(píng)價(jià)指標(biāo),這里使用對(duì)數(shù)損失(logloss)
}

# 初始化XGBoost分類模型
model_xgb = xgb.XGBClassifier(**params_xgb)

# 定義參數(shù)網(wǎng)格,用于網(wǎng)格搜索
param_grid = {
'n_estimators': [100, 200, 300, 400, 500], # 樹的數(shù)量
'max_depth': [3, 4, 5, 6, 7], # 樹的深度
'learning_rate': [0.01, 0.02, 0.05, 0.1], # 學(xué)習(xí)率
}

# 使用GridSearchCV進(jìn)行網(wǎng)格搜索和k折交叉驗(yàn)證
grid_search = GridSearchCV(
estimator=model_xgb,
param_grid=param_grid,
scoring='neg_log_loss', # 評(píng)價(jià)指標(biāo)為負(fù)對(duì)數(shù)損失
cv=5, # 5折交叉驗(yàn)證
n_jobs=-1, # 并行計(jì)算
verbose=1 # 輸出詳細(xì)進(jìn)度信息
)

# 訓(xùn)練模型
grid_search.fit(X_train, y_train)

# 輸出最優(yōu)參數(shù)
print("Best parameters found: ", grid_search.best_params_)
print("Best Log Loss score: ", -grid_search.best_score_)

# 使用最優(yōu)參數(shù)訓(xùn)練模型
best_model = grid_search.best_estimator_

使用XGBoost分類器通過(guò)網(wǎng)格搜索和5折交叉驗(yàn)證來(lái)尋找最佳模型參數(shù),并在訓(xùn)練集上進(jìn)行訓(xùn)練,同時(shí)輸出最佳參數(shù)和對(duì)應(yīng)的最優(yōu)對(duì)數(shù)損失分?jǐn)?shù)。

隨機(jī)森林RF模型構(gòu)建

from sklearn.ensemble import RandomForestClassifier
# 使用隨機(jī)森林建模
model_rf = RandomForestClassifier(n_estimators=100, criterion='gini', bootstrap=True, max_depth=3, random_state=8)
model_rf.fit(X_train, y_train

使用隨機(jī)森林分類器(指定了100棵樹、基尼系數(shù)作為分裂標(biāo)準(zhǔn)、引導(dǎo)抽樣、最大深度為3,以及隨機(jī)種子8)在訓(xùn)練集上進(jìn)行模型訓(xùn)練。。

shap力圖

XGBoost力圖

import shap
explainer = shap.TreeExplainer(best_model)
shap_values = explainer.shap_values(X_test)
print("基準(zhǔn)值:",explainer.expected_value)
print("shap值維度:",shap_values.shape)

基準(zhǔn)值:-0.17231837是模型在沒(méi)有任何特征輸入時(shí)的預(yù)測(cè)輸出。

SHAP值維度:(60, 13)表明測(cè)試集中有60個(gè)樣本,每個(gè)樣本有13個(gè)特征。

sample_index = 0
shap.force_plot(explainer.expected_value, shap_values[sample_index], X_test.iloc[sample_index], matplotlib=True)

XGBoost的力圖會(huì)顯示基準(zhǔn)值(通常是模型的平均輸出)以及繪制樣本各特征的具體數(shù)值,還有就是f(X)它是XGBoost模型根據(jù)這些特征實(shí)際的預(yù)測(cè)值,但是它并不是模型預(yù)測(cè)類別的概率值,而是輸出一個(gè)經(jīng)過(guò)Sigmoid函數(shù)處理前的對(duì)數(shù)幾率(log-odds)值。

Log-Odds: 在二分類問(wèn)題中,XGBoost的輸出 f(X) 實(shí)際上是一個(gè)對(duì)數(shù)幾率(log-odds)值,它表示類別為1的對(duì)數(shù)幾率:

這個(gè)值可以是任何實(shí)數(shù),可能會(huì)大于1,也可能小于0。

隨機(jī)森林RF力圖

explainer = shap.TreeExplainer(model_rf)
shap_values = explainer.shap_values(X_test)
print("基準(zhǔn)值:",explainer.expected_value)
print("shap值維度:",shap_values.shape)

基準(zhǔn)值 [0.54063291, 0.45936709] 對(duì)應(yīng)于每個(gè)類別的基準(zhǔn)概率。如果不知道任何特征信息,模型會(huì)預(yù)測(cè)類別 0 的概率為 0.5406,類別 1 的概率為 0.4594。

SHAP 值數(shù)組的維度是 (60, 13, 2),60: 測(cè)試集 X_test 中的樣本數(shù)量,13: 數(shù)據(jù)集中的特征數(shù)量,2: 模型中的類別數(shù)量(這里是二分類問(wèn)題)。

可以發(fā)現(xiàn)這里隨機(jī)森林RF模型和XGBoost模型的shap結(jié)果輸出已經(jīng)出現(xiàn)不一樣了,雖然使用的是同一個(gè)shap解釋器TreeExplainer。

sample_index = 0
shap.force_plot(explainer.expected_value[0], shap_values[sample_index,:,0], X_test.iloc[sample_index], matplotlib=True)

可視化 X_test 中第 0 個(gè)樣本的第 0 類別的 SHAP 值,展示各個(gè)特征對(duì)該樣本在第 0 類別上的預(yù)測(cè)的貢獻(xiàn)情況,explainer.expected_value[0]:類別 0 的基準(zhǔn)值(即模型在不知道任何特征時(shí)對(duì)類別 0 的平均預(yù)測(cè)值),shap_values[sample_index,:,0]:第 0 個(gè)樣本的所有特征對(duì)類別 0 預(yù)測(cè)的 SHAP 值,X_test.iloc[sample_index]:第 0 個(gè)樣本的特征值,這里的f(X)=0.91實(shí)際上就是隨機(jī)森林RF模型預(yù)測(cè)這一個(gè)樣本為0這一類的概率。

sample_index = 0
shap.force_plot(explainer.expected_value[1], shap_values[sample_index,:,1], X_test.iloc[sample_index], matplotlib=True)

可視化 X_test 中第 0 個(gè)樣本的第 1 類別的 SHAP 值,展示各個(gè)特征對(duì)該樣本在第 1 類別上的預(yù)測(cè)貢獻(xiàn)情況,explainer.expected_value[1]:類別 1 的基準(zhǔn)值(即模型在不知道任何特征時(shí)對(duì)類別 1 的平均預(yù)測(cè)值),shap_values[sample_index,:,1]:第 0 個(gè)樣本的所有特征對(duì)類別 1 預(yù)測(cè)的 SHAP 值,X_test.iloc[sample_index]:第 0 個(gè)樣本的特征值,這里的f(X)=0.09實(shí)際上就是隨機(jī)森林RF模型預(yù)測(cè)這一個(gè)樣本為1這一類的概率。

最后可以發(fā)現(xiàn)對(duì)這兩個(gè)在隨機(jī)森林RF下繪制的力圖f(X)相加為1(如果你進(jìn)一步研究還會(huì)發(fā)現(xiàn)同樣本不同類別下的shap值和為0),根據(jù)這個(gè)概率也可以確定這個(gè)樣本在模型中是91%的概率預(yù)測(cè)為0類,也就符合頂刊中的解釋,但是如果采用XGBoost模型就不會(huì)存在這種解釋。

總結(jié)

差異原因:

模型輸出的本質(zhì):

SHAP 值的計(jì)算方式:

這個(gè)現(xiàn)象說(shuō)明不同類型的模型在 SHAP 值解釋方面的不同之處,對(duì)于像隨機(jī)森林這樣直接輸出概率的模型,SHAP 值可以直接反映最終的預(yù)測(cè)概率,因此 f(X) 相加為 1 并且可以直觀地解釋為概率。

而對(duì)于 XGBoost 這種輸出 log-odds 值的模型,SHAP 值解釋的是對(duì) log-odds 的貢獻(xiàn),而不是直接的概率,因此在這種情況下,你無(wú)法通過(guò)簡(jiǎn)單相加 SHAP 值來(lái)得到概率,這種解釋方式與頂刊中的標(biāo)準(zhǔn)解釋方法有所不同。

這提醒我們,在使用 SHAP 解釋模型時(shí),需要根據(jù)具體模型的性質(zhì)正確理解和解釋 SHAP 值的含義。

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

上一篇:

Python實(shí)現(xiàn)數(shù)據(jù)預(yù)處理:常見(jiàn)異常值檢驗(yàn)方法解析

下一篇:

多分類模型的 SHAP 特征貢獻(xiàn)圖及其衍生可視化繪制

我們有何不同?

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)