我正在使用随机森林模型和神经网络进行二元分类,其中我使用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])

这生成了如下所示的绘图

enter image description here

然而,我想把它导出到dataframe,我该怎么做呢?

我希望我的输出如下所示.我想导出完整的数据帧.你能帮我吗?

enter image description here

推荐答案

让我们做一个小实验:

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

这是你感兴趣的,因为这是形状值相加的基础.

此外:

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

将给出提示sv是一个由2个对象组成的列表,它们很可能是10的形状值,必须是对称的(因为向1移动的对象向0移动的量完全相同,但符号相反).

因此:

sv1 = sv[1]

现在,您可以将其打包为所需的格式:

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

Q: How do I know?
A: Read docs and source code.

Python相关问答推荐

发生异常:TclMessage命令名称无效.!listbox"

如何在给定的条件下使numpy数组的计算速度最快?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

Stacked bar chart from billrame

如何设置视频语言时上传到YouTube与Python API客户端

将输入聚合到统一词典中

如何在turtle中不使用write()来绘制填充字母(例如OEG)

让函数调用方程

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

OpenGL仅渲染第二个三角形,第一个三角形不可见

pandas fill和bfill基于另一列中的条件

如何在Python Pandas中填充外部连接后的列中填充DDL值

如何在Gekko中处理跨矢量优化

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

高效生成累积式三角矩阵

以极轴表示的行数表达式?

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

如何在Python中创建仅包含完整天数的月份的列表

如果列包含空值,则PANAS查询不起作用

按最大属性值Django对对象进行排序