SHAP图,是一种根据博弈论方法来解释机器学习模型的方法
具体可以参考:https://zhuanlan.zhihu.com/p/441302127
一直都是用的未标准化的数据去训练模型,并且画dependence plot这些。
但是今天用了标准化后的数据训练模型,然后画dependence plot的时候,得到了下图这种图,显然是不对的。于是简单研究了shap返回结果
#x_trains_M是x_train数据标准化后的结果
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(x_trains_M) # 传入特征矩阵X,计算SHAP值
shap_interaction_values = explainer.shap_interaction_values(x_trains_M)
y_base = explainer.expected_value
fig = shap.summary_plot(shap_values, x_trains_M, max_display = 30, show = False)
类似summary_plot,不会太受标准化的影响,但是dependence plot是在反映特征值对结果影响,因此特征值被标准化后,会导致横轴发生变化。打开上述代码生成的shap_values 和shap_interaction_values ,会发现其实每一列y是与特征对应的,每一行x也是与输入特征对应的,因此[x, y]对应着训练集中的一个特征的值。
所以要用标准化前的数据与标准化后得到的shap_values,进行散点图绘图,即可得到dependence plot。此处sofa代表第一个特征,x_trains是标准化前的数据
plt.figure()
plt.scatter(x_trains["sofa"], shap_values[:,0])
plt.axhline(y=0, color="red",linestyle='-')