使用 SHAP 使機(jī)器學(xué)習(xí)模型變的可解釋??!
SHAP 是一種解釋機(jī)器學(xué)習(xí)模型預(yù)測(cè)結(jié)果的方法,它基于博弈論中的 Shapley 值理論。
它通過(guò)計(jì)算每個(gè)特征對(duì)模型輸出的貢獻(xiàn)度,幫助我們理解模型的決策過(guò)程。
SHAP 適用于各種類型的機(jī)器學(xué)習(xí)模型,使得黑盒模型(如深度神經(jīng)網(wǎng)絡(luò)、隨機(jī)森林等)的預(yù)測(cè)更加透明、可解釋。
核心概念
- Shapley 值
源自博弈論的 Shapley 值,用于公平地分配合作博弈中各參與者的收益。
在機(jī)器學(xué)習(xí)中,SHAP 通過(guò)計(jì)算每個(gè)特征在不同組合中的邊際貢獻(xiàn),求取其平均值,從而得到該特征的 Shapley 值。這種方法確保了模型解釋的公平性和一致性。 - 可加性解釋模型
SHAP 構(gòu)建了一個(gè)可加性的解釋模型,將模型的預(yù)測(cè)結(jié)果表示為各特征貢獻(xiàn)的線性組合。
這種方法確保了特征貢獻(xiàn)的總和等于模型的預(yù)測(cè)值,從而提供了一種一致且直觀的解釋方式。
SHAP的主要特點(diǎn)
1.一致性
如果模型的特征貢獻(xiàn)增加,那么相應(yīng)的SHAP值也會(huì)增加,確保解釋的合理性。
2.局部解釋
3.全局解釋
通過(guò)對(duì)多個(gè)數(shù)據(jù)點(diǎn)的SHAP值進(jìn)行匯總,提供模型整體行為的洞察。
SHAP的優(yōu)勢(shì)
- 模型無(wú)關(guān)性
SHAP 適用于多種機(jī)器學(xué)習(xí)模型,包括線性模型、樹(shù)模型和深度學(xué)習(xí)模型等。 - 理論基礎(chǔ)
SHAP基于Shapley值,具有堅(jiān)實(shí)的理論支持,確保解釋的公平性和一致性。 - 可視化能力
SHAP提供多種可視化工具,幫助直觀地理解特征對(duì)模型預(yù)測(cè)的影響。
案例分享
下面,我們來(lái)訓(xùn)練一個(gè) XGBoost 模型并計(jì)算 SHAP 值來(lái)解釋每個(gè)特征如何影響預(yù)測(cè)。
首先,我們加載數(shù)據(jù)集(加利福尼亞住房數(shù)據(jù)集)并訓(xùn)練一個(gè) XGBoost 模型
import shap
import xgboost as xgb
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加載加利福尼亞住房數(shù)據(jù)集
california_housing = fetch_california_housing()
X, y = california_housing.data, california_housing.target
feature_names = california_housing.feature_names
X = pd.DataFrame(X, columns=feature_names)
# 拆分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = xgb.XGBRegressor(random_state=42)
model.fit(X_train, y_train)
接下來(lái),計(jì)算訓(xùn)練集上的 SHAP值,并使用 shap.summary_plot 展示了各特征對(duì)模型預(yù)測(cè)的總體影響。
explainer = shap.Explainer(model,X_train)
shap_values = explainer(X_train)
shap.summary_plot(shap_values, X_train, feature_names=feature_names)
下圖按所有樣本的 SHAP 值大小總和對(duì)特征進(jìn)行排序,并使用 SHAP 值顯示每個(gè)特征對(duì)模型輸出的影響的分布。
我們還可以只取每個(gè)特征的 SHAP 值的平均絕對(duì)值來(lái)獲得標(biāo)準(zhǔn)條形圖。
shap.plots.bar(shap_values,show=False)
最后,我們使用 shap.force_plot 展示了單個(gè)樣本的特征貢獻(xiàn),幫助我們理解模型對(duì)該樣本的具體預(yù)測(cè)。
shap.initjs() # 初始化JS以便顯示交互圖
shap.force_plot(explainer.expected_value, shap_values.values[0, :], X_train.iloc[0])