SHAP 值提供了一種理解整合模型預測結果的有效方法。藉由計算每個特徵對預測的貢獻度,SHAP 值能揭示模型的決策過程。在實務應用中,我們可以利用 SHAP 值來識別關鍵特徵、偵測模型偏差,並提升模型的透明度。以 XGBoost 模型為例,我們可以透過 SHAP 值分析特徵 “RM” 對房價預測的影響,並結合部分依賴圖和散點圖深入理解特徵與 SHAP 值之間的關係。對於分類別問題,則可以透過邏輯迴歸和 XGBoost 分類別器的 SHAP 值分析,比較不同模型的解釋性差異。CatBoost 作為一種梯度提升演算法,也能夠與 SHAP 值結合,用於員工許可權預測等實際案例。透過 SHAP 值的計算和視覺化,我們可以更深入地理解模型的預測邏輯,並據此調整模型或特徵工程策略。LightGBM 同樣可以運用 SHAP 值來解釋模型預測,並透過超引數調優來提升模型效能。
整合模型的可解釋性:SHAP 值分析
在機器學習領域,模型的解釋性一直是一個重要的研究方向。隨著整合學習方法的廣泛應用,如何理解和解釋這些複雜模型的預測結果成為了一個挑戰。SHAP(SHapley Additive exPlanations)是一種根據 Shapley 值的技術,能夠有效地解釋各種機器學習模型的輸出。
使用 SHAP 分析 XGBoost 迴歸模型
首先,我們訓練了一個 XGBoost 迴歸模型來預測目標變數,並使用 SHAP 來解釋模型的預測結果。
import xgboost
model_xgb = xgboost.XGBRegressor(n_estimators=100, max_depth=2).fit(X, y)
explainer_xgb = shap.Explainer(model_xgb, X100)
shap_values_xgb = explainer_xgb(X)
內容解密:
XGBRegressor是 XGBoost 函式庫中的一個迴歸模型類別,n_estimators=100表示使用 100 棵樹來進行整合,max_depth=2限制了每棵樹的最大深度為 2。shap.Explainer用於建立一個 SHAP 的直譯器,傳入訓練好的 XGBoost 模型和資料集X100。explainer_xgb(X)用於計算資料集X中每個樣本的 SHAP 值。
部分依賴圖與 SHAP 值
接下來,我們使用 shap.partial_dependence_plot 繪製了特徵 “RM” 的部分依賴圖,並疊加了單個樣本的 SHAP 值。
fig,ax = shap.partial_dependence_plot(
"RM", model_xgb.predict, X, model_expected_value=True,
feature_expected_value=True, show=False, ice=False,
shap_values=shap_values_ebm[sample_ind:sample_ind+1,:]
)
內容解密:
shap.partial_dependence_plot用於繪製指定特徵的部分依賴圖,這裡是特徵 “RM”。model_xgb.predict是 XGBoost 模型的預測函式。shap_values=shap_values_ebm[sample_ind:sample_ind+1,:]指定了要疊加的 SHAP 值,這裡選擇了一個特定的樣本索引sample_ind。
SHAP 值與特徵值的散點圖
我們還繪製了 “RM” 特徵的 SHAP 值與其特徵值的散點圖,以觀察兩者之間的關係。
shap.plots.scatter(shap_values_xgb[:,"RM"])
內容解密:
shap.plots.scatter用於繪製 SHAP 值的散點圖。shap_values_xgb[:,"RM"]指定了要繪製的 SHAP 值,這裡是所有樣本的 “RM” 特徵的 SHAP 值。
分類別模型的 SHAP 分析
對於分類別問題,我們使用了一個簡單的邏輯迴歸模型和一個 XGBoost 分類別器來進行比較分析。
model_adult = sklearn.linear_model.LogisticRegression(max_iter=10000)
model_adult.fit(X_adult, y_adult)
內容解密:
LogisticRegression是 scikit-learn 中的邏輯迴歸模型類別,用於二分類別問題。max_iter=10000增加了迭代次數以保證模型的收斂。
使用 SHAP 分析邏輯迴歸模型的預測結果
我們計算了邏輯迴歸模型的 SHAP 值,並繪製了相關的圖表。
explainer = shap.Explainer(model_adult_proba, background_adult)
shap_values_adult = explainer(X_adult[:1000])
shap.plots.scatter(shap_values_adult[:,"Age"])
內容解密:
shap.Explainer用於建立一個 SHAP 的直譯器,傳入模型預測機率的函式model_adult_proba和背景資料集background_adult。explainer(X_adult[:1000])用於計算前 1000 個樣本的 SHAP 值。
XGBoost 分類別器的 SHAP 分析
最後,我們訓練了一個 XGBoost 分類別器,並使用 SHAP 分析了其預測結果。
model = xgboost.XGBClassifier(n_estimators=100, max_depth=2).fit(X_adult, y_adult)
explainer = shap.Explainer(model, background_adult)
shap_values = explainer(X_adult)
shap.plots.bar(shap_values)
內容解密:
XGBClassifier是 XGBoost 函式庫中的分類別模型類別。shap.Explainer和explainer(X_adult)用於計算所有樣本的 SHAP 值。shap.plots.bar(shap_values)繪製了平均絕對 SHAP 值的柱狀圖,用於評估特徵的重要性。
瞭解整合模型的解釋能力:以SHAP與CatBoost為例
在機器學習領域中,模型的解釋能力已成為評估模型好壞的重要指標之一。特別是在使用整合模型(如梯度提升機)時,如何解讀模型的預測結果變得至關重要。本篇文章將探討如何使用SHAP(SHapley Additive exPlanations)與CatBoost來解釋整合模型的預測結果。
SHAP值解析
SHAP是一種用於解釋機器學習模型預測結果的方法。它透過計算每個特徵對預測結果的貢獻度(SHAP值),來幫助我們瞭解模型的決策過程。
圖表解析
在圖5-20中,我們觀察到資本利得(capital gain)和資本損失(capital loss)這兩個特徵的SHAP值變化較大,表明這兩個特徵的實際值變化對預測結果有著較大的影響。
shap.plots.heatmap(shap_values[:1000])
內容解密:
- 熱圖展示:此圖用於展示前1000個樣本的SHAP值,幫助我們瞭解不同特徵在不同樣本上的貢獻度。
- SHAP值變化:透過觀察SHAP值的變化,我們可以發現哪些特徵對預測結果有著較大的影響。
在圖5-21中,我們關注了「關係」(relationship)這一特徵的SHAP值變化。結果顯示,在不同的樣本例項中,該特徵的SHAP值存在明顯的變化。
shap.plots.scatter(shap_values[:,"Age"])
內容解密:
- 散點圖展示:此圖用於展示年齡(Age)特徵的SHAP值與其實際值之間的關係。
- 非線性關係:透過觀察散點圖,我們可以發現年齡與其SHAP值之間存在嚴格的非線性關係,這是由極端梯度提升分類別器模型所產生的。
使用CatBoost進行模型解釋
CatBoost是一種能夠自動處理類別型特徵的梯度提升函式庫。在本例中,我們將使用CatBoost與SHAP來生成模型的解釋。
程式碼範例
import catboost
from catboost.datasets import *
import shap
# 載入資料集
X, y = shap.datasets.boston()
# 建立CatBoost迴歸模型
model = CatBoostRegressor(iterations=300, learning_rate=0.1, random_seed=123)
model.fit(X, y, verbose=False, plot=False)
# 建立SHAP直譯器
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# 視覺化第一個預測結果的解釋
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
內容解密:
- 模型建立:首先,我們使用CatBoost迴歸模型對波士頓房價資料集進行訓練。
- SHAP解釋:接著,我們使用SHAP對模型的預測結果進行解釋,生成每個特徵的SHAP值。
- 視覺化:最後,我們使用力圖(force plot)來視覺化第一個預測結果的解釋,幫助我們瞭解哪些特徵對預測結果有著較大的貢獻。
使用CatBoost進行員工許可權預測與模型可解釋性分析
在軟體開發部門中,員工需要特定的許可權來完成工作任務。傳統的手動許可權授予過程可能導致員工遭遇阻礙,且缺乏自動化的機制來授予必要的軟體系統存取權。本案例研究旨在利用歷史資料建模,以確定員工的許可權需求。目標變數為ACTION,當資源獲準時為1,否則為0。其餘特徵用於預測目標變數。
資料準備與模型訓練
首先,我們使用CatBoost提供的Amazon資料集進行分析。
from catboost.datasets import amazon
train_df, test_df = amazon()
y_train = train_df.ACTION
X_train = train_df.drop('ACTION', axis=1)
cat_features = list(range(0, X_train.shape[1]))
內容解密:
- 資料集載入:使用
catboost.datasets.amazon()載入Amazon資料集,該資料集包含員工許可權相關的特徵和目標變數ACTION。 - 目標變數與特徵分離:將
ACTION列作為目標變數y_train,其餘列作為特徵X_train。 - 類別特徵識別:將所有特徵視為類別特徵,儲存在
cat_features列表中。
接下來,我們訓練一個CatBoost分類別器。
from catboost import CatBoostClassifier
model = CatBoostClassifier(iterations=300, learning_rate=0.1, random_seed=12)
model.fit(X_train, y_train, cat_features=cat_features, verbose=False, plot=False)
內容解密:
- 模型初始化:建立一個CatBoost分類別器,設定迭代次數為300,學習率為0.1,並固定隨機種子以確保結果可重現。
- 模型訓練:使用訓練資料擬合模型,指定類別特徵並關閉詳細輸出和繪圖。
預測與模型解釋
訓練完成後,我們可以使用模型進行預測並解釋結果。
preds_class = model.predict(X_train)
preds_proba = model.predict_proba(X_train)
preds_raw = model.predict(X_train, prediction_type='RawFormulaVal')
內容解密:
- 類別預測:使用
predict方法獲得預測的類別標籤。 - 機率預測:使用
predict_proba方法獲得每個類別的預測機率。 - 原始預測值:使用
predict方法並指定prediction_type='RawFormulaVal'獲得原始預測值(log odds)。
對於第一筆和第91筆記錄,我們可以計算其預測機率和原始預測值。
import numpy as np
np.log(0.9964/(1-0.9964))
np.exp(5.62)/(1+np.exp(5.62))
內容解密:
- log odds計算:計算第一筆記錄的log odds值,反映其屬於類別1的對數勝算比。
- 機率轉換:展示如何將原始預測值轉換為機率。
SHAP值與模型可解釋性
為了進一步理解模型的預測結果,我們使用SHAP(SHapley Additive exPlanations)進行模型解釋。
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(Pool(X_train, y_train, cat_features=cat_features))
shap.force_plot(explainer.expected_value, shap_values[0,:], X_train.iloc[0,:])
內容解密:
- SHAP直譯器建立:使用
shap.TreeExplainer為CatBoost模型建立一個SHAP直譯器。 - SHAP值計算:計算訓練資料的SHAP值,用於解釋模型的預測結果。
- 力圖繪製:使用
shap.force_plot繪製第一筆記錄的力圖,直觀展示各特徵對預測結果的影響。
使用SHAP進行模型可解釋性分析
在機器學習領域中,模型的預測能力和可解釋性同等重要。SHAP(SHapley Additive exPlanations)是一種用於解釋模型預測結果的技術,能夠幫助理解特徵對模型輸出的影響。本文將介紹如何使用SHAP來分析不同整合模型的預測結果,包括CatBoost和LightGBM。
使用SHAP分析整合模型
整合模型(如梯度提升決策樹)因其優異的預測效能而廣泛應用於各類別機器學習任務中。然而,這些模型的複雜性往往使得理解其預測結果變得困難。SHAP透過將每個特徵的貢獻度量化,能夠有效地解釋模型的預測結果。
SHAP與CatBoost分類別器
CatBoost是一種梯度提升決策樹的實作,特別適用於處理具有大量類別特徵的資料集。結合SHAP,可以深入理解CatBoost模型的預測邏輯。
程式碼範例
model = CatBoostClassifier(loss_function='MultiClass', iterations=300, learning_rate=0.1, random_seed=123)
model.fit(X, y, cat_features=cat_features, verbose=False, plot=False)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(Pool(X, y, cat_features=cat_features))
shap.summary_plot(shap_values[0], X)
內容解密:
- CatBoostClassifier初始化:建立一個CatBoost分類別器例項,指定損失函式為多類別分類別,迭代次數為300,學習率為0.1,並設定隨機種子以保證結果的可重現性。
- 模型訓練:使用訓練資料集
X和y訓練模型,並傳入類別特徵的索引cat_features。 - SHAP直譯器建立:利用
shap.TreeExplainer建立一個SHAP直譯器,以解析模型的預測邏輯。 - SHAP值計算:透過直譯器計算每個樣本的SHAP值,瞭解各特徵對預測結果的貢獻度。
- 結果視覺化:使用
shap.summary_plot繪製SHAP值的匯總圖,直觀展示各特徵的重要性。
CatBoost超引數調優
CatBoost提供了多個超引數供使用者調整,以最佳化模型效能。表5-8列出了部分重要的超引數及其作用。
使用SHAP進行LightGBM模型解釋
LightGBM是另一種高效的梯度提升決策樹實作,尤其在處理混合資料型別時表現出色。與CatBoost類別似,LightGBM也可以透過SHAP進行模型解釋。
程式碼範例
model = lgb.train(params, d_train, 10000, valid_sets=[d_test], early_stopping_rounds=50, verbose_eval=1000)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
shap.force_plot(explainer.expected_value[1], shap_values[1][0,:], X_display.iloc[0,:])
內容解密:
- LightGBM模型訓練:使用LightGBM的訓練函式訓練模型,並設定相關引數,如最大迭代次數、早停輪數等。
- SHAP直譯器建立:同樣使用
shap.TreeExplainer建立SHAP直譯器。 - SHAP值計算:計算測試資料集的SHAP值。
- Force Plot繪製:利用
shap.force_plot繪製某個樣本的SHAP值力圖,直觀展示各特徵如何影響該樣本的預測結果。
LightGBM超引數
LightGBM提供了豐富的超引數供使用者調整,以適應不同的資料特性和任務需求。表5-9詳細介紹了部分關鍵超引數的功能。