使用 SHAP 的 Tkinter 回调异常

Posted

技术标签:

【中文标题】使用 SHAP 的 Tkinter 回调异常【英文标题】:Exception in Tkinter callback using SHAP 【发布时间】:2020-09-16 22:56:25 【问题描述】:

我正在尝试在 Python 中绘制一些 SHAP plots,以更深入地了解我的机器学习模型的输出。这是我在 for 循环中调用的方法:

def plotAndSaveSHAPSummary(model,train_data,x_train,pathToSHAPPlots):
    shap_values = model.get_feature_importance(train_data, type='ShapValues')
    expected_value = shap_values[0,-1]
    shap_values = shap_values[:,:-1]

    shap.summary_plot(shap_values,x_train,max_display=20,show=False)
    plt.savefig(pathToSHAPPlots+'/SHAP Plots/SHAP_Plot'+str(counter)+'.png',dpi=300,bbox_inches='tight')
    plt.clf()

绘图按预期保存到磁盘,但每次调用 savefig 方法后,我都会收到以下错误消息:

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\PathTo\Anaconda\Lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "D:\PathTo\Anaconda\Lib\tkinter\__init__.py", line 749, in callit
    func(*args)
  File "D:\PathTo\Anaconda\lib\site-packages\matplotlib\backends\_backend_tk.py", line 270, in idle_draw
    self.draw()
  File "D:\PathTo\Anaconda\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "D:\PathTo\Anaconda\lib\site-packages\matplotlib\backends\backend_agg.py", line 393, in draw
    self.figure.draw(self.renderer)
  File "D:\PathTo\Anaconda\lib\site-packages\matplotlib\backend_bases.py", line 1535, in _draw
    def _draw(renderer): raise Done(renderer)
matplotlib.backend_bases._get_renderer.<locals>.Done: <matplotlib.backends.backend_agg.RendererAgg object at 0x000002066B288288>

任何想法如何摆脱这个异常?

【问题讨论】:

我最近只使用 matplotlib 遇到了同样的错误,并通过在 savefig 调用之前添加一个小的 plt.pause(1e-13) 来解决它(hackily)。我不知道为什么会这样,但假设 matplotlib 代码中的某处存在竞争条件。 【参考方案1】:

在更新其中一个库(可能是 matplot 库)后,我也开始收到此错误。评论中描述的使用plt.pause 的建议有效,但它在内部调用plt.show(),这对我来说是不可接受的。我最终在savefig 之前添加了canvas.start_event_loop

import sys

def _save(self, filename: str) -> None:
   fig1 = plt.gcf()
   fig1.set_size_inches(6, 2.8)
   plt.draw()
   fig1.subplots_adjust(left=0.20)
   fig1.canvas.start_event_loop(sys.float_info.min) #workaround for Exception in Tkinter callback
   fig1.savefig(self.dst_dir + '/' + filename + '.png', dpi=220, bbox_inches='tight')
   fig1.clf()
   plt.close()

【讨论】:

【参考方案2】:
plt.ioff()

帮我搞定了

【讨论】:

【参考方案3】:

我也有同样的问题。我在 Python 中有一个简单的脚本来制作一个过去可以正常工作的图表,但现在当它尝试保存文件时,会显示确切的警告。我花了很多时间试图弄清楚发生了什么,因为错误是突然的,并且消息不是很丰富。

我发现当我在savefig 中省略bbox_inches 参数时它会消失。

我注意到安装python-tk 后开始出现错误,但卸载它并没有帮助。

[Mariu 的回答]plt.ioff() 对我不起作用。

[nan 的回答]fig1.canvas.start_event_loop(sys.float_info.min) 确实有效。

【讨论】:

【参考方案4】:

我在使用 matplot lib 保存多个绘图时遇到了同样的问题。保存数字后添加 plt.close() 对我有用。

【讨论】:

以上是关于使用 SHAP 的 Tkinter 回调异常的主要内容,如果未能解决你的问题,请参考以下文章

pyqt tkinter哪个好用

SHAP 异常:TreeExplainer 中的可加性检查失败

无法在终端执行使用 tkinter 和 py2app 创建的 Mac 应用程序

Python - 从Tkinter回调返回

Tkinter 字符串回调

更改 Tkinter 列表框选择时获取回调?