我正在使用随机森林进行二元分类,并try SHAP来解释模型预测.

但是,我想将带有值的SHAP local解释图转换 for each 实例的pandas数据帧.

这里有没有人可以帮我将SHAP local解释导出到每个实例的pandas dataframe?

我知道SHAPASH有.to_pandas()种方法,但在SHAP中找不到类似的方法

我根据SO post heretry 了下面的方法,但没有效果

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)

我希望我的输出如下.在这里,负号表示类别0的功能贡献,正值表示类别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

如果你想把结果放在数据库中:

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

或者,如果您希望一切按行排列:

pd.DataFrame(
    np.c_[sv.base_values, sv.values],
    columns = ["bv"] + list(X.columns)
)

Python相关问答推荐

为什么tkinter框架没有被隐藏?

用Python解密Java加密文件

大小为M的第N位_计数(或人口计数)的公式

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

如何在Python脚本中附加一个Google tab(已经打开)

Django—cte给出:QuerySet对象没有属性with_cte''''

如何合并两个列表,并获得每个索引值最高的列表名称?

用渐近模计算含符号的矩阵乘法

CommandeError:模块numba没有属性generated_jit''''

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

GPT python SDK引入了大量开销/错误超时

我什么时候应该使用帆布和标签?

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

利用SCIPY沿第一轴对数组进行内插

随机森林n_估计器的计算

用0填充没有覆盖范围的垃圾箱

文本溢出了Kivy的视区

Pandas 删除只有一种类型的值的行,重复或不重复

如何在基于时间的数据帧中添加计算值

如何有效地计算所有输出相对于参数的梯度?