import pandas as pd

# Load the iris dataset
iris = load_iris()

# Create a DataFrame from the iris dataset
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target

from sklearn.model_selection import train_test_split
X = iris_df.drop(['target'],axis=1)
y = iris_df['target']

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

# 然后將訓(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,stratify=y_temp, random_state=42) # 0.125 x 0.8 = 0.1

加載鳶尾花數(shù)據(jù)集,將鳶尾花數(shù)據(jù)集分割為訓(xùn)練集、驗(yàn)證集和測(cè)試集,具體過程是:從整個(gè)數(shù)據(jù)集中抽取20%作為測(cè)試集;剩余的80%數(shù)據(jù)中抽取12.5%作為驗(yàn)證集,最終驗(yàn)證集占整個(gè)數(shù)據(jù)集的10%,訓(xùn)練集占整個(gè)數(shù)據(jù)集的70%,這一步驟為后續(xù)使用XGBoost進(jìn)行多分類模型的訓(xùn)練和評(píng)估奠定基礎(chǔ)

模型建立

import xgboost as xgb

# 更新后的多分類模型參數(shù)
params_xgb = {
'learning_rate': 0.02, # 學(xué)習(xí)率
'booster': 'gbtree', # 提升方法
'objective': 'multi:softprob', # 損失函數(shù),多分類使用softmax
'num_class': 3, # 類別數(shù),鳶尾花數(shù)據(jù)集有三類
'max_leaves': 127, # 每棵樹的葉子節(jié)點(diǎn)數(shù)量
'verbosity': 1, # 輸出信息的詳細(xì)程度
'seed': 42, # 隨機(jī)種子
'nthread': -1, # 并行運(yùn)算的線程數(shù)量
'colsample_bytree': 0.6, # 每棵樹隨機(jī)選擇的特征比例
'subsample': 0.7, # 每次迭代時(shí)隨機(jī)選擇的樣本比例
'early_stopping_rounds': 100, # 早停輪數(shù)
'eval_metric': 'mlogloss' # 評(píng)估指標(biāo),多分類使用mlogloss
}

# 創(chuàng)建并訓(xùn)練多分類模型
model_xgb = xgb.XGBClassifier(**params_xgb)
model_xgb.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=False)

配置并訓(xùn)練一個(gè)XGBoost多分類模型來(lái)預(yù)測(cè)鳶尾花數(shù)據(jù)集的類別,使用特定的參數(shù)設(shè)置和早停機(jī)制,比如這里是三分類,如果需要更改為其他多分類(如四分類),只需修改參數(shù)num_class,并相應(yīng)調(diào)整其他參數(shù)以達(dá)到最優(yōu)模型效果

模型評(píng)價(jià)指標(biāo)輸出

評(píng)價(jià)報(bào)告

from sklearn.metrics import classification_report
# 預(yù)測(cè)測(cè)試集
y_pred = model_xgb.predict(X_test)

# 輸出模型報(bào)告, 查看評(píng)價(jià)指標(biāo)
print(classification_report(y_test, y_pred))

混淆矩陣熱力圖

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# 輸出混淆矩陣
conf_matrix = confusion_matrix(y_test, y_pred)

# 繪制熱力圖
plt.figure(figsize=(10, 7))
sns.heatmap(conf_matrix, annot=True, annot_kws={'size':15}, fmt='d', cmap='YlGnBu')
plt.xlabel('Predicted Label', fontsize=12)
plt.ylabel('True Label', fontsize=12)
plt.title('Confusion matrix heat map', fontsize=15)
plt.show()

Shap實(shí)現(xiàn)

創(chuàng)建Shap解釋器

import shap
# 創(chuàng)建SHAP解釋器
explainer = shap.Explainer(model_xgb)
# 計(jì)算SHAP值
shap_values = explainer(X_test)
print("shap值維度;",shap_values.shape)
shap_values

可以看見針對(duì)測(cè)試集的shap值的維度為(30,4,3),也就是計(jì)算的每個(gè)類別的SHAP值,對(duì)于每個(gè)樣本,SHAP值將是一個(gè)矩陣,其中每個(gè)元素表示一個(gè)特征對(duì)某個(gè)類別的貢獻(xiàn)

繪制Shap解釋圖

# 特征標(biāo)簽
labels = X_train.columns

# 設(shè)置 matplotlib 的全局字體配置
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = 'Times New Roman'
plt.rcParams['font.size'] = 13

# 提取每個(gè)類別的 SHAP 值
shap_values_class_1 = shap_values.values[:, :, 0]
shap_values_class_2 = shap_values.values[:, :, 1]
shap_values_class_3 = shap_values.values[:, :, 2]
shap_values_class_1

# 繪制 SHAP 總結(jié)圖,使用viridis配色方案
plt.figure()
plt.title('class_1')
shap.summary_plot(shap_values_class_1, X_val, feature_names=labels, plot_type="dot", cmap="viridis")
plt.show()

這里針對(duì)鳶尾花的測(cè)試集第一個(gè)類別0進(jìn)行shap解釋圖繪制

繪制Shap依賴圖

shap.dependence_plot('sepal length (cm)', shap_values_class_1, X_val, interaction_index='sepal width (cm)')
plt.show()

針對(duì)鳶尾花的測(cè)試集第一個(gè)類別0的特征sepal length (cm)、sepal width (cm)進(jìn)行shap依賴圖繪制

繪制Shap力圖

# 選擇一個(gè)樣本索引進(jìn)行解釋
sample_index = 1
expected_value = explainer.expected_value[0] # 需要指定個(gè)類別的基準(zhǔn)值,這里是第一個(gè)類別
# 獲取單個(gè)樣本的 SHAP 值
sample_shap_values = shap_values_class_1[sample_index]

# 繪制 SHAP 解釋力圖 (Force Plot)
shap.force_plot(expected_value, sample_shap_values, X_val.iloc[sample_index], matplotlib=True)
# 顯示繪圖
plt.show()

shap力圖解釋同樣會(huì)選擇數(shù)據(jù)集以及類別,但是還會(huì)多一個(gè)應(yīng)選擇的基準(zhǔn)值,比如這里選擇的第一個(gè)類比那基準(zhǔn)值也要選擇第一個(gè)類比的基準(zhǔn)值

生成Shap交互作用圖

shap_interaction_values = explainer.shap_interaction_values(X_val)
# 提取每個(gè)類別的值
shap_interaction_values_class_1 = shap_interaction_values[:, :, :, 0] # 類別1
shap_interaction_values_class_2 = shap_interaction_values[:, :, :, 1] # 類別2
shap_interaction_values_class_3 = shap_interaction_values[:, :, :, 2] # 類別3
# 繪制 SHAP 交互值的總結(jié)圖
plt.figure()
shap.summary_plot(shap_interaction_values_class_1, X_val, feature_names=labels)
plt.show()

計(jì)算的交互值比Shap值維度多一,同理得提取每一個(gè)類比的交互值,具體怎么提取參考這個(gè)三分類代碼

生成Shap熱圖

expected_value = explainer.expected_value[0]  # 需要指定個(gè)類別的基準(zhǔn)值,這里是第一個(gè)類別 
# 創(chuàng)建 shap.Explanation 對(duì)象
shap_explanation = shap.Explanation(values=shap_values_class_1[0:10, :],
base_values= expected_value,
data=X_val.iloc[0:10, :],
feature_names=X_val.columns)

# 繪制熱圖
plt.figure()
shap.plots.heatmap(shap_explanation)
plt.show()

代碼繪制的是第一個(gè)類比測(cè)試集前10個(gè)樣本的Shap熱圖,和力圖一樣得確定一個(gè)基準(zhǔn)值,對(duì)哪一個(gè)類比做就采用哪一個(gè)類比的基準(zhǔn)值

項(xiàng)目GUI實(shí)現(xiàn)

創(chuàng)建一個(gè)使用Tkinter庫(kù)構(gòu)建的GUI應(yīng)用程序,旨在通過按鈕、標(biāo)簽、組合框和文本框等組件實(shí)現(xiàn)數(shù)據(jù)上傳、選擇目標(biāo)特征、設(shè)置分類任務(wù)的類別數(shù)、選擇數(shù)據(jù)集、選擇顏色方案、選擇特征、輸入樣本索引、輸入樣本范圍等功能,從而對(duì)XGBoost分類模型進(jìn)行訓(xùn)練并生成相關(guān)的解釋圖,并確保將這些圖保存為高DPI的PDF文件,以保證可視化效果不受損失

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

上一篇:

優(yōu)化XGBoost回歸模型:網(wǎng)格搜索與K折交叉驗(yàn)證實(shí)現(xiàn)

下一篇:

快速選擇最佳模型:輕松上手LightGBM、XGBoost、CatBoost和NGBoost!

我們有何不同?

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)