将 SHAP 瀑布图导出到数据框

export SHAP waterfall plot to dataframe

我正在使用随机森林模型和神经网络进行二元分类,其中使用 SHAP 来解释模型预测。我按照教程编写了下面的代码以获得下面显示的瀑布图

row_to_show = 20
data_for_prediction = ord_test_t.iloc[row_to_show]  # use 1 row of data here. Could use multiple rows if desired
data_for_prediction_array = data_for_prediction.values.reshape(1, -1)
rf_boruta.predict_proba(data_for_prediction_array)
explainer = shap.TreeExplainer(rf_boruta)
# Calculate Shap values
shap_values = explainer.shap_values(data_for_prediction)
shap.plots._waterfall.waterfall_legacy(explainer.expected_value[0], shap_values[0],ord_test_t.iloc[row_to_show])

这生成了如下图所示的情节

但是,我想将其导出到数据框,我该怎么做?

我希望我的输出如下所示。我想将其导出为完整的数据框。你能帮帮我吗?

如果我没记错的话,你可以用pandas

做这样的事情
import pandas as pd
    
shap_values = explainer.shap_values(data_for_prediction)
shap_values_df = pd.DataFrame(shap_values)

要获取特征名称,您应该这样做(如果 data_for_prediction 是数据框):

feature_names = data_for_prediction.columns.tolist()
shap_df = pd.DataFrame(shap_values.values, columns=feature_names)

我正在使用它:

def getShapReport(classifier,X_test):
   shap_values = shap.TreeExplainer(classifier).shap_values(X_test)
   shap.summary_plot(shap_values, X_test)
   shap.summary_plot(shap_values[1], X_test)
   return pd.DataFrame(shap_values[1])

它首先显示模型的 shap 值,然后显示每个预测的形状值,最后它 returns 正 class 的数据帧(我在不平衡的上下文中)

它是针对树解释器而不是瀑布,但基本相同。

我们来做个小实验:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from shap import TreeExplainer

X, y = load_breast_cancer(return_X_y=True)
model = RandomForestClassifier(max_depth=5, n_estimators=100).fit(X, y)
explainer = TreeExplainer(model)

这里的explainer是什么?如果你这样做 dir(explainer) 你会发现它有一些方法和属性,其中包括:

explainer.expected_value

您对此很感兴趣,因为这是 SHAP 值相加的基础。

此外:

sv = explainer.shap_values(X)
len(sv)

会提示 sv 是一个由 2 个对象组成的列表,这两个对象很可能是 10 的 SHAP 值,它们必须是对称的(因为什么向 1 移动向 0).

移动完全相同的量,但符号相反

因此:

sv1 = sv[1]

现在您已准备好将其打包为所需格式的所有内容:

df = pd.DataFrame(sv1, columns=X.columns)
df.insert(0, 'bv', explainer.expected_value[1])

:我怎么知道?
A: 阅读文档和源代码。