常见问题解答#
你有问题,太多了。我们有答案。
为什么当我运行show(...)时没有任何反应?
Interpret 的可视化设计最适合在类似 Jupyter notebook 的环境中运行(如 Jupyter notebook、VS Code、Colab 等)。如果您从命令行脚本运行 show(),可能无法直接渲染可视化内容——请检查打印的控制台输出以获取在浏览器中打开的链接。
默认情况下,Interpret 使用 Plotly Dash 在本地 Web 服务器上托管可视化。在某些受限环境中,不允许应用程序托管本地 Web 服务器,我们直接将可视化嵌入到笔记本中。如果 Interpret 没有自动检测并切换渲染模式,您可以使用以下代码在受限环境中手动嵌入可视化:
from interpret.provider import InlineProvider
from interpret import set_visualize_provider
set_visualize_provider(InlineProvider())
InlineProvider 比 Interpret 中的默认渲染逻辑兼容更广泛的环境。但是,警告:在调用 show() 时,您可能会遇到性能较慢的情况,并且目前不支持使用 InlineProvider 的完整 interpret 仪表板。
如何生成完整的解释仪表板而不是小的单一解释下拉菜单?
确保你传入的是一个要显示的解释列表。请注意,你也可以传入一个包裹在列表中的单个解释。例如:
from interpret import show
show(ebm_local) # Returns small dropdown
show([ ebm_local ]) # Produces interpret dashboard
如何提取用于可视化解释的基础数据?
interpret 中的每个解释对象都支持一个 .data() 方法,该方法返回用于生成可视化的基础数据的 JSON 兼容字典。大多数解释包含许多可视化——例如,explain_local() 调用将为传递给函数的每个单独实例生成可视化。data 接受一个参数,该参数索引解释对象并返回用于该单独解释的数据(例如:explanation.data(0) 返回用于对象中第一个可视化的数据)。要返回用于所有可视化的数据,请使用 -1 键(explanation.data(-1))。
如何将解释图保存到磁盘?
每个解释图都是一个Plotly对象,并且可以通过UI中的相机图标保存到磁盘:

或者使用Plotly静态图像导出工具。您可以通过以下方式访问单个Plotly图表:
ebm_explanation = ebm.explain_global()
plotly_fig = ebm_explanation.visualize(0)
例如,将全局解释中的每个图表保存到磁盘上的“images”目录中:
ebm_global = ebm.explain_global()
for index, value in enumerate(ebm.feature_groups_):
plotly_fig = ebm_global.visualize(index)
plotly_fig.write_image(f"images/fig_{index}.png")
每个图表底部的“density”是什么意思?
密度是一个描述该特征数据分布的直方图(使用传递给explain_*方法的任何数据进行估计)。在可视化解释时,了解特征空间每个区域中有多少数据通常非常有用——模型在大样本和小样本下的表现可能非常不同。
Interpret 是否支持图像和文本数据的可解释性?
还没有,但请关注未来的发布!
如何仅安装一个解释器而不安装任何其他依赖项?
这可以通过直接从interpret-core基础包安装来实现,适用于高级用户。例如,如果您想安装EBM而不包含其他解释器,请运行以下代码块:
pip install interpret-core[required,ebm]
interpret-core 提供的各种安装选项在 interpret-core 的 setup.py 文件中指定。通常建议所有安装都使用 required 标签。
为什么图表中没有显示特征名称?
如果你正在将一个numpy数组传递给解释器,请确保设置了feature_names属性(可以通过在初始化时传递,或者在调用解释函数之前手动设置)。当使用pandas数据框时,这应该会自动工作。
EBM
我应该调整EBMs的参数吗(如果是,我应该调整哪些参数)?
一般来说,EBMs的默认参数在大多数问题上应该表现得相当不错。我们建议使用默认参数训练模型,并在参数调优之前查看学习到的函数以捕捉异常行为——通常,这些图表有助于指示需要调整哪些参数。以下是一些一般性建议:
为了生成最佳模型,我们通常建议将
outer_bags和inner_bags各自设置为25或更多。这将显著减慢算法的训练时间,并且在较大的数据集上可能不可行,但往往会产生更平滑的图形,并略微提高准确性。如果您认为模型可能过拟合(例如:训练和测试误差之间的差异较大,或图表中的高度不稳定性),请考虑以下选项:
对于较小的数据集,减少
max_bins,以便将更多数据聚集在一起。通过减少
early_stopping_rounds和增加early_stopping_tolerance,使早期停止更加激进。
相反,对于显得过于保守的欠拟合模型,你可以采取与之前建议相反的措施——增加
max_bins并使早停不那么激进。增加允许的总max_rounds也可能有所帮助。如果许多包含的交互项是显著的(例如,学习大值或在整体重要性列表中排名较高),那么默认包含的10个交互项可能不足以满足您的数据集。考虑增加这个数字。
对于一般调优,我们建议扫描
max_bins,值在32到1024之间,以及max_leaves从2到5。这些改进通常是边际的,但在某些数据集上可能会有显著帮助。
EBM图表上的误差条是什么意思,它们是如何计算的?
误差条是对特征空间每个区域中模型不确定性的粗略估计。较大的误差条意味着学习到的函数可能会随着训练数据的微小变化而发生显著变化,并表明在该区域对模型的解释应持更多怀疑态度。
误差条的大小通常由两个因素决定——特征空间该区域中的训练数据量,以及学习模型的固有不确定性。例如,考虑从成人收入数据集中学习的“年龄”特征的图表:

在图的右侧(70岁以上),模型预测变得不稳定,误差条变得更大以表示这种不确定性。从底部的密度图中,我们可以看到这可能是由于该区域的样本数量较少。
误差估计是通过bagging方法得出的。默认情况下,EBM在训练数据集的随机85%子样本上训练8个不同的mini-EBM。训练的mini-EBM数量由outer_bags参数控制,采样的数据比例为1 - validation_size。这些模型的输出被平均在一起以生成最终的EBM,并且图中每个区域的估计值的标准偏差作为误差条发布。您可以通过任何EBM上的standard_deviations_属性以编程方式访问误差条的大小。
您有EBM项的显著性p值吗?
目前还没有,尽管这是一个活跃的研究领域。如果您有兴趣讨论这个问题或帮助我们解决它,请联系我们!
分类和回归中的EBMs有什么区别?
差异主要类似于线性回归和逻辑回归之间的差异。与逻辑回归类似,EBMs需要通过使用逻辑链接函数来适应分类设置。
之所以使用此链接是因为概率不是可加的——两个特征不能各自为预测贡献+0.6的概率,因为最终的1.2概率是未定义的。逻辑链接允许模型在logit空间中训练——每个特征的贡献可以是可加的——并在预测时转换回有界的概率。因此,在解释ExplainableBoostingClassifier的图表时,重要的是要记住y轴的值是在logits中。形状的解释通常是相同的——正值推动预测向该类的正标签方向移动。然而,因为这些图表是在对数空间中,+1或+2的差异是非常显著的。
在回归设置中,解释更为简单:y轴的值直接以目标的单位表示。例如,如果您正在训练房价模型,每个图的y轴将准确表示该特征对模型最终价格的贡献有多少美元——无需额外的转换!
如何编辑EBM模型以移除不需要的学习效果?
最终的EBM模型以numpy数组的形式存储在terms_scores_属性中。索引这个数组将返回EBM中特定项学习到的函数——例如,ebm.terms_scores_[0]将返回第一个项的数组。直接编辑这个数组将改变模型对该图相应区域的所有预测。不久将引入一个更精细控制的API!
我们能否对单个EBM项强制执行单调性?
可以通过两种方法在EBM中强制实施单个项的单调性:
通过在
ExplainableBoostingClassifier或ExplainableBoostingRegressor构造函数中设置monotone_constraints。此参数是一个整数列表,其中每个整数对应于相应特征的单调性约束。值为-1表示强制递减单调性,0表示不强制单调性,1表示强制递增单调性。例如,monotone_constraints=[1, -1, 0]将对第一个特征强制递增单调性,对第二个特征强制递减单调性,对第三个特征不强制单调性。通过对图进行后处理。我们通常建议在每个图输出上使用等渗回归来强制正或负单调性。这可以通过在EBM对象上调用
monotonize方法来实现。 后处理是推荐的方法,因为它防止模型通过学习其他高度相关特征中的非单调效应来补偿单调性约束。
我们如何序列化EBMs并在生产中使用它们?
为了完整的功能,我们建议使用pickle来序列化和反序列化EBM对象。解释可以通过data方法序列化为JSON。
感谢Github用户@MainRo,现在有一个ebm2onnx包可用,它可以通过ONNX兼容的运行时在EBM对象上实现高速推理。在这里查看包:SoftAtHome/ebm2onnx,并通过pip install ebm2onnx从PyPi安装。
支持
我需要帮助,如何联系?
对于大多数问题,我们建议提出一个GitHub问题。在GitHub上解决问题意味着像您这样的其他用户可以从相同的解决方案中受益。对于其他任何事情(或需要保密的问题),请随时发送电子邮件至interpret@microsoft.com。
我有一个好主意,我该如何贡献?
如果您有想要提交的代码,请确保您阅读了贡献指南,并向我们发送一个拉取请求。
如果您想请求新功能或讨论任何想法,只需提出一个GitHub issue。