Shap - 总结图中未显示颜色条

11

显示summary_plot时,色条未显示。

shap.summary_plot(shap_values, X_train)

汇总图

我尝试更改plot_size。当绘图较高时,色条出现了,但非常小-看起来不像应该的样子。

shap.summary_plot(shap_values, X_train, plot_size=0.7)

高维度概览图

这是一个合适的颜色条的示例。 合适的概览图

有人知道是否可以解决这个问题吗?

如何重现:

import pandas as pd
import shap
import sklearn
from sklearn.ensemble import RandomForestRegressor

# a classic housing price dataset
X,y = shap.datasets.boston()

# a simple linear model
model = RandomForestRegressor(max_depth=6, random_state=0, n_estimators=10)
model.fit(X, y)
shap_values = shap.TreeExplainer(model).shap_values(X)
shap.summary_plot(shap_values, X)
在这种情况下,颜色条被显示出来,但是非常小。我选择了这样一个例子,以便更容易地检索数据。

在此情况下,虽然会显示颜色条,但其大小很小。我选择此示例以使检索数据更加轻松。


我正在使用shap==0.40.0和matplotlib==3.5.1。我在问题中添加了一个示例代码,其中显示了颜色条,但它非常小。 - nietoperz21
感谢您提供的示例代码。我无法在matplotlib 3.4.3中复现您的问题。但是,正如链接帖子所建议的那样,Python版本和后端也可能很重要。也许Shap的github上的某个人可以帮助您解决问题? - JohanC
shap的源代码中,有一个对pl.colorbar(..., aspect=1000)的调用。这似乎不是一个现实的值。也许在新的matplotlib版本中它的工作方式不同?你可以尝试一下import matplotlib.pyplot as plt; plt.gcf().axes[-1].set_aspect(30)来改变它的纵横比。 - JohanC
我有完全相同的问题!我的shap和matplotlib版本也是一样的。直到保存图片,我才意识到有颜色条存在。它非常细。 - ethan tenison
5个回答

5

我和你遇到了同样的问题,我发现解决方法是将matplotlib降级至3.4.3版本。看起来SHAP还没有为matplotlib 3.5.1进行优化。


无需降级。 - Sergey Bushmanov

2

我曾遇到类似问题,当时我使用的是max_display=10。以下代码解决了我的问题:

plt.gcf().axes[-1].set_aspect(100)
plt.gcf().axes[-1].set_box_aspect(100)

2
如上所述,看起来在 matplotlib.pyplot 版本 3.5 中颜色条或框的纵横比处理已经发生了改变。但是,您可以进行更正。
  • 使用 shap.summary_plot(..., show=False) 允许修改图表
  • 如上所述,使用 plt.gcf().axes[-1].set_aspect(1000) 设置颜色条的纵横比
  • 然后还要设置颜色条框的纵横比,plt.gcf().axes[-1].set_box_aspect(1000)
这将使结果回到旧状态。如果您想使颜色条更厚,请将纵横比设置为 100。

1
只需使用“auto”纵横比就可以解决问题:
plt.gcf().axes[-1].set_aspect('auto')
plt.tight_layout()
# As mentioned, smaller "box_aspect" value to make colorbar thicker
plt.gcf().axes[-1].set_box_aspect(50) 

shap版本0.40.0;matplotlib版本3.5.1


这些方面的结合对我很有效! - oustella

0

调用plt.colorbar()将会执行:

import xgboost
import shap

X, y = shap.datasets.adult()
model = xgboost.XGBClassifier().fit(X, y)

explainer = shap.Explainer(model, X)
shap_values = explainer(X)

shap.plots.beeswarm(shap_values, show=False, color_bar=False)
plt.colorbar()
plt.show()

enter image description here


嗨,Sergey,对我来说,使用summary_plot没有起作用,并且在图表本身上也没有颜色渐变 - 有什么想法吗? - JED HK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接