如何将 SHAP 本地解释导出到数据框?
How to export SHAP local explanations to dataframe?
我正在使用随机森林进行二进制 class化,并尝试使用 SHAP 来解释模型预测。
但是,我想将带有值的 SHAP 局部解释图转换为每个实例的 pandas 数据框。
这里有人可以帮助我将 SHAP 本地解释导出到每个实例的 pandas 数据帧吗?
我知道 SHAPASH 有 .to_pandas()
方法,但在 SHAPA
中找不到类似的东西
我根据 SO post here 尝试了类似下面的方法,但没有帮助
feature_names = shap_values.feature_names
shap_df = pd.DataFrame(shap_values.values, columns=feature_names)
vals = np.abs(shap_df.values).mean(0)
shap_importance = pd.DataFrame(list(zip(feature_names, vals)), columns=['col_name', 'feature_importance_vals'])
shap_importance.sort_values(by=['feature_importance_vals'], ascending=False, inplace=True)
我希望我的输出如下所示。这里,负号表示对 class 0 的特征贡献,正值表示对 class 1
的特征贡献
subject_id Feature importance value (contribution)
1 F1 31
1 F2 27
1 F3 20
1 F5 - 10
1 F9 - 29
如果您有这样的模型:
import xgboost
import shap
import warnings
warnings.filterwarnings("ignore")
# train XGBoost model
X,y = shap.datasets.boston()
model = xgboost.XGBRegressor().fit(X, y)
# explain the model's predictions using SHAP values
# (same syntax works for LightGBM, CatBoost, and scikit-learn models)
background = shap.maskers.Independent(X, max_samples=100)
explainer = shap.Explainer(model, background, algorithm="tree")
sv = explainer(X)
您可以像这样分解结果:
sv.base_values[0]
22.342787810446044
sv.values[0]
array([-7.68297079e-01, -4.38205232e-02, 3.46814548e-01, -4.06731364e-03,
-3.17875379e-01, -5.37296545e-01, 2.68567768e-01, -1.30198611e+00,
-4.83524088e-01, -4.39375216e-01, 2.94188969e-01, 2.43096180e-02,
4.63890554e+00])
model.predict(X.iloc[[0]])
array([24.019339], dtype=float32)
正好等于:
sv.base_values[0] + sum(sv.values[0])
24.01933200249436
如果你想把结果放到 Pandas df:
pd.DataFrame(sv.values[0], index = X.columns)
0
CRIM -0.768297
ZN -0.043821
INDUS 0.346815
CHAS -0.004067
NOX -0.317875
RM -0.537297
AGE 0.268568
DIS -1.301986
RAD -0.483524
TAX -0.439375
PTRATIO 0.294189
B 0.024310
LSTAT 4.638906
或者,如果您希望一切都安排妥当row-wise:
pd.DataFrame(
np.c_[sv.base_values, sv.values],
columns = ["bv"] + list(X.columns)
)
我正在使用随机森林进行二进制 class化,并尝试使用 SHAP 来解释模型预测。
但是,我想将带有值的 SHAP 局部解释图转换为每个实例的 pandas 数据框。
这里有人可以帮助我将 SHAP 本地解释导出到每个实例的 pandas 数据帧吗?
我知道 SHAPASH 有 .to_pandas()
方法,但在 SHAPA
我根据 SO post here 尝试了类似下面的方法,但没有帮助
feature_names = shap_values.feature_names
shap_df = pd.DataFrame(shap_values.values, columns=feature_names)
vals = np.abs(shap_df.values).mean(0)
shap_importance = pd.DataFrame(list(zip(feature_names, vals)), columns=['col_name', 'feature_importance_vals'])
shap_importance.sort_values(by=['feature_importance_vals'], ascending=False, inplace=True)
我希望我的输出如下所示。这里,负号表示对 class 0 的特征贡献,正值表示对 class 1
的特征贡献subject_id Feature importance value (contribution)
1 F1 31
1 F2 27
1 F3 20
1 F5 - 10
1 F9 - 29
如果您有这样的模型:
import xgboost
import shap
import warnings
warnings.filterwarnings("ignore")
# train XGBoost model
X,y = shap.datasets.boston()
model = xgboost.XGBRegressor().fit(X, y)
# explain the model's predictions using SHAP values
# (same syntax works for LightGBM, CatBoost, and scikit-learn models)
background = shap.maskers.Independent(X, max_samples=100)
explainer = shap.Explainer(model, background, algorithm="tree")
sv = explainer(X)
您可以像这样分解结果:
sv.base_values[0]
22.342787810446044
sv.values[0]
array([-7.68297079e-01, -4.38205232e-02, 3.46814548e-01, -4.06731364e-03,
-3.17875379e-01, -5.37296545e-01, 2.68567768e-01, -1.30198611e+00,
-4.83524088e-01, -4.39375216e-01, 2.94188969e-01, 2.43096180e-02,
4.63890554e+00])
model.predict(X.iloc[[0]])
array([24.019339], dtype=float32)
正好等于:
sv.base_values[0] + sum(sv.values[0])
24.01933200249436
如果你想把结果放到 Pandas df:
pd.DataFrame(sv.values[0], index = X.columns)
0
CRIM -0.768297
ZN -0.043821
INDUS 0.346815
CHAS -0.004067
NOX -0.317875
RM -0.537297
AGE 0.268568
DIS -1.301986
RAD -0.483524
TAX -0.439375
PTRATIO 0.294189
B 0.024310
LSTAT 4.638906
或者,如果您希望一切都安排妥当row-wise:
pd.DataFrame(
np.c_[sv.base_values, sv.values],
columns = ["bv"] + list(X.columns)
)