将 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 个对象组成的列表,这两个对象很可能是 1
和 0
的 SHAP 值,它们必须是对称的(因为什么向 1 移动向 0
).
移动完全相同的量,但符号相反
因此:
sv1 = sv[1]
现在您已准备好将其打包为所需格式的所有内容:
df = pd.DataFrame(sv1, columns=X.columns)
df.insert(0, 'bv', explainer.expected_value[1])
问:我怎么知道?
A: 阅读文档和源代码。
我正在使用随机森林模型和神经网络进行二元分类,其中使用 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 个对象组成的列表,这两个对象很可能是 1
和 0
的 SHAP 值,它们必须是对称的(因为什么向 1 移动向 0
).
因此:
sv1 = sv[1]
现在您已准备好将其打包为所需格式的所有内容:
df = pd.DataFrame(sv1, columns=X.columns)
df.insert(0, 'bv', explainer.expected_value[1])
问:我怎么知道?
A: 阅读文档和源代码。