为什么我每次调用 shap.plots.beeswarm 时 shap 值都在变化?
Why are shap values changing every time I call shap.plots.beeswarm?
所以这是我使用 shap 的代码:
因为我只绘制了相同形状值的三倍,所以我希望这三个图是相同的。然而,它一直在变化。经过一些研究,似乎每次调用时顶部都会出现一个新值,但为什么呢?是 shap 中的错误吗?
编辑 1:我尝试在 shap.plots.beeswarm
的每次调用之间加载相同的模型,但结果仍然不同。
基于this github issue,问题与“xx 其他特征的总和”变量的创建有关。这个变量是临时的,即你只用它一次来绘图(如果你再次 运行 shap.plots.beeswarm 结果是错误的)。所以我猜你的问题的解决方案是“不要运行它多次并且没有问题”。
感谢@jared_mamrot,我找到了解决方案。
我只需要更改 shap 函数 beeswarm 的代码即可:
Line 57 : shap_exp = shap_values
替换为:
Line 57 : shap_exp = copy.deepcopy(shap_values)
确保在代码顶部导入库:
import copy
编辑:如果您不想更改源代码,只需在像这样调用 beeswarm 时提供 shap_values 的深层副本:
import copy
shap.plots.beeswarm(copy.deepcopy(shap_values), max_display=15)
所以这是我使用 shap 的代码:
因为我只绘制了相同形状值的三倍,所以我希望这三个图是相同的。然而,它一直在变化。经过一些研究,似乎每次调用时顶部都会出现一个新值,但为什么呢?是 shap 中的错误吗?
编辑 1:我尝试在 shap.plots.beeswarm
的每次调用之间加载相同的模型,但结果仍然不同。
基于this github issue,问题与“xx 其他特征的总和”变量的创建有关。这个变量是临时的,即你只用它一次来绘图(如果你再次 运行 shap.plots.beeswarm 结果是错误的)。所以我猜你的问题的解决方案是“不要运行它多次并且没有问题”。
感谢@jared_mamrot,我找到了解决方案。 我只需要更改 shap 函数 beeswarm 的代码即可:
Line 57 : shap_exp = shap_values
替换为:
Line 57 : shap_exp = copy.deepcopy(shap_values)
确保在代码顶部导入库:
import copy
编辑:如果您不想更改源代码,只需在像这样调用 beeswarm 时提供 shap_values 的深层副本:
import copy
shap.plots.beeswarm(copy.deepcopy(shap_values), max_display=15)