应用机器学习的解释技巧-全-

应用机器学习的解释技巧(全)

原文:annas-archive.org/md5/0228e14e6fec9455ecd6a02d2442db25

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

可解释人工智能(XAI)是一个新兴领域,旨在将人工智能(AI)更接近非技术终端用户。XAI 承诺使机器学习(ML)模型透明、可信,并促进 AI 在工业和研究用例中的应用。

这本书结合了工业和学术研究视角的独特混合,旨在获得 XAI 的实用技能。与数据科学、ML、深度学习和 AI 一起工作的 ML/AI 专家将能够利用这本 XAI 实用指南将他们的知识应用于实践,以弥合 AI 与终端用户之间的差距。本书提供了 XAI 的实施和相关方法的动手方法,让您能够迅速投入工作并变得高效。

首先,您将获得对 XAI 及其必要性的概念理解。然后,您将通过利用最先进的方法和框架,获得在 AI/ML 问题解决过程中利用 XAI 的必要实践经验。最后,您将获得将 XAI 推进到下一步并弥合 AI 与终端用户之间现有差距的必要指南。

在本书结束时,您将能够使用 Python 实现 XAI 方法和方案来解决工业问题,解决遇到的关键痛点,并遵循 AI/ML 生命周期的最佳实践。

本书面向的对象

这本书是为那些积极从事机器学习及相关领域的科学家、研究人员、工程师、建筑师和管理人员设计的。一般来说,任何对使用 AI 进行问题解决感兴趣的人都能从这本书中受益。建议您具备 Python、ML、深度学习和数据科学的基础知识。这本书非常适合以下角色的读者:

  • 数据和 AI 科学家

  • AI/ML 工程师

  • AI/ML 产品经理

  • AI 产品负责人

  • AI/ML 研究人员

  • 用户界面和人类计算机交互(HCI)研究人员

一般来说,任何具备 Python 基础知识的 ML 爱好者都将能够阅读、理解和应用从本书中获得的知识。

本书涵盖的内容

第一章可解释性技术的基础概念,提供了对可解释人工智能的必要了解,并帮助您理解其重要性。本章涵盖了与可解释性技术相关的各种术语和概念,这些术语和概念在本书中经常使用。本章还涵盖了人性化的可解释 ML 系统的关键标准以及评估可解释性技术质量的不同方法。

第二章模型可解释性方法讨论了用于解释黑盒模型的多种模型可解释性方法。其中一些方法是模型无关的,一些是模型特定的。一些方法提供全局可解释性,而其他方法提供局部可解释性。本章将向您介绍可用于解释机器学习模型的各种技术,并提供关于选择正确可解释性方法的建议。

第三章数据为中心的方法介绍了数据为中心的 XAI 概念。本章涵盖了各种技术,用于从数据属性、数据量、数据一致性、数据纯净度和从底层训练数据集中生成的可操作见解等方面解释机器学习系统的工作原理。

第四章LIME 用于模型可解释性涵盖了最受欢迎的 XAI 框架之一,即 LIME 的应用。本章讨论了 LIME 算法背后的直觉以及算法的一些重要特性,这些特性使得生成的解释对人类友好。本章还讨论了 LIME 算法的某些优势和局限性,并包含了一个关于如何将 LIME 应用于分类问题的代码教程。

第五章使用 LIME 在机器学习中的实际应用是前一章的扩展,但更专注于 LIME Python 框架在不同类型的数据集上的实际应用,如图像、文本以及结构化表格数据。本章还涵盖了实际代码示例,以展示如何使用 Python LIME 框架获取手头知识。本章还讨论了 LIME 是否适合用于生产级别的机器学习系统。

第六章使用 SHAP 进行模型可解释性着重于理解 SHAP Python 框架在模型可解释性方面的重要性。本章涵盖了 Shapley 值和 SHAP 的直观理解,并讨论了如何通过多种可视化和解释方法使用 SHAP 进行模型可解释性。本章还包含了一个使用 SHAP 解释回归模型的代码示例。最后,我们将讨论 SHAP 的关键优势和局限性。

第七章在机器学习中使用 SHAP 的实际应用提供了使用 SHAP 与表格结构数据以及非结构化数据(如图像和文本)相结合的必要实践。我们讨论了 SHAP 中可用的不同解释器,用于模型特定和模型无关的解释性。在本章中,我们还应用了 SHAP 来解释线性模型、树集成模型、卷积神经网络模型甚至 Transformer 模型。本章还涵盖了必要的代码教程,以提供使用 Python SHAP 框架进行实际操作的体验。

第八章使用 TCAV 进行人性化的解释涵盖了由 Google AI 开发的 TCAV 框架的概念。本章提供了对 TCAV 的概念理解和应用 Python TCAV 框架的实际体验。本章讨论了 TCAV 的关键优势和局限性,并讨论了使用基于概念的解释解决潜在研究问题的有趣想法。

第九章其他流行的 XAI 框架介绍了在 Python 中可用的约七个流行 XAI 框架——DALEX、Explainerdashboard、InterpretML、ALIBI、DiCE、ELI5 和 H2O AutoML 解释器。我们讨论了每个框架所支持的解释方法、实际应用以及每个框架的优缺点。本章还提供了一个快速比较指南,以帮助您根据您的用例决定应该选择哪个框架。

第十章XAI 行业最佳实践专注于为工业问题设计可解释 AI 系统的最佳实践。在本章中,我们讨论了 XAI 的开放挑战以及考虑开放挑战的必要设计指南,对于可解释 ML 系统。我们还强调了考虑以数据为中心的可解释性、交互式机器学习和面向设计的可解释 AI/ML 系统的规范性见解的重要性。

第十一章以最终用户为中心的人工智能介绍了用于设计和开发可解释 AI/ML 系统的以最终用户为中心的人工智能(ENDURANCE)理念。我们讨论了使用 XAI 引导构建可解释 AI/ML 系统以实现最终用户主要目标的重要性。通过本章中提出的一些原则和推荐的最佳实践,我们可以极大地弥合 AI 与最终用户之间的差距!

为了充分利用这本书

要运行本书提供的代码教程,您需要一个具有 Python 3.6+的 Jupyter 环境。这可以通过以下两种方式之一实现:

  • 通过Anaconda Navigator在您的机器上本地安装,或者从头开始使用pip安装。

  • 使用基于云的环境,例如Google ColaboratoryKaggle 笔记本Azure 笔记本Amazon SageMaker

如果您是 Jupyter 笔记本的新手,可以查看代码仓库中提供的补充信息:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/SupplementaryInfo/CodeSetup.md

您还可以查看github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/SupplementaryInfo/PythonPackageInfo.mdgithub.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/SupplementaryInfo/DatasetInfo.md,以获取关于教程笔记本中使用的 Python 包和数据集的补充信息。

关于安装书中使用的 Python 包的说明,请参阅代码仓库中提供的特定笔记本。如需任何额外帮助,请参阅特定包的原始项目仓库。您可以使用PyPi (pypi.org/)搜索特定包并导航到项目的代码仓库。鉴于包经常更改,安装或执行说明可能会不时更改。我们还使用代码仓库提供的补充信息中的Python 包信息 README 文件中详细说明的特定版本进行了代码测试。因此,如果后续版本有任何不符合预期的情况,请安装 README 中提到的特定版本。

如果您正在使用这本书的数字版,我们建议您亲自输入代码或从书的 GitHub 仓库(下一节中有一个链接)获取代码。这样做将帮助您避免与代码复制粘贴相关的任何潜在错误。

对于没有任何机器学习或数据科学经验的初学者,建议按顺序阅读本书,因为许多重要概念在早期章节中都有充分的详细解释。对于相对新于 XAI 领域的经验丰富的机器学习或数据科学专家,可以快速浏览前三章,以获得对各种术语的清晰概念理解。对于第四到第九章,对于经验丰富的专家来说,任何顺序都行。对于所有级别的从业者,建议在覆盖完所有九章之后,再阅读第十章和第十一章。

关于提供的代码,建议你要么阅读每一章然后运行相应的代码,要么在阅读特定章节的同时运行代码。Jupyter 笔记本中也添加了足够的理论,以帮助你理解笔记本的整体流程。

当你在阅读这本书时,建议你记录下涵盖的重要术语,并尝试思考如何应用所学的概念或框架。在阅读完这本书并浏览完所有 Jupyter 笔记本后,希望你能受到启发,将新获得的知识付诸实践!

下载示例代码文件

你可以从 GitHub 下载这本书的示例代码文件github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques。如果代码有更新,它将在 GitHub 仓库中更新。

我们还有其他来自我们丰富的书籍和视频目录的代码包,可在github.com/PacktPublishing/找到。查看它们吧!

下载彩色图像

我们还提供了一份包含本书中使用的截图和图表的彩色图像的 PDF 文件。你可以从这里下载:packt.link/DF7lG

使用的约定

本书使用了多种文本约定。

文本中的代码:表示文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称。以下是一个示例:“在这个例子中,我们将使用RegressionExplainerExplainerDashboard子模块。”

代码块设置如下:

pdp = PartialDependence(
    predict_fn=model.predict_proba,
    data=x_train.astype('float').values,
    feature_names=list(x_train.columns),
    feature_types=feature_types)
pdp_global=pdp.explain_global(name='Partial Dependence')

当我们希望将你的注意力引到代码块的一个特定部分时,相关的行或项目将以粗体显示:

explainer = shap.Explainer(model, x_test)
shap_values = explainer(x_test)
shap.plots.waterfall(shap_values[0], max_display = 12,
                     show=False)

粗体:表示新术语、重要词汇或屏幕上看到的词汇。例如,菜单或对话框中的词汇以粗体显示。以下是一个示例:“由于这些已知的缺点,寻找一个稳健的可解释人工智能(XAI)框架仍在进行中。”

小贴士或重要注意事项

看起来像这样。

联系我们

我们欢迎读者的反馈。

一般反馈:如果你对这本书的任何方面有疑问,请通过电子邮件发送至 customercare@packtpub.com,并在邮件主题中提及书名。

勘误表:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果你在这本书中发现了错误,我们非常感谢你向我们报告。请访问www.packtpub.com/support/errata并填写表格。

盗版: 如果你在互联网上以任何形式遇到我们作品的非法副本,如果你能提供位置地址或网站名称,我们将不胜感激。请通过 mailto:copyright@packt.com 与我们联系,并提供材料的链接。

如果您有兴趣成为作者:如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请访问authors.packtpub.com

分享您的想法

一旦您阅读了《应用机器学习可解释性技术》,我们很乐意听到您的想法!请点击此处直接进入此书的亚马逊评论页面并分享您的反馈。

您的评论对我们和科技社区都很重要,并将帮助我们确保我们提供高质量的内容。

第一部分 – 概念介绍

本节将向您介绍机器学习ML)模型的可解释性技术,并通过实际案例进行讲解。您将了解基础概念、可解释性的不同维度、各种模型可解释性方法,甚至数据驱动的可解释性方法。对基础概念的了解将帮助您理解设计稳健的可解释性机器学习系统(如本书中涵盖的系统)的指南。

本节包括以下章节:

  • 第一章**,可解释性技术的基础概念

  • 第二章**,模型可解释性方法

  • 第三章**,数据驱动的可解释性方法

第一章:可解释性技术的基础概念

随着越来越多的组织开始采用人工智能(AI)和机器学习(ML)来支持他们的关键业务决策过程,立即期望能够解释和揭示黑盒算法,以增加其采用率。AI 和 ML 正在越来越多地被用于确定我们在多个领域的日常体验,如银行、医疗保健、教育、招聘、交通和供应链。但 AI 和 ML 模型所扮演的基石角色导致了商业利益相关者和消费者对透明度和可解释性的日益关注,因为这些黑盒算法高度受到人类偏见的影响;特别是在高风险领域,如医疗保健、金融、法律和其他关键工业操作,模型可解释性是一个先决条件。

随着人工智能(AI)和机器学习(ML)的益处可能非常显著,问题在于,我们如何增加其采用率,尽管存在越来越多的担忧?我们甚至能否解决这些担忧,并使 AI 和 ML 的使用民主化?以及我们如何使 AI 对关键工业应用更加可解释,在这些应用中,黑盒模型不受信任?在这本书中,我们将尝试找到这些问题的答案,并将这些概念和思想应用于解决实际问题!

在本章中,你将了解可解释人工智能(XAI)的基础概念,以便未来章节中使用的术语和概念清晰易懂,这将使你更容易跟随和实施本书后面讨论的一些高级可解释性技术。这将为你提供理解和实施后面章节中讨论的实用技术所需的理论知识。本章重点介绍以下主要主题:

  • XAI 简介

  • 定义解释方法和途径

  • 评估可解释性方法的质量

现在,让我们开始吧!

XAI 简介

XAI 是确保 AI 和 ML 解决方案透明、可信、负责任和道德的最有效实践,从而有效地解决算法透明度、风险缓解和后备计划的监管要求。AI 和 ML 可解释性技术提供了必要的可见性,以了解这些算法在其解决方案生命周期中的每个阶段是如何运作的,使用户能够理解 AI 和 ML 模型的查询与结果之间的 原因方式

理解关键术语

通常,对于机器学习模型,为了回答如何的问题,我们使用术语可解释性,为了回答为什么的问题,我们使用术语可解释性。在这本书中,术语模型可解释性模型可解释性是互换使用的。然而,为了提供机器学习模型结果的人性化整体解释,我们需要使机器学习算法既可解释又可解释,从而使用户能够轻松理解这些模型的决策过程。

在大多数情况下,机器学习模型被视为黑盒,我们输入任何训练数据,并期望它能够对新、未见过的数据进行预测。与传统的编程不同,在传统的编程中,我们编写特定的指令,而机器学习模型会自动尝试从数据中学习这些指令。如图1.1所示,当我们试图找出模型预测的依据时,我们得不到足够的信息!

图 1.1 – 传统上,黑盒模型不提供预测背后的任何依据

图 1.1 – 传统上,黑盒模型不提供预测背后的任何依据

现在,让我们了解错误预测和不准确的机器学习模型的影响。

差异预测的后果

传统上,所有机器学习模型都被认为是神奇的黑色盒子,可以自动从数据中解析出有趣的模式和见解,并提供银弹般的解决方案!与受程序员智力限制的传统基于规则的计算机程序相比,经过良好训练的机器学习算法被认为即使在复杂情况下也能提供丰富的见解和准确的预测。但事实是,所有机器学习模型都存在偏差,这可能是由于算法本身的归纳偏差,也可能是由于用于训练模型的数据库中存在偏差。在实践中,还可能有其他原因,如数据漂移概念漂移过拟合欠拟合的模型,这些原因可能导致模型预测出错。正如著名的英国统计学家乔治·E·P·博克斯曾经说过:“所有模型都是错误的,但有些是有用的”;所有统计的、科学的和机器学习模型都可能在初始假设不一致的情况下给出错误的结论。因此,了解为什么机器学习模型预测了特定的结果,如果它是错误的,应该怎么做,以及如何改进预测,对我们来说非常重要。

图 1.2展示了新闻标题的集合,突出了人工智能算法在产生公平和无偏见结果方面的失败。

图 1.2 – 偏见和缺乏公平性的机器学习模型日益受到关注

图 1.2 – 偏见和缺乏公平性的机器学习模型日益受到关注

在完全同意我对模型可解释性必要性的观点之前,让我尝试给出一些低风险和高风险领域的实际例子,以了解不良预测的后果。天气预报是极具挑战性的经典预测问题之一(因为它依赖于多个动态因素),机器学习在这里得到了广泛的应用,机器学习算法考虑多种不同类型的参数的能力使其比标准统计模型在预测天气方面更加高效。尽管拥有高度准确的预测模型,但有时天气预报算法可能会错过降雨的预测,尽管几分钟后就开始下雨了!但这样的不良预测的后果可能并不严重,而且大多数人并不盲目依赖自动化的天气预报,这使得天气预报成为一个低风险领域问题。

类似地,对于另一个低风险领域,例如内容推荐系统,即使机器学习算法提供了不相关的推荐,最多用户可能只是会花更多时间明确地搜索相关内容。尽管最终用户的整体体验可能会受到影响,但仍然没有严重的生活或生计损失。因此,对于低风险领域,模型可解释性的需求并不关键,但为模型预测提供可解释性确实使自动智能系统对最终用户更加可靠和可信,从而通过提升用户体验来增加人工智能的采用率。

现在,让我举一个例子,其中不良预测的后果导致了公司声誉和估值的严重损失,影响了众多人的生活!2021 年 11 月,一家名为Zillow的美国在线房地产交易平台公司报告称,其股价价值损失超过 40%,其购房部门Offers因未能检测到其房价预测算法的不确定性而损失了超过 3 亿美元(更多详情请参阅参考文献部分)。为了弥补损失,Zillow 不得不采取大幅裁员等措施,数千个家庭受到了影响。

同样,多家科技公司被指控使用高度偏见的 AI 算法,这些算法可能导致因种族或性别歧视而引发的社会动荡。2015 年发生的一起事件中,谷歌照片自动将一对非洲裔美国人夫妇标记为大猩猩,造成了大规模的种族主义错误(请参阅参考文献部分中提到的来源以获取更多信息)。尽管这些错误是无意的,并且大多是由于有偏见的数据集或未泛化的机器学习模型造成的,但这些事件的后果可能会造成巨大的社会、经济和政治混乱。在其他高风险领域,如医疗保健、信贷贷款和招聘中,机器学习模型中的偏见持续提醒我们,需要更多透明的解决方案和 XAI 解决方案,以便最终用户可以依赖。

图 1.3所示,不良预测的后果突出了 XAI 的重要性,它可以提供早期指标,以防止因 AI 算法失败而导致的声誉、金钱、生命或生计的损失:

![Figure 1.3 – 机器学习模型预测不良的常见后果

![img/B18216_01_03.jpg]

图 1.3 – 机器学习模型预测不良的常见后果

现在,让我们在下一节中尝试总结模型可解释性的需求。

概述模型可解释性的需求

在上一节中,我们了解到不良预测的后果可能影响高风险领域的许多生命,甚至在低风险领域,最终用户的使用体验也可能受到影响。Samek 和 BinderMICCAI'18可解释机器学习教程中强调了模型可解释性的主要必要性。让我尝试总结模型可解释性之所以重要的关键原因:

  • 验证和调试机器学习系统:正如我们所看到的,错误的模型决策可能代价高昂且危险,模型可解释性技术帮助我们验证和验证机器学习系统。对错误预测的解释有助于我们调试根本原因,并提供解决问题的方向。我们将在第十章 XAI 行业最佳实践中更详细地讨论可解释机器学习系统的不同阶段。

  • 使用以用户为中心的方法来改进机器学习模型:XAI 提供了一种机制,将人类经验和直觉纳入机器学习系统。传统上,机器学习模型是根据预测误差来评估的。使用这种评估方法来改进机器学习模型不会增加任何透明度,并且可能不是稳健和高效的。然而,使用可解释性方法,我们可以使用人类经验来验证预测,并了解是否需要进一步采用以模型为中心或以数据为中心的方法来改进机器学习模型。图 1.4比较了一个经典的机器学习系统与一个可解释的机器学习系统:

![Figure 1.4 – 经典机器学习与可解释机器学习方法的比较

![img/B18216_01_04.jpg]

图 1.4 – 经典机器学习与可解释机器学习方法的比较

  • 学习新的见解:机器学习被认为能够自动从数据中揭示出对人类来说并不明显的有趣见解和模式。可解释机器学习为我们提供了一种机制,使我们能够理解模型自动选择的见解和模式背后的理由,并允许我们详细研究这些模式以进行新的发现。

  • 符合法规要求:许多监管机构,如通用数据保护条例GDPR)和加利福尼亚消费者隐私法案CCPA),对人工智能缺乏可解释性表示严重关切。因此,日益增长的全球人工智能法规赋予了个人要求对其产生影响的自动化决策系统进行解释的权利。模型可解释性技术试图确保机器学习模型符合拟议的监管法律,从而促进公平、责任和透明度。

图 1.5 – (上) 欧洲委员会推文的截图,突出强调要求解释的权利。(下) 表格显示为使自动化决策系统可解释、透明、负责任和公平而建立的一些重要监管法律

图 1.5 – (上) 欧洲委员会推文的截图,突出强调要求解释的权利。(下) 表格显示为使自动化决策系统可解释、透明、负责任和公平而建立的一些重要监管法律

模型可解释性的需求可以通过书中提供的FAT 模型可解释机器学习的以下图表来可视化,该图表来自 Serg Masís 的《用 Python 进行可解释机器学习》一书。

图 1.6 – 可解释机器学习 FAT 模型(来自 Serg Masís 的《用 Python 进行可解释机器学习》)

图 1.6 – 可解释机器学习 FAT 模型(来自 Serg Masís 的《用 Python 进行可解释机器学习》)

图 1.6 展示了构成可解释机器学习系统 FAT 模型的金字塔,用于提高人工智能的采用率。让我们在下一节讨论定义解释方法和途径。

定义解释方法和途径

在本节中,让我们尝试理解理解和应用各种可解释性技术和方法所需的一些关键概念。

可解释性的维度

Samek 和 Binder 在MICCAI'18*上的教程《可解释机器学习》中提出的概念基础上,当我们谈论揭开黑盒算法神秘面纱的问题时,有四个不同的维度可以通过以下图表来解决这个问题:

图 1.7 – 可解释性的四个维度

图 1.7 – 可解释性的四个维度

现在,让我们详细了解这些维度:

  • 数据:可解释性的维度围绕着正在建模的底层数据。理解数据、识别其局限性和相关组件,以及形成某些假设对于建立正确的预期至关重要。一个稳健的数据整理过程、分析数据纯度和对抗性效应对数据的影响是获取可解释结果的其他关键练习。

  • 模型:基于模型的可解释性技术通常帮助我们理解输入数据是如何映射到输出预测的,并意识到所使用的机器学习算法的一些局限性和假设。例如,用于机器学习分类的朴素贝叶斯算法假设某个特征的存在是完全独立且与任何其他特征的存在无关的。因此,了解机器学习算法的这些归纳偏差有助于我们理解和预测任何预测错误或机器学习模型的局限性。

  • 结果:可解释性的结果在于理解为什么一个特定的预测或决策是由机器学习模型做出的。尽管数据和模型的可解释性非常重要,但大多数机器学习专家和最终用户更关注使最终模型预测可解释。

  • 最终用户:可解释性的最后一个维度是关于为机器学习模型的最终消费者创建正确的抽象层次和包括适当数量的细节,以便结果对任何非技术最终用户都是可靠和可信的,并使他们能够理解黑盒算法的决策过程。

可解释性针对一个或多个可解释性的维度提供给 AI/ML 算法。接下来,让我们讨论如何解决可解释性的关键问题。

解决可解释性的关键问题

现在我们已经了解了可解释性的不同维度,让我们讨论一下要使机器学习模型可解释需要什么。为了使机器学习算法可解释,以下是我们应该尝试解决的问题:

  • 我们从数据中理解了什么?

第一步完全是关于数据。在开始 AI 和机器学习建模之前,我们应该花足够的时间分析和探索数据。目标始终是寻找差距、不一致性、潜在的偏差或假设,这些可能会影响或给建模和生成预测带来挑战。这有助于我们了解期望是什么以及数据的某些方面如何有助于解决业务问题。

  • 模型是如何创建的?

我们需要了解算法的透明度如何,以及算法在建模过程中建模数据时可以捕捉到什么样的关系。这是我们试图理解算法的归纳偏置并尝试将其与探索数据时获得的初始假设或观察结果相关联的步骤。例如,如果数据中存在一些通过基于可视化的数据探索方法观察到的二次或周期模式,线性模型将无法有效地建模数据。预测误差预计会更高。因此,如果算法如何构建训练数据模型不清楚,这些算法的透明度较低,因此可解释性也较低。

  • 关于训练模型的全球可解释性,我们了解什么?

理解全局模型的可解释性始终具有挑战性。这关乎获得底层特征的全面视角,了解重要特征,了解模型对关键特征值变化的敏感度,以及模型内部发生的复杂交互类型。这对于具有数百万个学习参数和数百层复杂深度学习模型来说,在实践中尤其难以实现。

  • 模型的不同部分对最终预测有什么影响?

机器学习模型的不同部分可能以不同的方式影响最终预测。特别是对于深度神经网络模型,每一层都试图学习不同类型的特征。当模型预测错误时,了解模型的不同部分如何影响或控制最终结果非常重要。因此,可解释性技术可以从模型的不同部分揭示洞察力,并帮助调试和观察算法对不同数据点的鲁棒性。

  • 为什么模型对单个记录和一批记录做出特定的预测?

可解释性的最重要方面是理解模型为何做出特定的预测而不是其他预测。因此,应用了某些局部和全局的解释技术,这些技术要么考虑单个特征的影响,要么甚至考虑多个特征对结果的整体影响。通常,这些可解释性技术应用于单个数据实例和一批数据实例,以了解观察结果是否一致。

  • 结果是否符合最终用户的期望?

最后一步总是提供以用户为中心的解释。这意味着解释性全部关于将结果与基于常识和人类直觉的用户预测进行比较。如果模型的预测与用户的预测相符,提供合理的解释只需证明导致特定结果的主要因素。但如果模型的预测与用户的预测不符,那么一个好的解释会尝试证明输入观察中可能发生了哪些变化,以得到不同的结果。

例如,假设,考虑到通常的工作日交通拥堵,我从办公室到家的通勤时间是 30 分钟。但如果下雨,我会预计路上的车辆会缓慢移动,交通拥堵会更高,因此可能会预计到家的时间会更长。现在,如果 AI 应用预测到家的时间仍然是 30 分钟,我可能不会相信这个预测,因为这不符合直觉。

现在,假设算法在预测上是准确的。然而,提供的理由是关于我路线上的车辆移动情况,AI 应用只是提到我路线上的车辆移动速度与其他日子相同。这种解释真的能帮助我理解模型预测吗?不,它不能。但如果应用提到路线上的车辆比典型日子少,那么我会很容易理解车辆数量减少是因为下雨,因此到达目的地的时间仍然与平时工作日相同。

我的建议是,在训练和验证机器学习模型后,始终尝试在解释黑盒模型的工作原理时将这些问题的答案作为第一步。

理解不同类型的解释方法

在上一节中,我们讨论了在设计和使用鲁棒的解释方法时需要解决的一些关键问题。在本节中,我们将讨论各种类型的解释方法,考虑到在机器学习中使用的四个解释性维度:

  • 局部可解释性全局可解释性:机器学习模型的可解释性可以针对数据中的单个局部实例进行,以了解某个范围内的值或特定的分类值如何与最终预测相关。这被称为局部可解释性。全局模型可解释性用于解释整个模型的行为或某些重要特征的整体行为,这些特征共同导致一组特定的模型结果。

  • 内在可解释性外在可解释性:一些机器学习模型,如线性模型、简单的决策树和启发式算法,由于其逻辑或输入输出之间的数学映射是清晰的,因此本质上是可以解释的。而外在或事后可解释性则是指首先在给定数据上训练一个机器学习模型,然后使用某些模型可解释性技术分别来理解和解释模型的输出。

  • 模型特定可解释性模型无关可解释性:当我们使用适用于任何特定算法的某些可解释性方法时,这些就是模型特定方法。例如,决策树模型中树结构的可视化仅限于决策树算法,因此属于模型特定可解释性方法。模型无关方法用于向任何机器学习模型提供解释,无论使用的是哪种算法。大多数情况下,这些是事后分析方法,在训练好的机器学习模型获得后使用,通常这些方法并不了解模型的内部结构和权重。在这本书中,我们将主要关注模型无关可解释性方法,这些方法不依赖于任何特定的算法。

  • 模型中心可解释性数据中心可解释性:传统上,大多数解释方法都是模型中心的,因为这些方法试图解释算法如何对输入特征和目标值进行建模,以及如何获得特定的结果。但随着数据中心 AI 领域的最新进展,机器学习专家和研究人员也在研究围绕用于训练模型的训练数据的解释方法,这被称为数据中心可解释性。数据中心方法用于了解数据是否一致、精心整理,以及是否适合解决潜在问题。数据概要、数据漂移和概念漂移的检测以及对抗鲁棒性是我们将在第三章“数据中心方法”中更详细讨论的某些特定数据中心可解释性方法。

我们将在本书的后续章节中讨论所有这些类型的可解释性方法。

理解准确性与可解释性之间的权衡

在理想情况下,我们希望我们的机器学习模型既高度准确又高度可解释,以便任何非技术性的业务利益相关者或最终用户都能理解模型预测背后的逻辑。但在实践中,实现高度准确和可解释的模型极其困难,准确性和可解释性之间始终存在权衡。

例如,为了进行放射学图像分类,本质上可解释的机器学习算法,如决策树,可能无法提供高效和通用的结果,而更复杂的深度卷积神经网络,如 DenseNet,可能对建模放射学图像数据更为高效和稳健。但是,DenseNet 本质上不可解释,向任何非技术性最终用户解释算法的工作原理可能相当复杂和具有挑战性。因此,高度精确的模型,如深度神经网络,是非线性和更复杂的,可以从数据中捕捉复杂的关联和模式,但这些模型的可解释性很难实现。高度可解释的模型,如线性回归和决策树,主要是线性和较简单的,但它们仅限于从数据中学习线性或较简单的模式。

现在,问题是,是选择高度精确的模型还是高度可解释的模型更好?我会说,正确的答案是,这取决于! 这取决于要解决的问题和模型的消费者。对于高风险领域,其中预测错误的后果严重,即使牺牲准确性,我也建议选择更可解释的模型。任何高度可解释的基于规则的启发式模型在这种情况下可能非常有效。但是,如果问题研究得很好,并且最小化预测误差是主要目标(如任何学术用例或任何机器学习竞赛),那么预测错误的后果不会造成任何重大损害,那么选择高度精确的模型可能是首选。在大多数工业问题中,保持模型准确性和可解释性之间的正确平衡对于促进人工智能的采用至关重要。

图 1.10 展示了流行机器学习算法的准确性-可解释性权衡:

![图 1.8 – 准确性-可解释性权衡图

![图片 B18216_01_08.jpg]

图 1.8 – 准确性-可解释性权衡图

现在我们对准确性-可解释性权衡有了相当的了解,让我们尝试理解如何评估可解释性方法的质量。

评估可解释性方法的质量

可解释性是主观的,可能因人而异。关键问题是我们如何确定一种方法是否优于另一种方法? 因此,在本节中,让我们讨论评估机器学习系统可解释性技术时应考虑的某些标准。

优秀可解释机器学习系统的标准

由于机器学习系统的可解释性是一个非常主观的话题,首先让我们尝试理解一些良好的人性化解释的关键标准。在《可解释机器学习》一书中,作者克里斯托夫·莫拉尔经过深入研究后,也强调了良好的人性化解释的重要性,我将尝试以简化的形式提及,考虑到现代、工业化的可解释机器学习系统:

  • 与先验知识的一致性:与最终用户的先验信念的一致性是可解释机器学习系统的重要标准。如果任何解释与人类先验知识相矛盾,那么人类往往会对这样的解释缺乏信任。然而,将人类的先验知识引入机器学习模型是具有挑战性的。但是,人性化的可解释机器学习系统应该尝试提供围绕某些特征的解释,这些特征与结果有直接且不太复杂的关系,从而使关系与最终用户的先验信念一致。

例如,对于预测糖尿病的存在,血糖水平的测量与人类先前的信念有直接关系,这是符合人类先前的信念的。如果血糖水平高于正常值,这可能会表明患者患有糖尿病,尽管糖尿病也可能是由某些遗传因素或其他原因引起的。同样,高血糖水平也可能是瞬时的,高血糖水平并不总是意味着患者患有糖尿病。但是,由于解释与先验知识一致,最终用户会对这样的解释有更多的信任。

  • 忠实度:提供全面解释的另一个关键因素是解释的真实性,这也被称为机器模型的忠实度。高忠实度的解释可以近似黑盒模型的全面预测,而低忠实度的解释可以解释局部数据实例或数据的一个特定子集。例如,在进行销售预测时,仅基于历史数据的趋势提供解释并不能给出完整的画面,因为其他因素,如生产能力、市场竞争和客户需求,可能会影响模型的结果。忠实度在详细根本原因分析中起着关键作用,但过多的细节可能对普通用户没有帮助,除非有要求。

  • 抽象性:良好的人性化解释总是期望以简洁和抽象的格式呈现。过多的复杂细节也可能影响最终用户的体验。例如,对于天气预报,如果模型预测有很高的降雨概率,简洁和抽象的解释可以是:现在天空多云,当前位置 5 公里范围内正在下雨,因此有很高的降雨概率。

但是,如果模型包括与降水水平、湿度和风速相关的细节,这些细节可能对降雨预测也很重要,这些额外的细节复杂且难以理解,因此不人性化。所以,好的、人性化的解释包括适当程度的抽象,以简化最终用户的理解。最终用户大多更喜欢简洁的解释,但在进行模型预测的根本原因分析时可能需要详细解释。

  • 对比解释:好的、人性化的解释并不是关于理解模型的内部运作,而是主要关于比较“如果...会怎样”的情景。假设结果是连续的数值数据,就像回归问题中的情况一样。在这种情况下,一个好的预测解释包括与另一个实例的预测进行比较,该预测显著更高或更低。同样,一个好的分类问题解释是关于将当前预测与其他可能的输出进行比较。但对比解释是应用相关的,因为它需要一个比较点,尽管理解“如果...会怎样”的情景有助于我们理解某些关键特征的重要性以及这些特征与目标变量之间的关系。

例如,对于员工流失预测的用例,如果模型预测员工可能会离开组织,那么对比解释试图通过将其与一个预期员工将留在组织中的实例的预测进行比较来证明模型的决策,并比较用于建模数据的关键特征值。因此,解释方法可能会传达,由于可能离开组织的员工的薪水远低于可能留在组织内的员工的薪水,模型预测该员工预计会离开组织。

  • 关注异常情况:这听起来可能有些反直觉,但人类试图寻找对那些不可预期和不明显的事件的解释。假设数据中存在异常观察,比如一个罕见的分类值或一个可能影响结果的异常连续值。在这种情况下,它应该包含在解释中。即使其他正常且一致的特征对模型结果有相同的影响,仍然包含异常性在人性化的解释中具有更高的重要性。

例如,假设我们正在根据汽车的配置预测汽车的价格,比如说操作模式是电动,这与汽油相比是一种罕见的观察。这两个类别可能对最终模型预测有相同的影响。然而,模型解释应该包括罕见的观察,因为最终用户对异常观察更感兴趣。

  • 社会方面:模型可解释性的社会方面决定了解释的抽象层次和内容。社会方面取决于特定目标受众的理解水平,可能在模型可解释性方法中难以概括和引入。例如,假设一个旨在向用户建议行动的股票预测机器学习模型建议做空某只特定股票。在这种情况下,非金融领域的最终用户可能难以理解。但相反,如果模型建议在当前价格卖出不持有的股票,并在一个月后价格预期下跌时买回,任何非技术用户都可能轻松理解模型建议。因此,好的解释应考虑社会方面,并且通常,利用人机交互HCI)的用户中心设计原则来设计考虑社会方面的良好、可解释的机器学习系统。

现在我们对良好解释的关键标准有了大致的了解,在下一节中,我们将讨论在构建可解释的机器学习系统时同样重要的辅助标准。

XAI 的辅助标准用于机器学习系统

良好的解释不仅限于之前讨论的关键标准,还有 XAI 的一些辅助标准,如Doshi-VelezKim在他们关于迈向可解释机器学习的严谨科学的工作中所讨论的那样:

  • 无偏性:模型可解释性技术还应寻找数据或模型中任何形式的偏见。因此,XAI 的一个关键目标是使机器学习模型无偏见且公平。例如,对于预测信用卡欺诈,可解释性方法应调查与客户性别相关的人口信息对于模型决策过程的重要性。如果性别信息的重要性很高,这意味着模型对特定性别存在偏见。

  • 隐私:可解释性方法应遵守数据隐私措施,因此不应使用任何敏感信息进行模型解释。主要为了提供个性化的解释,确保遵守数据隐私可能非常重要。

  • 因果关系:模型可解释性方法应尝试寻找任何因果关系,以便最终用户意识到由于任何扰动,生产系统的模型预测可能会有所变化。

  • 鲁棒性:如敏感性分析等方法有助于了解模型预测与其特征值之间的鲁棒性和一致性。如果输入特征的小幅变化导致模型预测发生显著变化,这表明模型不是鲁棒或稳定的。

  • 信任:XAI 的一个关键目标是通过对最终用户增加信任来增加 AI 的采用率。因此,所有可解释性方法都应使黑盒机器学习模型更加透明和可解释,以便最终用户可以信任并依赖它们。如果解释方法不符合在“良好可解释机器学习系统标准”部分讨论的良好解释标准,那么它可能不会帮助增加其消费者的信任。

  • 可用性:XAI 方法应努力使 AI 模型更易于使用。因此,它应向用户提供完成任务所需的信息。例如,反事实解释可能会建议贷款申请人支付未来 2 个月的信用卡账单,并在申请新贷款之前清偿之前的债务,这样他们的贷款申请就不会被拒绝。

接下来,我们需要了解评估可解释机器学习系统各个层面的不同水平。

可解释机器学习系统评估层面的分类

既然我们已经讨论了设计和评估良好可解释机器学习系统的关键标准,那么让我们讨论评估解释质量的评估方法分类。在他们的工作《迈向可解释机器学习的严谨科学》中,Doshi-Velez 和 Kim 提到了三种主要的评估方法类型,我们将在本节中尝试理解。由于可解释机器学习系统应按照以用户为中心的人类-计算机交互(HCI)设计原则进行设计,因此评估真实任务的评估者在评估解释质量中扮演着核心角色。

但人类评估机制可能有其自身的挑战,例如不同类型的人类偏见,以及更耗时和消耗其他资源,还可能有其他导致评估不一致的复合因素。因此,人类评估实验应设计得很好,并且只有在必要时才使用,否则不应使用。现在,让我们看看三种主要的评估方法类型:

  • 基于应用的评估方法:这种评估方法涉及将可解释性技术集成到实际产品或应用中,从而允许进行涉及真实最终用户的实验,这些用户将执行某些实验。尽管实验设置成本高且耗时,但构建一个几乎完成的产品然后允许领域专家进行测试有其好处。这将使研究人员能够评估解释的质量相对于系统的最终任务,从而提供快速识别可解释性方法错误或局限性的方法。这种评估原则与在人类-计算机交互(HCI)中使用的评估方法一致,可解释性被融入到整个负责解决用户持续问题和帮助用户实现最终目标的系统中。

例如,为了评估一款 AI 软件从图像中自动检测皮肤癌的解释方法的质量,皮肤科医生可以被邀请直接测试 AI 软件所构建的目标。如果解释方法成功,那么这样的解决方案可以很容易地扩展。从工业角度来看,由于获得完美的成品可能耗时,更好的方法是构建一个健壮的原型或最小可行产品(MVP),这样领域专家在测试系统时就能更好地了解成品将如何。

  • 基于人类的评估:这种方法涉及对非专家新手用户进行更直接的任务的人类受试者实验,而不是领域专家。获取领域专家可能耗时且昂贵,因此基于人类的评估实验更容易设置且成本更低。有时任务也会简化,通常在需要泛化的某些用例中,这些方法非常有帮助。A/B 测试反事实模拟正向模拟是用于基于人类评估的一些流行评估方法。

在可解释人工智能(XAI)中,A/B 测试向用户提供不同类型的解释,用户被要求选择解释质量更高的最佳选项。然后,基于最终汇总的投票,以及使用其他指标如点击率、屏幕悬停时间和完成任务的时间,来确定最佳方法。

对于反事实模拟方法,人类受试者被展示模型的输入和输出以及一定数量的数据样本的解释,并被要求提供某些输入特征的更改,以改变模型的最终结果到特定的值范围或特定类别。在正向模拟方法中,人类受试者被提供模型输入及其相应的解释方法,然后被要求在不查看真实值的情况下模拟模型预测。然后,用于找到人类预测结果与真实标签之间差异的错误指标可以作为评估解释质量的一种定量方法。

  • 基于功能性的评估:这种方法不涉及任何人类受试者实验,使用代理任务来评估解释的质量。这些实验比其他两种方法更可行且成本更低,特别是在人类受试者实验受限且不道德的用例中,这是一种替代方法。当算法类型已经在人类水平评估中测试过时,这种方法效果良好。

例如,线性回归模型易于解释,最终用户可以有效地理解模型的工作原理。因此,使用线性回归模型进行销售预测等用例可以帮助我们理解历史数据的整体趋势以及预测值与趋势之间的关系。

图 1.9总结了可解释机器学习系统评估层级的分类:

图 1.9 – 可解释机器学习系统的评估层级分类

图 1.9 – 可解释机器学习系统的评估层级分类

除了这里讨论的方法之外,为了确定解释的质量,还经常使用其他指标,如解释的描述长度、用于解释的特征的复杂性以及理解提供的解释所需的认知处理时间。我们将在第十一章《以最终用户为中心的人工智能》中更详细地讨论它们。

在本章中,到目前为止,你已经遇到了许多关于机器学习可解释性技术的全新概念。图 1.10中的思维导图对本章讨论的各种术语和概念提供了一个很好的总结:

图 1.10 – 机器学习可解释性技术的思维导图

图 1.10 – 机器学习可解释性技术的思维导图

我强烈建议你们熟悉这个思维导图中使用的术语,因为我们将在此书中使用它!让我们总结一下在摘要部分中讨论的内容。

摘要

在阅读本章之后,你现在应该已经理解了 XAI(可解释人工智能)是什么以及为什么它如此重要。你已经了解了与可解释性技术相关的各种术语和概念,这些术语和概念我们将在此书中频繁使用。你还了解了一些关键的人性化可解释机器学习系统的标准以及评估可解释性技术质量的不同方法。在下一章中,我们将专注于结构化和非结构化数据的各种模型可解释性方法。

参考文献

请参考以下资源以获取更多信息:

第二章:模型可解释性方法

本书的一个关键目标是赋予读者设计可解释机器学习系统的能力,这些系统可用于生产环境中解决关键业务问题。对于健壮的可解释机器学习系统,根据问题的类型和使用的数据类型,可解释性可以以多种方式提供。与图像和文本等非结构化数据相比,为结构化表格数据提供可解释性相对更符合人类习惯,因为图像或文本数据更复杂,具有更少的可解释粒度特征。

为机器学习模型添加可解释性的方法有很多种,例如,通过提取关于数据或模型的信息(知识提取),使用有效的可视化来证明预测结果(结果可视化),识别训练数据中的主导特征并分析其对模型预测的影响(基于影响的方法),或者通过将模型结果与已知场景或情况进行比较作为例子(基于示例的方法)。

因此,在本章中,我们将讨论用于模型可解释性的各种模型无关和模型特定解释方法,这些方法适用于结构化和非结构化数据。

本章涵盖了以下主要主题:

  • 模型可解释性方法的类型

  • 知识提取方法

  • 结果可视化方法

  • 基于影响的方法

  • 基于示例的方法

技术要求

本章的主要目标是提供对模型可解释性方法的概要理解。然而,我将提供一些教程示例,以在 Python 中实现某些方法,并在一些有趣的数据集上应用。我们将使用 Python Jupyter 笔记本来运行代码并在整本书中可视化输出。第二章的代码和数据集资源可以从以下 GitHub 仓库下载或克隆:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter02。其他运行代码所需的 Python 框架将在笔记本中提及,以及其他相关细节,以理解这些概念中的代码实现。

模型可解释性方法的类型

您可以使用不同的方法来提供模型可解释性。某些技术特定于某个模型,而某些方法应用于模型的输入和输出。在本节中,我们将讨论用于解释机器学习模型的不同类型的方法:

  • 知识提取方法:在数据探索性分析EDA)和事后分析期间从数据中提取关键洞察和统计信息是提供模型无关可解释性的方法之一。通常,应用统计配置文件方法来提取平均值和中位数、标准差或方差,以及某些描述性统计来估计预期结果的范围。

同样,使用相关性热图、分解树和分布图等其他洞察力也被用来观察特征之间的任何关系,以解释模型的结果。对于更复杂的非结构化数据,如图像,通常这些统计知识提取方法是不够的。使用概念激活向量CAVs),如在第第八章“使用 TCAV 进行人性化的解释”中讨论的,更有效的人性化方法。

然而,首先,知识提取方法从输入数据和输出数据中提取关于定义预期模型结果的基本信息。例如,为了解释时间序列预测模型,我们可以考虑一个模型性能指标,比如训练期间预测误差的方差。误差率可以在(比如说)±10%的置信区间内指定。置信区间的形成只有在从输出训练数据中提取关键洞察之后才可能。

  • 结果可视化方法:绘制模型结果并将其与先前预测的值进行比较,尤其是与代理模型进行比较,通常被认为是一种有效的模型无关的可解释性方法。来自黑盒机器学习算法的预测被传递给代理模型解释器。通常,这些是高度可解释的线性模型、决策树或任何基于规则的启发式算法,可以解释复杂模型的结果。这种方法的主要局限性是可解释性完全依赖于模型结果。如果数据或建模过程中有任何异常,这些可解释性的维度就不会被捕捉到。

例如,假设一个分类器错误地预测了一个输出。仅从预测概率中,我们无法确切理解模型为何以特定方式表现。但这些方法在实际应用中易于应用,甚至易于理解,因为使用了高度可解释的解释算法。

  • 基于影响的方法:这些是帮助我们理解某些数据特征如何对模型结果产生重要影响的特定技术。目前,这是应用最常见和最有效的方法之一,用于为机器学习模型提供可解释性。特征重要性、敏感性分析、关键影响因素图、显著性图、类激活图(CAMs)和其他视觉特征图被用来解释数据中的单个特征是如何被模型用于其决策过程的。

  • 基于实例的方法:之前讨论的三种模型无关的可解释性方法仍然需要某种技术知识来理解机器学习模型的工作原理。对于非技术用户来说,解释某事最好的方式是提供一个他们能够与之相关联的例子。基于实例的方法,尤其是基于反事实的实例方法,试图查看某些单个数据实例来解释机器学习模型的决策过程。

例如,假设一个由机器学习驱动的自动贷款审批系统拒绝了一个申请人的贷款申请。使用基于实例的可解释性方法,申请人也会被建议,如果他们在接下来的三个月内按时支付信用卡账单并增加每月收入 2000 美元,他们的贷款申请将被批准。

根据最新趋势,模型无关的技术方法比模型依赖的方法更受欢迎,因为即使复杂的机器学习算法也可以在一定程度上使用这些技术进行解释。但某些技术,如显著性图、基于树/森林的特征重要性以及激活图,通常是模型特定的。我们选择解释方法是由我们试图解决的关键问题决定的。

图 2.1展示了应用于解释黑盒模型工作原理的四种主要类型的可解释性方法,我们将在以下章节中介绍:

图 2.1 – 模型可解释性方法

图 2.1 – 模型可解释性方法

现在,让我们更详细地讨论这些模型可解释性方法中的每一个。

知识提取方法

无论在任何语境中讨论可解释性,都是关于获取对问题的了解,以便对预期的结果有更清晰的了解。同样,如果我们已经知道结果,可解释性就是追踪到根本原因。机器学习中的知识提取方法用于从输入数据中提取关键见解,或利用模型结果追踪并映射到终端用户已知的信息,无论是结构化数据还是非结构化数据。尽管有多个提取知识的方法,但在实践中,以数据为中心的 EDA 过程是解释任何黑盒模型最常见和最受欢迎的方法之一。让我们更详细地讨论如何在XAI的语境中使用 EDA 过程。

EDA

我总是认为 EDA 对于任何机器学习工作流程来说是最重要的过程。EDA 使我们能够探索数据并得出关键见解;利用这些见解,我们可以从数据中形成某些假设。这实际上帮助我们识别数据中的任何独特模式,并最终帮助我们做出正确的算法选择。因此,EDA 是传统且模型无关的方法之一,它解释了数据的本质,并且通过考虑数据,它帮助我们了解从模型中可以期待什么。使用 EDA 可以轻松地观察到任何明显的异常、模糊、冗余数据点和数据偏差。现在,让我们看看在 EDA 中用于解释结构化和非结构化数据模型的一些重要方法。

结构化数据上的 EDA

在结构化数据上进行的 EDA(探索性数据分析)是用于提取洞察力以提供可解释性的初步步骤之一。然而,在 EDA 过程中实际应用的技术可能因问题而异。但一般来说,对于结构化数据,我们可以使用 EDA 来生成某些描述性统计量,以便更好地理解数据,然后应用各种单变量和多变量方法来检测每个特征的重要性,观察数据的分布以找出数据中的任何偏差,并寻找异常值、重复值、缺失值、特征之间的相关性以及基数,这些都可能影响模型的结果。

从 EDA 步骤中获得的信息和假设有助于执行有意义的特征工程和建模技术,并帮助为利益相关者设定正确的期望。在本节中,我们将介绍最流行的 EDA 方法,并讨论在 XAI(可解释人工智能)的背景下使用结构化数据 EDA 的好处。我强烈建议查看 GitHub 仓库(github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques)以在实际用例中应用这些技术。现在,让我们看看以下列表中的重要 EDA 方法:

  • 摘要统计量:通常,模型可解释性是相对于数据中的特征来呈现的。在 EDA 过程中观察数据集统计量可以给出早期迹象,表明数据集是否足够用于建模和解决给定问题。它有助于理解数据的维度和存在的特征类型。如果特征是数值型的,则会观察到某些描述性统计量,如均值、标准差、变异系数、偏度、峰度和四分位数范围。

此外,某些基于直方图的分布被用来监控数据中的任何偏斜或偏差。对于分类特征,观察分类值的频率分布。如果数据集不平衡,如果数据集偏向于某个特定的分类值,如果数据集有异常值,或者偏向于某个特定方向,所有这些都可以很容易地观察到。由于所有这些因素都可能影响模型预测,因此理解数据集统计信息对于模型可解释性很重要。

图 2.2显示了在 EDA 步骤中创建的汇总统计和可视化,以提取关于数据的知识:

图 2.2 – EDA 过程中的汇总统计和可视化

图 2.2 – EDA 过程中的汇总统计和可视化

  • 重复值和缺失值:重复或冗余的值可能会给模型增加更多偏差。相反,缺失值可能导致信息丢失和训练模型的数据不足。这可能会导致模型过拟合。因此,在训练模型之前,如果观察到缺失值或重复值,并且没有采取进一步措施来纠正这种情况,那么这些观察结果可能有助于解释模型泛化不良的原因。

  • 单变量分析:这涉及到通过图形技术(如分布图、直方图、箱线图、小提琴图、饼图、聚类图)分析单个特征,以及使用非图形技术(如频率、集中趋势度量[即均值、标准差和变异系数]和四分位数范围)。这些方法帮助我们估计单个特征对模型结果的影响。

  • 多变量分析:这涉及到使用图形和非图形方法一起分析两个或更多特征。它用于识别数据相关性以及变量的依赖性。在 XAI 的背景下,多变量分析用于理解数据中的复杂关系,并提供比单变量分析方法更详细和更细粒度的解释。

  • 异常值检测:异常值是某些异常数据点,可能会完全扭曲模型。如果模型是在异常数据点上训练的,那么很难实现泛化。然而,在模型推理时间对异常数据点的预测可能会完全错误。因此,在训练和推理时间进行异常值检测是模型可解释性的一个重要部分。可视化方法,如箱线图、散点图,以及统计方法,如 1.5 倍 IQR 规则(www.khanacademy.org/math/statistics-probability/summarizing-quantitative-data/box-whisker-plots/a/identifying-outliers-iqr-rule)和纳尔逊规则([www.leansixsigmadefinition.com/glossary/nelson-rules/](https://www.leansixsigmadefinition.com/glossary/nelson-rules/))用于检测异常。

  • 帕累托分析:根据帕累托原则,80%的价值或影响是由 20%的样本量驱动的。因此,在 XAI 中,这个80-20 规则用于解释对模型结果影响最大的子样本。

  • 频繁项集挖掘:这是提取模型可解释性的另一种流行方法。这项技术常用于关联规则挖掘,以了解在给定的数据集中某些观察结果出现的频率。这种方法提供了一些有趣的观察结果,有助于从数据中形成重要的假设,并最终对解释模型结果做出很大贡献。

现在我们已经涵盖了结构化数据的方法,让我们来看看一些非结构化数据的方法。

非结构化数据的 EDA

从非结构化数据(如图像和文本)中解释特征是困难的,因为机器学习算法试图识别人类难以直观解释的粒度级特征。然而,有一些特定于图像和文本数据的方法被应用于形成从数据中得出的有意义的假设。如前所述,EDA 过程可能会根据问题和数据而变化,但在这章中,我们将讨论 XAI 背景下最流行的方法选择。

探索图像数据

用于图像的 EDA 方法与用于表格数据的 EDA 方法不同。以下是图像数据集的一些流行的 EDA 步骤选择:

  • 数据维度分析:对于一致和泛化的模型,理解数据维度很重要。监控图像数量和每个图像的形状对于解释任何过拟合或欠拟合的观察结果都很重要。

  • 观察数据分布:由于使用图像解决的问题中的大多数都是分类问题,因此监控类别不平衡很重要。如果数据分布不平衡,那么模型可能会偏向多数类。对于像素级分类(用于分割问题),观察像素强度分布很重要。这也有助于理解阴影或非均匀照明条件对图像的影响。

  • 观察平均图像和对比图像:为了观察图像中的感兴趣区域,经常使用平均图像和对比图像。这在基于分类的问题中尤其有用,用于比较感兴趣区域的占主导地位。

  • 高级统计和代数方法:除了前面讨论的方法之外,其他统计方法,如寻找 z 分数和标准差,以及基于特征向量的特征图像等代数方法,用于视觉检查图像数据中的关键特征,这为最终的模型结果增加了可解释性。

根据问题的类型,探索图像数据集还有其他复杂的方法。然而,本小节中讨论的方法是最常见的方法。

探索文本数据

通常,与图像或表格数据相比,文本数据更嘈杂。因此,EDA 通常伴随着一些预处理或清洗方法来处理文本数据。但因为我们只关注 EDA 部分,以下列表详细介绍了使用文本数据进行 EDA 的一些流行方法:

  • 数据维度分析:与图像类似,文本维度分析,如检查记录数量和每条记录的长度,以形成关于潜在过拟合或欠拟合的假设。

  • 观察数据分布:使用条形图或词云可视化词频分布是观察任何文本数据中顶级单词的流行选择。这种技术使我们能够避免与低频词相比高频词的任何偏差。

  • n-gram 分析:考虑到文本数据的性质,通常,一个短语或单词集合比单个单词更容易解释。例如,对于从电影评论中进行情感分析,高频单词如moviefilm相当模糊。相比之下,短语如good movievery boring film则更容易解释且更有用,有助于理解情感。因此,n-gram 分析或“n-words”集合的引入为理解模型结果提供了更多的可解释性。

通常,EDA 确实包括某些可视化技术来解释数据并形成一些重要假设。但解释 ML 模型的重要技术之一是通过可视化模型结果。在下一节中,我们将更详细地讨论这些结果可视化方法。

结果可视化方法

模型结果的可视化是应用于解释机器学习模型的一种非常常见的方法。通常,这些是在训练后的黑盒模型上应用的模型无关的事后分析方法,并提供可解释性。在下一节中,我们将讨论一些常用的结果可视化方法,用于解释机器学习模型。

使用对比分析方法

这些大多是事后分析的方法,用于在训练过程之后通过可视化模型的预测输出来增加模型的可解释性。大多数情况下,这些是模型无关的方法,可以应用于内在可解释模型和黑盒模型。对比分析可用于生成全局和局部解释。它主要用于使用各种可视化方法比较不同结果的多种可能性。

例如,对于基于分类的问题,某些方法如 t-SNE 和 PCA 被用于可视化并比较模型预测标签的转换特征空间,尤其是在误差率较高的情况下。对于回归和时间序列预测模型,使用置信水平来比较模型预测结果与上下限。有各种方法可以应用于对比分析,以获得更清晰的“如果...将会如何”场景的见解。一些突出方法在项目仓库中提到(https://github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter02/Comparison%20Analysis.ipynb)。

正如我们在 图 2.3 中所看到的,结果可视化有助于提供关于模型的全球视角,以可视化模型预测:

![图 2.3 – 使用 t-SNE 方法对分类问题(左侧)和时间序列预测模型(右侧)的置信区间进行对比分析]

![img/B18216_02_03.jpg]

图 2.3 – 使用 t-SNE 方法对分类问题(左侧)和时间序列预测模型(右侧)的置信区间进行对比分析

图 2.3 中,我们可以看到如何使用可视化方法通过可视化模型的最终结果并与其他数据实例或可能的 如果...将会如何 场景进行比较,从而提供模型的全球视角。

使用代理解释器方法

在机器学习的背景下,当外部模型或算法被应用于解释黑盒机器学习模型时,外部方法被称为代理解释方法。这种方法背后的基本思想是应用一个内在可解释的模型,该模型简单易解释,并且尽可能准确地近似黑盒模型的预测。然后,使用某些可视化技术来可视化代理解释方法的结果,以深入了解模型行为。

但现在的问题是我们能否直接应用代理模型而不是使用黑盒模型? 答案是不! 使用代理模型的主要思想是获取一些关于输入数据如何与目标结果相关的信息,而不考虑模型精度。相比之下,原始的黑盒模型更准确、更高效,但不可解释。因此,完全用代理模型替换黑盒模型将损害模型精度,这是我们不愿意看到的。

可解释算法,如回归、决策树和基于规则的算法,是代理解释方法的热门选择。为了提供可解释性,主要分析了输入特征与目标结果之间的三种关系类型:线性、单调性和交互性。

线性关系帮助我们检查输入特征是否与目标结果呈线性相关。单调性帮助我们分析增加整体输入特征值是否会导致目标结果增加或减少。对于整个特征范围,这解释了输入特征与目标结果之间的关系是否始终向同一方向传播。模型交互在提供可解释性时非常有帮助,但实现起来很困难。交互性帮助我们分析单个特征如何相互作用以影响模型决策过程。

决策树和基于规则的算法用于检查输入特征与目标结果之间的交互作用。在《可解释机器学习》一书中,克里斯托夫·莫尔纳christophm.github.io/interpretable-ml-book/))提供了一个非常有用的表格,比较了不同的内在可解释模型,这对于选择作为代理解释器的可解释模型非常有用。

如下表格展示了这一过程的简化版本:

图 2.4 – 比较选择代理解释方法的可解释算法

图 2.4 – 比较选择代理解释方法的可解释算法

这种技术的最大优点之一是它可以帮助使任何黑盒模型可解释。它是模型无关的,并且非常容易实现。但是,当数据复杂时,会使用更复杂的算法来达到更高的建模精度。在这种情况下,代理方法往往会过度简化输入特征之间的复杂模式或关系。

图 2.5 展示了如何使用可解释的算法,如决策树、线性回归或任何基于启发式规则的算法,作为代理模型来解释任何黑盒机器学习模型:

图 2.5 – 使用代理解释器进行模型可解释性

图 2.5 – 使用代理解释器进行模型可解释性

尽管这种方法存在缺点,但线性、单调性和交互性的可视化在很大程度上可以证明在复杂黑盒模型上工作的合理性。在下一节中,我们将讨论基于影响的方法来解释机器学习模型。

基于影响的方法

基于影响的方法被用来理解数据集中特征对模型决策过程的影响。与其它方法相比,基于影响的方法被广泛使用且更受欢迎,因为这有助于从数据集中识别出主导属性。从结构化和非结构化数据中识别主导属性有助于我们分析主导特征在影响模型结果中的作用。

例如,假设你正在处理一个分类问题,用于区分狼和西伯利亚雪橇犬。假设在训练和评估过程之后,你已经得到了一个准确率超过 95%的良好模型。但在尝试使用基于影响的方法来寻找模型可解释性的重要特征时,你观察到模型将周围背景作为分类是否为狼或雪橇犬的主导特征。在这种情况下,即使你的模型结果看起来高度准确,你的模型也是不可靠的。这是因为模型做出决策的特征并不稳健且不具有普遍性。

基于影响的方法常用于执行根本原因分析以调试机器学习模型和检测机器学习系统中的故障。现在,让我们讨论一些用于模型可解释性的基于影响方法的流行选择。

特征重要性

在应用机器学习模型时,理解每个特征相对于影响模型结果的重要性至关重要。这是一种技术,它根据特征在预测目标值中的有用性,对数据集中存在的输入特征分配特定的分数。特征重要性是结构化数据建模中非常流行的模型无关可解释性选择。尽管有各种评分机制来确定特征重要性,例如排列重要性分数、统计相关性分数、基于决策树的评分等,但在本节中,我们将主要关注整体方法,而不仅仅是评分机制。

在 XAI 的背景下,特征重要性可以提供对数据和模型行为的全局洞察。它通常用于特征选择和降维,以提高机器学习模型的效率。通过从建模过程中移除不太重要的特征,观察到通常整体模型性能得到提高。

重要特征的概念有时可能取决于评分机制或所使用的模型类型。因此,建议在得出任何结论之前,您应该使用领域专家验证此技术选择的重要特征。此方法适用于结构化数据集,其中特征被明确定义。对于文本或图像等非结构化数据,特征重要性并不非常相关,因为模型使用的特征或模式更为复杂,并且并不总是可由人类解释。

图 2.6 展示了如何突出显示数据集的有影响特征,使最终用户能够关注重要特征的价值,以证明模型结果:

图 2.6 – 糖尿病数据集上的特征重要性图(来自代码教程)

图 2.6 – 糖尿病数据集上的特征重要性图(来自代码教程)

接下来,我们将介绍另一种重要的基于影响度的模型可解释性方法,称为敏感性分析。

敏感性分析

敏感性分析是一种定量过程,通过改变关于预测模型使用的输入特征所做的假设来近似预测的不确定性。在敏感性分析中,单个输入特征变量被增加或减少以评估单个特征对目标结果的影响。这种技术在预测建模中非常常用,用于优化系统的整体性能和鲁棒性。

进行敏感性分析可能很简单,但却是任何数据科学项目非常强大的方法,可以为商业利益相关者提供额外信息,特别是对于多元数据集。它有助于理解“如果...会怎样”的情景,并观察是否有任何特定特征对异常值或任何形式的对抗性扰动敏感。它有助于质疑变量假设的可靠性,预测假设改变时的可能结果,并衡量改变变量假设的重要性。敏感性分析是一种数据驱动的建模方法。它表明数据是否可靠、准确且与建模过程相关。此外,它有助于找出是否有其他可能影响模型的因素。

在 XAI 的背景下,由于敏感性分析相对于一些广泛使用的方法来说稍微不那么常见,让我尝试给出我在机器学习中进行敏感性分析的建议。通常,这对于回归问题非常有用,但对于基于分类的问题也非常重要。

请参考 GitHub 仓库中提供的笔记本(github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter02/FeatureImportance_SensitivityAnalysis.ipynb),以获取进行敏感性分析的详细和实用方法。我建议你为敏感性分析做的第一步是计算原始数据集中每个属性的方差(σ)。然后,对于每个属性,将原始属性值转换为-3σ、-2σ、-σ、σ、2σ和 3σ,并观察回归问题中目标结果的百分比变化或观察基于分类问题的预测类别。

对于一个好的和稳健的模型,我们希望目标结果对特征值的任何变化都不太敏感。理想情况下,我们期望回归问题中目标结果的百分比变化不太剧烈,对于分类问题,预测类别在改变特征值时不应有太大变化。任何超过/低于+/- 3σ的特征值都被认为是异常值,因此通常我们只改变特征值到+/- 3σ。

图 2.7展示了详细的敏感性分析如何帮助你分析容易影响模型结果的因素:

![图 2.7 – 通过敏感性分析理解数据的有影响特征图片

图 2.7 – 通过敏感性分析理解数据的有影响特征

除了敏感性分析之外,在下一节中,你将了解部分依赖图PDPs),它也可以用来分析有影响特征。

PDPs

当使用黑盒机器学习模型时,检查特征属性与目标结果之间的功能关系可能具有挑战性。尽管计算特征重要性可能更容易,但 PDPs 提供了一种功能上计算预测特征与预测变量之间关系的机制。它显示了单个或两个属性对目标结果的影响。

PDPs 可以有效地帮助识别预测变量和预测变量之间的线性、单调或任何复杂交互,并指示预测变量对预测变量的平均影响。PDP 通过测量边际效应来衡量特定预测属性的贡献,该效应不包括其他变量对特征空间的影响。

与敏感性分析类似,PDPs 帮助我们近似特定特征可以影响目标结果的方向。为了简化,我将不会添加任何复杂的数学表示来获得预测变量的平均边际效应;然而,我强烈建议阅读 Jerome H. Friedman 的关于 Greedy Function Approximation: A Gradient Boosting Machine 的工作,以获取更多信息。PDP 的一个最显著的好处是它易于使用、实现和理解,并且可以很容易地向非技术业务利益相关者或机器学习模型的最终用户解释。

但这种方法也存在某些缺点。默认情况下,该方法假设所有特征之间没有相关性,并且特征属性之间没有交互作用。在任何实际场景中,这种情况极不可能发生,因为大多数时候,由于特征变量,总会有一些交互或联合效应。

PDPs 也局限于二维表示,并且 PDPs 并不显示任何特征分布。因此,如果特征空间分布不均匀,分析结果时可能会错过某些偏差的影响。由于 PDPs 只显示平均边际效应,它可能不会显示出任何异质效应。这意味着,如果某个特定特征的半数数据对预测结果有正面影响,而另一半则有负面影响,那么 PDP 可能仅仅是一条水平线,因为两半的影响可以相互抵消。这可能导致结论认为该特征对目标变量没有任何影响,这是误导性的。

通过 累积局部效应图ALEP)和 个体条件期望曲线ICE 曲线)可以解决 PDP 的缺点。我们不会在本章中涵盖这些概念,但请参考 参考文献 部分,[参考文献 – 4,5],以获取帮助您理解这些概念的额外资源。

让我们看看 图 2.8 中的某些样本 PDP 可视化:

![图 2.8 – PDP 可视化(来自代码教程)]

图片

图 2.8 – PDP 可视化(来自代码教程)

图 2.8 展示了有助于我们理解来自表格数据集的有影响力的特征的 PDP 可视化。在下一节中,我们将讨论层相关传播(Layer-wise Relevance Propagation,LRP)方法,以理解非结构化数据中的有影响力特征。

LRP

我们之前讨论的大多数基于影响的方法对结构化数据非常有效。但不幸的是,这些方法不能应用于图像和文本等非结构化数据,在这些数据中,特征并不总是明确定义的,尤其是在使用深度卷积神经网络(Deep Convolution Neural Networks,DCNNs)时。与应用于图像和文本等非结构化数据相比,经典机器学习算法的效率不如深度学习算法。由于深度学习在自动特征提取方面的优势,与经典机器学习中的手动特征工程相比,深度学习算法在模型精度方面更高效,因此更受欢迎。然而,深度学习模型比经典机器学习模型更复杂,可解释性也更差。

为深度学习模型提供可解释性也是一个相当大的挑战;通常,为深度学习模型提供可解释性的定量方法非常少。因此,我们主要依靠定性方法来可视化可能影响权重和偏差计算过程的关键影响数据元素,这些是任何深度学习模型的主要参数。此外,对于具有多个层的深度网络,当层之间的梯度流过程的信息流保持一致时,就会发生学习。因此,为了解释任何深度学习模型,特别是图像和文本,我们会尝试可视化网络不同层中的激活或最有影响力的数据元素,并定性检查算法的运行情况。

为了解释深度学习模型,LRP(Layer-wise Relevance Propagation)是其中最突出的方法之一。直观地说,这种方法利用网络中的权重和前向传递的神经激活来通过网络的各个层将输出反向传播到输入层。因此,借助网络权重,我们可以可视化对最终模型输出贡献最大的数据元素(在图像的情况下是像素,在文本数据的情况下是单词)。这些数据元素的贡献是相关性的定性度量,它在网络层之间传播。

现在,我们将探讨一些已经应用于解释深度学习模型工作原理的具体 LRP 方法。在实践中,实现这些方法可能具有挑战性。因此,我没有将这些方法包含在代码教程中,因为本章旨在帮助即使是初学者也能学习。我在参考部分分享了一些资源,供中级或高级学习者进行代码演练。

显著性图

显著性图是用于解释卷积神经网络CNN)预测结果的最常用方法之一。这项技术源于图像显著性概念,它指的是图像的重要特征,例如像素,这些像素在视觉上具有吸引力。因此,显著性图是从原始图像派生出的另一张图像,其中像素亮度与图像的显著性成正比。显著性图有助于突出图像中在模型最终决策过程中发挥重要作用的区域。它是一种专门用于 DCNN 模型的可视化技术,用于区分视觉特征和数据。

除了为深度学习模型提供可解释性之外,显著性图还可以用于识别感兴趣的区域,这些区域可以进一步由自动图像标注算法使用。此外,显著性图在音频领域,尤其是在音频监控中,用于检测不寻常的声音模式,如枪声或爆炸声。

图 2.9显示了给定输入图像的显著性图,它突出了模型用于预测结果的重要像素:

图 2.9 – 输入图像的显著性图

图 2.9 – 输入图像的显著性图

接下来,让我们来介绍另一种流行的 LRP 方法——引导反向传播引导反向传播)。

引导反向传播

另一种用于解释深度学习模型、增加信任并促进其采用的可视化技术是引导反向传播。引导反向传播突出图像中的细粒度视觉细节,以解释模型为何预测了特定的类别。它也被称为引导显著性,实际上结合了标准反向传播和通过 ReLU 非线性(也称为反卷积网络)的反向传播过程。如果您不熟悉这些术语,我强烈建议您阅读这篇文章,towardsdatascience.com/review-deconvnet-unpooling-layer-semantic-segmentation-55cf8a6e380e,以了解更多关于反向传播和反卷积网络机制的信息。

在这种方法中,网络的神经元充当特征检测器,由于使用了 ReLU 激活函数,因此只保留特征图中正的梯度元素。此外,DeconvNets 只保留正的错误信号。由于负梯度被设置为零,因此在通过 ReLU 层反向传播时,只有重要的像素被突出显示。因此,这种方法有助于可视化图像的关键区域、重要的形状以及算法将要分类的对象的轮廓。

图 2.10显示了给定输入图像的引导反向传播图,该图标记了模型用于预测结果的轮廓和一些粒度视觉特征:

![图 2.10 – 输入图像的引导反向传播img/B18216_02_10.jpg

图 2.10 – 输入图像的引导反向传播

引导反向传播非常有用,但在下一节中,我们将介绍另一种有用的方法来解释图像等非结构化数据,称为梯度 CAM。

梯度 CAM

CAMs 是用于解释深度学习模型的独立可视化方法。在这里,模型预测的类别分数被追踪回最后一个卷积层,以突出图像中具有类别特定性且甚至不适用于其他计算机视觉或图像处理算法的感兴趣区域。梯度 CAM结合了引导反向传播和 CAM 的效果,在不突出像素粒度重要性时突出感兴趣区域的类别判别性,这与引导反向传播不同。但 Grad-CAM 可以应用于任何 CNN 架构,而 CAM 只能应用于在预测层之前对来自卷积层的输出特征图执行全局平均池化的架构。

Grad-CAM(也称为梯度加权类别激活图)有助于可视化高分辨率细节,这些细节通常叠加在原始图像上,以突出预测特定类别的占主导地位的图像区域。对于多类分类模型来说,它非常有用。Grad-CAM 通过检查模型最后一层的梯度信息流来工作。然而,对于某些情况,检查细粒度像素激活信息也很重要。由于 Grad-CAM 不允许我们检查粒度信息,因此存在 Grad-CAM 的另一种变体,称为引导 Grad-CAM,用于结合引导反向传播和 Grad-CAM 的优点,以可视化图像中的粒度级类别判别信息。

图 2.11显示了任何输入图像的 Grad-CAM 可视化效果:

![图 2.11 – 输入图像的 Grad-CAMimg/B18216_02_11.jpg

图 2.11 – 输入图像的 Grad-CAM

Grad-CAM 突出了图像中的重要区域,这些区域被模型用于预测结果。这种方法的另一种变体是使用引导 Grad-CAM,它结合了引导反向传播和 Grad-CAM 方法,以产生有趣的可视化来解释深度学习模型:

图 2.12 – 引导 Grad-CAM 的架构图

图 2.12 – 引导 Grad-CAM 的架构图

图 2.12显示了引导 Grad-CAM 方法的架构图,这个图稍微复杂一些,但总体来说,LRP 是一种重要的方法,可以用来解释深度学习模型的工作原理。

基于表示的解释

模式表示在决策过程中起着重要作用,尤其是在文本和图像等非结构化数据中。传统上,使用手工设计的模式匹配算法来提取全局特征,这些特征是人类可以关联的。但最近,基于 CAVs 的 GoogleAI 模型可解释性技术,在 XAI 领域获得了极大的普及。在本部分,我们将更详细地讨论 CAVs,尽管从非结构化数据中提取特征和模式也属于基于表示的解释。

CAVs

尤其对于非结构化数据,大多数深度学习模型在低级特征上工作,如边缘、轮廓和模式,以及一些中级和高级特征,如感兴趣对象的一些定义部分和部分。大多数情况下,这些表示不是人类友好的,尤其是对于复杂的深度学习模型。直观上,CAVs 将低级和细粒度特征与高级人类友好概念联系起来。因此,使用 CAVs 的模型可解释性提供了更现实的解释,任何人类都可以与之相关联。

CAVs 的方法实际上是通过使用 GoogleAI 的概念激活向量测试TCAV)框架来实现的。TCAV 利用方向导数来近似神经网络内部状态到人类定义的概念。例如,如果我们要求一个人解释斑马是什么样子,他们可能会说斑马是一种看起来像白色马匹带有黑色条纹的动物,并且生活在草原上。因此,动物白色马匹黑色条纹草原可以代表斑马的重要概念。

同样,TCAV 算法试图学习这些概念,并使用训练好的模型学习这些概念对预测的重要性,尽管这些概念可能在训练过程中没有被使用。因此,TCAV 试图量化模型对特定类别的特定概念敏感度。我发现 CAVs 的想法非常吸引人。我认为这是创建人类友好型 AI 模型解释的一步,任何非技术用户都可以轻松地与之相关联。我们将在第八章使用 TCAV 进行人类友好型解释中更详细地讨论 GoogleAI 的 TCAV 框架。

图 2.13展示了使用人类友好概念来解释模型预测的想法。在下一小节中,我们将看到另一种用于解释复杂深度学习模型的可视化方法:

![Figure 2.13 – The fundamental idea behind the CAVimg/B18216_02_13.jpg

图 2.13 – CAV 背后的基本思想

接下来,我们将讨论视觉注意力图VAMs),它也可以与复杂的深度学习模型一起使用。

VAMs

近年来,由于在复杂非结构化数据上能够实现最先进的模型性能,转换器模型架构因其能力而获得了大量关注。注意力网络是转换器架构的核心,它允许算法学习更多上下文信息,以产生更准确的结果。

基本思想是数据中的每一部分并不同等重要,只有重要的特征需要比其他数据更多的关注。因此,注意力网络会过滤掉无关的数据部分,以便做出更好的判断。通过注意力机制,网络可以根据对底层任务的重要性级别分配更高的权重给重要部分。使用这些注意力权重,可以创建某些可视化,这些可视化可以解释复杂算法的决策过程。这些被称为 VAMs。

这种技术在解决诸如自动图像标题和视觉问答等问题时,对于多模态编码器-解码器架构特别有用。如果你对这种技术的理解处于入门水平,应用 VAMs 可能会相当复杂。因此,在这本书或代码教程中,我将不会详细介绍这项技术。如果你对了解这种技术在实践中是如何工作的感兴趣,请参考代码仓库github.com/sgrvinod/a-PyTorch-Tutorial-to-Image-Captioning

图 2.14所示,VAMs 提供了逐步可视化来解释复杂编码器-解码器模型的输出。在下一节中,我们将探讨基于示例的方法,这些方法用于解释机器学习模型:

图 2.14 – 使用 VAMs 解释用于多模态数据集自动图像标题任务的复杂编码器-解码器注意力深度学习模型

图 2.14 – 使用 VAMs 解释用于多模态数据集自动图像标题任务的复杂编码器-解码器注意力深度学习模型

在下一节中,我们将介绍另一种使用人类友好示例来解释黑盒模型预测的可解释性方法。

基于示例的方法

模型可解释性的另一种方法是示例方法提供的。示例方法的想法类似于人类尝试解释新概念的方式。作为人类,当我们试图向他人解释或介绍新事物时,我们通常会尝试使用听众能够相关联的例子。同样,在 XAI 的背景下,示例方法尝试选择数据集的某些实例来解释模型的行为。它假设观察当前数据实例与历史观察之间的相似性可以用来解释黑盒模型。

这些大多是模型无关的方法,可以应用于结构化和非结构化数据。如果结构化数据是高维的,这些方法会变得稍微具有挑战性,并且无法包含所有特征来解释模型。因此,只有在有选项总结数据实例或仅选择特定特征的情况下,这些方法才能很好地工作。

在本章中,我们将主要讨论反事实解释CFEs),这是最流行的基于示例的可解释性方法,适用于结构化和非结构化数据。CFEs 指出特定特征需要改变到何种程度才能显著改变预测结果。通常,这对于基于分类的问题很有用。

对于某些预测模型,CFEs 可以提供指导性的见解和建议,这对于最终用户和商业利益相关者可能非常关键。例如,假设有一个用于自动贷款审批系统的 ML 模型。如果黑盒模型拒绝某个申请人的贷款申请,贷款申请人可能会联系提供者以了解他们的申请为何未被批准的确切原因。但相反,如果系统建议申请人增加 5,000 元的薪水,并在接下来的 3 个月内按时支付信用卡账单,以便批准贷款申请,那么申请人将理解并信任系统的决策过程,并努力使他们的贷款申请获得批准。

结构化数据中的 CFEs

在 Python 中使用Diverse Counterfactual Explanation (DiCE)框架(interpret.ml/DiCE/),可以为结构化数据提供一个 CFE。它可以应用于基于分类和回归的问题,以实现模型无关的局部可解释性,并描述了结构化数据中最小的变化如何改变目标结果。

在 Python 中用于 CFE(Counterfactual Explanations)的重要框架之一是Alibi (docs.seldon.io/projects/alibi/en/stable/),它在实现 CFE 的概念以解释 ML 模型方面也相当不错。尽管我们将在第九章“其他流行的 XAI 框架”中讨论这些框架并体验这些框架的实际应用,但现在,我将讨论一些关于结构化数据中 CFE 的直观理解。请参考代码仓库中提供的笔记本(github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter02/Counterfactual_structured_data.ipynb),以了解如何在 Python 中编码这些方法以解决实际问题。

当与结构化数据一起使用时,CFE 方法试图分析一个输入查询数据实例,并尝试从历史数据中考虑相同查询实例的原始目标结果。或者,它试图检查特征并将它们映射到历史数据中存在的相似实例,以获取目标输出。然后,算法生成多个反事实示例来预测相反的结果。

对于基于分类的问题,这种方法将尝试预测二分类问题中的相反类别或对于多分类问题中最接近或最相似的类别。对于回归问题,如果目标结果位于谱系的较低端,算法将尝试提供一个目标结果更接近谱系高端的反事实示例,反之亦然。因此,这种方法对于理解“如果...会怎样”的情景非常有效,并且可以提供可操作性的见解以及模型可解释性。解释也非常清晰,易于理解和实现。

但这种方法的重大缺点,尤其是对于结构化数据,是它受到罗生门效应(www.dictionary.com/e/pop-culture/the-rashomon-effect/)的影响。对于任何现实世界的问题,它可能会找到多个可以相互矛盾的 CFEs。在结构化数据中,由于具有多个特征,相互矛盾的 CFEs 可能会造成更多的混淆,而不是解释机器学习模型!人类干预以及将领域知识应用于选择最相关的示例,可以帮助减轻罗生门效应。否则,我的建议是将这种方法与特征重要性方法结合起来,用于可操作的特征,以选择涉及重大变化的反事实示例,从而提供更好的可操作解释性。

图 2.15说明了如何使用 CFEs 来获取规范性见解和可操作的建议,以解释模型的工作原理:

图 2.15 – 从结构化数据中的 CFEs 获得的规范性见解

图 2.15 – 从结构化数据中的 CFEs 获得的规范性见解

在表格数据集中,CFEs 非常有用,因为它们可以为最终用户提供可操作的建议。在下一小节中,我们将探讨非结构化数据中的 CFEs。

非结构化数据中的 CFEs

在非结构化数据,如图像和文本中,实现 CFEs 可能相当具有挑战性。其中一个主要原因是深度学习模型在图像或文本中使用的细粒度特征并不总是定义良好或对人类友好。但Alibi(docs.seldon.io/projects/alibi/en/stable/)框架在生成图像数据上的 CFEs 方面做得相当不错。即使是简单的 CFE 方法的改进版本,通过生成由类别原型引导的 CFE,表现也更好。它使用自动编码器或 k-d 树,使用某个输入实例为每个预测类别构建原型。

例如,在 MNIST 数据集中,假设输入查询图像是数字 7。那么,反事实原型方法将构建从 0 到 9 的所有数字的原型。随后,它将尝试生成除原始数字 7 之外最近的数字作为反事实示例。根据数据,最近的手写数字可以是 9 或 1;即使是我们人类,如果书写不清楚,我们可能会混淆数字 7 和 9 或 7 和 1!它采用优化方法来最小化模型的反事实预测损失。

我强烈推荐查看阿诺德·范·洛弗伦简尼斯·克莱斯的工作,基于原型的可解释反事实解释 (arxiv.org/abs/1907.02584),以获取更多关于此方法如何工作的细节。此 CFE 方法,由原型引导,还消除了由于黑盒深度学习模型的数值梯度评估过程可能出现的任何计算约束。请查看 GitHub 仓库中的笔记本 (github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter02/Counterfactual_unstructured_data.ipynb),了解如何将此方法应用于实际问题。

下面的图表,取自论文Counterfactual Visual Explanations, Goyal et al. 2019 (arxiv.org/pdf/1904.07451.pdf),展示了视觉 CFE 如何成为解释图像分类器的有效方法:

图 2.16 – 基于反事实示例的图像解释

图 2.16 – 基于反事实示例的图像解释

在实践中,使用非结构化数据的 CFE 难以实现。这仍然是一个活跃的研究领域,但我认为这种方法具有很大的潜力,可以为甚至复杂的模型提供人性化的解释。以下图表显示了基于可解释性类型的各种方法映射:

图 2.17 – 基于可解释性类型的各种方法映射

图 2.17 – 基于可解释性类型的各种方法映射

LIME 和 SHAP 是本章未涉及的重要的局部和非模型特定算法,但它们将在稍后进行更详细的介绍。本章讨论的模型可解释性方法广泛应用于各种数据集,以提供不同维度的可解释性。

摘要

在本章中,你了解了用于解释黑盒模型的多种模型可解释性方法。其中一些是非模型特定的,而另一些是模型特定的。其中一些方法提供全局可解释性,而另一些则提供局部可解释性。对于大多数这些方法,通过图表、图形和转换图进行可视化,用于定性检查数据或模型结果;而对于某些方法,使用某些示例来提供解释。统计数据和数值指标在提供定量解释中也起着重要作用。

在下一章中,我们将讨论非常重要的数据中心化 XAI 概念,并了解数据中心化方法如何在模型可解释性中发挥作用。

参考文献

要获取本章主题的更多信息,请参阅以下资源:

第三章:数据中心化方法

第一章“可解释性技术基础概念”的定义解释方法和途径部分,当我们查看可解释性的各个维度时,我们讨论了数据是其中一个重要维度。实际上,所有机器学习ML)算法都依赖于所使用的基础数据。

在上一章中,我们讨论了各种模型可解释性方法。在第二章“模型可解释性方法”中讨论的大多数方法都是模型中心的。讨论的概念和思想集中在使黑盒模型可解释。但最近,机器学习和人工智能社区已经意识到数据对于任何分析或建模目的的核心重要性。因此,越来越多的 AI 研究人员正在探索围绕数据中心化 AI的新想法和概念。

由于数据在模型构建和预测过程中发挥着至关重要的作用,因此,我们更有必要从基础数据的角度解释任何机器学习和人工智能算法的工作原理。从我在这领域的经验观察来看,任何机器学习系统在生产中的失败并不是由于选择了糟糕的机器学习算法,也不是由于模型训练或调整过程效率低下,而是大多数情况下是由于基础数据集的不一致性。因此,本章专注于数据中心化可解释人工智能XAI)的概念。

本章的目标是向您介绍数据中心化 XAI 的概念。阅读本章后,您将了解可以执行的各种方法,以检查可能影响模型结果的数据质量。对于生产级别的机器学习系统,推理数据可能存在与其一致性和质量相关的问题。因此,监控这些漂移至关重要。此外,可能存在影响数据的外部噪声或扰动,这可能会影响模型。因此,我们将讨论一些用于解释机器学习模型的数据中心化方法。在本章中,以下主要主题将被涵盖:

  • 数据中心化 XAI 简介

  • 详尽的数据分析和配置文件过程

  • 监控和预测漂移

  • 检查对抗鲁棒性

  • 测量数据可预测性

现在,让我们深入探讨!

技术要求

第二章中的模型可解释性方法类似,本章提供了一些教程示例,以实现某些在特定有趣数据集上执行以数据为中心的 XAI 技术的技术。我们将使用 Python Jupyter 笔记本来运行代码并在整本书中可视化输出。本章的代码和数据集资源可以从以下 GitHub 仓库下载或克隆:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter03。其他运行代码所需的 Python 框架将在笔记本中提及,以及其他相关细节,以了解这些概念代码的实现。其他运行代码所需的 Python 框架将在笔记本中提及,以及了解这些概念代码实现的相关细节。请注意,本章主要侧重于提供对所涵盖主题的概念性理解。Jupyter 笔记本将帮助您获得在实践实现这些概念所需的补充知识。我建议您首先阅读本章,然后尝试执行 Jupyter 笔记本。

数据为中心的 XAI 简介

安德鲁·吴是 AI 和 ML 领域有影响力的思想领袖之一,他经常强调使用系统方法构建具有高质量数据的 AI 系统的重要性。他是以数据为中心的 AI理念的先驱之一,该理念侧重于开发系统流程,使用干净、一致和可靠的数据来开发模型,而不是专注于代码和算法。如果数据是一致的、明确的、平衡的,并且有足够的数量,这将导致模型构建更快、准确性更高,以及任何生产级系统的部署更快。

不幸的是,今天所有在生产中存在的 AI 和 ML 系统都不符合以数据为中心的 AI 原则。因此,可能存在严重的数据问题,这些问题很少被发现,但最终会导致 ML 系统失败。这就是为什么以数据为中心的 XAI对于检查和评估所使用数据的质量很重要。

当我们谈论根据数据解释任何黑盒模型的运作时,我们应该检查数据的、数据的一致性(尤其是对于监督式 ML 问题),以及数据的纯净性和完整性。现在,让我们讨论数据为中心的 XAI 的重要方面,并了解为什么它们很重要。

分析数据量

机器学习算法的经典问题之一是由于过拟合导致的泛化不足。可以通过添加更多数据或获取适当体积的数据集来解决潜在问题,从而减少过拟合。因此,我们应该首先问关于数据的问题来解释黑盒模型:“模型是否在足够的数据上训练过?”但对于任何工业应用,由于数据非常昂贵,添加更多数据并不总是可行的。因此,问题应该是:“我们如何找出模型是否在足够的数据上训练过?

检查模型是否在足够的数据上训练过的一种方法是通过使用 70%、80%和 90%的训练数据集来训练模型。如果模型准确率显示出随着数据量的增加而增加的趋势,这意味着数据量可以影响模型的表现。如果基于整个训练数据集训练的模型的准确率较低,那么随着数据量的增加而增加的模型准确率趋势表明模型没有在足够的数据上训练。因此,需要更多数据来使模型更准确和更具泛化能力。

对于生产系统,如果数据持续流动且没有对数据可用性的限制,应该对数据的变化量进行持续的训练和监控,以了解和分析其对整体模型性能的影响。

分析数据一致性

数据一致性是解释机器学习模型时需要检查的另一个重要因素。分析数据一致性的基本步骤之一是理解数据的分布。如果数据分布不均匀,如果存在类别不平衡,或者如果数据偏向特定方向,那么模型很可能对数据的一个特定部分存在偏差或效率较低。

对于生产系统,通常观察到在生产应用中使用的推理数据可能与训练和验证期间使用的数据进行一些差异。这种现象被称为数据漂移,它指的是数据结构或数据集的统计属性出现意外变化,从而使数据变得不完整并妨碍机器学习系统的运行。

对于大多数实时预测模型来说,数据漂移非常常见。这仅仅是因为,在大多数情况下,数据分布会在一段时间内发生变化。这可能是由多种原因造成的,例如,如果收集数据所通过的系统(例如,传感器)开始出现故障或需要重新校准,那么就会发生数据漂移。其他外部因素,如周围温度和周围噪声,也可能引入数据漂移。特征之间的关系可能会发生自然变化,这可能导致数据漂移。因此,如果训练数据与推理数据显著不同,模型在预测结果时将产生错误。

现在,有时整个数据集可能会出现漂移,或者一个或多个特征可能会出现漂移。如果单个特征出现漂移,这被称为特征漂移。有多种方法可以检测特征漂移,例如人口稳定性指数PSI)(www.lexjansen.com/wuss/2017/47_Final_Paper_PDF.pdf)、Kullback–Leibler 散度KL 散度)(www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained)和Wasserstein 距离地球搬家距离)(infolab.stanford.edu/pub/cstr/reports/cs/tr/99/1620/CS-TR-99-1620.ch4.pdf)。其中一些技术的应用已在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter03中展示。这些统计方法是衡量两个数据分布之间距离的流行方式。因此,如果距离显著较大,这表明存在漂移。

除了特征漂移,如果由于未知原因,目标变量的统计特性在一段时间内发生变化,则可能会发生标签漂移概念漂移。然而,在解释黑盒模型时,整体数据一致性是一个重要的参数,用于根本原因分析检查

分析数据纯净度

用于实际工业问题的数据集永远不会是干净的,尽管大多数组织在数据工程和数据整理上投入了大量的时间和资金,以推动数据驱动决策的文化。然而,几乎所有实际数据集都是杂乱的,需要系统性的整理和准备方法。

当我们训练一个模型时,通常,我们会将精力投入到数据预处理和准备步骤中,例如查找重复或唯一值从数据中移除噪声或不想要的值检测异常值处理缺失值处理具有混合数据类型的特征,甚至转换原始特征或进行特征工程以获得更好的机器学习模型。从高层次来看,这些方法旨在从训练数据中去除杂质。但是,如果在一个黑盒机器学习模型上训练的数据纯净度较低,因此表现不佳,会怎样呢?

正因如此,分析数据纯净度是数据为中心的 XAI 的一个重要步骤。除了前面提到的数据预处理和准备方法之外,还存在其他数据完整性问题,如下所示:

  • 标签模糊性:对于监督式机器学习问题,标签模糊性可能是一个非常关键的问题。如果数据集中两个或多个非常相似的实例具有多个标签,那么这可能导致标签模糊性。目标变量的模糊标签可能会增加即使是领域专家正确分类样本的难度。标签模糊性可能是一个非常常见的问题,因为通常,标记数据集是由容易犯人为错误的人类领域专家准备的。

  • 主导特征频率变化DFCC):检查训练和推理数据集中的 DFCC 是另一个可能导致数据完整性问题的参数。在第二章“模型可解释性方法”中,当我们讨论特征重要性时,我们了解到数据集中并非所有特征都同等重要,有些特征对模型的决策过程有更大的影响力。这些是数据集中的主导特征,如果训练和推理数据集中主导特征值的方差很高,那么模型在预测结果时出现错误的概率非常高。

其他数据纯净度问题,例如引入新的标签或新的特征类别,或者在推理集中某个特定特征的越界值(或异常值),可能导致生产中的机器学习系统失败。

下表显示了可以使用Deepchecks Python 框架执行的某些重要数据纯净度检查:

![图 3.1 – 使用 Deepchecks 框架进行数据纯净度检查图片

图 3.1 – 使用 Deepchecks 框架进行数据纯净度检查

以数据为中心的 XAI 还包括其他可以分析的参数,例如对抗鲁棒性(adversarial-ml-tutorial.org/introduction/)、信任分数比较(arxiv.org/abs/1805.11783)、协变量偏移(arxiv.org/abs/2111.08234)、训练集和验证集之间的数据泄露(machinelearningmastery.com/data-leakage-machine-learning/)以及基于数据变更的模型性能敏感性分析。所有这些概念都适用于表格数据和非结构化数据,如图像和文本。

要探索数据纯度分析的实际方法,你可以参考github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter03/Data_Centric_XAI_part_1.ipynb上的 Jupyter 笔记本。我们将在本章后面讨论这些主题。

详尽的数据分析和概要化流程

在上一节中,你被介绍到了以数据为中心的 XAI 的概念,我们讨论了数据为中心 XAI 的三个重要方面:分析数据量、数据一致性和数据纯度。你可能已经了解了一些我们将要学习的数据分析和数据概要化方法。但我们将假设我们已经有了一个训练好的机器学习模型,现在我们正在通过采用以数据为中心的方法来解释模型的决策过程。

需要进行数据分析和概要化流程

第二章 模型可解释性方法中,当我们讨论使用探索性数据分析EDA)进行知识提取时,我们发现这是一个预先分析过程,其中我们试图理解数据以形成相关假设。作为数据科学家,这些初步假设很重要,因为它们允许我们采取必要的步骤来构建更好的模型。但让我们假设我们有一个基线训练好的机器学习模型,而这个模型的表现并不如预期,因为它没有达到设定的基准精度分数。

遵循以模型为中心的方法原则,大多数数据科学家可能会想要花更多时间在超参数调整、训练更多轮次、特征工程或选择更复杂的算法上。然而,在某个点上,这些方法将变得有限,并且对模型精度的提升非常微小。这时,以数据为中心的方法证明是非常有效的。

数据分析作为预防措施

根据以数据为中心的可解释性方法的原则,首先,我们尝试对基础数据集进行彻底分析。我们尝试随机重新排列数据以创建不同的训练集和验证集,并观察任何过拟合或欠拟合效应。如果模型过拟合或欠拟合,显然需要更多的数据来泛化模型。如果可用的数据量不足,有方法可以生成合成或人工数据。用于图像分类的一种流行技术是数据增强research.aimultiple.com/data-augmentation/)。合成少数过采样技术SMOTE)([machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/](https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/))也是一种强大的方法,您可以使用它来增加数据集的大小。这些以数据为中心的方法通常在传统的机器学习工作流程中实践。然而,我们需要认识到这些步骤对于黑盒模型可解释性的重要性。

一旦我们进行了足够的测试以了解数据量是否充足,我们就可以尝试在分段级别上检查数据的一致性和纯度。如果我们正在处理一个分类问题,我们可以尝试了解模型性能是否对所有类别都是一致的。如果不一致,我们可以隔离模型性能较差的特定类别或类别。然后,我们检查数据漂移、特征漂移、概念漂移、标签模糊、数据泄露(例如,当未见过的测试数据逐渐进入训练数据时),以及针对该特定类别(或类别)的其他数据完整性检查。通常,如果特定类别(或类别)的数据有任何异常,这些检查就足以隔离问题。彻底的数据分析作为预防措施,用于检测建模过程中的任何漏洞。

构建稳健的数据概要

另一种方法是建立数据的统计概要,然后比较训练数据和推理数据之间的概要。数据集的统计概要是一组统计度量,这些度量按目标变量类别(或,在回归问题的情况下,按值区间)分段。统计度量的选择可能因用例而异,但通常,我选择如均值、中位数、平均方差、平均标准差、变异系数(标准差/均值)和 z 分数((值 - 均值)/标准差)等统计度量来创建数据概要。在时间序列数据的情况下,移动平均和移动中位数等度量也非常重要。

接下来,让我们尝试理解这种方法的有用之处。假设有一个任意数据集,它有三个类别(即类别 0、1 和 2)并且只有两个特征:特征 1 和特征 2。当我们尝试准备统计概览时,我们会尝试计算每个特征和每个类别的某些统计量(例如,在这个例子中的均值、中位数和平均方差)。

因此,对于类别 0,将生成一个包含特征 1 的均值、特征 1 的中位数、特征 1 的平均方差、特征 2 的均值、特征 2 的中位数和特征 2 的平均方差的概览值集合。同样,对于类别 1 和类别 2,将为每个类别创建一个概览值集合。以下表格代表了我们在本例中考虑的任意数据集的统计概览:

图 3.2 – 一个表格,展示了针对任意数据集按每个类别分割的统计概览

图 3.2 – 一个表格,展示了针对任意数据集按每个类别分割的统计概览

这些特征值的统计量可以用来比较不同的类别。如果一个训练模型预测了特定的类别,我们可以将该类别的特征值与统计概览值进行比较,以获得关于模型决策过程中影响特征的一个公平的概念。但更重要的是,我们可以为验证集、测试集和生产系统中使用的推理数据创建单独的统计概览,并将它们与训练集的统计概览进行比较。如果值之间的绝对百分比变化显著较高(比如说,> 20%),那么这表明存在数据漂移。

在我们的例子中,假设如果类别 1 的特征 1 的平均方差分数在训练数据和推理数据之间绝对百分比变化约为 25%,那么我们就有了特征 1 的特征漂移,这可能会导致生产系统中的推理数据模型性能不佳。统计概览也可以为非结构化数据,如图像和文本,创建,尽管统计量的选择可能稍微复杂一些。

通常,这种方法很容易实现,并且它帮助我们验证用于训练模型的数据和用于测试或推理的数据是否一致,这对于以数据为中心的模型可解释性是一个重要的步骤。在下一节中,我们将讨论监控和预测漂移对于解释机器学习系统的重要性。

监控和预测漂移

在上一节中,我们了解了如何通过彻底的数据分析和数据概要分析的方法帮助我们识别与数据量、一致性和纯度相关的数据问题。通常,在初始数据探索过程中,大多数数据科学家会尝试从数据量、纯度等方面检查数据集中的问题,并执行必要的预处理和特征工程步骤来处理这些问题。

但对于几乎所有的机器学习系统来说,检测实时系统和生产系统中的数据一致性是一个具有挑战性的问题。此外,与数据一致性相关的问题通常被忽视,并且相当不可预测,因为它们可能在生产系统的任何时间点发生。以下是一些可能发生数据一致性问题的案例:

  • 它们可能由于自然原因而发生,例如外部环境条件的变化或捕捉推理数据的传感器或系统的自然磨损和老化。

  • 它们可能由于人为原因而发生,例如对收集数据的系统造成的任何物理损坏,由于软件程序中的任何错误导致输入数据被错误地转换,或者在升级旧系统版本时向系统中引入的任何噪声。

因此,所有这些情况都可能引入数据漂移和概念漂移,最终导致机器学习模型性能下降。由于漂移在现实中非常普遍,因此与漂移相关的问题应该预先考虑,并且在任何机器学习系统的设计过程中都应该予以考虑。

检测漂移

在任何生产机器学习系统中部署训练好的模型后,性能监控和基于模型性能的反馈是一个必要的流程。在我们监控模型性能的同时,检查任何数据或概念漂移也是这一步骤中的关键。此时,你可能会有两个疑问:

  • 如何最好地识别漂移的存在?

  • 当我们检测到漂移的存在时会发生什么?

如在分析数据一致性一节中讨论的,存在两种类型的数据漂移——特征漂移概念漂移。特征漂移发生在由于不可预见的原因导致特征或独立变量的统计属性发生变化时。相比之下,概念漂移发生在模型试图预测的目标类别变量在动态环境中改变其与输入特征的初始关系时。在这两种情况下,底层数据都发生了统计变化。因此,我推荐检测漂移时使用上一节中讨论的数据概要分析方法。

对于任何实时应用程序来说,实时监控仪表板总是有助于监控任何漂移。在仪表板中,尝试为每个类别和每个特征提供必要的可视化,比较统计概要值与实际流入训练模型的实时值。

尤其对于概念漂移,比较特征与目标结果之间的相关性非常有帮助。由于外部原因,漂移可能在某个时间段后甚至可能在特定时间点出现,因此始终建议在时间窗口期内(例如,50 个连续数据点或 100 个连续数据点)监控推理数据的统计特性,而不是基于连续累积的基础。当在推理数据中检测到异常数据点时,可以设置必要的警报和触发器,这可能表明存在数据漂移。

统计指标的选择

有时,选择统计指标可能很困难。因此,我们通常选择一些流行的分布指标,通过定量方法检测数据漂移。其中一个指标被称为信任度分布(arxiv.org/abs/1805.11783)。

下面的图显示了使用Deepchecks Python 框架获得的信任度分布图:

![图 3.3 – 训练数据集和推理数据集之间信任度分布的示例图片 B18216_03_3.jpg

图 3.3 – 训练数据集和推理数据集之间信任度分布的示例

信任度是一种分布指标,用于衡量训练集上的机器学习分类器与推理数据集上的更新k-最近邻kNN)分类器之间的协议。前面的图显示了训练数据集和推理数据集之间的信任度分布图。

理想情况下,训练和测试数据集的分布应该几乎相同。然而,如果推理数据集的信任度分布偏向极端左侧,这表明训练模型对推理数据的信心较低,从而暗示存在漂移。如果推理数据上信任度分布偏向极端右侧,可能存在模型问题,并且数据泄露的可能性很高,因为理想情况下,训练模型对测试数据的信心不应比训练数据更高。

要检测分类特征上的特征漂移,常用的指标是人口稳定性指数PSI)(www.lexjansen.com/wuss/2017/47_Final_Paper_PDF.pdf)。这是一种统计方法,用于测量变量在一定时间内的变化。如果整体漂移分数超过 0.2 或 20%,则认为漂移是显著的,从而确定存在特征漂移。

要检测数值特征中的特征漂移,Wasserstein 度量kowshikchilamkurthy.medium.com/wasserstein-distance-contraction-mapping-and-modern-rl-theory-93ef740ae867)是流行的选择。这是一个用于测量两个概率分布之间距离的函数。类似于 PSI,如果使用 Wasserstein 度量得到的漂移分数高于 20%,这被认为是显著的,并且数值特征被认为存在特征漂移。

以下图表展示了使用 Wasserstein(地球迁移)距离和预测能力分数PPS)在 Deepchecks 框架中进行的特征漂移估计:

图 3.4 – 使用 Wasserstein(地球迁移)距离和特征 PPS 进行特征漂移估计

图 3.4 – 使用 Wasserstein(地球迁移)距离和特征 PPS 进行特征漂移估计

使用这些指标也可以检测到类似的概念漂移。对于回归问题,Wasserstein 度量是有效的,而对于分类问题,PSI 更有效。您可以在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter03上的实际数据集上看到这些方法的运用。此外,还有其他非常有用的统计方法,如Kullback-Leibler 散度KL 散度)、Bhattacharyya 距离Jensen-Shannon 散度JS 散度)等,可用于检测数据漂移。

在本章中,我们的重点不是学习这些指标,但我强烈建议您查看参考部分,以了解更多关于这些指标及其在检测数据漂移中的应用。这些方法也适用于图像。与结构化特征值不同,图像数据集的像素强度值分布被用来检测漂移。

既然我们已经了解了一些有效的检测漂移的方法,当我们确定了漂移的存在时,我们该怎么办? 第一步是如果机器学习系统已经在生产中,则通知我们的利益相关者。由于数据漂移导致的错误预测可能会影响许多最终用户,这最终可能导致最终用户对失去信任。下一步是检查漂移是否是暂时的季节性的永久的。漂移性质的分析可能具有挑战性,但如果可以识别并撤销导致漂移的变化,那么这就是最好的解决方案。

如果漂移是暂时的,第一步是确定导致漂移的临时变化,然后撤销这些更改。对于季节性漂移,应在训练过程中或作为额外的预处理步骤考虑数据中的季节性变化,以归一化数据中的任何季节性影响。这样,模型就会意识到数据中的季节性模式。然而,如果漂移是永久的,那么唯一的选择就是在新数据上重新训练模型,并将新训练的模型部署到生产系统中。

在 XAI 的背景下,漂移的检测可以证明任何 ML 模型或算法的失败,并有助于通过识别失败的根本原因来改进模型。在下一节中,我们将讨论另一个可以执行的数据中心化质量检查步骤,以确保 ML 模型的鲁棒性。

检查对抗鲁棒性

在上一节中,我们讨论了预测和监控任何生产级 ML 系统漂移的重要性。通常,这种监控是在模型部署到生产之后进行的。但在模型部署到生产之前,检查模型的对抗鲁棒性是极其关键的。

大多数 ML 模型都容易受到对抗攻击或输入数据中噪声注入的影响,导致模型通过做出错误预测而失败。对抗攻击的程度随着模型复杂性的增加而增加,因为复杂模型对噪声数据样本非常敏感。因此,检查对抗鲁棒性就是评估训练好的模型对对抗攻击的敏感程度。

在本节中,首先,我们将尝试理解对抗攻击对模型的影响以及为什么这在 XAI 的背景下很重要。然后,我们将讨论我们可以使用的某些技术来提高 ML 模型的对抗鲁棒性。最后,我们将讨论用于评估模型对抗鲁棒性的方法,这可以在将 ML 模型部署到生产之前作为一个练习来完成,以及这是可解释 ML 系统的一个关键部分。

对抗攻击的影响

在过去的几年里,对抗攻击一直是 AI 社区关注的焦点。这些攻击可以通过向输入数据注入噪声来修改数据,使得人类观察者可以轻易地识别出正确的结果,但 ML 模型却很容易被欺骗并开始预测完全错误的结果。攻击的强度取决于攻击者对模型的访问权限。

通常,在生产系统中,训练好的模型(尤其是模型参数)是固定的,不能修改。但是,流入模型的可疑数据可能会被突然的噪声信号污染,从而使模型分类错误。人类专家在过滤掉注入的噪声方面非常高效,但如果模型在训练阶段没有接触过这种噪声样本,那么机器学习模型就无法从实际数据中隔离噪声。有时,这些攻击也可能是有针对性的攻击。

例如,如果一个面部识别系统只允许特定人员访问,那么通过引入一些噪声,对抗攻击可以将任何人的图像修改成特定的人。在这种情况下,需要使用目标样本来训练对抗算法,以构建噪声信号。还有其他形式的对抗攻击,它们可以在训练阶段本身修改模型。然而,由于我们是在 XAI 的背景下讨论这个问题,我们将集中讨论对抗效果对训练好的机器学习模型的影响。

有不同类型的对抗攻击可以影响训练好的机器学习模型:

  • 快速梯度符号方法FGSM):FGSM 是这种方法之一,它使用深度学习模型的梯度来学习对抗样本。对于图像分类器来说,这可能是一个常见问题,因为 FGSM 通过添加或减去像素强度值来在图像的像素值上创建扰动,这取决于模型的梯度下降方向。这可能会欺骗模型进行错误分类,并严重影响模型性能,但这对人类观察者来说不会造成任何问题。即使修改看起来微不足道,该方法添加的均匀分布噪声足以导致错误分类。

  • Carlini & WagnerC&W攻击:另一种常见的对抗攻击是 C&W 攻击。这种方法使用基于三个范数的距离度量(,和)来寻找对抗示例,使得对抗示例与原始样本之间的距离最小。检测 C&W 攻击比检测 FGSM 攻击更困难。

  • 目标对抗补丁攻击:有时,在整个图像中注入噪声(即添加噪声随机像素)并不是必要的。仅向图像的一小部分添加噪声图像片段,对模型同样有害。目标对抗补丁攻击可以生成一个小型的对抗补丁,然后将其叠加到原始样本上,从而遮挡数据的特征,使模型分类错误。还有其他形式的对抗攻击,未来还可以发现更多新方法。然而,影响仍然相同。

下图展示了不同的对抗攻击如何向图像中引入噪声,从而使模型难以给出正确的预测。尽管添加了噪声,但作为人类,我们仍然可以预测正确的结果,但训练好的模型却被对抗攻击完全欺骗了:

![图 3.5 – 对推理数据进行的对抗攻击导致模型预测错误img/B18216_03_5.jpg

图 3.5 – 对推理数据进行的对抗攻击导致模型预测错误

对抗攻击可以迫使机器学习模型产生错误的输出,这可能会严重影响最终用户。在下一节中,让我们尝试探索提高模型对抗鲁棒性的方法。

提高对抗鲁棒性的方法

在生产系统中,对抗攻击通常会在推理数据中注入噪声。因此,为了减少对抗攻击的影响,我们可能需要教会模型过滤掉噪声,或在训练过程中暴露噪声样本的存在,或者训练模型检测对抗样本:

  • 最简单的方法是将噪声作为防御机制过滤掉,以增加机器学习模型的对抗鲁棒性。任何对抗噪声都会导致输入样本发生急剧变化。为了过滤掉任何信号中的急剧变化,我们通常尝试应用一种平滑滤波器,例如空间平滑。空间平滑在图像中相当于模糊操作,用于减少对抗攻击的影响。根据经验,我发现一种自适应中值空间平滑homepages.inf.ed.ac.uk/rbf/HIPR2/median.htm),通过窗口方法在局部层面工作,比全局层面的平滑更有效。中值统计量在过滤掉数据中的噪声或异常值方面总是更有效。

  • 提高对抗鲁棒性的另一种方法是,在训练过程中引入对抗示例。通过使用数据增强技术,我们可以从原始数据生成对抗样本,并在训练过程中包含增强数据。如果从头开始使用增强对抗样本进行训练不可行,那么训练好的机器学习模型可以使用迁移学习对对抗样本进行微调。在这里,可以将训练好的模型权重用于在新样本上进行微调。

  • 使用对抗样本训练模型的过程通常被称为对抗训练。我们甚至可以使用对抗训练来训练一个单独的模型,仅用于从原始样本中检测对抗样本,并将其与主模型一起使用,以在生成对抗样本时触发警报。将模型暴露于可能的对抗样本的想法类似于网络安全中的压力测试ieeexplore.ieee.org/document/6459909)。

图 3.6 展示了如何使用空间平滑作为防御机制来最小化对抗攻击的影响:

图 3.6 – 使用空间平滑作为防御机制以最小化对抗攻击的影响

图 3.6 – 使用空间平滑作为防御机制以最小化对抗攻击的影响

使用我们迄今为止讨论的方法,我们可以极大地提高训练的机器学习模型的对抗鲁棒性。在下一节中,我们将尝试探索评估机器学习模型对抗鲁棒性的方法。

评估对抗鲁棒性

现在我们已经学习了某些防御对抗攻击的方法,紧接着可能想到的问题是我们如何衡量模型的对抗鲁棒性?

不幸的是,我从未遇到过任何专门用于定量衡量机器学习模型对抗鲁棒性的指标,但这对于人工智能社区来说是一个重要的研究课题。数据科学家评估机器学习模型对抗鲁棒性的最常见方法包括压力测试分段压力测试

  • 压力测试中,通过 FGSM 或 C&W 方法生成对抗示例。随后,在对抗示例上测量模型的准确性,并将其与使用原始数据获得的模型准确性进行比较。对抗攻击的强度也可以增加或减少,以观察模型性能随攻击强度的变化。有时,某个特定类别或特征可能比整个数据集更容易受到对抗攻击。在这些情况下,分段压力测试是有益的。

  • 分段压力测试中,不是在整个数据集上测量整个模型的对抗鲁棒性,而是考虑数据集的各个部分(无论是特定类别还是特定特征),以比较模型的鲁棒性与对抗攻击的强度。可以通过随机噪声或高斯噪声生成对抗示例。对于某些数据集,可以使用诸如峰值信噪比PSNR)(www.ni.com/nl-be/innovations/white-papers/11/peak-signal-to-noise-ratio-as-an-image-quality-metric.html)和综合相对误差ERGAS)(www.researchgate.net/figure/Erreur-Relative-Globale-Adimensionnelle-de-Synthese-ERGAS-values-of-fused-images_tbl1_248978216)等量化指标来衡量数据或信号质量。否则,可以通过模型对对抗样本的预测来定量检查机器学习模型的对抗鲁棒性。

除了评估对抗鲁棒性的方法之外,检查对抗鲁棒性和监测对抗性攻击的检测是可解释机器学习系统的一个基本部分。接下来,让我们讨论测量数据可预测性的重要性,作为提供以数据为中心的模型可解释性的方法。

测量数据可预测性

到目前为止,我们已经通过检查数据的一致性和纯度、寻找监测漂移以及检查任何对抗性攻击来了解分析数据的重要性,以解释机器学习模型的工作原理。但是,一些数据集非常复杂,因此即使使用复杂的算法,训练准确的模型也是不可行的。如果训练的模型不准确,它就倾向于做出错误的预测。现在的问题是,如果我们知道训练的模型在做出正确预测方面并不非常准确,我们如何赢得最终用户的信任?

我会说,获得信任的最好方式是保持透明,并清楚地传达什么是可行的。因此,测量数据可预测性并向最终用户传达模型的效率有助于设定正确的期望。

数据可预测性是对模型性能使用底层数据进行估计。例如,假设我们有一个预测特定公司股价的模型。被机器学习算法建模的股价数据可以以最多 60%的准确率预测股价。超过这个点,使用给定的数据集生成更准确的预测结果在实际上是不可能的。

但假设如果考虑其他外部因素来补充当前数据,可以提高模型的准确性。这证明限制系统性能的不是机器学习算法,而是用于建模的数据集没有足够的信息来获得更好的模型性能。因此,这是可以通过数据可预测性度量来估计的数据集限制。

下面的图表显示了可以使用 Deepchecks 框架分析数据可预测性的多个模型评估可视化。

![Figure 3.7 – 使用模型评估报告和 Deepchecks 框架估计数据可预测性img/B18216_03_7.jpg

图 3.7 – 使用模型评估报告和 Deepchecks 框架估计数据可预测性

接下来,让我们讨论如何估计数据可预测性。

估计数据可预测性

数据可预测性是通过模型评估指标来估计的。数据可预测性也可以通过执行模型错误分析来衡量。指标的选择取决于数据集的类型和要解决的问题的类型。例如,看看以下列表:

  • 对于时间序列数据,数据可预测性通过如平均绝对百分比误差(MAPE)、对称平均绝对百分比误差(SMAPE)、变异系数(CoV)等指标来获得。

  • 对于分类问题,我通常选择ROC-AUC 分数混淆矩阵精确度召回率F1 分数以及准确度

  • 对于回归问题,我们可以查看均方误差(MSE)、R2 分数均方根误差(RMSE)、平方误差和(SSE)等。

你可能已经使用过这些指标中的大多数来评估训练好的机器学习模型。数据可预测性不仅仅是根据你选择的指标来评估训练模型,而是使用给定数据集来衡量模型的预测性。

假设你正在应用三种不同的机器学习算法,如决策树、支持向量机(SVM)和随机森林,来解决一个分类问题,并且你选择的指标是召回率。这是因为你的目标是最小化假阳性的影响。经过对未见数据的严格训练和验证后,你能够获得决策树的 70%召回率,SVM 的 85%,随机森林的 90%。你认为你的数据可预测性会是多少?是 70%,90%,还是 81.67%(三个分数的平均值)?

我会说,正确答案在 70%到 90%之间。总是最好将可预测性视为一个大致估计,因为提供一个值范围而不是单个值可以给出最佳和最坏情况场景的印象。关于数据可预测性的沟通增加了最终利益相关者对机器学习系统的信心。如果最终用户意识到算法只有 70%的准确性,即使系统预测错误,他们也不会盲目信任模型。如果用户意识到模型的局限性,当模型结果与实际结果不符时,他们会更加谨慎。

生产中的大多数机器学习系统已经开始使用预测概率或模型置信度作为数据可预测性的衡量标准,并将其传达给最终用户。例如,如今,大多数天气预报应用都会显示降雨或降雪有一定概率(或概率)。因此,数据可预测性通过为预测结果的准确性设定正确的期望,增加了 AI 算法的可解释性。这不仅仅是模型性能的衡量标准,而是特定数据集上训练的模型可预测性的衡量标准。

这就带我们来到了本章的结尾。让我们在下面的部分中总结一下我们讨论的内容。

摘要

现在,让我们尝试总结一下你在本章中学到的内容。在本章中,我们专注于 XAI 的数据中心方法。我们学习了从底层数据解释黑盒模型的重要性,因为数据是任何机器学习模型的中心部分。数据为中心的 XAI 的概念可能对你们中的许多人来说都是新的,但它是对整个 AI 社区的一个重要研究领域。数据为中心的 XAI 可以在数据量、数据一致性和数据纯度方面为黑盒模型提供可解释性。

数据中心的可解释性方法是活跃的研究课题,目前还没有单一的 Python 框架涵盖数据为中心的 XAI 的所有各个方面。请探索在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter03提供的补充 Jupyter 笔记本教程,以获得更多关于这个主题的实用知识。

我们学习了彻底检查数据和数据概要化的概念,以估计训练数据和推理数据的一致性。监控生产机器学习系统的数据漂移也是数据为中心的 XAI 过程中的一个重要部分。除了数据漂移之外,估计机器学习模型的对抗鲁棒性和检测对抗攻击也是这个过程的重要组成部分。

最后,我们学习了数据可预测性的重要性,这对于设定正确的期望,让利益相关者了解模型可以实现什么,以及这是增加我们最终用户信任的必要实践至关重要。

本章介绍了许多统计概念。涵盖每种统计方法的全部内容超出了本章的范围。然而,我强烈建议您查看共享的参考链接,以更深入地了解这些主题。

这本书的第一部分到此结束,您已经接触到了 XAI 某些关键主题的概念理解。从下一章开始,我们将开始探索将 XAI 的概念应用于实际现实问题的流行 Python 框架。在下一章中,我们将介绍一个重要的 XAI 框架 LIME,并探讨其在实践中的应用。

参考文献

若要获取本章主题的更多信息,请参考以下资源:

第二部分 – 实际问题解决

本节将为您提供使用 Python 实现模型可解释性各种方法所需的信息和经验。您将了解上一节中涵盖的可解释人工智能XAI)概念的不同 Python 框架,例如 LIME、SHAP、TCAV、ALIBI、DALEX、Explainerdashboard、InterpretML、ELI5 和 DiCE。您还将获得必要的实际经验,以应用于实际案例中的可解释性方法。

本节包括以下章节:

  • 第四章**,LIME 模型可解释性

  • 第五章**,在机器学习中使用 LIME 的实际经验

  • 第六章**,使用 SHAP 进行模型可解释性

  • 第七章**,在机器学习中使用 SHAP 的实际经验

  • 第八章**,使用 TCAV 进行人性化的解释

  • 第九章**,其他流行的 XAI 框架

第四章:LIME 用于模型可解释性

在前几章中,我们讨论了构建可信赖人工智能系统所需的各种可解释人工智能XAI)的技术概念。此外,我们还查看了一些使用各种 Python 框架实现的实际示例和演示,这些示例和演示在本书本章的 GitHub 代码库中给出。XAI 已经是一个重要的研究课题有一段时间了,但直到最近,所有组织才开始将 XAI 作为解决使用人工智能解决商业问题的解决方案生命周期的一部分来采用。其中一种流行的方法是局部可解释模型无关解释LIME),它已被广泛采用以提供模型无关的局部可解释性。LIME Python 库是一个健壮的框架,它为表格、文本和图像数据提供人性化的解释,并有助于解释黑盒监督机器学习算法。

在本章中,你将了解 LIME 框架,它在 XAI 领域产生了重大影响。我们将讨论 LIME 算法在全局和局部模型可解释性方面的作用。此外,我将演示一个示例,说明 LIME Python 框架在实际中的应用。我将介绍这个框架的限制,你应该注意这些限制。

因此,在本章中,我们将讨论以下主要主题:

  • 对 LIME 的直观理解

  • 什么使 LIME 成为一个好的模型解释器?

  • 子模块选择(SP-LIME)

  • 使用 LIME 解决分类问题的实际示例

  • 可能的陷阱

不再拖延,让我们开始吧。

技术要求

本章的技术性比本书前几章的内容要高一些。本章的代码和数据集资源可以从位于github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter04的 GitHub 代码库中下载或克隆。与前面的章节类似,我们将使用 Python 和 Jupyter 笔记本来运行代码并生成必要的输出。在笔记本中还将提到运行代码所需的其他重要 Python 框架,并附带进一步的相关细节,以理解这些概念代码的实现。

对 LIME 的直观理解

LIME 是一种新颖的、模型无关的局部解释技术,通过学习预测周围的局部模型来解释黑盒模型。LIME 为模型提供了一个直观的全局理解,这对非专家用户也很有帮助。这项技术最初在 Ribeiro 等人撰写的科研论文 "为什么我应该相信你?解释任何分类器的预测" 中被提出。(https://arxiv.org/abs/1602.04938)。Python 库可以从 GitHub 仓库 github.com/marcotcr/lime 安装。该算法通过使用近似局部可解释模型,以忠实的方式解释任何分类器或回归器,做得相当不错。它提供了一个全局视角,以建立对任何黑盒模型的信任;因此,它允许你识别在人类可解释表示中可解释的模型,这些表示在局部上是忠实于算法的。所以,它主要通过 学习可解释的数据表示在保真度-可解释性权衡中保持平衡寻找局部探索 来发挥作用。让我们详细看看每一个方面。

学习可解释的数据表示

LIME 在区分影响特征和选择任何非专家用户都能理解的可解释数据表示方面做得相当不错,无论算法实际使用的复杂特征如何。例如,当解释在图像等非结构化数据上训练的模型时,实际算法可能使用复杂的数值特征向量进行决策过程,但这些数值特征值对任何非技术终端用户来说都是难以理解的。相比之下,如果解释是通过图像中感兴趣区域或超像素(即像素的连续块)的存在或不存在来提供的,那么这是一种人类可解释的解释方式。

类似地,对于文本数据,与其使用词嵌入向量值来解释模型,不如通过使用描述模型目标结果的某些单词的存在或不存在来提供一种更好的、人类可解释的解释方式。从数学上讲,被解释的数据实例的原始表示用 表示,其中 d 是数据的整个维度。一个可解释数据表示的二进制向量在数学上表示为 。直观地说,算法试图表示人类可解释数据表示的存在或不存在,以解释任何黑盒模型。

图 4.1 展示了 LIME 如何尝试将输入图像数据划分为人类可解释的组件,这些组件随后被用来以任何非技术用户都能理解的方式解释黑盒模型:

![图 4.1 – LIME 如何将图像转换为人类可解释的组件图片 B18216_04_001.jpg

图 4.1 – LIME 如何将图像转换为人类可解释的组件

接下来,让我们讨论如何维持保真度-可解释性权衡。

维持保真度-可解释性权衡的平衡

LIME 利用固有的可解释模型,如决策树、线性模型和基于规则的启发式模型,通过视觉或文本工件向非专家用户提供解释。从数学上讲,这种解释是一个可以用表示的模型,其中是所有可能的可解释模型的全集,而的域用另一个二进制向量,表示,它表示可解释组件的存在或不存在。此外,算法还试图衡量解释的复杂度及其可解释性。例如,即使在可解释模型如决策树中,树的深度是其复杂度的一个度量。

从数学的角度来说,一个可解释模型的复杂度用 表示。LIME 试图在提供解释的同时保持局部保真度。这意味着算法试图复制模型在预测的个体数据实例附近的的行为。因此,从数学上讲,该算法的发明者使用了一个函数,,来衡量任何数据实例,,之间的接近程度,从而定义了原始表示,周围的局部性。现在,如果概率函数,,定义了属于某个类别的概率,那么为了近似,LIME 算法试图用一个接近函数,,来衡量的不忠实程度。这个整个操作用函数表示。因此,算法试图最小化局部感知损失函数,,同时保持为一个低值。这样,它就可以很容易地向任何非专家用户解释。可解释性局部保真度权衡的度量可以用以下数学函数近似:

因此,这个权衡度量依赖于可解释模型,,保真度函数,,和复杂度度量,

寻找局部探索

LIME 算法是模型无关的。这意味着当我们尝试最小化局部感知损失函数,对f没有任何假设时。同时,LIME 通过取权重为的样本来保持局部保真度,同时近似的非零样本被随机均匀抽取,以采样周围的实例。假设存在一个包含非零元素分数的扰动样本,用表示。算法试图从原始表示,,中恢复样本,以近似。然后,被用作解释模型,的标签。

图 4.2展示了在arxiv.org/pdf/1602.04938.pdf原始 LIME 框架论文中的一个例子,它通过视觉表示直观地解释了算法的工作原理:

图 4.2 – 直观解释 LIME 算法的工作原理

图 4.2 – 直观解释 LIME 算法的工作原理

图 4.2中,分隔浅蓝色和粉红色的曲线被认为是黑盒模型的复杂决策函数。由于决策函数是非线性的,使用线性模型来近似它并不高效。十字和点代表属于两个不同类别的训练数据。粗十字代表正在解释的推理数据实例。算法通过采样实例来获取使用f的预测。然后,算法根据与被解释数据实例的邻近度分配权重。在前面的图中,根据数据实例的邻近度,红色十字和蓝色点的尺寸被调整。因此,采样的实例既更接近x,从中获得更高的权重,又远离它,因此具有较低的权重。原始的黑盒模型可能过于复杂,无法提供全局解释,但 LIME 框架可以提供适合局部数据实例,的解释。通过虚线表示的学习解释在局部上是忠诚的,具有全局视角。

图 4.3展示了 LIME 算法的更直观理解。从原始图像中,算法生成了一组扰动数据实例:

图 4.3 – 使用 LIME 解释的预测

图 4.3 – 使用 LIME 解释的预测

图 4.3所示,扰动实例是通过关闭一些可解释组件创建的。在图像的情况下,如前图所示,这是通过将某些组件变为灰色来实现的。然后,将黑盒模型应用于生成的每个扰动实例,并计算实例被预测为模型最终结果的概率。然后,在数据集上学习一个可解释的模型(例如简单的局部加权线性模型),最后,考虑具有最大正权重的超像素作为最终解释。

在下一节中,让我们讨论为什么 LIME 是一个好的模型解释器。

什么使 LIME 成为一个好的模型解释器?

LIME 使非专家用户能够理解不可信的黑盒模型的工作原理。以下 LIME 的特性使其成为一个好的模型解释器:

  • 人类可解释性:如前节所述,LIME 提供易于理解的解释,因为它提供了一种定性的方法来比较输入数据的组件与模型结果。

  • 模型无关性:在前几章中,尽管你已经学习了各种特定模型的解释方法,但如果解释方法可以用于为任何黑盒模型提供可解释性,这始终是一个优势。LIME 在提供解释时不对模型做任何假设,并且可以与任何模型一起工作。

  • 局部保真度:LIME 通过探索被预测的数据实例的邻近性来尝试复制整个模型的行为。因此,它为用于预测的数据实例提供局部可解释性。这对于任何非技术用户理解模型决策过程的准确原因非常重要。

  • 全局直觉:尽管该算法提供了局部可解释性,但它确实试图向最终用户解释一个代表性集合,从而为模型的运作提供全局视角。SP-LIME 通过解释一组数据实例来提供对模型的全局理解。这将在下一节中更详细地介绍。

既然我们已经了解了 LIME 框架的关键优势,那么在下一节中,让我们讨论 LIME 的子模选择算法,该算法用于提取全局可解释性。

SP-LIME

为了使解释方法更加可信,对单个数据实例(即局部解释)的解释并不总是足够的,最终用户可能希望对模型有全局的理解,以便对模型的鲁棒性有更高的可靠性。因此,SP-LIME 算法试图在多个多样化、但仔细选择的数据实例集上运行解释,并返回非冗余的解释。

现在,让我提供一个关于 SP-LIME 算法的直观理解。算法认为,通过所有单个局部解释所需的时间是有限的,并且是一个约束。因此,最终用户愿意检查以解释模型的数量是算法的预算,用B表示。假设X表示实例集合;选择B个实例供最终用户分析以进行模型可解释性的任务定义为选择步骤。选择步骤与解释的存在无关,并且它需要通过选择一个多样化的代表性实例集来提供非冗余解释,以解释模型从全局角度的行为。因此,算法试图避免选择具有相似解释的实例。

从数学上讲,这个想法是通过解释矩阵W)来表示的,其中W = n * d',其中n是样本数量,d'是可解释的人类特征。算法还使用一个全局重要性组件矩阵I),其中对于I的每个组件jI(j)代表解释空间中的全局重要性。直观地说,I是以一种方式制定的,为解释数据中的许多实例分配更高的分数。考虑用于解释的重要特征集合用V表示。因此,结合所有这些参数,算法试图学习一个非冗余覆盖直觉函数c(V,W,I)。非冗余覆盖直觉试图计算至少在集合V中的一个实例中出现的所有特征的集体重要性。然而,选择问题是关于最大化加权覆盖函数的。这由以下方程表示:

图片

我们在本节中刚刚覆盖的算法的细节可能对某些读者来说理解起来有些令人困惑。然而,直观地说,算法试图覆盖以下步骤:

  1. 解释模型在所有实例(x)上运行。

  2. 计算所有单个组件的全局重要性。

  3. 然后,算法通过迭代添加具有最高最大覆盖增益的实例来尝试最大化非冗余覆盖直觉函数(c)。

  4. 最后,算法试图获得代表性的非冗余解释集(V)并将其返回。

在下一节中,我们将通过代码示例介绍如何使用 LIME Python 框架来解决分类问题。

使用 LIME 解决分类问题的实际示例

到目前为止,我们已经涵盖了关于 LIME 算法所需的大部分深入概念理解。在本节中,我们将尝试探索用于解释分类问题的 LIME Python 框架。该框架可在 GitHub 上作为开源项目找到github.com/marcotcr/lime。在 Jupyter 笔记本中使用pip安装程序可以轻松安装 LIME:

!pip install lime

教程的完整笔记本版本可在 GitHub 仓库github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter04/Intro_to_LIME.ipynb中找到。然而,现在,我将尝试带你详细了解整个代码。一旦 LIME 框架安装完成,通过导入库快速验证安装是否成功:

import lime

如果导入成功,你可以轻松地继续下一步;否则,你需要检查在安装框架时出了什么问题。但通常情况下,你不会遇到任何错误或任何依赖冲突,因为安装库相当直接。对于这个教程,我们将使用泰坦尼克数据集(www.openml.org/search?type=data&sort=runs&id=40945&status=active)。这是用于预测泰坦尼克号乘客生存的经典机器学习数据集之一。因此,这是一个可以用机器学习解决的问题的二分类问题。尽管这是一个不太复杂的经典数据集,但它包含了所有类型的特征,如分类有序连续,甚至某些对分类不相关的标识符,这使得这个数据集成为很有趣的工作对象。为了使你更容易执行笔记本,我在代码仓库github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter04/dataset中进行了一些轻微修改后下载并提供了数据集。

泰坦尼克数据集

描述泰坦尼克号上个别乘客生存状态的原始泰坦尼克数据集。泰坦尼克数据不包含船员的信息,但它包含了半数乘客的实际年龄。关于泰坦尼克号乘客的数据主要来源于《泰坦尼克号百科全书》。这里使用的数据集由各种研究人员开始。其中一个原始来源是 Eaton & Haas (1994)的《泰坦尼克号:胜利与悲剧》,由 Patrick Stephens Ltd 出版,其中包括由许多研究人员创建并由 Michael A. Findlay 编辑的乘客名单。

UVa 的 Thomas Cason 使用《泰坦尼克号百科全书》对 titanic 数据框进行了大量更新和改进,并在此创建了数据集。一些重复的乘客已被删除,许多错误得到纠正,许多缺失的年龄得到填补,并创建了新的变量。

在安装和导入所有必需的模块后,首先,我们将从目录中加载数据集作为 pandas DataFrame:

data = pd.read_csv('dataset/titanic.csv')

当你尝试使用 pandas 的head方法可视化 DataFrame 时,你会看到数据集的一个快照,如图图 4.4所示。通常,这一步可以帮助你快速了解如何理解你的数据:

data.head()

下面的图表展示了用于此例的 pandas DataFrame 的一个快照:

图 4.4 – 以 pandas DataFrame(左侧)和数据字典(右侧)显示数据集

图 4.4 – 以 pandas DataFrame(左侧)和数据字典(右侧)显示数据集

对于这个特定的例子,我们并不关心获得一个高度高效的机器学习模型,而是我们的重点是使用 LIME 在几行代码中生成人类友好的解释。因此,我们将跳过进行严格的探索性数据分析EDA)或特征工程步骤。然而,我非常鼓励你们所有人都将这些步骤作为良好的实践。正如我们可以从数据集中看到的那样,某些特征,如乘客 ID票号是标识符,可以忽略。船舱号特征是一个有趣的特征,特别是因为它可能表明船的某个翼、楼层或侧面更容易受到损害。但是,这个特征是一个稀疏分类特征,单独来看,可能不会非常有帮助,可能需要一些高级的转换或特征工程。因此,为了构建一个简单的模型,我们将删除这个特征。此外,乘客姓名对于预测模型没有用,因此我们可以将其删除。有一些分类特征需要转换以获得更好的模型结果。如果你想尝试更多关于特征工程的想法,以下文章可能有所帮助:triangleinequality.wordpress.com/2013/09/08/basic-feature-engineering-with-the-titanic-data/.

这里是模型训练前的数据准备代码行:

# Dropping all irrelevant columns
data.drop(columns=['PassengerId', 'Name', 'Cabin', 'Ticket'], inplace = True)
# Handling missing values
data.dropna(inplace=True)
# Ensuring that Age and Fare is of type float 
data['Age'] = data['Age'].astype('float')
data['Fare'] = data['Fare'].astype('float')
# Label Encoding features 
categorical_feat = ['Sex']
# Using label encoder to transform string categories to integer labels
le = LabelEncoder()
for feat in categorical_feat:
    data[feat] = le.fit_transform(data[feat]).astype('int')
# One-Hot Encoding Categorical features
data = pd.get_dummies(data, columns=['Embarked'])

转换后的 DataFrame 在图 4.5中显示:

图 4.5 – 基本预处理和特征工程后的 DataFrame 显示

图 4.5 – 基本预处理和特征工程后的 DataFrame 显示

现在,对于模型训练部分,我们将使用 XGBoost 分类器。这是一个集成学习算法,本身不具有可解释性。根据估计器的数量,算法的复杂性可以有所不同。它也可以使用pip安装程序轻松安装:

!pip install xgboost

将以下代码用于在划分为训练集和测试集后训练模型:

features = data.drop(columns=['Survived'])
labels = data['Survived']
# Dividing into training-test set with 80:20 split ratio
x_train,x_test,y_train,y_test = train_test_split(
    features,labels,test_size=0.2, random_state=123)
model = XGBClassifier(n_estimators = 300, 
                      random_state = 123)
model.fit(x_train, y_train)

接下来,让我们将![图片 B18216_04_039.png]定义为预测概率分数,该分数将随后被 LIME 框架利用:

predict_fn = lambda x: model.predict_proba(x)

为了提供模型解释,我们可以通过几行代码定义 LIME 对象,并解释所需的数据实例:

explainer = lime.lime_tabular.LimeTabularExplainer(
    data[features.columns].astype(int).values, 
    mode='classification', 
    training_labels=data['Survived'],
    feature_names=features.columns)
exp = explainer.explain_instance(
    data.loc[i,features.columns].astype(int).values, 
    predict_fn, num_features=5)
exp.show_in_notebook(show_table=True)

以下图表显示了 LIME 为模型可解释性提供的可视化:

![图 4.6 – LIME 框架提供的模型结果可视化

![图片 B18216_04_006.jpg]

图 4.6 – LIME 框架提供的模型结果可视化

图 4.6中,我们可以看到 LIME 框架仅用几行代码提供的解释。现在,让我们尝试理解这个可视化在告诉我们什么:

  • 最左侧的条形图显示了预测概率,这可以被视为模型在做出预测时的置信水平。在图 4.6中,对于所选数据实例,模型有 100%的信心认为该乘客会幸存

  • 从左数第二个可视化可能是最重要的可视化,它提供了最大的可解释性。它告诉我们最重要的特征是Sex特征,其特征重要性得分为 38%,其次是Age,其特征重要性得分为 26%。然而,如图 4.6所示,对于所选数据实例,SexPclass(乘客等级)、FareEmbarked_C(从瑟堡港出发)特征与从整个数据集中学习到的阈值分数一起,对模型的幸存结果做出了贡献。相比之下,蓝色的Age特征更倾向于预测结果为未幸存,因为该乘客的年龄是 38 岁,通常来说,38 岁以上的乘客在灾难中幸存的机会较低。LIME 模型学习到的阈值特征值也与我们的常识和先验知识一致。即使在 100 多年前发生的泰坦尼克号沉船事件中,妇女和儿童被优先考虑使用有限的救生艇逃离沉船。

同样,支付了更高票价的一等舱乘客有更高的优先权使用救生艇,因此有更高的生存机会。所以,提供的模型解释是人性化的,并且与我们之前的信念一致。

  • 从左数第三个可视化显示了前五个特征及其相应的值。在这里,橙色突出显示的特征对类别 1 有贡献,而蓝色突出显示的特征对类别 0 有贡献。

  • 最右侧的可视化几乎与第二个可视化相同,只是它以不同的格式呈现,并且它还为所选特定数据实例提供了局部解释。

在上一节中,我们讨论了 LIME 也提供了对模型的全面理解,同时提供了局部解释。这是通过 SP-LIME 算法实现的。这可以通过以下几行代码实现:

sp_exp = submodular_pick.SubmodularPick(
   explainer, data[features.columns].values, predict_fn,
   num_features=5, num_exps_desired=10)
[exp.as_pyplot_figure(label=exp.available_labels()[0]) for exp in sp_exp.sp_explanations]

图 4.7 展示了使用 SP-LIME 获得的可视化:

图 4.7 – 从 SP-LIME 获得的多样化解释的可视化,以获得对模型的全面理解

](https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/app-ml-expl-tech/img/B18216_04_007.jpg)

图 4.7 – 从 SP-LIME 获得的多样化解释的可视化,以获得对模型的全面理解

图 4.7 展示了 SP-LIME 代码的输出。SP-LIME 提供了一个多样化的代表性样本集,考虑了模型的不同实例,以获得对黑盒模型的全面视角。这些可视化显示了重要的特征、特征重要性得分,以及每个特征的值范围,以及这些特征如何对任一类别做出贡献。LIME 框架的所有这些属性和特性使其成为向黑盒模型提供模型无关、人类可理解模型可解释性的强大方法。此外,该框架也非常稳健,因此整个算法只需几行代码即可实现。

尽管 LIME 有许多优点,但不幸的是,这个算法也有一些缺点,我们应该意识到。让我们在下一节中讨论它们。

潜在的陷阱

在上一节中,我们学习了如何轻松地使用 LIME Python 框架来解释分类问题的黑盒模型。但不幸的是,该算法确实存在某些局限性,并且有一些场景中该算法并不有效:

  • 在提供可解释的解释时,特定的可解释数据表示和可解释模型的选择可能仍然存在很多限制。尽管底层训练模型可能仍然被视为黑盒模型,但在解释过程中并没有对模型做出任何假设。然而,某些表示可能不足以表示模型的某些复杂行为。例如,如果我们试图构建一个图像分类器来区分黑白图像和彩色图像,那么超像素的存在与否对于提供解释可能没有帮助。

  • 如前所述,LIME 学习一个可解释的模型来提供局部解释。通常,这些可解释的模型是线性和非复杂的。然而,如果底层黑盒模型不是线性的,即使在预测的局部区域,那么 LIME 算法可能就不有效。

  • LIME 解释对输入数据的任何变化都高度敏感。即使输入数据的一点点变化也可能极大地改变 LIME 提供的解释实例。

  • 对于某些数据集,LIME 解释并不稳健,即使是对于相似的数据实例,提供的解释也可能完全不同。这可能会阻止最终用户完全依赖 LIME 提供的解释。

  • 该算法极其容易受到数据漂移和标签漂移的影响。训练数据和推理数据之间的一点点漂移可能会导致完全不一致的解释。论文《在 LIME 框架中研究数据和标签漂移》的作者RahnamaBoströmarxiv.org/abs/1910.14421)提到了一些可以用来评估 LIME 框架中数据漂移影响的实验。由于这种限制,LIME 解释的近似良好性(也称为保真度)被认为是低的。在一个好的解释方法中这是不应该出现的。

  • LIME 提供的解释依赖于算法超参数的选择。与大多数算法类似,即使是 LIME 算法,超参数的选择也会决定所提供解释的质量。对于 LIME 算法来说,超参数调整也是困难的,因为通常采用定性方法来评估 LIME 解释的质量。

有许多研究工作指出了 LIME 算法的其他局限性。我在参考文献部分提到了其中一些研究工作。我强烈建议您阅读这些论文,以获取有关算法某些局限性的更多详细信息。

摘要

这就带我们结束了这一章。在本章中,我们讨论了 LIME,这是 XAI 中最广泛采用的框架之一。在本章中,我们讨论了算法工作背后的直觉以及使生成的解释对人类友好的算法的一些重要特性。此外,我们还看到了一个端到端的教程,展示了如何使用 LIME 为黑盒分类模型提供可解释性。尽管我们讨论了 LIME 算法的一些局限性,但由于其简单性,LIME 仍然是 XAI 中最受欢迎和最广泛使用的框架之一。因此,对我们来说,讨论这个算法并深入了解框架的工作原理非常重要。

在下一章中,我们将应用 LIME 框架,使用不同类型的数据集来解决其他类型的机器学习问题。

参考文献

对于更多信息,请参阅以下资源:

第五章:在机器学习中实际使用 LIME

在阅读上一章之后,您现在应该对局部可解释模型无关解释(LIME)有很好的概念理解。我们看到了 LIME Python 框架如何解释分类问题的黑盒模型。我们还讨论了 LIME 框架的一些优缺点。在实践中,LIME 仍然是 XAI 框架中最受欢迎的之一,因为它可以轻松应用于表格数据集、文本数据集和图像数据集。LIME 可以为解决回归和分类问题提供模型无关的局部解释。

在本章中,您将更深入地了解如何在机器学习中使用 LIME 的实践。本章的主要讨论话题包括:

  • 在表格数据上使用 LIME

  • 使用 LIME 解释图像分类器

  • 在文本数据上使用 LIME

  • LIME 用于生产级系统

技术要求

与上一章类似,本章非常技术性,包含 Python 和 Jupyter 笔记本中的代码讲解。对于本章,代码和数据集资源可以从 GitHub 仓库下载或克隆:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter05。与前面的章节一样,我们将使用 Python 和 Jupyter 笔记本来运行代码并生成必要的输出。所有其他相关细节都提供在笔记本中,我建议您在阅读章节内容的同时运行笔记本,以更好地理解所涵盖的主题。

在表格数据上使用 LIME

第四章使用 LIME 解决分类问题的实际例子部分,我们讨论了如何在 Python 中设置 LIME 以及如何使用 LIME 解释分类机器学习模型。第四章**LIME 用于模型可解释性中使用的教程数据集(github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter04/Intro_to_LIME.ipynb)是一个表格结构化数据。在本节中,我们将讨论如何使用 LIME 解释基于表格数据的回归模型。

设置 LIME

在开始代码讲解之前,我会要求您检查以下笔记本,github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter05/LIME_with_tabular_data.ipynb,其中已经包含了理解我们现在将要深入讨论的概念所需的步骤。我假设我们将用于本教程的大多数 Python 库已经安装在了您的系统上。但如果还没有安装,请运行以下命令来安装我们将要使用的 Python 库的升级版本:

!pip install --upgrade pandas numpy matplotlib seaborn scikit-learn lime

关于数据集的讨论

对于本教程,我们将使用来自scikit-learn datasetsDiabetes datasetscikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset)。这个数据集用于预测糖尿病的疾病进展水平。它包含大约442 个样本10 个基线特征年龄性别体重指数 (bmi)平均血压 (bp)总血清胆固醇 (s1)低密度脂蛋白 (s2)高密度脂蛋白 (s3)总胆固醇 / HDL (s4)可能的对血清甘油三酯水平的对数 (s5),以及血糖水平 (s6)。考虑到监测糖尿病进展的潜在问题是重要的实际问题,这个数据集既有趣又相关。

数据集中提供的特征变量已经通过将特征值围绕均值中心化并按标准差乘以样本数(N)进行缩放进行了归一化:

更多关于原始数据集的信息可以在www4.stat.ncsu.edu/~boos/var.select/diabetes.html找到。

要加载数据集,只需执行以下代码行:

from sklearn import datasets
dataset = datasets.load_diabetes()
features, labels = dataset.data, dataset.target

如果需要,您可以执行必要的 EDA 步骤,但由于我们的主要重点是使用 LIME 来解释黑盒模型,我们不会在本教程中花费太多精力在 EDA 上。

关于模型的讨论

如笔记本教程中所示,我们使用了一个梯度提升回归器GBR)(scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html)模型来训练我们的预测模型。然而,任何回归机器学习算法都可以用来代替 GBR,因为 LIME 算法将模型本身视为任何黑盒模型。此外,当我们对未见过的数据进行模型评估时,我们观察到平均绝对百分比误差(MAPE)为 0.37,均方误差(MSE)为 2,538,以及R 平方系数评分为 0.6。所有这些结果都表明我们的模型并不很好,肯定还有改进的空间。因此,如果这样的模型在生产级系统中部署,最终利益相关者可能会提出许多问题,因为他们总是难以信任不准确模型。此外,如 GBR 之类的算法本身不具有可解释性,算法的复杂性取决于超参数,包括估计器的数量和树的深度。因此,模型可解释性框架如 LIME 不仅仅是附加步骤,而是构建机器学习模型过程中的必要部分。接下来,我们将看到 LIME 如何通过几行代码轻松地应用于解释黑盒回归模型。

LIME 的应用

如我们在上一章中看到的,我们可以轻松使用以下命令支持 LIME 框架对表格数据的支持:

import lime
import lime.lime_tabular

一旦成功导入 LIME 模块,我们需要创建一个解释器对象:

explainer = lime.lime_tabular.LimeTabularExplainer(
    x_train, mode='regression',
    class_names=['disease_progression'],
    feature_names=dataset.feature_names)

然后,我们只需要获取数据实例并为其提供局部可解释性:

exp = explainer.explain_instance(x_test[i], model.predict, 
                                 num_features=5)
exp.show_in_notebook(show_table=True)

我们将从前面的代码行中获得以下输出:

图 5.1 – 将 LIME 框架应用于在表格数据集上训练的回归模型时的输出可视化

图 5.1 – 将 LIME 框架应用于在表格数据集上训练的回归模型时的输出可视化

图 5.1说明了 LIME 框架提供的基于可视化的解释。

接下来,让我们尝试理解图 5.1中的输出可视化在告诉我们什么:

  • 图 5.1中最左侧的可视化显示了可能的值范围和模型预测结果的位置。直观地说,所有模型预测都应该位于最小值和最大可能值之间,因为这表明用户将当前预测与最佳和最坏情况值进行比较。

  • 中间的可视化显示了哪些特征对预测结果偏高或偏低有贡献。考虑到我们对糖尿病的先验知识,较高的 BMI、升高的血压和血清甘油三酯水平确实表明疾病进展的增加。

  • 图 5.1中最右侧的可视化显示了识别出的最重要的特征的实际局部数据值,按其相关性降序排列。

LIME 框架提供的解释在很大程度上是可由人类理解的,并且确实为我们提供了关于黑色盒模型用于预测的特征值对的指示。

因此,这就是我们如何仅用几行代码就能使用 LIME 来解释在表格数据上训练的黑色盒回归模型的方法。但是,正如我们在第四章中讨论的,“LIME 模型可解释性”部分下的“潜在陷阱”部分,LIME 提供的解释并不总是全面的,可能存在一些不一致性。这是我们都需要注意的事情。然而,LIME 的解释,结合彻底的 EDA、以数据为中心的 XAI、反事实解释和其他模型可解释性方法,可以为在表格数据集上训练的黑色盒模型提供强大而全面的解释性。

现在,让我们在下一节中探讨如何使用 LIME 来解释在非结构化数据上训练的分类器,例如图像。

使用 LIME 解释图像分类器

在上一节中,我们看到了如何轻松地将 LIME 应用于解释在表格数据上训练的模型。然而,解释在图像等非结构化数据上训练的复杂深度学习模型始终是主要挑战。通常,深度学习模型在图像数据上比传统的机器学习模型更有效率,因为这些模型具有执行自动特征提取的能力。它们可以提取复杂的低级特征,如条纹边缘轮廓角点模式,甚至高级特征,如更大的形状物体的某些部分。这些高级特征通常被称为图像中的感兴趣区域 (RoI)或超像素,因为它们是覆盖图像特定区域的像素集合。现在,低级特征不是人类可解释的,但高级特征是可解释的,因为任何非技术终端用户都会根据高级特征与图像相关联。LIME 也以类似的方式工作。算法试图突出图像中那些对模型决策过程产生积极或消极影响的超像素。所以,让我们看看 LIME 如何被用来解释图像分类器。

设置所需的 Python 模块

在我们开始代码讲解之前,请检查代码仓库中提供的笔记本:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter05/LIME_with_image_data.ipynb。该笔记本包含了实际应用这些概念所需的必要细节。在本节中,我将为您讲解代码,并解释笔记本教程中涵盖的所有步骤。如果尚未安装,请使用以下命令安装 Python 库的升级版本:

!pip install --upgrade pandas numpy matplotlib seaborn tensorflow lime scikit-image

接下来,让我们讨论本例中使用的模型。

使用预训练的 TensorFlow 模型作为我们的黑盒模型

对于这个教程,我们使用了一个预训练的 TensorFlow Keras Xception 模型作为我们的黑盒模型。该模型在 ImageNet 数据集(www.image-net.org/)上进行了预训练,这是图像分类中最受欢迎的基准数据集之一。可以使用以下代码行加载预训练模型:

from tensorflow.keras.applications.xception import Xception
model = Xception(weights="imagenet")

为了使用任何推理数据进行图像分类,我们还需要执行必要的预处理步骤。请参阅github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter05/LIME_with_image_data.ipynb 中的必要预处理方法。

LIME 图像解释器的应用

在本小节中,我们将看到如何使用 LIME 框架来识别模型用于预测特定结果的图像中的超像素或区域。我们首先需要定义一个图像explainer对象:

explainer = lime_image.LimeImageExplainer()

接下来,我们需要将推理数据(normalized_img[0])传递给explainer对象,并使用 LIME 框架突出显示对模型预测有最大正负影响的超像素:

exp = explainer.explain_instance(normalized_img[0], 
                                 model.predict, 
                                 top_labels=5, 
                                 hide_color=0, 
                                 num_samples=1000)
image, mask = exp.get_image_and_mask(exp_class, 
                                     positive_only=False,
                                     num_features=6,
                                     hide_rest=False,
                                     min_weight=0.01)
plt.imshow(mark_boundaries(image, mask))
plt.axis('off')
plt.show()

作为前面代码行的输出,我们将得到图像中某些突出显示的部分,这些部分以正负两种方式对模型的预测有贡献:

图 5.2 – (左) 原始推理图像。(中) 最重要的图像超像素。(右) 在原始数据上叠加的绿色掩码超像素图像

图 5.2 – (左) 原始推理图像。(中) 最重要的图像超像素。(右) 在原始数据上叠加的绿色掩码超像素图像

图 5.2中,最左侧的图像被用作推理图像。当训练模型应用于推理图像时,模型的最高预测是虎鲨

预测实际上是正确的。然而,为了解释模型,LIME 算法可以突出对预测影响最大的超像素。从图 5.2的中间和最右侧的图像中,我们可以看到黑盒模型实际上是很好且值得信赖的,因为 LIME 算法捕获的相关超像素表明存在虎鲨。

LIME 算法估计的超像素可以使用以下代码行显示:

plt.imshow(exp.segments)
plt.axis('off')
plt.show()

我们还可以形成一个热力图,突出每个超像素的重要性,这使我们进一步了解黑盒模型的工作原理:

dict_heatmap = dict(exp.local_exp[exp.top_labels[0]])
heatmap = np.vectorize(dict_heatmap.get)(exp.segments) 
plt.imshow(heatmap, cmap = 'RdBu', vmin  = -heatmap.max(),
           vmax = heatmap.max())
plt.colorbar()
plt.show()

获得的输出显示在图 5.3中:

图 5.3 – (左) LIME 算法选取的所有超像素的图像。(右) 根据模型预测的重要性对超像素的热力图

图 5.3 – (左) LIME 算法选取的所有超像素的图像。(右) 根据模型预测的重要性对超像素的热力图

图 5.3中的热力图为我们提供了一些关于重要超像素的见解,对于任何非技术用户解释任何黑盒模型来说也很容易。

因此,我们已经看到 LIME 如何仅用几行代码就能解释在图像数据上训练的复杂深度学习模型。我发现 LIME 是可视化解释基于深度学习的图像分类器最有效的算法之一,无需展示任何复杂的统计或数值或复杂的图形可视化。与表格数据不同,我觉得提供给图像分类器的解释更加稳健、稳定且易于人类理解。这绝对是我最喜欢的解释图像分类器的方法之一,在将任何图像分类模型投入生产之前,我强烈建议应用 LIME 作为一个额外的评估步骤,以增强对训练模型的信心。

在下一节中,让我们探索在文本数据上训练的 LIME。

在文本数据上使用 LIME

在前一节中,我们讨论了 LIME 是如何成为解释在图像数据集上训练的复杂黑盒模型的有效方法。与图像一样,文本也是一种非结构化数据,这与结构化的表格数据有很大不同。解释在非结构化数据上训练的黑盒模型始终是非常具有挑战性的。但 LIME 也可以应用于在文本数据上训练的模型。

使用 LIME 算法,我们可以分析特定单词或单词组的存在是否会增加预测特定结果的可能性。换句话说,LIME 有助于突出影响模型结果向特定类别发展的文本标记或单词的重要性。在本节中,我们将看到如何使用 LIME 来解释文本分类器。

安装所需的 Python 模块

与之前的教程一样,完整的笔记本教程可在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter05/LIME_with_text_data.ipynb找到。尽管运行笔记本所需的必要说明已在笔记本本身中清楚地记录,类似于之前的教程,我仍将提供必要的细节来指导你完成实现。使用以下命令,你可以安装运行代码所需的模块:

!pip install --upgrade pandas numpy matplotlib seaborn scikit-learn nltk lime xgboost swifter

对于底层数据集上的文本相关操作,我主要将使用 NLTK Python 框架。因此,你需要通过执行以下命令下载某些nltk模块:

nltk.download('stopwords')
nltk.download('wordnet')
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')

在教程中,我们将尝试解释一个设计用于执行情感分析的文本分类器,该分类器通过将文本数据分类为正面和负面类别来执行情感分析。

关于用于训练模型的训练集的讨论

在本教程中,我们使用了包含电影评论情感极性数据集 v2.0,用于从文本数据中进行情感分析。该数据集包含大约 1,000 个正面和负面电影评论样本。有关数据集的更多信息可以在源网站上找到:www.cs.cornell.edu/people/pabo/movie-review-data/。该数据集也提供在本章的 GitHub 仓库中:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter05

情感极性数据集 v2.0

这份数据最初被用于 Bo Pang 和 Lillian Lee 的论文,“情感教育:基于最小割的基于主观性的情感分析”,ACL 会议论文集,2004 年。

关于文本分类模型的讨论

与之前的图像分类器教程不同,我们没有使用预训练模型。我们从头开始训练了一个XGBoost 分类器(xgboost.readthedocs.io/en/stable/),包括笔记本中涵盖的必要的数据预处理、准备和特征提取步骤。XGBoost 是一种集成学习提升算法,本质上不可解释。因此,我们将它视为我们的黑盒文本分类模型。我们并不专注于通过必要的超参数调整来提高模型的准确性,因为 LIME 是完全模型无关的。对于本教程,我们创建了一个 scikit-learn 管道,首先使用TFIDF 向量器https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)进行特征提取,然后应用训练好的模型:

model_pipeline = make_pipeline(tfidf, model)

在下一小节中,我们将看到如何轻松地将 LIME 框架应用于文本数据。

应用 LIME 文本解释器

就像之前关于图像和表格数据的教程一样,使用文本数据应用 LIME 也非常简单,只需几行代码。现在,我们将定义 LIME 解释器 对象:

from lime.lime_text import LimeTextExplainer
explainer = LimeTextExplainer(class_names=['negative', 'positive'])

然后,我们将使用推理数据实例为该特定数据实例提供局部可解释性:

exp = explainer.explain_instance(x_test_df[idx], model_pipeline.predict_proba, num_features=5)
exp.show_in_notebook()

就这样!仅仅几行代码,我们就能解释基于 TFIDF 数值特征的文本分类器,但解释性是以人类可解释的视角提供的,即突出那些可以积极或消极影响模型结果的关键词。以这种方式解释文本模型的工作原理,对于任何非技术用户来说都更容易理解,而不是使用数值编码的特征来提供解释。

现在,让我们看看 LIME 应用于文本数据时提供的输出可视化。

图 5.4 – 应用 LIME 到文本分类器时的输出可视化

图 5.4 – 应用 LIME 到文本分类器时的输出可视化

图 5.4中,我们可以看到当 LIME 应用于文本数据时的输出可视化。

输出可视化与我们观察到的表格数据非常相似。它显示了预测概率,这可以用作模型置信度分数。算法突出了决定模型结果的最具影响力的关键词,并带有特征重要性分数。例如,从图 5.4中,我们可以看到推理数据实例被模型预测为负面(正如在笔记本中演示的那样,预测是正确的)。存在诸如wastebadridiculous等词语确实表明了负面评论。这对于人类解释也是可行的,因为如果你要求一个非技术用户解释为什么评论被分类为负面,用户可能会提到在负面评论中频繁使用的词语或在具有负面语调的句子中使用的词语。

因此,我们可以看到 LIME 可以轻松地应用于文本分类器。即使在文本数据中,该算法简单而有效,能够提供人类可解释的解释。我肯定会推荐使用 LIME 来解释黑盒文本分类器,作为额外的模型评估或质量检查步骤。

但到目前为止,我们只看到了 LIME Python 框架在 Jupyter 笔记本环境中的应用。你可能立即会问一个问题——我们能否将 LIME 扩展到用于生产级系统? 让我们在下一节中找出答案。

LIME 用于生产级系统

对于上一节末尾提出的问题的简短回答是是的。由于以下主要原因,LIME 肯定可以扩展到用于生产级系统:

  • 最小化实现复杂性:LIME Python 框架的 API 结构简洁且结构良好。这使得我们只需几行代码就能添加模型可解释性。为了向推理数据实例提供局部可解释性,LIME 算法的运行时复杂度非常低,因此这种方法也可以用于实时应用。

  • 易于与其他软件应用集成:框架的 API 结构是模块化的。对于消费可解释性结果,我们不需要完全依赖于框架提供的内置可视化。我们可以利用原始的可解释性结果,创建我们自己的自定义可视化仪表板或报告。此外,我们可以创建自定义 Web API 方法,并在远程云服务器上托管这些 Web API,创建我们自己的基于云的模型可解释性服务,该服务可以轻松与其他软件应用集成。我们将在第十章中更详细地介绍这一点,XAI 行业最佳实践

  • 不需要大量计算资源:LIME 框架与低计算资源很好地协同工作。对于实时应用,使用的算法需要非常快,并且应该能够在低计算资源上运行,否则用户体验会受到负面影响。

  • 易于设置和打包:正如我们在运行教程笔记本之前所看到的,LIME 非常容易设置,并且不依赖于难以安装的包。同样,任何使用 LIME 的 Python 程序都很容易打包或容器化。大多数生产级系统都有自动化的 CI/CD 管道来创建Docker 容器https://www.docker.com/resources/what-container),这些容器部署在生产级系统上。使用 LIME 框架容器化 Python 程序所需的工程工作量很低,因此很容易将此类软件应用程序投入生产。

这些是 LIME 成为工业应用中首选模型可解释性方法的关键原因,尽管它有一些众所周知的缺陷。

摘要

在本章中,我们讨论了 LIME Python 框架在不同类型数据集上的实际应用。本章涵盖的教程只是起点,我强烈建议您尝试在其他数据集上使用 LIME 可解释性。我们还讨论了为什么 LIME 非常适合生产级机器学习系统。

在下一章中,我们将讨论另一个非常流行的可解释人工智能 Python 框架,称为SHAP,它甚至考虑了多个特征在影响模型结果时的集体贡献。

参考文献

请参考以下资源以获取更多信息:

第六章:使用 SHAP 进行模型可解释性

在前两章中,我们探讨了使用LIME框架进行模型无关局部可解释性,以解释黑盒模型。尽管 LIME 仍然是最受欢迎的可解释人工智能XAI)算法之一,但我们还讨论了 LIME 方法的一些局限性。在本章中,我们将介绍SHapley Additive exPlanationSHAP),这是另一个流行的 XAI 框架,可以为表格、图像和文本数据集提供模型无关的局部可解释性。

SHAP基于Shapley 值,这是一个在博弈论c3.ai/glossary/data-science/shapley-values/)中广泛使用的概念。尽管 Shapley 值的数学理解可能很复杂,但我将提供一个简单、直观的 Shapley 值和 SHAP 的理解,并更多地关注框架的实践方面。与 LIME 类似,SHAP 也有其优缺点,我们将在本章中讨论。本章将涵盖一个实践教程,将使用 SHAP 解释回归模型。稍后,在第七章使用 SHAP 在机器学习中实际应用中,我们将涵盖 SHAP 框架的其他实际应用。

因此,以下是本章讨论的主要主题列表:

  • 对 SHAP 和 Shapley 值的直观理解

  • 使用 SHAP 的模型可解释性方法

  • 优点和局限性

  • 使用 SHAP 解释回归模型

现在,让我们开始吧!

技术要求

与本章相关的代码教程和必要资源可以从 GitHub 仓库下载或克隆:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter06。Python 和 Jupyter 笔记本用于实现本章涵盖的理论概念的实际应用。但我建议您在深入理解本章内容之后再运行笔记本。此外,在开始本章的实践教程部分之前,请先查看SHAP 勘误表部分:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter06/SHAP_ERRATA/ReadMe.md

对 SHAP 和 Shapley 值的直观理解

如在 第一章 中所讨论的,可解释性技术的根本概念,解释黑盒模型对于增加人工智能的采用是必要的。那些模型无关且能够从全局视角提供局部可解释性的算法是机器学习 (ML) 中可解释性技术的理想选择。这就是为什么 LIME 在 XAI 中如此受欢迎。SHAP 是机器学习中另一种流行的可解释性技术,在特定场景下,它比 LIME 更有效。在本节中,我们将讨论 SHAP 框架的直观理解以及它是如何提供模型可解释性的。

SHAP 和 Shapley 值的介绍

SHAP 框架是由 Scott LundbergSu-In Lee 在他们的研究工作中引入的,该研究工作为 《解释模型预测的统一方法》 (arxiv.org/abs/1705.07874)。这项研究于 2017 年发表。SHAP 基于合作博弈论中的 Shapley 值概念,但与 LIME 框架不同,它考虑了 加性特征重要性。根据定义,Shapley 值是 在特征空间中所有可能值上每个特征值的平均边际贡献。Shapley 值的数学理解比较复杂,可能会让大多数读者感到困惑。话虽如此,如果你对 Shapley 值的深入数学理解感兴趣,我们建议你阅读名为 "A Value for n-Person Games." Contributions to the Theory of Games 2.28 (1953), by Lloyd S. Shapley 的研究论文。在下文中,我们将通过一个非常简单的例子来获得 Shapley 值的直观理解。

什么是 Shapley 值?

在本节中,我将通过一个非常简单且易于理解的例子来解释 Shapley 值。假设 Alice、Bob 和 Charlie 是三位朋友,他们作为一个团队参加 Kaggle 竞赛,使用机器学习解决给定问题以赢得一定的奖金。他们的共同目标是赢得比赛并获得奖金。他们在机器学习的所有领域都不擅长,因此以不同的方式做出了贡献。现在,如果他们赢得比赛并获得奖金,他们将如何确保奖金的公平分配,考虑到他们的个人贡献? 他们将如何衡量他们为同一目标所做的个人贡献? 这些问题的答案可以通过 Shapley 值给出,这些值是由 Lloyd Shapley 在 1951 年引入的。

下面的图表为我们提供了该场景的视觉说明:

图 6.1 – "什么是 Shapley 值?"部分讨论的场景的视觉说明

图 6.1 – "什么是 Shapley 值?"部分讨论的场景的视觉说明

因此,在这种情况下,Alice、Bob 和 Charlie 是同一队的成员,在玩同一款游戏(即 Kaggle 比赛)。在博弈论中,这被称为联盟博弈。比赛的奖金是他们的奖金分配。因此,Shapley 值告诉我们每个玩家对奖金分配的平均贡献,以确保公平分配。但为什么不是将奖金平均分配给所有玩家呢?嗯,由于贡献并不相等,所以平均分配奖金是不公平的。

决定奖金分配

现在,我们如何决定分配奖金的最公平方式呢?一种方法是假设 Alice、Bob 和 Charlie 按照 Alice 首先加入,然后是 Bob,最后是 Charlie 的顺序加入游戏。假设如果 Alice、Bob 和 Charlie 单独参加,他们分别可以获得 10 分、20 分和 25 分。但如果是只有 Alice 和 Bob 组队,他们可能获得 40 分。而 Alice 和 Charlie 一起可以得到 30 分,Bob 和 Charlie 一起可以得到 50 分。当三人共同合作时,他们才能获得 90 分,这足以让他们赢得比赛。

图 6.2展示了每种情况下的得分点数。我们将利用这些值来计算每个玩家的平均边际贡献:

图 6.2 – 所有可能玩家组合的贡献值

图 6.2 – 所有可能玩家组合的贡献值

从数学上讲,如果我们假设有 N 名玩家,其中 S 是玩家的联盟子集,而 S 玩家的总价值,那么根据 Shapley 值公式,玩家 i 的边际贡献如下所示:

Shapley 值的方程可能看起来很复杂,但让我们用我们的例子来简化它。请注意,每个玩家开始游戏的顺序很重要,因为 Shapley 值试图考虑每个玩家的顺序来计算边际贡献。

现在,对于我们的例子,爱丽丝的贡献可以通过计算爱丽丝对最终分数造成的影响来计算。因此,贡献是通过计算爱丽丝在游戏中和不在游戏中的得分差异来计算的。此外,当爱丽丝在游戏中时,她可以单独玩或者与其他人组队。当爱丽丝在游戏中时,她可以创造的价值可以表示为img/B18216_06_003.png。同样,img/B18216_06_004.pngimg/B18216_06_005.png分别表示鲍勃和查理创造的个体价值。现在,当爱丽丝和鲍勃组队时,我们只能通过从整体贡献中减去鲍勃的贡献来计算爱丽丝的贡献。这可以表示为img/B18216_06_006.png。如果三个人一起玩,爱丽丝的贡献给出为img/B18216_06_007.png

考虑到爱丽丝、鲍勃和查理玩游戏的所有可能排列顺序,爱丽丝的边际贡献是在所有可能场景中她个体贡献的平均值。这如图6.3所示:

图 6.3 – 考虑所有可能场景的爱丽丝的 Shapley 值

图 6.3 – 考虑所有可能场景的爱丽丝的 Shapley 值

因此,爱丽丝的整体贡献将是她在所有可能场景中的边际贡献,这也恰好是 Shapley 值。对于爱丽丝来说,Shapley 值是20.83。同样,我们可以计算出鲍勃和查理的边际贡献,如图6.4所示:

图 6.4 – 爱丽丝、鲍勃和查理的边际贡献

图 6.4 – 爱丽丝、鲍勃和查理的边际贡献

希望这不难理解!有一点需要注意,即爱丽丝、鲍勃和查理的边际贡献之和应该等于他们三个人共同做出的总贡献。现在,让我们尝试在机器学习的背景下理解 Shapley 值。

机器学习中的 Shapley 值

为了理解 Shapley 值在机器学习中对解释模型预测的重要性,我们将尝试修改我们用于理解 Shapley 值的关于爱丽丝、鲍勃和查理的例子。我们可以将爱丽丝、鲍勃和查理视为在用于训练模型的数据集中存在的三个不同的特征。在这种情况下,玩家贡献将是每个特征的贡献游戏或 Kaggle 比赛将是黑盒机器学习模型收益将是预测。因此,如果我们想了解每个特征对模型预测的贡献,我们将使用Shapley 值

图 6.1的修改用于表示机器学习背景下的 Shapley 值,如图6.5所示:

图 6.5 – 在机器学习背景下理解 Shapley 值

图 6.5 – 在机器学习背景下理解 Shapley 值

因此,Shapley 值帮助我们理解每个特征对黑盒机器学习模型预测结果的集体贡献。通过使用 Shapley 值,我们可以通过估计特征贡献来解释黑盒模型的工作原理。

Shapley 值的性质

现在我们已经对 Shapley 值有了直观的理解,并且我们已经学习了如何计算 Shapley 值,我们还应该了解 Shapley 值的性质:

  • 效率:Shapley 值的总和或每个特征的边际贡献应该等于总联盟的价值。例如,在图 6.4中,我们可以看到 Alice、Bob 和 Charlie 的 Shapley 值总和等于当 Alice、Bob 和 Charlie 一起组队时获得的总联盟价值。

  • 对称性:每个玩家都有公平的机会以任何顺序加入游戏。在图 6.4中,我们可以看到考虑了所有玩家的序列的所有排列。

  • 虚拟玩家:如果一个特定的特征无论联盟组如何都不会改变预测值,那么该特征的 Shapley 值为0

  • 可加性:对于任何具有合并支付的游戏,Shapley 值也会合并。这表示为,然后。例如,对于机器学习中的随机森林算法,可以通过计算每个单独的树并取平均值来计算特定特征的 Shapley 值,从而找到整个随机森林的加性 Shapley 值。

因此,这些是 Shapley 值的重要性质。接下来,让我们讨论 SHAP 框架,了解它远不止是 Shapley 值的使用。

SHAP 框架

之前,我们讨论了 Shapley 值是什么以及它们如何在机器学习中使用。现在,让我们介绍 SHAP 框架。虽然 SHAP 通常用作 XAI 工具,为个别预测提供局部可解释性,但 SHAP 还可以通过汇总个别预测提供全局解释。此外,SHAP 是模型无关的,这意味着它不对黑盒模型中使用的算法做出任何假设。该框架的创造者广泛提出了两种模型无关的近似方法,如下所示:

  • SHAP 解释器:这是基于Shapley 采样值

  • KernelSHAP 解释器:这是基于LIME 方法

该框架还包括以下特定模型的可解释性方法:

  • 线性 SHAP:这是针对具有独立特征的线性模型。

  • Tree SHAP:这是一个比 SHAP 解释器更快的算法,用于计算树算法和基于树的集成学习算法的 SHAP 值。

  • Deep SHAP:这是一个比 SHAP 解释器更快的算法,用于计算深度学习模型的 SHAP 值。

除了这些方法之外,SHAP 还使用有趣的可视化方法来解释 AI 模型。我们将在下一节中更详细地介绍这些方法。但有一点需要注意,Shapley 值的计算在计算上非常昂贵,算法的复杂度为,其中n是特征的数量。所以,如果数据集有大量特征,计算 Shapley 值可能需要很长时间!然而,SHAP 框架使用近似技术来有效地计算 Shapley 值。与 LIME 框架相比,SHAP 提供的解释更加稳健。让我们进入下一节,我们将讨论 SHAP 在多种类型数据上使用的各种模型可解释性方法。

使用 SHAP 的模型可解释性方法

在阅读上一节之后,您已经对 SHAP 和 Shapley 值有了了解。在本节中,我们将讨论使用 SHAP 的各种模型可解释性方法。数据可视化是解释复杂算法工作原理的重要方法。SHAP 利用各种有趣的数据可视化技术来表示近似的 Shapley 值,以解释黑盒模型。因此,让我们讨论一些 SHAP 框架中使用的流行可视化方法。

SHAP 中的可视化

如前所述,SHAP 可以用于模型的全球可解释性和推理数据实例的局部可解释性。现在,除非我们使用直观的视觉表示,否则 SHAP 算法生成的值很难理解。可视化方法的选择取决于全球可解释性或局部可解释性的选择,我们将在本节中介绍。

使用特征重要性条形图的全球可解释性

分析数据集中存在的最具影响力的特征总是有助于我们理解算法相对于底层数据的工作原理。SHAP 提供了一种有效的方法,通过 Shapley 值来找到特征重要性。因此,特征重要性条形图按重要性降序显示重要特征。此外,SHAP 提供了一种独特的方式来使用层次聚类www.displayr.com/what-is-hierarchical-clustering/)展示特征交互。这些特征聚类方法帮助我们可视化一组共同影响模型结果的特征。这非常有趣,因为使用 Shapley 值的核心好处之一就是分析多个特征组合的加性影响。然而,对于全球可解释性,特征重要性图有一个缺点。因为这个方法只考虑平均绝对 Shapley 值来估计特征重要性,所以它不显示某些特征是否以负面的方式共同影响模型。

下面的图表说明了使用 SHAP 进行特征重要性图和特征聚类图可视化的示例:

![Figure 6.6 –A feature importance plot for global interpretability (left-hand side) and a feature clustering plot for global interpretability (right-hand side)img/B18216_06_006.jpg

图 6.6 – 用于全局可解释性的特征重要性图(左侧)和用于全局可解释性的特征聚类图(右侧)

接下来,让我们探索 SHAP 队列图。

使用队列图进行全局可解释性

有时,分析数据子集是数据分析的重要部分。SHAP 提供了一种非常有趣的方法,将数据分组到某些定义好的队列中,以分析特征重要性。我发现这是 SHAP 中的一个独特选项,非常有帮助!这是现有特征重要性可视化的扩展,并突出了每个队列的特征重要性,以便更好地比较。

图 6.7 展示了从数据中定义的两个队列的比较队列图:

![Figure 6.7 – A cohort plot visualization to compare feature importance between two cohortsimg/B18216_06_007.jpg

图 6.7 – 用于比较两个队列特征重要性的队列图可视化

接下来,我们将探索 SHAP 热图图。

使用热图图进行全局可解释性

为了在更细粒度的层面上理解所有特征对模型的整体影响,热图可视化非常有用。SHAP 热图可视化显示了每个特征值如何积极或消极地影响结果。此外,该图还包括一个折线图,以显示模型预测如何随着特征值的积极或消极影响而变化。然而,对于非技术用户来说,这种可视化可能真的很难解释。这是这种可视化方法的缺点之一。

图 6.8 说明了 SHAP 热图可视化

![Figure 6.8 – A SHAP heatmap plotimg/B18216_06_008.jpg

图 6.8 – SHAP 热图图

使用 SHAP 进行全局可解释性的另一种流行的可视化选择是摘要图。让我们在下一节讨论摘要图。

使用摘要图进行全局可解释性

摘要图是 SHAP 提供的一种用于提供黑盒模型全局可解释性的可视化方法。它是特征重要性图的良好替代品,不仅包括重要的特征,还包括数据集中这些特征的影响范围。颜色条表示特征的影响。以特定颜色突出显示对模型结果产生积极影响的特征,而以另一种对比颜色表示对模型结果产生负面影响的特征。每个特征的横向小提琴图显示了每个数据实例的特征 Shapley 值的分布。

下面的屏幕截图说明了 SHAP 摘要图

![图 6.9 – SHAP 小提琴总结图图片

图 6.9 – SHAP 小提琴总结图

在下一节中,我们将讨论 SHAP 依赖性图。

使用依赖性图进行全局可解释性

在某些情况下,分析特征之间的相互作用以及这种相互作用如何影响模型结果是很重要的。因此,SHAP 特征依赖性图显示了模型结果随特定特征的变化。这些图类似于在第二章“模型可解释性方法”中介绍的部分依赖性图。此图可以帮助发现特征值之间的有趣交互模式或趋势。用于选择颜色图的特征由算法自动根据与特定选定特征的交互选择。

图 6.10 展示了一个 SHAP 依赖性图:

![图 6.10 – pH 特征的 SHAP 依赖性图图片

图 6.10 – pH 特征的 SHAP 依赖性图

在这个例子中,选定的特征是pH,用于选择颜色图的特征是alcohol。因此,该图告诉我们,随着pH的增加,alcohol值也会增加。这将在下一节中更详细地介绍。

在下一节中,我们将探讨用于局部可解释性的 SHAP 可视化方法。

使用条形图进行局部可解释性

到目前为止,我们已经介绍了 SHAP 提供的各种可视化技术,用于提供模型的全球概述。然而,与 LIME 类似,SHAP 也是模型无关的,旨在提供局部可解释性。SHAP 提供了一些可视化方法,可以应用于推理数据以实现局部可解释性。使用 SHAP 条形图进行局部特征重要性分析是此类局部可解释性方法之一。此图可以帮助我们分析数据中存在的特征的正负影响。对模型结果产生正面影响的特征以一种颜色(默认为粉红色)突出显示,而对模型结果产生负面影响的特征则使用另一种颜色(默认为蓝色)表示。此外,正如我们之前讨论的,如果任何特征的总和值为零,这表明该特征根本不影响模型结果。此外,条形图以零为中心,以显示数据中存在的特征的贡献。

以下图表显示了用于局部可解释性的SHAP 特征重要性条形图

![图 6.11 – 用于局部可解释性的 SHAP 特征重要性条形图图片

图 6.11 – 用于局部可解释性的 SHAP 特征重要性条形图

接下来,让我们介绍另一种用于局部可解释性的 SHAP 可视化。

使用瀑布图进行局部可解释性

条形图并不是 SHAP 为局部可解释性提供的唯一可视化方式。相同的信息可以使用瀑布图来显示,这可能看起来更吸引人。也许,唯一的区别是瀑布图不是以零为中心,而条形图是以零为中心。否则,我们得到基于 Shapley 值的相同特征重要性,以及特定特征对模型结果的正向或负向影响。

图 6.12 展示了用于局部可解释性的 SHAP 瀑布图

![图 6.12 – 用于局部可解释性的 SHAP 瀑布图img/B18216_06_012.jpg

图 6.12 – 用于局部可解释性的 SHAP 瀑布图

接下来,我们将讨论 SHAP 中的力图可视化。

使用力图的局部可解释性

我们还可以使用力图来代替瀑布图或条形图来解释局部推理数据。使用力图,我们可以看到模型预测,用 f(x) 表示,如图 图 6.13 所示。以下图中的 基础值 代表模型的平均预测结果。当局部数据实例中不包含特征时,实际上使用的是基础值。因此,使用力图,我们还可以看到预测结果与基础值之间的距离。此外,我们还可以看到特征影响,如图中某些试图增加模型预测(在 图 6.13 中用粉色表示)的特征的视觉高亮,以及那些试图降低预测值(在 图 6.13 中用绿色表示)并对模型有负面影响的其他重要特征。

因此,图 6.13 展示了 SHAP 中的样本力图可视化:

![图 6.13 – 用于局部可解释性的 SHAP 力图img/B18216_06_013.jpg

图 6.13 – 用于局部可解释性的 SHAP 力图

尽管力图在视觉上可能看起来非常有趣,但如果数据集中包含许多以正向或负向方式影响模型结果的特征,我们建议使用条形图或瀑布图。

使用决策图的局部可解释性

解释某事最简单的方法就是将其与参考值进行比较。到目前为止,在条形图、瀑布图甚至力图中,我们没有看到任何用于底层特征的参考值。然而,为了找出特征值是正向还是负向影响模型结果,算法实际上是在尝试将推理数据的特征值与训练模型特征值的平均值进行比较。因此,这是我们未在所涵盖的三个局部可解释性可视化图中显示的参考值。但 SHAP 决策图帮助我们比较局部数据实例的特征值与训练数据集的平均特征值。此外,决策图显示了特征值的偏差、模型预测以及特征值与参考值偏差的方向。如果偏差方向向右,这表明特征正向影响模型结果;如果偏差方向向左,这表示特征对模型结果的负向影响。使用不同的颜色突出显示正向或负向影响。如果没有偏差,则实际上特征不会影响模型结果。

以下图表说明了使用决策图比较两个不同的数据实例以提供局部可解释性的用法:

图 6.14 – SHAP 决策图用于局部可解释性

img/B18216_06_014.jpg

图 6.14 – SHAP 决策图用于局部可解释性

到目前为止,你已经看到了 SHAP 为 ML 模型的全球和局部可解释性提供的各种可视化方法。现在,让我们讨论 SHAP 中提供的各种解释器类型。

SHAP 中的解释器

在上一节中,我们探讨了如何使用 SHAP 中可用的数据可视化技术来提供可解释性。但可视化方法的选择也可能取决于解释器算法的选择。如我们之前讨论的,SHAP 提供特定于模型和模型无关的可解释性。但该框架具有多个解释器算法,可以应用于不同的模型和不同类型的数据集。在本节中,我们将介绍 SHAP 提供的各种解释器算法。

TreeExplainer

TreeExplainer 是 Tree SHAP 算法 (arxiv.org/pdf/1802.03888.pdf) 的快速实现,用于计算树和基于树的集成学习算法的 Shapley 值。该算法对数据集中存在的特征之间的特征依赖性做出了许多不同的假设。仅支持基于树的算法,如 随机森林XGBoostLightGBMCatBoost。该算法依赖于在本地编译的 C 扩展或外部模型包内部的快速 C++ 实现,但它比传统的基于 Shapley 值的解释器更快。通常,它用于训练在结构化数据上用于分类和回归问题的基于树的模型。

DeepExplainer

与 LIME 类似,SHAP 也可以应用于在非结构化数据上训练的深度学习模型,例如图像和文本。SHAP 使用基于 Deep SHAP 算法 的 DeepExplainer 来解释深度学习模型。DeepExplainer 算法是为深度学习模型近似 SHAP 值而设计的。该算法是 DeepLIFT 算法 (arxiv.org/abs/1704.02685) 的修改版。框架的开发者提到,Deep SHAP 算法的实现与原始 DeepLIFT 算法略有不同。它使用背景样本的分布而不是单个参考值。此外,Deep SHAP 算法还使用 Shapley 方程来线性化乘法、除法、最大值、softmax 等计算。该框架主要支持 TensorFlow、Keras 和 PyTorch 等深度学习框架。

GradientExplainer

DeepExplainer 并不是 SHAP 中唯一可以与深度学习模型一起使用的解释器。GradientExplainer 也可以与深度学习模型一起工作。该算法使用 预期梯度 的概念来解释模型。预期梯度是 集成梯度 (arxiv.org/abs/1703.01365)、SHAP 和 SmoothGrad (arxiv.org/abs/1706.03825) 的扩展,这些算法将这些想法结合成一个单一的预期值方程。因此,与 DeepExplainer 类似,可以使用整个数据集作为背景分布样本,而不是单个参考样本。这允许模型通过数据单个样本和要解释的当前输入数据实例之间的线性函数进行近似。由于假设输入特征是独立的,预期梯度将计算近似的 SHAP 值。

对于模型可解释性,具有更高 SHAP 值的特征值会被突出显示,因为这些特征对模型的输出有积极的贡献。对于如图像这样的非结构化数据,对模型预测贡献最大的像素位置会被突出显示。通常,GradientExplainer 比 DeepExplainer 慢,因为它做出了不同的近似假设。

以下图表展示了在图像上训练的分类模型的局部可解释性的一个样本 GradientExplainer 可视化:

![Figure 6.15 – SHAP GradientExplainers 用于局部可解释性所使用的可视化img/B18216_06_015.jpg

图 6.15 – SHAP GradientExplainers 用于局部可解释性所使用的可视化

接下来,让我们讨论 SHAP KernelExplainers。

KernelExplainer

SHAP 中的 KernelExplainers 使用 Kernel SHAP 方法提供模型无关的可解释性。为了估计任何模型的 SHAP 值,Kernel SHAP 算法利用一个特别加权的局部线性回归方法来计算特征重要性。这种方法与我们在 第四章 中讨论的 LIME 算法类似,即 LIME for Model Interpretability。Kernel SHAP 和 LIME 之间的主要区别在于它们采用的方法来为回归模型中的实例分配权重。

在 LIME 中,权重是根据局部数据实例与原始实例的接近程度来分配的。而在 Kernel SHAP 中,权重是根据所使用特征的联盟的 Shapley 估计值来分配的。简单来说,LIME 是基于孤立特征分配权重,而 SHAP 考虑了特征的组合效应来分配权重。KernelExplainer 比特定模型算法慢,因为它不对模型类型做出任何假设。

LinearExplainer

SHAP LinearExplainer 是为计算线性模型的 SHAP 值而设计的,以分析特征间的相关性。LinearExplainer 还支持联盟特征重要性的特征协方差矩阵的估计。然而,对于高维数据集,找到特征相关性可能会非常耗费计算资源。但 LinearExplainers 由于使用采样来估计一个转换,因此它们既快又高效。然后,这个转换被用来解释线性模型的任何结果。

因此,我们已经讨论了 SHAP 中各种解释器的理论方面。有关这些解释器的更多信息,我强烈建议您查看shap-lrjball.readthedocs.io/en/docs_update/api.html。在下一章中,我们将通过 GitHub 上的代码教程来介绍 SHAP 解释器的实际应用,我们将实现 SHAP 解释器来解释在不同类型数据集上训练的模型。在下一节中,我们将介绍一个关于如何使用 SHAP 解释回归模型的实际教程,让您了解如何应用 SHAP 来提高模型的可解释性。

使用 SHAP 解释回归模型

在上一节中,我们学习了 SHAP 中用于解释机器学习模型的不同可视化和解释器。现在,我将向您展示如何使用 SHAP 提供模型可解释性的实际操作。该框架作为开源项目在 GitHub 上提供:github.com/slundberg/shap。您可以在shap-lrjball.readthedocs.io/en/docs_update/index.html获取 API 文档。完整的教程在 GitHub 仓库github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter06/Intro_to_SHAP.ipynb中提供。我强烈建议您阅读这一部分并边读边执行代码。

设置 SHAP

在 Python 中安装 SHAP 可以通过使用以下命令在您的控制台中通过 pip 安装器轻松完成:

pip install shap

由于教程需要您安装其他 Python 框架,如果尚未安装,您也可以尝试以下命令从 Jupyter 笔记本本身安装教程所需的全部必要模块:

!pip install --upgrade pandas numpy matplotlib seaborn scikit-learn shap

现在,让我们导入 SHAP 并检查其版本:

import shap
print(f"Shap version used: {shap.__version__}")

我在这个教程中使用的版本是 0.40.0

请注意,由于版本不同,API 可能会有所变化,或者您可能会遇到不同的错误。因此,如果您遇到此类问题,我建议您查看框架的最新文档。我还在仓库中添加了SHAP 错误列表(github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter06/SHAP_ERRATA),以提供对 SHAP 框架已知问题的解决方案。

检查数据集

对于这个教程,我们将使用来自 Kaggle 的红葡萄酒质量数据集www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009。数据集已经添加到代码仓库中,以便您可以轻松访问数据。这个特定的数据集包含了关于葡萄牙Vinho Verde红葡萄酒变种的详细信息,并且它来源于原始的 UCI 数据源archive.ics.uci.edu/ml/datasets/wine+quality

葡萄酒质量数据集

这个数据集的功劳归功于P. Cortez, A. Cerdeira, F. Almeida, T. Matos 和 J. Reis。通过数据挖掘物理化学特性来建模葡萄酒偏好。

我们将使用这个数据集来解决一个回归问题。我们将数据作为 pandas DataFrame 加载,并进行初步检查:

data = pd.read_csv('dataset/winequality-red.csv')
data.head()

图 6.16展示了数据的快照:

图 6.16 – 葡萄酒质量数据集的 pandas DataFrame 快照

图 6.16 – 葡萄酒质量数据集的 pandas DataFrame 快照

我们可以使用以下命令来检查数据集的一些快速信息:

data.info()

这将产生以下输出:

RangeIndex: 1599 entries, 0 to 1598
Data columns (total 12 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   fixed acidity         1599 non-null   float64
 1   volatile acidity      1599 non-null   float64
 2   citric acid           1599 non-null   float64
 3   residual sugar        1599 non-null   float64
 4   chlorides             1599 non-null   float64
 5   free sulfur dioxide   1599 non-null   float64
 6   total sulfur dioxide  1599 non-null   float64
 7   density               1599 non-null   float64
 8   pH                    1599 non-null   float64
 9   sulphates             1599 non-null   float64
 10  alcohol               1599 non-null   float64
 11  quality               1599 non-null   int64  
dtypes: float64(11), int64(1)
memory usage: 150.0 KB

如您所见,我们的数据集由11 个数值特征1,599 条数据记录组成。回归模型将要学习的目标结果是葡萄酒的质量,这是一个整数特征。尽管我们使用这个数据集来解决回归问题,但同样的问题也可以被视为分类问题,并且可以使用相同的基础数据。

本教程的目的不是构建一个极其高效的模型,而是考虑任何模型并使用 SHAP 来解释模型的工作原理。因此,我们将跳过 EDA、数据归一化、异常值检测甚至特征工程步骤,这些步骤对于构建一个健壮的机器学习模型是至关重要的。但是,数据集中的缺失值可能会给 SHAP 算法带来问题。因此,我建议至少快速检查缺失值:

sns.displot(
    data=data.isna().melt(value_name="missing"),
    y="variable",
    hue="missing",
    multiple="fill",
    aspect=1.5
)
plt.show()

上述代码行将产生以下图表作为其输出:

图 6.17 – 数据集的缺失值可视化

图 6.17 – 数据集的缺失值可视化

幸运的是,数据集没有缺失值;否则,我们可能需要在进一步处理之前处理这个问题。但由于数据没有重大问题,我们可以直接进行建模步骤。

训练模型

由于我没有为这个数据集预训练的模型,我想构建一个简单的随机森林模型。我们可以使用 80:20 的分割比例将模型分为训练集和测试集:

features = data.drop(columns=['quality'])
labels = data['quality']
# Dividing the data into training-test set with 80:20 split ratio
x_train,x_test,y_train,y_test = train_test_split(
    features,labels,test_size=0.2, random_state=123)

要使用随机森林算法,我们需要从 scikit-learn 模块中导入此算法,然后在训练数据上拟合回归模型:

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=2000, 
                              max_depth=30, 
                              random_state=123)
model.fit(x_train, y_train)

重要提示

考虑到这个笔记本的目标,我们并没有进行广泛的超参数调整过程。但我强烈建议您为您的用例执行所有必要的最佳实践,如数据探索性分析(EDA)、特征工程、超参数调整、交叉验证等。

模型训练完成后,我们将使用确定系数R2 系数)的指标对模型进行快速评估:

model.score(x_test, y_test)

获得的模型评分大约为 0.5,这表明模型效率不高。因此,对于此类模型,模型可解释性尤为重要。现在,让我们使用 SHAP 来解释模型。

SHAP 的应用

应用 SHAP 非常简单,只需几行代码即可完成。首先,我们将使用基于 Shapley 值的解释器对测试数据集进行处理:

explainer = shap.Explainer(model)
shap_values = explainer(x_test)

然后,我们可以使用 SHAP 值来应用之前讨论的各种可视化技术。选择可视化方式取决于我们是否希望追求全局可解释性或局部可解释性。例如,对于图 6.9中显示的摘要图,我们可以使用以下代码:

plt.title('Feature Importance using SHAP')
shap.plots.bar(shap_values, show=True, max_display=12)

如果我们想要使用图 6.14中显示的决策图来提供局部可解释性,我们可以尝试以下代码:

expected_value = explainer.expected_value
shap_values = explainer.shap_values(x_test)[0]
shap.decision_plot(expected_value, shap_values, x_test)

要使用不同的解释器算法,我们只需选择合适的解释器。对于树形解释器,我们可以尝试以下代码:

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(x_test)

在笔记本教程中已经涵盖了使用此框架解释回归模型并考虑各种方面的用法:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter06/Intro_to_SHAP.ipynb

在下一章中,我们将介绍更多有趣的应用案例。接下来,让我们讨论这个框架的一些优势和劣势。

SHAP 的优势和局限性

在上一节中,我们讨论了使用 SHAP 仅用几行代码解释回归模型的实际应用。然而,由于 SHAP 不是唯一的可解释性框架,我们也应该了解 SHAP 的具体优势和劣势。

优势

以下是一些 SHAP 的优势:

  • 局部可解释性:由于 SHAP 为推理数据提供了局部可解释性,它使用户能够分析影响模型决策过程的关键因素,这些因素是正面还是负面影响的。由于 SHAP 提供了局部可解释性,因此它对生产级机器学习系统也很有用。

  • 全局可解释性:SHAP 提供的全局可解释性有助于提取有关模型和训练数据的键信息,特别是从集体特征重要性图中。我认为 SHAP 在获得模型的全局视角方面优于 LIME。LIME 中的 SP-LIME 对于获得以示例驱动的模型全局视角很好,但我认为 SHAP 提供了对训练模型的通用全局理解。

  • 模型无关性和模型特异性:SHAP 可以是模型无关的,也可以是模型特定的。因此,它可以与黑盒模型一起工作,也可以与复杂的深度学习模型一起工作,以提供可解释性。

  • 理论稳健性:基于联盟博弈论原则的 Shapley 值用于模型可解释性的概念,很好地捕捉了特征交互。此外,SHAP 关于效率对称性虚拟性可加性的性质是在稳健的理论基础上制定的。与 SHAP 不同,LIME 没有建立在坚实的理论基础之上,因为它假设 ML 模型对于某些局部数据点将表现出线性行为。但是,没有多少理论证据证明为什么这个假设对所有情况都成立。这就是为什么我会说 SHAP 基于比 LIME 更稳健的理论思想。

这些优势使 SHAP 成为 XAI 框架中最受欢迎的选择之一。不幸的是,对于高维数据集,应用 SHAP 可能真的具有挑战性,因为它不提供可操作的解释。让我们看看 SHAP 的一些局限性。

局限性

这里是 SHAP 的一些局限性的列表:

  • SHAP 不是高维数据的首选选择:在高维数据上计算 Shapley 值可能更具计算挑战性,因为算法的时间复杂度为,其中n是数据集中特征的总数。

  • Shapley 值对于选择性解释无效:Shapley 值试图考虑所有特征以提供可解释性。对于只考虑所选特征的稀疏解释,解释可能是错误的。但通常,人类友好的解释会考虑选择性特征。因此,当您寻求选择性解释时,我认为 LIME 比 SHAP 更好。然而,SHAP 框架的最新版本确实包括与 LIME 相同的思想,并且对于稀疏解释可以几乎同样有效。

  • SHAP 不能用于提供规范性见解:SHAP 计算每个特征的 Shapley 值,并不像 LIME 那样构建预测模型。因此,它不能用于分析任何假设情景或提供任何反事实示例以提供可操作的见解。

  • KernelSHAP 可能很慢:尽管 KernelSHAP 是模型无关的,但它可能非常慢,因此可能不适合用于在训练高维数据上训练的模型的生产级 ML 系统。

  • 不太适合人类使用:除了通过特征交互分析特征重要性之外,SHAP 的可视化对于任何非技术用户来说可能都难以解释。通常,非技术用户更喜欢从机器学习模型中获得简单、有针对性的见解、建议或理由。不幸的是,当在生产系统中使用时,SHAP 需要另一层抽象来为人类提供友好的解释。

从本节讨论的要点来看,SHAP 可能不是最理想的解释性框架,而且还有很大的改进空间,使其更加适合人类使用。然而,它确实是一个重要的、非常有用的框架,用于解释黑盒算法,尤其是对于技术用户来说。这使我们来到了本章的结尾。让我们总结一下本章所学的内容。

摘要

在本章中,我们专注于理解 SHAP 框架对于模型解释性的重要性。到目前为止,你对 Shapley 值和 SHAP 有了很好的理解。我们介绍了如何通过各种可视化和解释方法使用 SHAP 进行模型解释性分析。我们还介绍了使用 SHAP 解释回归模型的代码示例。最后,我们讨论了该框架的一些优点和局限性。

在下一章中,我们将介绍更多关于在不同类型的数据集上应用 SHAP 的有趣的实际用例。

参考文献

如需更多信息,请参阅以下资源:

第七章:在机器学习中使用 SHAP 的实际经验

在上一章中,我们讨论了SHapley Additive exPlanationSHAP),这是最受欢迎的模型可解释性框架之一。我们还介绍了使用 SHAP 解释回归模型的一个实际例子。然而,SHAP 可以解释在多种类型数据集上训练的其他类型的模型。在上一章中,你确实对 SHAP 中可用于解释不同类型数据集上训练的模型的不同类型的解释器有一个简要的概念理解。但在本章中,你将获得应用 SHAP 中各种类型解释器所需的实际经验。

更具体地说,你将学习如何应用TreeExplainers来解释在结构化表格数据上训练的树集成模型。你还将学习如何应用DeepExplainerGradientExplainer SHAP,这些 SHAP 与在图像数据上训练的深度学习模型一起使用。正如你在上一章中学到的,SHAP 中的KernelExplainer是模型无关的,你将在本章中获得 KernelExplainers 的实际经验。我们还将涵盖在线性模型上使用LinearExplainers的实际方面。最后,你将探索如何使用 SHAP 来解释在文本数据上训练的复杂的Transformer模型。

在本章中,我们将涵盖以下重要主题:

  • 将 TreeExplainers 应用于树集成模型

  • 使用 DeepExplainer 和 GradientExplainer 解释深度学习模型

  • 使用 KernelExplainer 进行模型无关的可解释性

  • 探索 SHAP 中的 LinearExplainer

  • 使用 SHAP 解释 Transformer

让我们开始吧!

技术要求

本代码教程以及必要的资源可以从本章的 GitHub 仓库下载或克隆:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter07。Python 和 Jupyter 笔记本用于实现本章中涵盖的理论概念的实际应用。然而,我建议你在阅读本章后运行笔记本,以便更好地理解。

将 TreeExplainers 应用于树集成模型

如前一章所述,Tree SHAP 实现可以与树集成模型如 随机森林XGBoostLightGBM 算法一起工作。决策树本身是可解释的。但是,基于树的集成学习模型,无论是实现提升还是袋装,本身并不是可解释的,并且可能相当复杂。因此,SHAP 是用于解释此类复杂模型的最受欢迎的算法之一。SHAP 的核 SHAP 实现是模型无关的,可以解释任何模型。然而,对于具有许多特征的较大数据集,该算法可能非常慢。这就是为什么 Tree SHAP (arxiv.org/abs/1802.03888) 算法的实现是一个针对树集成模型的高速精确算法。TreeExplainer 是 Tree SHAP 算法的快速 C++ 实现,支持 XGBoost、CatBoost、LightGBM 以及来自 scikit-learn 的其他树集成模型。在本节中,我将介绍如何在实践中应用 TreeExplainer。

安装所需的 Python 模块

完整的教程可以在 GitHub 仓库中找到,地址为 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter07/TreeExplainers.ipynb,我强烈建议您阅读这一部分并边读边执行代码。如果您已经跟随着其他章节中提供的先前教程,那么现在应该已经安装了大多数所需的 Python 包。否则,您可以使用 pip 安装程序安装必要的包:

!pip install --upgrade numpy pandas matplotlib seaborn sklearn lightgbm shap

您可以导入这些包以验证它们的成功安装:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import sklearn
import lightgbm as lgb
import shap

对于 Jupyter 笔记本中的某些基于 JavaScript 的 SHAP 可视化,请确保初始化 SHAP JavaScript 模块:

shap.initjs()

接下来,让我们讨论我们将用于本例的数据集。

关于数据集的讨论

在本例中,我们将使用 Kaggle 上的德国信用风险数据集 (www.kaggle.com/uciml/german-credit)。该数据集用于构建一个分类模型,用于区分良好的和不良的信用风险。Kaggle 数据集实际上是 UCI (archive.ics.uci.edu/ml/datasets/statlog+(german+credit+data)) 中可用的原始数据的简化版本)

Statlog (德国信用数据) 数据集

该数据集的归功于 教授博士汉斯·霍夫曼,汉堡统计学与计量经济学研究所

请参阅笔记本以获取有关数据集的更多信息。该数据集已提供在本章的 GitHub 仓库中:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter07/datasets。我们可以使用 pandas Python 模块来加载数据集并将其显示为 DataFrame:

data  = pd.read_csv('datasets/german_credit_data.csv', index_col=0)
data.head()

下面的图表展示了该数据的 pandas DataFrame:

![Figure 7.1 – pandas DataFrame snapshot of the German Credit Risk dataset

![img/B18216_07_001.jpg]

图 7.1 – 德国信用风险数据集的 pandas DataFrame 快照

我强烈建议您进行彻底的数据探索分析EDA)。您还可以使用如第二章中所示,模型可解释性方法中的 pandas profiling (github.com/ydataai/pandas-profiling) 进行自动 EDA。由于我们已经覆盖了这一点,我将跳过本例的 EDA 部分。

然而,数据集确实存在一些缺失值,在构建模型之前需要处理。我们可以使用以下代码行进行检查:

sns.displot(
    data=data.isna().melt(value_name="missing"),
    y="variable",
    hue="missing",
    multiple="fill",
    aspect=1.5,
    palette='seismic'
)
plt.show()

下面的可视化是输出结果:

![Figure 7.2 – Missing value visualization for the German Credit Risk dataset

![img/B18216_07_002.jpg]

图 7.2 – 德国信用风险数据集的缺失值可视化

该数据集在储蓄账户特征上大约有 18% 的缺失值,在支票账户特征上有 40% 的缺失值。由于缺失数据的百分比较高,且这些特征可能很重要,我们不能完全忽略或删除这些特征。请记住,本教程的重点是使用 TreeExplainers 进行模型可解释性。因此,我们不会花太多时间进行数据插补,因为我们不关心构建一个高效的模型。由于这两个特征都是分类特征,我们将简单地为缺失值创建一个未知类别。这可以通过以下代码行完成:

data.fillna('Unknown', inplace=True)

我们需要对分类特征进行标签编码,因为我们需要将字符串类型的特征值转换为整数格式:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for feat in ['Sex', 'Housing', 'Saving accounts', 'Checking account', 'Purpose', 'Risk']:
    le.fit(data[feat])
    data[feat] = le.transform(data[feat])

现在,对于这个例子,我们将使用LightGBM 算法(lightgbm.readthedocs.io/en/latest/),它可以直接在分类变量上工作,因此我们不需要执行独热编码。但对于其他算法,我们可能需要执行独热编码。此外,我们不会执行其他复杂的数据预处理或特征工程步骤。我确实建议您进行稳健的特征工程、异常值检测和数据归一化,以构建高效的机器学习模型。然而,对于这个例子,即使模型精度不高,我们也可以使用 SHAP 来生成解释。让我们继续进行模型训练部分。

训练模型

在训练模型之前,我们需要创建训练集和测试集:

from sklearn.model_selection import train_test_split
features = data.drop(columns=['Risk'])
labels = data['Risk']
# Dividing the data into training-test set with 80:20 split ratio
x_train,x_test,y_train,y_test = \
train_test_split(features,labels,test_size=0.2, 
                 random_state=123)

由于我们将使用 LightGBM 算法,我们需要创建 LightGBM 数据集对象,这些对象在训练过程中会被使用:

data_train = lgb.Dataset(x_train, label=y_train, 
                         categorical_feature=cat_features)
data_test = lgb.Dataset(x_test, label=y_test, 
                        categorical_feature=cat_features)

我们还需要将模型参数定义为字典:

params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': 'auc',
    'num_leaves': 20,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': -1,
    'lambda_l1': 1,
    'lambda_l2': 1,
    'seed': 123
}

最后,我们可以使用创建的参数和数据集对象来训练模型:

model = lgb.train(params,
                  data_train,
                  num_boost_round=100,
                  verbose_eval=100,
                  valid_sets=[data_test, data_train])

我们再次跳过了超参数调整过程以获得更高效的模型,但我确实建议您花些时间在超参数调整上,以获得更高精度的模型。现在,让我们使用 SHAP 进行模型可解释性部分。

在 SHAP 中应用 TreeExplainer

在 SHAP 中应用 TreeExplainer 非常简单,因为框架已经很好地模块化:

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(features)

一旦我们近似了 SHAP 值,我们就可以应用 SHAP 提供的可视化方法来获得模型的可解释性。我建议您参考第六章中的SHAP 中的可视化部分,使用 SHAP 进行模型可解释性,以刷新您对我们可以使用 SHAP 进行模型可解释性的各种可视化方法的记忆。我们将从全局可解释性开始,使用汇总图。

图 7.3展示了使用 TreeExplainer 在此数据集上生成的 SHAP 值创建的 SHAP 汇总图:

![图 7.3 – TreeExplainer 生成的 SHAP 值上的 SHAP 汇总图

![img/B18216_07_003.jpg]

图 7.3 – TreeExplainer 生成的 SHAP 值上的 SHAP 汇总图

如前图所示,汇总图基于 SHAP 值突出显示重要特征,从最重要到最不重要排序。模型将Checking accountDuration视为最有影响力的特征之一,与SexJob特征相比。

对于局部可解释性,我们可以应用力图决策图可视化方法:

# Local explainability with force plots
shap.force_plot(explainer.expected_value[1], shap_values[1][0,:], features.iloc[0,:])
# Local explainability with force plots
shap.decision_plot(explainer.expected_value[1], shap_values[1][0,:], features.iloc[0,:])

我经常发现决策图比力图更易于理解,因为决策图显示了每个特征的预期平均值偏差。偏差的方向也表明了特征是正向影响模型决策还是具有负面影响。但有些人可能也更喜欢力图,因为这表明了基于特征值及其如何影响以实现更高的预测值或更低的预测值,哪些特征是正向或负向影响的。

图 7.4 展示了我们获得的力图和决策图:

图 7.4 – 用于局部可解释性的力和决策图

图 7.4 – 用于局部可解释性的力和决策图

在某些情况下,理解特征间的相互依赖性变得很重要,因为 SHAP 不会孤立地考虑特征来获得最有影响力的特征。相反,基于 SHAP 的特征重要性是基于多个特征共同影响的集体估计。因此,为了分析特征重要性,我们可以尝试 SHAP 特征依赖性图:

# For feature wise global interpretability
for col in ['Purpose', 'Age']:
    print(f"Feature Dependence plot for: {col}")
    shap.dependence_plot(col, shap_values[1], features, display_features=features)

下图显示了PurposeAge特征的依赖性图:

图 7.5 – 目的和年龄特征的 SHAP 特征依赖图

图 7.5 – 目的和年龄特征的 SHAP 特征依赖图

图 7.3中的 SHAP 来看,我发现特征PurposeAge并不像DurationCredit amount那样重要,这让我有些惊讶。在这种情况下,特征依赖性图会自动计算所选特征的依赖性最强的特征。因此,从图 7.5中,我们可以看到对于PurposeAgeCredit Amount是依赖性最强的特征,我们还可以看到这些特征如何与依赖性特征变化。这证明了Credit amount作为一个整体,比PurposeAge更有影响力。

您还可以尝试其他在第六章中介绍的可视化方法,即使用 SHAP 进行模型可解释性,并且强烈建议您尝试使用 TreeExplainer 生成的 SHAP 值来玩转自定义可视化方法!在下一节中,我们将应用 SHAP 解释器到在图像数据上训练的深度学习模型。

使用 DeepExplainer 和 GradientExplainer 解释深度学习模型

在上一节中,我们介绍了 SHAP 中的 TreeExplainer 的使用,这是一个仅适用于树集成模型的特定模型解释方法。现在我们将讨论 GradientExplainer 和 DeepExplainer,SHAP 中的另外两种特定模型解释器,它们主要用于深度学习模型。

GradientExplainer

如在 第二章 中讨论的,模型可解释性方法,解释在图像等非结构化数据上训练的深度学习模型的最广泛采用的方法之一是层相关传播LRP)。LRP 是关于分析深度神经网络中间层的梯度流。SHAP GradientExplainers 也以类似的方式工作。如在第 第六章 中讨论的,使用 SHAP 的模型可解释性,GradientExplainer 将 SHAP集成梯度SmoothGrad 的思想结合成一个单一的期望值方程。GradientExplainer 最终使用基于敏感度图的梯度可视化方法。可视化图中的红色像素表示具有正 SHAP 值的像素,这增加了输出类的概率。蓝色像素表示具有负 SHAP 值的像素,这减少了输出类的可能性。现在,让我带您参观代码仓库中提供的教程:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter07/Explaining%20Deep%20Learning%20models.ipynb。请加载必要的模块,并按照笔记本教程中提供的详细步骤进行操作,因为我将只在本节中涵盖重要的编码步骤,以帮助您理解代码教程的流程。

讨论用于训练模型的训练集

对于这个示例,我们将使用 SHAP ImageNet 数据集,该数据集将被用于生成 GradientExplainer 算法所需的背景参考。我们还将从同一数据集中选取推理图像。然而,你始终可以自由选择任何其他图像数据集或你选择的推理图像:

X,y = shap.datasets.imagenet50(resolution=224)
inference_image = X[[46]] 

对于这个示例,我们选择了以下图像作为我们的推理图像:

图 7.6 – 来自 SHAP ImageNet50 的推理图像

图 7.6 – 来自 SHAP ImageNet50 的推理图像

如我们从推理图像中可以看到,它包含许多可能的物体,包括一个人、一把椅子和一台电脑。所有这些都可以是潜在模型的结果,实际结果取决于模型预测时关注的精确区域。因此,在这种情况下,可解释性非常重要。接下来,让我们讨论这个示例中使用的模型。

在这个示例中,我们将使用预训练的 CNN 模型

我已经使用了一个预训练的 CNN 模型,tensorflow Python 模块:

from tensorflow.keras.applications.vgg19 import VGG19
model = VGG19(weights='imagenet')

接下来,让我们将 GradientExplainer 应用到 SHAP 上。

GradientExplainer 在 SHAP 中的应用

GradientExplainer 有助于将深度学习模型(如 卷积神经网络CNN))的中间层的梯度流映射出来,以解释模型的运作原理。因此,我们将尝试探索模型的第 10 层,并基于 SHAP 值可视化梯度。选择第 10 层完全是随机的;你也可以选择其他层:

layer_num = 10
# explain how the input to the 10th layer of the model explains the top two classes
def map2layer(x, layer):
    '''
    Source : https://github.com/slundberg/shap
    '''
    feed_dict = dict(zip([model.layers[0].input],
                         [preprocess_input(x.copy())]))
    return K.get_session().run(model.layers[layer].input, feed_dict)
model_input = (model.layers[layer_num].input, 
               model.layers[-1].output)
explainer = shap.GradientExplainer(model_input,
                                   map2layer(X, layer_num),
                                   local_smoothing=0)
shap_values, ind = explainer.shap_values(
    map2layer(inference_image, layer_num), 
    ranked_outputs=4)
# plot the explanations
shap.image_plot(shap_values, inference_image, class_names)

在这个例子中,我们试图估计预训练模型第 10 层基于 GradientExplainer 的 SHAP 值。使用 SHAP 图像绘制方法,我们可以可视化模型前 4 个可能结果的对敏感度图,如图 图 7.7 所示:

图 7.7 – 基于应用 GradientExplainer 到推理图像的 SHAP 图像绘制可视化

](https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/app-ml-expl-tech/img/B18216_07_007.jpg)

图 7.7 – 基于应用 GradientExplainer 到推理图像的 SHAP 图像绘制可视化

模型的前四个预测结果是 desktop_computerdeskmonitorscreen。所有这些结果都是有效的,取决于模型关注的区域。使用 图 7.7 中所示的 SHAP 图像绘制,我们可以识别出对特定模型预测有贡献的确切区域。标记为红色的像素区域对特定模型预测有正面贡献,而蓝色像素区域对模型预测有负面贡献。你也可以尝试可视化模型的其它层,并分析模型预测在各个层中的变化情况!

探索 DeepExplainers

在上一节中,我们介绍了 SHAP 中的 GradientExplainers。然而,深度学习模型也可以使用基于 Deep SHAP 算法的 SHAP 中的 DeepExplainers 来解释。Deep SHAP 是一种用于估计深度学习模型 SHAP 值的高速实现。它使用背景样本的分布和 Shapley 方程来线性化深度学习模型中使用的最大值、乘积和 softmax 等主要非线性操作。

提供的教程笔记本 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter07/Explaining%20Deep%20Learning%20models.ipynb 涵盖了一个从 CIFAR-10 数据集 (www.cs.toronto.edu/~kriz/cifar.html) 中从头开始训练的多类分类深度学习模型的示例。该数据集包含 32x32 大小的高度压缩图像,属于 10 个不同的类别。在本节中,我将跳过模型训练过程,因为它已经在笔记本教程中得到了充分的详细说明。相反,我将讨论使用 DeepExplainers 的模型可解释性部分,这是我们主要关注的焦点。您也可以尝试使用预训练的 CNN 模型而不是从头开始训练模型进行相同的教程。现在,让我们讨论模型可解释性部分。

SHAP 中 DeepExplainer 的应用

为了应用 DeepExplainer,我们首先需要形成背景样本。可解释性的鲁棒性实际上在很大程度上取决于背景样本的选择。在这个例子中,我们将从训练数据中随机选择 1,000 个样本。您也可以增加样本大小,但请确保背景样本在训练或推理数据之间没有数据漂移,通过确保数据收集过程是一致的:

background = x_train[np.random.choice(len(x_train), 1000, replace=False)]

一旦选定了背景样本,我们就可以使用在训练模型和背景样本上应用 DeepExplainer 方法来创建一个 SHAP 解释器对象,并估计推理数据的 SHAP 值:

explainer = shap.DeepExplainer(model, background)
shap_values = explainer.shap_values(sample_x_test)

在计算 SHAP 值之后,我们可以使用 SHAP 图像图来可视化以类似梯度解释器使用的敏感性图来影响模型的像素,无论是正面还是负面的影响:

shap.image_plot(shap_values, sample_x_test, labels, labelpad= 1)

下图显示了某些样本推理数据的 SHAP 图像:

图 7.8 – 在 SHAP 中应用 DeepExplainer 后的 SHAP 图像可视化

图 7.8 – 在 SHAP 中应用 DeepExplainer 后的 SHAP 图像可视化

如我们从 图 7.8 中所见,即使模型是在一个非常压缩的数据集上训练的,DeepExplainer 仍然能够计算出 SHAP 值,帮助我们识别图像中(以粉红色像素突出显示)对模型预测有正面贡献的区域。模型确实正确地预测了结果为 ,这是从压缩图像中得到的正确分类。然而,应用 DeepExplainer 非常简单,与传统的用于近似在非结构化数据(如图像)上训练的深度学习模型的 SHAP 值的方法相比,这种方法非常快速。接下来,我们将学习关于 KernelExplainer 的模型无关可解释性。

使用 KernelExplainer 的模型无关可解释性

在前面的章节中,我们已经讨论了 SHAP 中可用的三种特定于模型的解释器 – TreeExplainer、GradientExplainer 和 DeepExplainer。SHAP 中的 KernelExplainer 实际上使 SHAP 成为一个模型无关的解释方法。然而,与之前的方法不同,基于 Kernel SHAP 算法的 KernelExplainer 要慢得多,尤其是在大型和高维数据集上。Kernel SHAP 尝试结合 Shapley 值和 局部可解释模型无关解释 (LIME) 的思想,以实现黑盒模型的全球和局部可解释性。类似于 LIME 采取的方法,Kernel SHAP 算法也创建了局部线性扰动样本,并计算相同样本的 Shapley 值,以识别对模型预测有贡献或相反的特征。

KernelExplainer 是 Kernel SHAP 算法的实际实现。以下笔记本提供了完整的教程,展示了 SHAP KernelExplainer 的应用:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter07/KernelExplainers.ipynb。我使用了与 TreeExplainer 教程 中相同的 德国信用风险数据集。如果你直接从本节开始,请参阅 将 TreeExplainers 应用于树集成模型 部分,以详细了解数据集和模型。在本节中,我们将讨论 KernelExplainer 在 TreeExplainer 教程中讨论的相同问题中的应用。

SHAP 中 KernelExplainer 的应用

SHAP 中的 KernelExplainer 方法将模型和背景数据作为输入来计算 SHAP 值。对于较大的数据集或具有许多特征的维数据集,建议仅使用训练数据的一个子集作为背景样本。否则,Kernel SHAP 可能是一个非常慢的算法,并且生成 SHAP 值需要很长时间。与之前介绍的解释方法一样,应用 KernelExplainer 非常简单,可以使用以下代码行完成:

explainer = shap.KernelExplainer(model.predict, x_train)
shap_values = explainer.shap_values(x_test, nsamples=100)

如果我们记录计算 SHAP 值的墙时(在 Jupyter 笔记本中使用 %%time),并将 KernelExplainer 与 TreeExplainer 在同一数据集上比较,我们将观察到 KernelExplainer 执行时间明显更长(在我们的案例中几乎长 1,000 倍!)这表明尽管 KernelExplainer 是模型无关的,但算法的缓慢是一个主要的缺点。

对于解释黑盒模型,适用于 TreeExplainer 的相同可视化方法也适用于 KernelExplainer,可以通过以下代码生成:

shap.summary_plot(shap_values, x_test, plot_type='violin', show=False)
shap.force_plot(explainer.expected_value, shap_values[1], x_test.iloc[0,:])
shap.decision_plot(explainer.expected_value, shap_values[1], x_test.iloc[0,:])

图 7.9 展示了用于解释黑盒模型的总结图、决策图和力图:

图 7.9 – 使用 SHAP KernelExplainer 获得的总结图、决策图和力图

图 7.9 – 使用 SHAP KernelExplainer 获得的总结图、决策图和力图

使用与 TreeExplainer 中介绍的方法相同的途径,可以获得图 7.9中显示的图表。在下一节中,我们将介绍 SHAP 中的 LinearExplainer,这是另一种特定于模型的解释方法。

探索 SHAP 中的 LinearExplainer

SHAP 中的 LinearExplainer 特别为线性机器学习模型开发。在前一节中,我们了解到虽然 KernelExplainer 是模型无关的,但它可能非常慢。因此,我认为这是使用 LinearExplainer 解释具有独立特征的线性模型,甚至考虑特征相关性的主要动机之一。在本节中,我们将讨论在实践中应用 LinearExplainer 方法。详细的笔记本教程可在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter07/LinearExplainers.ipynb找到。我们使用了与第六章中讨论的教程相同的红酒质量数据集使用 SHAP 进行模型可解释性。您可以参考相同的教程了解更多关于数据集的信息,因为我们将在本节中仅关注 LinearExplainer 的应用部分。

SHAP 中 LinearExplainer 的应用

对于这个例子,我们实际上在数据集上训练了一个线性回归模型。与其他解释器类似,我们可以使用几行代码应用 LinearExplainer:

explainer = shap.LinearExplainer(model, x_train, feature_dependence="independent")
shap_values = explainer.shap_values(x_test)

为了解释训练好的线性模型,适用于 TreeExplainer 和 KernelExplainer 的相同可视化方法同样适用。图 7.10展示了用于解释训练好的线性模型的总结图、特征依赖图和力图:

![图 7.10 – 使用 SHAP LinearExplainer 获得的总结图、特征依赖图和力图图片

图 7.10 – 使用 SHAP LinearExplainer 获得的总结图、特征依赖图和力图

我们可以使用以下代码行获得图 7.10中显示的视觉化图表:

shap.summary_plot(shap_values, x_test, plot_type='violin', show=False)
shap.force_plot(explainer.expected_value, shap_values[1], x_test.iloc[0,:])
shap.dependence_plot("alcohol", shap_values, x_test, show=False)

我会建议您探索其他可视化方法,甚至使用 LinearExplainer 生成的 SHAP 值创建自定义可视化。接下来,我们将讨论将 SHAP 应用于在文本数据上训练的转换器模型。

使用 SHAP 解释转换器

在本章中,到目前为止,我们已经看到了使用 SHAP 解释器解释在结构化和图像数据集上训练的不同类型模型的例子。现在,我们将介绍解释在文本数据上训练的复杂模型的方法。对于文本数据,使用传统的自然语言处理(NLP)方法训练模型以获得高精度始终具有挑战性。这是因为使用经典方法在顺序文本数据中提取上下文信息总是很困难。

然而,随着基于注意力机制Transformer深度学习架构的发明(blogs.nvidia.com/blog/2022/03/25/what-is-a-transformer-model/),在文本数据上训练更高精度的模型变得容易得多。然而,transformer 模型极其复杂,解释这些模型的工作原理可能非常困难。幸运的是,由于 SHAP 对模型无偏见,它也可以应用于 transformer 模型。

因此,在本节中,我们将介绍如何使用来自 Hugging Face 的基于文本的、预训练的 transformer 模型(github.com/huggingface/transformers)应用于不同的应用场景。完整的教程可以从github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter07/Explaining_Transformers.ipynb获取。现在,让我们看看使用 SHAP 解释基于 transformer 的情感分析模型的第一个例子。

解释基于 transformer 的情感分析模型

使用pip安装程序安装transformers Python 模块:

!pip install --upgrade transformers

您可以通过导入模块来确认 transformers 框架的成功安装:

import transformers

现在,让我们加载一个情感分析预训练模型:

model = transformers.pipeline('sentiment-analysis', return_all_scores=True)

我们可以将任何句子作为输入,并将模型应用于检查其是否具有积极或消极的情感。因此,我们将使用句子"Hugging Face transformers are absolutely brilliant!"作为我们的推理数据:

text_data = "Hugging Face transformers are absolutely brilliant!"
model(text_data)[0]

模型将预测推理数据为积极和消极的概率:

[{'label': 'NEGATIVE', 'score': 0.00013269631017465144},
 {'label': 'POSITIVE', 'score': 0.99986732006073}]

几乎可以肯定(99.99%的概率),模型预测该句子为积极,这是一个正确的预测。现在,让我们应用 SHAP 来解释模型预测:

explainer = shap.Explainer(model) 
shap_values = explainer([text_data])

一旦成功计算出 SHAP 值,我们可以应用 SHAP 文本图可视化和条形图可视化来突出对模型预测有积极和消极贡献的单词:

shap.plots.text(shap_values[0,:,'POSITIVE'])
shap.plots.bar(shap_values[0,:,'POSITIVE'])

图 7.11向我们展示了 SHAP 文本图,它们看起来类似于力图:

图 7.11 – 使用 SHAP 文本图解释在文本数据上训练的 transformer 模型

图 7.11 – 使用 SHAP 文本图解释在文本数据上训练的 transformer 模型

正如我们从图 7.11中可以看到的,突出显示为红色的单词,如brilliantabsolutelyHugging,对模型预测分数有正面的贡献,而其他单词则降低了模型预测,因此对模型的预测有负面的贡献。

从以下图中所示的 SHAP 条形图中也可以得出相同的推断:

![图 7.12 – 用于解释在文本数据上训练的变压器模型的 SHAP 条形图

![img/B18216_07_012.jpg]

图 7.12 – 用于解释在文本数据上训练的变压器模型的 SHAP 条形图

我发现解释条形图更容易,它清楚地显示了句子中每个单词的正负影响,如图图 7.12所示。

接下来,让我们探索另一个示例,其中基于变压器的多类分类模型是在文本数据上训练的。

使用 SHAP 解释多类预测变压器模型

在上一个示例中,我们应用 SHAP 来解释一个基于文本的二分类模型。现在,让我们应用 SHAP 来解释用于检测以下六种情感之一的预训练变压器模型:悲伤喜悦爱情愤怒恐惧惊讶

让我们加载用于情感检测的预训练变压器模型:

tokenizer = transformers.AutoTokenizer.from_pretrained("nateraw/bert-base-uncased-emotion", use_fast=True)
model = transformers.AutoModelForSequenceClassification.from_pretrained("nateraw/bert-base-uncased-emotion").cuda()
# build a pipeline object to do predictions
pipeline = transformers.pipeline("text-classification", model=model, tokenizer=tokenizer, device=0, return_all_scores=True)

现在,让我们使用与上一个示例中相同的推断数据,并使用 SHAP 计算 SHAP 值:

explainer = shap.Explainer(pipeline)
shap_values = explainer([text_data])

然后,我们可以使用 SHAP 文本图来突出显示对六个可能结果中的每一个都有正负贡献的单词:

shap.plots.text(shap_values[0])

图 7.13展示了从上一行代码中获得的 SHAP 文本图的输出:

![图 7.13 – 交互式 SHAP 文本图突出显示对正负贡献的单词

![img/B18216_07_013.jpg]

图 7.13 – 交互式 SHAP 文本图突出显示对正负贡献的单词

SHAP 文本图是交互式的。正如我们从图 7.13中可以看到的,这突出了模型预测结果的红色,以及对模型决策有正负贡献的单词。我们还可以点击其他可能的结果,并可视化每个单词对模型预测的影响。例如,如果我们点击惊讶而不是喜悦,我们会看到除了单词face之外的所有单词都被突出显示为蓝色,因为这些单词对该特定结果有负面的贡献。我个人认为,使用 SHAP 解释在文本数据上训练的变压器模型的方法非常有趣且高效!接下来,让我们探讨应用 SHAP 解释 NLP 零样本学习模型的另一个有趣用例。

使用 SHAP 解释零样本学习模型

零样本学习 是 NLP 中最迷人的概念之一,它涉及在推理数据上应用模型来预测任何在训练过程中未使用的自定义类别,而无需微调。您可以在以下参考链接中找到有关零样本学习的更多信息:aixplain.com/2021/09/23/zero-shot-learning-in-natural-language-processing/。将 SHAP 应用于零样本学习模型也非常简单。

首先,我们需要加载预训练的转换器模型:

model = AutoModelForSequenceClassification.from_pretrained("valhalla/distilbart-mnli-12-3")
tokenizer = AutoTokenizer.from_pretrained("valhalla/distilbart-mnli-12-3")

我们需要创建一个自定义的零样本学习流程,以便 SHAP 能够工作:

class ZSLPipeline(ZeroShotClassificationPipeline):
    # Overwrite the __call__ method
    def __call__(self, *args):
        out = super().__call__(args[0], self.set_labels)[0]
        return [[{"label":x[0], "score": x[1]}  for x in zip(out["labels"], out["scores"])]]
    def set_labels(self, labels: Union[str,List[str]]):
        self.set_labels = labels

然后,我们需要定义自定义标签和推理文本数据,并为零样本学习模型配置新标签。对于这个例子,我们选择了文本 "我喜欢打板球!" 作为我们的推理数据,并希望我们的零样本学习模型能够预测推理文本数据属于 昆虫体育动物 类:

text = ["I love playing cricket!"]
labels = ["insect", "sports", "animal"]
model.config.label2id.update({v:k for k,v in enumerate(labels)})
model.config.id2label.update({k:v for k,v in enumerate(labels)})
pipe = ZSLPipeline(model=model, tokenizer=tokenizer, return_all_scores=True)
pipe.set_labels(labels)

一旦零样本学习模型的设置过程准备就绪,我们就可以轻松地应用 SHAP 进行模型可解释性:

explainer = shap.Explainer(pipe)
shap_values = explainer(text)

在成功计算 SHAP 值之后,我们可以使用文本图或条形图进行模型可解释性:

shap.plots.text(shap_values)
shap.plots.bar(shap_values[0,:,'sports'])

图 7.14 展示了作为输出获得的条形图可视化:

图 7.14 – 零样本学习模型预测运动结果的条形图可视化

图 7.14 – 零样本学习模型预测运动结果的条形图可视化

用于此例的推理文本句子 – "我喜欢打板球!" 实际上与 体育 类相关,该模型正确地预测了这一点。然而,板球不仅是一项运动,也是一种昆虫。当使用短语 打板球 时,整体上它表示我们在谈论一项运动。因此,这些词应该对模型的预测做出积极的贡献。不幸的是,从 图 7.14 中,我们可以看到 板球 这两个词都带有负的 SHAP 值,这表明尽管模型预测是正确的,但这并不是一个非常好的模型,因为模型过于依赖单词 而不是 板球。这是一个经典例子,强调了将 可解释人工智能XAI)作为 AI 流程周期中强制性的必要部分的重要性,我们甚至不应该盲目相信模型,即使模型预测是正确的。

我们现在已经到达了本章的结尾,我将总结本章中我们讨论的重要主题。

摘要

在阅读本章之后,您已经对使用 SHAP 处理表格结构数据以及非结构化数据(如图像和文本)有了实际的经验。我们讨论了 SHAP 中可用于特定模型和无模型可解释性的不同解释器。在本章中,我们应用 SHAP 来解释线性模型、树集成模型、卷积神经网络模型,甚至 Transformer 模型。使用 SHAP,我们可以解释在不同类型数据上训练的不同类型的模型。我强烈推荐尝试 GitHub 代码仓库中提供的端到端教程,并深入探索以获得更深入的实际知识。

在下一章中,我们将讨论另一个有趣的主题——概念激活向量,并探讨应用谷歌 AI 的 使用概念激活向量进行测试TCAV)框架的实践部分,以用人类友好的概念解释模型。

参考文献

请参考以下资源以获取更多信息:

第八章:使用 TCAV 进行人性化解释

在前几章中,我们广泛讨论了LIMESHAP。您也看到了将 LIME 和 SHAP 的 Python 框架应用于解释黑盒模型的实际应用方面。这两个框架的一个主要局限性是,解释方法与非技术性最终用户解释观察结果的方式并不极端一致和直观。例如,如果您有一张装满可乐的玻璃杯的图片,并使用 LIME 和 SHAP 来解释用于正确分类图片为可乐的黑盒模型,LIME 和 SHAP 都会突出显示图片中导致训练模型做出正确预测的区域。但如果你要求一个非技术用户描述这张图片,用户会因为玻璃杯中存在类似可乐饮料的深色碳酸饮料而将其归类为可乐。换句话说,人类倾向于将任何观察与已知的概念联系起来以解释它。

使用概念激活向量(TCAV)进行测试,这是由Google AI提出的,在用已知人类概念解释模型预测方面也采取了类似的方法。因此,在本章中,我们将介绍如何使用 TCAV 提供基于概念的人性化解释。与 LIME 和 SHAP 不同,TCAV 超越了特征归因,并涉及诸如颜色性别种族形状任何已知对象抽象想法等概念来解释模型预测。在本章中,我们将讨论 TCAV 算法的工作原理。我将介绍该框架的一些优缺点。我们还将讨论使用此框架进行实际问题解决。在第二章模型可解释性方法部分,在基于表示的解释中,您已经接触到了 TCAV,但本章我们将涵盖以下主题:

  • 直观理解 TCAV

  • 探索 TCAV 的实际应用

  • 优点和局限性

  • 基于概念解释的潜在应用

现在是时候开始行动了!

技术要求

此代码教程和必需的资源可以从本章的 GitHub 仓库github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter08下载或克隆。与其他章节类似,Python 和 Jupyter 笔记本用于实现本章涵盖的理论概念的实际应用。然而,我建议您在阅读完本章后再运行笔记本,以便更好地理解。

直观理解 TCAV

TCAV 的概念最初由Kim 等人在其工作中提出 – 超越特征归因的解释性:使用概念激活向量(TCAV)的定量测试 (arxiv.org/pdf/1711.11279.pdf)。该框架旨在提供超越特征归因的解释性,特别是对于依赖于低级转换特征且这些特征对人类不可解释的深度学习模型。TCAV 旨在使用抽象的、高级的、对人类友好的概念来解释深度学习模型的内部状态。在本节中,我将向您展示对 TCAV 的直观理解,并解释它是如何提供对人类友好的解释的。

什么是 TCAV?

到目前为止,我们已经介绍了许多通过基于特征的方法解释机器学习模型的方法和框架。但您可能会想到,由于大多数机器学习模型在低级特征上运行,基于特征的解释方法可能会突出那些对没有数据科学和机器学习技术背景的最终用户来说没有用的特征。例如,在解释图像分类器时,图像中的像素强度值或像素坐标可能对没有技术背景的最终用户来说没有用。因此,这些特征不是用户友好的。此外,基于特征的解释总是受限于特征的选择和数据集中存在的特征数量。在所有由基于特征的解释方法选择的特征中,最终用户可能对算法未选择的某个特定特征感兴趣。

因此,而不是这种方法,基于概念的方法提供了一种更广泛的抽象,它对人类友好且更相关,因为解释是以高级概念的重要性为依据提供的。所以,TCAV是 Google AI 的一个模型可解释性框架,它在实践中实现了基于概念解释方法的想法。该算法依赖于概念激活向量(CAV),它使用对人类友好的概念来解释机器学习模型的内部状态。在更技术性的意义上,TCAV 使用方向导数来量化对模型预测的人类友好、高级概念的重要性。例如,在描述发型时,TCAV 可以使用诸如卷发直发发色等概念。这些用户定义的概念不是算法在训练过程中使用的输入特征集。

下图说明了 TCAV 解决的关键问题:

![图 8.1 – TCAV 帮助我们通过神经网络对用户定义的概念进行图像分类,解决该概念重要性的关键问题

![img/B18216_08_001.jpg]

图 8.1 – TCAV 帮助我们通过神经网络对用户定义的概念进行图像分类,解决该概念重要性的关键问题

在下一节中,让我们尝试理解使用抽象概念进行模型解释的想法。

使用抽象概念进行解释

到目前为止,你可能已经对使用抽象概念提供解释的方法有了直观的理解。但为什么你认为这是一种有效的方法呢?让我们再举一个例子。假设你正在构建一个基于深度学习的图像分类器,用于从图像中检测医生。在应用 TCAV 之后,比如说,你发现概念重要性最高的概念是白人男性,其次是听诊器白大褂听诊器白大褂的概念重要性是可以预料的,但白人男性概念的高重要性表明数据集存在偏见。因此,TCAV 可以帮助评估训练模型中的公平性

实际上,CAV 的目标是估计一个概念(如颜色、性别和种族)对于训练模型预测的重要性,即使这些概念在模型训练过程中没有被使用。这是因为 TCAV 从几个示例样本中学习概念。例如,为了学习一个性别概念,TCAV 需要一些具有男性概念的样本和一些非男性的例子。因此,TCAV 可以定量地估计训练模型对该类别的特定概念的敏感性。为了生成解释,TCAV 会扰动数据点,使其向与人类相关的概念靠近,因此它是一种全局扰动方法。接下来,让我们尝试了解 TCAV 的主要目标。

TCAV 的目标

我认为 TCAV 的方法与其他解释方法相比非常独特。其中一个主要原因是,这个框架的开发者确立了与我自己的对人类友好解释的理解相呼应的明确目标。以下是 TCAV 确立的目标:

  • 可访问性:TCAV 的开发者希望这种方法对任何最终用户都是可访问的,无论他们是否了解机器学习或数据科学。

  • 定制性:该框架可以适应任何用户定义的概念。这不仅仅限于训练过程中考虑的概念。

  • 插件就绪性:开发者希望这种方法能够在不重新训练或微调训练的机器学习模型的情况下工作。

  • 全局可解释性:TCAV 可以通过一个单一的定量指标来解释整个类别或数据集的多个样本。它不仅限于数据实例的局部可解释性。

现在我们已经了解了使用 TCAV 可以取得什么成果,让我们来讨论 TCAV 工作的一般方法。

TCAV 的方法

在本节中,我们将更深入地探讨 TCAV 的工作原理。该算法的整体工作原理可以总结为以下方法:

  • 将方向导数应用于定量估计训练的机器学习模型对各种用户定义概念的预测敏感性。

  • 计算最终的定量解释,称为TCAVq 度量,而无需重新训练或微调模型。这个度量是每个概念对每个模型预测类别的相对重要性。

现在,我将尝试进一步简化 TCAV 的方法,而不使用过多的数学概念。假设我们有一个从图像中识别斑马的模型。要应用 TCAV,可以采取以下方法:

  1. 定义感兴趣的概念:第一步是考虑感兴趣的概念。对于我们的斑马分类器,我们既可以有一个代表该概念的给定示例集(例如,黑色条纹对于识别斑马很重要)或者我们可以有一个带有概念标签的独立数据集。这一步骤的主要好处是它不会限制算法使用模型使用的特征。即使是非技术用户或领域专家也可以根据他们现有的知识来定义概念。

  2. 学习概念激活向量:算法试图通过训练一个线性分类器来区分由概念实例生成的激活和任何层中存在的实例的激活,从而在学习层的激活空间中学习一个向量。因此,CAV被定义为将具有概念和没有概念的实例在模型激活中分离的超平面的正交投影。对于我们的斑马分类器,CAVs 有助于区分表示黑色条纹和表示不表示黑色条纹的表示。

  3. 估计方向导数:方向导数用于量化模型预测对概念的敏感性。因此,对于我们的斑马分类器,方向导数帮助我们测量黑色条纹表示在预测斑马中的重要性。与使用每个像素显著性的显著性图不同,方向导数是在整个数据集或一组输入上计算的,但针对特定概念。这有助于提供一个全局的解释视角。

  4. 估计 TCAV 分数:为了量化特定类别的概念重要性,计算 TCAV 分数(TCAVq)。这个指标有助于衡量定义的概念对模型特定激活层的影响,无论是正面的还是负面的。

  5. CAV 验证:CAV 可以从随机选择的数据中生成。但不幸的是,这可能不会产生有意义的概念。因此,为了提高生成的概念,TCAV 通过从不同的数据批次中寻找概念进行多次迭代,而不是在单个数据批次上一次性训练 CAV。然后,使用双尾 t 检验进行统计显著性测试,以选择具有统计显著性的概念。还执行了必要的校正,如Bonferroni 校正,以控制假发现率。

因此,我们已经介绍了 TCAV 算法的直观工作原理。接下来,让我们看看 TCAV 如何在实践中实际应用。

探索 TCAV 的实际应用

在本节中,我们将探讨 TCAV 在解释预训练图像解释器时,如何应用于概念重要性的实际应用。整个笔记本教程可在本章代码库中找到,地址为github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter08/Intro_to_TCAV.ipynb。本教程基于 TCAV 原始 GitHub 项目仓库中提供的笔记本github.com/tensorflow/tcav。我建议您都参考 TCAV 的主要项目仓库,因为实现上的功劳应归于 TCAV 的开发者和贡献者。

在本教程中,我们将介绍如何将 TCAV 应用于验证“条纹”概念相对于“蜂窝”图案在识别老虎方面的概念重要性。以下图像展示了 TCAV 使用简单可视化来确定概念重要性的方法流程:

![Figure 8.2 – 使用 TCAV 估计老虎图像分类器中条纹的概念重要性

![img/B18216_08_002.jpg]

图 8.2 – 使用 TCAV 估计老虎图像分类器中条纹的概念重要性

让我们先设置我们的 Jupyter 笔记本。

开始

与前几章中涵盖的其他教程示例类似,为了安装运行笔记本所需的 Python 模块,您可以在 Jupyter 笔记本中使用pip install命令:

!pip install --upgrade pandas numpy matplotlib tensorflow tcav

您可以导入所有模块以验证这些框架的成功安装:

import tensorflow as tf
import tcav

接下来,让我们看看我们将要处理的数据。

关于数据

我觉得在 TCAV 原始项目仓库中提供的数据准备过程稍微有些耗时。因此,我已经准备了必要的数据集,您可以从这个项目仓库中参考。由于我们将验证“条纹”概念对于老虎图像的重要性,我们需要一个老虎图像数据集。数据来自 ImageNet 收集,并在项目仓库github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter08/images/tiger中提供。这些图像是随机精选和收集的,使用了 TCAV 仓库中提供的数据收集脚本github.com/tensorflow/tcav/tree/master/tcav/tcav_examples/image_models/imagenet

为了运行 TCAV,你需要准备必要的概念图像目标类图像随机数据集图像。对于这个教程,我已从Broden 数据集netdissect.csail.mit.edu/data/broden1_224.zip)中准备了概念图像,正如主项目示例中所建议的。请查阅创建此数据集的研究工作:github.com/CSAILVision/NetDissect。你还可以探索在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter08/concepts/broden_concepts提供的Broden 数据集纹理图像,以了解更多信息。我建议你尝试其他概念或其他图像,并围绕基于 TCAV 的概念重要性进行实验!

Broden 数据集

David Bau、Bolei Zhou*、Aditya Khosla、Aude Oliva 和 Antonio Torralba。网络剖析:量化深度视觉表示的可解释性。计算机视觉和模式识别(CVPR),2017。

由于 TCAV 还需要一些随机数据集来确保从目标图像示例中学习到的概念统计意义的显著性,我在项目仓库中提供了一些示例随机图像,从而简化了教程笔记本的运行!但就像往常一样,你也应该尝试其他随机图像示例。这些随机图像也是使用主项目中提供的图像获取脚本收集的:github.com/tensorflow/tcav/blob/master/tcav/tcav_examples/image_models/imagenet/download_and_make_datasets.py

要进一步进行,你需要定义目标类和概念的变量:

target = 'tiger'  
concepts = ['honeycombed', 'striped'] 

你还可以创建必要的路径和目录来存储笔记本教程中提到的生成的激活和 CAVs。接下来,让我们讨论这个示例中使用的模型。

关于所使用的深度学习模型的讨论

在这个示例中,我们将使用预训练的深度学习模型来强调即使 TCAV 被认为是一种特定于模型的方案,因为它仅适用于神经网络,但它并不对网络架构做出假设,可以很好地与大多数深度神经网络模型协同工作。

对于这个例子,我们将使用基于 ImageNet 数据集的预训练 GoogleNet 模型,paperswithcode.com/method/googlenet。模型文件在代码仓库中提供:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter08/models/inception5h。您可以使用以下代码行加载训练好的模型:

model_to_run = 'GoogleNet'
sess = utils.create_session()
GRAPH_PATH = "models/inception5h/tensorflow_inception_graph.pb"
LABEL_PATH = "models/inception5h/imagenet_comp_graph_label_strings.txt"
trained_model = model.GoogleNetWrapper_public(sess,
                                              GRAPH_PATH,
                                              LABEL_PATH)

模型包装器实际上用于获取训练模型的内部状态和张量。概念重要性实际上是基于内部神经元激活计算的,因此,这个模型包装器很重要。有关内部 API 工作原理的更多详细信息,请参阅以下链接:github.com/tensorflow/tcav/blob/master/Run_TCAV_on_colab.ipynb

接下来,我们需要使用ImageActivationGenerator方法生成概念激活:

act_generator = act_gen.ImageActivationGenerator(
    trained_model, source_dir, activation_dir, 
    max_examples=100)

接下来,我们将使用 TCAV 来探索模型的可解释性。

使用 TCAV 进行模型可解释性

如前所述,TCAV 目前用于解释神经网络及其神经网络内部层。因此,它不是模型无关的,而是一种以模型为中心的可解释性方法。这要求我们定义网络的瓶颈层:

bottlenecks = [ 'mixed4c']

下一步将是应用 TCAV 算法来创建概念激活向量。此过程还包括使用目标类概念重要性和随机样本之间的双尾 t 检验进行统计显著性测试:

num_random_exp= 15
mytcav = tcav.TCAV(sess,
                   target,
                   concepts,
                   bottlenecks,
                   act_generator,
                   [0.1],
                   cav_dir=cav_dir,
                   num_random_exp=num_random_exp)

TCAV 论文中提到的原始实验,arxiv.org/abs/1711.11279,提到至少使用 500 次随机实验来识别具有统计显著性的概念。但为了简化,并实现更快的结果,我们正在使用 15 次随机实验。您也可以尝试更多的随机实验。

最后,我们可以获取结果并可视化概念重要性:

results = mytcav.run(run_parallel=False)
utils_plot.plot_results(results,
                        num_random_exp=num_random_exp)

这将生成以下图表,帮助我们比较概念的重要性:

![Figure 8.3 – TCAV concept importance of the concepts of striped and honeycombed]

用于识别老虎图像

![img/B18216_08_003.jpg]

图 8.3 – 用于识别老虎图像的条纹和蜂窝状概念的概念重要性

如您从图 8.3中观察到的,对于识别老虎条纹概念的概念重要性显著高于蜂窝状概念。

现在我们已经涵盖了实际应用部分,让我给你一个类似的挑战作为练习。你现在能否使用 ImageNet 数据集,并确定“水”对“船只”以及“云”或“天空”对“飞机”的概念的重要性?这将帮助你更深入地理解这个概念,并增强你应用 TCAV 的信心。接下来,我们将讨论 TCAV 的一些优势和局限性。

优势和局限性

在上一节中,我们讨论了 TCAV 的实际应用方面。TCAV 确实是一种解释复杂深度学习模型非常有趣且新颖的方法。尽管它有很多优势,但不幸的是,我在当前框架中确实发现了一些局限性,这些局限性在修订版本中肯定可以改进。

优势

让我们先讨论以下优势:

  • 正如你在第四章中之前看到的 LIME 框架一样,LIME 用于模型可解释性(使用全局扰动方法生成解释),对于同一类别的两个数据实例可能会有相互矛盾的解释。尽管 TCAV 也是一种全局扰动方法,但与 LIME 不同,TCAV 生成的解释不仅对单个数据实例是真实的,而且对整个类别也是真实的。这是 TCAV 相对于 LIME 的一个主要优势,这增加了用户对解释方法的信任。

  • 基于概念的解释更接近人类解释未知观察的方式,而不是 LIME 和 SHAP 采用的基于特征的解释。因此,TCAV 生成的解释确实更符合人性。

  • 基于特征的解释仅限于模型中使用的特征。为了引入任何新的特征以实现模型可解释性,我们需要重新训练模型,而基于概念的解释则更加灵活,并且不受模型训练期间使用的特征的限制。要引入一个新概念,我们不需要重新训练模型。此外,在引入概念时,你不必了解任何关于机器学习(ML)的知识。你只需要创建必要的数据集来生成概念。

  • 模型可解释性不是 TCAV 的唯一好处。TCAV 可以帮助检测训练过程中的问题,例如不平衡数据集导致相对于多数类的数据集中的偏差。实际上,概念重要性可以用作指标来比较模型。例如,假设你正在使用VGG19模型和ResNet50模型。假设这两个模型具有相似的准确性和模型性能,但与 ResNet50 模型相比,用户定义的概念的重要性对于 VGG19 模型要高得多。在这种情况下,使用 VGG19 模型比使用 ResNet50 模型更好。因此,TCAV 可以用来改进模型训练过程。

这些是 TCAV 的一些独特优势,使其比 LIME 和 SHAP 更符合人性。接下来,让我们讨论一下 TCAV 的一些已知局限性。

局限性

以下是一些已知 TCAV 方法的缺点:

  • 目前,使用 TCAV 进行概念解释的方法仅限于神经网络。为了增加其采用率,TCAV 需要一个可以与经典机器学习算法(如决策树支持向量机集成学习算法)一起工作的实现。LIME 和 SHAP 都可以应用于经典机器学习算法来解决标准机器学习问题,这也是为什么 LIME 和 SHAP 有更多采用的原因。同样,在文本数据方面,TCAV 的应用也非常有限。

TCAV 非常容易受到第三章中讨论的数据漂移对抗性影响和其他数据质量问题的影响,“数据为中心的方法”。如果您使用 TCAV,您需要确保训练数据、推理数据和甚至概念数据具有相似的统计特性。否则,由于噪声或数据不纯问题,生成的概念可能会受到影响:

  • Guillaume AlainYoshua Bengio 在他们的论文 Understanding intermediate layers using linear classifier probes (arxiv.org/abs/1610.01644) 中,表达了对将 TCAV 应用于较浅层神经网络的担忧。许多类似的研究论文都建议,与较浅层网络中的概念相比,深层网络中的概念更具可分性,因此 TCAV 的使用主要限于深度神经网络。

  • 准备一个概念数据集可能是一项具有挑战性和昂贵的任务。尽管您不需要机器学习知识来准备概念数据集,但在实践中,您也不期望任何普通用户花费时间创建任何定制用户定义概念的有标注概念数据集。

  • 我觉得 TCAV 的 Python 框架在使用于任何生产级系统之前还需要进一步改进。在我看来,在撰写本章时,这个框架需要进一步成熟,以便可以轻松地与任何生产级机器学习系统一起使用。

我认为所有这些限制都可以解决,使 TCAV 成为一个更加稳健的框架,被广泛采用。如果您感兴趣,您也可以联系 TCAV 框架的作者和开发者,为开源社区做出贡献!在下一节中,让我们讨论一些基于概念解释的潜在应用。

基于概念解释的潜在应用

我确实看到了基于概念的解释,如 TCAV 的巨大潜力!在本节中,您将接触到一些基于概念解释的潜在应用,这些可能成为整个 AI 社区的重要研究课题,具体如下:

  • AI 中透明度和公平性的估计:大多数针对黑盒 AI 模型的监管担忧都与性别、颜色和种族等概念相关。基于概念的解释实际上可以帮助估计 AI 算法在这些抽象概念方面是否公平。检测 AI 模型的偏差实际上可以提高其透明度,并有助于解决某些监管问题。例如,在医生使用深度学习模型的情况下,TCAV 可以用来检测模型是否对特定性别、颜色或种族存在偏见,因为这些概念在模型决策方面理想上并不重要。这些概念的高概念重要性表明存在偏见。图 8.4展示了使用 TCAV 检测模型偏差的一个示例。

图 8.4 – TCAV 可以根据概念重要性检测模型偏差

图 8.4 – TCAV 可以根据概念重要性检测模型偏差

  • 使用 CAV 检测对抗攻击:如果你阅读了 TCAV 研究论文的附录(arxiv.org/pdf/1711.11279.pdf),作者们提到实际样本和对抗样本的概念重要性相当不同。这意味着如果一个图像受到对抗攻击的影响,其概念重要性也会发生变化。因此,CAV 可以作为一种潜在的方法来检测对抗攻击,正如在第三章数据中心方法中讨论的那样。

  • 基于概念图像聚类:使用 CAV 根据相似概念对图像进行聚类可以是一个有趣的应用。基于深度学习的图像搜索引擎是一个常见的应用,其中聚类或相似性算法被应用于特征向量以定位相似图像。然而,这些都是基于特征的方法。同样,使用 CAV 进行基于概念图像聚类的潜力也是存在的。

  • 基于概念自动解释(ACE)Ghorbani, AmirataJames WexlerJames Zou和 Been Kim,在他们关于《向自动概念解释》的研究工作中,提到了一种自动化的 TCAV 版本,该版本会遍历训练图像并自动发现显著的概念。这是一项有趣的工作,我认为它在识别错误标记的训练数据方面可以发挥重要作用。在工业应用中,获取一个完美标记的精选数据集极具挑战性。这个问题在很大程度上可以通过 ACE 来解决。

  • 基于概念的反事实解释:在第二章《模型可解释性方法》中,我们讨论了反事实解释(CFE)作为一种通过建议更改输入特征以改变整体结果来生成可操作见解的机制。然而,CFE 是一种基于特征的解释方法。有一个基于概念的反事实解释将是一个非常有趣的研究课题,这使解释更接近于人类友好的解释。

例如,如果我们说今天会下雨,尽管现在天空晴朗,我们通常会添加进一步的解释,表明晴朗的天空可以被云层覆盖,这增加了降雨的概率。换句话说,晴朗的天空是与晴天相关的概念,而多云的天空是与降雨相关的概念。这个例子表明,如果描述情况的术语也被反转,则预报可以被反转。因此,这就是基于概念的反事实的思想。这个想法并不非常牵强,因为概念瓶颈模型(CBMs)在 Koh 等人发表的研究工作中提出,可以在arxiv.org/abs/2007.04612中实现类似的生成基于概念的反事实的想法,通过操纵瓶颈层的神经元活动。

图 8.5 展示了使用基于概念的反事实示例的例子。目前还没有现有的算法或框架可以帮助我们实现这一点,但这是在计算机视觉中基于概念方法的一个有用应用。

图 8.5 – 基于概念的反事实示例思想的插图

图 8.5 – 基于概念的反事实示例思想的插图

我觉得这是一个广阔的研究领域,使用基于概念的解释提出颠覆性应用的潜力是巨大的。我真诚地希望越来越多的研究人员和 AI 开发者开始在这个领域工作,在未来的几年里取得重大进展!因此,我们已经到达了本章的结尾。现在让我在下一节中总结本章所涵盖的内容。

摘要

本章介绍了 TCAV 的概念,这是一种由 Google AI 开发的新方法和一个框架。你已经对 TCAV 有了一个概念性的理解,实际接触了应用 Python TCAV 框架,了解了一些 TCAV 的关键优势和局限性,最后,我提出了一些关于使用基于概念的解释可以解决的潜在研究问题的有趣想法。

在下一章中,我们将探讨其他流行的 XAI 框架,并将这些框架应用于解决实际问题。

参考文献

请参考以下资源以获取更多信息:

第九章:其他流行的 XAI 框架

在上一章中,我们介绍了来自谷歌 AITCAV 框架,该框架用于生成基于概念的人类友好型解释。我们还讨论了其他广泛使用的解释框架:LIMESHAP。然而,LIME、SHAP 甚至 TCAV 都有一定的局限性,我们在前面的章节中讨论了这些局限性。这些框架中没有哪一个涵盖了非技术最终用户的所有四个可解释性维度。由于这些已知的缺点,寻找稳健的可解释人工智能XAI)框架的工作仍在继续。

寻找稳健的 XAI 框架和解决流行 XAI 模块的已知限制的过程,导致了许多其他稳健框架的发现和发展,这些框架试图解决 ML 模型可解释性的不同方面。在本章中,我们将介绍除了 LIME、SHAP 和 TCAV 之外的其他流行 XAI 框架。

更具体地说,我们将讨论这些框架的重要功能和关键优势。我们还将探讨如何在实践中应用每个框架。涵盖每个框架的所有内容超出了本章的范围。但在本章中,您将了解这些框架的最重要功能和实际应用。在本章中,我们将涵盖以下广泛使用的 XAI 框架列表:

  • DALEX

  • Explainerdashboard

  • InterpretML

  • ALIBI

  • DiCE

  • ELI5

  • H2O AutoML explainer

在本章结束时,我还会分享一个快速比较指南,比较所有这些 XAI 框架,以帮助您根据您的问题选择框架。现在,让我们开始吧!

技术要求

此代码教程及其必要资源可以从本章的 GitHub 仓库下载或克隆:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter09。像其他章节一样,Python 和 Jupyter 笔记本用于实现本章中涵盖的理论概念的实际应用。但我建议您在阅读完本章后再运行笔记本,以便更好地理解。教程中使用的多数数据集也提供在代码仓库中:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter09/datasets

DALEX

第一章的“可解释性的维度”部分,我们讨论了可解释性的四个不同维度——数据模型结果最终用户。大多数可解释性框架,如 LIME、SHAP 和 TCAV,都提供以模型为中心的可解释性。

DALEX模型无关的探索和解释语言)是少数广泛使用的 XAI 框架之一,它试图解决可解释性的大多数维度。DALEX 是模型无关的,并且可以提供一些关于底层数据集的元数据,以提供解释的上下文。此框架提供了对模型性能和模型公平性的洞察,并且它还提供了全局和局部模型可解释性。

DALEX 框架的开发者希望遵守以下要求列表,他们已经定义了这些要求,以便解释复杂的黑盒算法:

  • 预测的论证:根据 DALEX 开发者的说法,机器学习模型用户应该能够理解最终预测的变量或特征归因。

  • 预测的推测:假设情景或理解数据集特定特征对模型结果敏感性的假设是 DALEX 开发者考虑的其他因素。

  • 预测的验证:对于模型的每个预测结果,用户应该能够验证确认模型特定预测的证据强度。

DALEX 设计为使用框架提供的各种解释方法来满足上述要求。图 9.1 展示了 DALEX 的模型探索堆栈:

图 9.1 – DALEX 的模型探索堆栈

图 9.1 – DALEX 的模型探索堆栈

接下来,我将向您演示如何在实际中探索 DALEX 来解释黑盒模型。

设置 DALEX 以实现模型可解释性

在本节中,您将学习如何在 Python 中设置 DALEX。在开始代码演示之前,我建议您检查笔记本 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/DALEX_example.ipynb,其中包含理解我们现在将深入讨论的概念所需的步骤。我还建议您查看 DALEX 的 GitHub 项目存储库 github.com/ModelOriented/DALEX/tree/master/python/dalex,以防在执行笔记本时需要更多信息。

DALEX Python 框架可以使用 pip 安装程序进行安装:

pip install dalex -U

如果您想使用 DALEX 的任何需要可选依赖项的附加功能,您可以尝试以下命令:

pip install dalex[full]

您可以通过使用以下命令将包导入 Jupyter 笔记本来验证包的安装是否成功:

import dalex as dx

希望您的导入操作能够成功;否则,如果您遇到任何错误,您将需要重新安装框架或单独安装其依赖项。

关于数据集的讨论

接下来,让我们简要介绍用于此示例的数据集。对于这个示例,我使用了FIFA 俱乐部位置预测数据集www.kaggle.com/datasets/adityabhattacharya/fifa-club-position-prediction-dataset)来预测足球运动员在欧元联赛中的估值,基于他们的技能和能力。因此,这是一个可以通过回归机器学习模型解决的回归问题。

FIFA 俱乐部位置数据集引用

Bhattacharya A. (2022). Kaggle - FIFA 俱乐部位置预测数据集:www.kaggle.com/datasets/adityabhattacharya/fifa-club-position-prediction-dataset

与所有其他标准机器学习解决方案流程类似,我们首先进行数据检查过程。数据集可以作为 pandas DataFrame 加载,我们可以检查数据集的维度、存在的特征以及每个特征的数据类型。此外,我们可以执行任何必要的数据转换步骤,例如删除无关特征、检查缺失值以及为相关特征填充缺失值。我建议您遵循笔记本中提供的必要步骤,但请随意包括其他附加步骤并更深入地探索数据集。

训练模型

对于这个示例,我使用随机森林回归算法在将数据分为训练集和验证集后拟合模型。这可以通过以下代码行完成:

x_train,x_valid,y_train,y_valid = train_test_split(
  df_train,labels,test_size=0.2,random_state=123)
model = RandomForestRegressor(
  n_estimators=790, min_samples_split = 3, 
  random_state=123).fit(x_train, y_train)

我们对模型的超参数调整尽可能少,因为我们的目标不是构建一个高度高效的模型。相反,我们的目标是使用这个模型作为黑盒模型,并使用 DALEX 来解释模型。因此,让我们继续使用 DALEX 进行模型可解释性部分的讨论。

使用 DALEX 进行模型可解释性

DALEX 对模型无偏见,因为它不对模型做任何假设,并且可以与任何算法一起工作。因此,它将模型视为黑盒。在探讨如何在 Python 中使用 DALEX 之前,让我们讨论以下该框架的关键优势:

  • DALEX 为不同的预测模型提供了一个统一的抽象:作为解释器,DALEX 非常稳健,并且与不同的模型框架(如 scikit-learn、H2O、TensorFlow 等)配合良好。它可以处理不同格式的数据,如 NumPy 数组或 pandas DataFrame。它提供了有关数据或模型的额外元数据,这使得在生产环境中开发端到端模型可解释性管道变得更加容易。

  • DALEX 具有稳健的 API 结构:DALEX 简洁的 API 结构确保了在模型分析中使用了统一的语法和编码结构。只需几行代码,我们就可以应用各种可解释性方法,并解释任何黑盒模型。

  • 它可以提供推理数据实例的局部解释:在 DALEX 中,可以轻松获得单个推理数据实例的预测级可解释性。DALEX 中有不同方法可供选择,如交互式分解图、SHAP 特征重要性图和假设分析图,这些都可以用于局部解释。我们将在下一节中更详细地介绍这些方法。

  • 它还可以在考虑整个数据集和模型的情况下提供全局解释:使用 DALEX 的部分依赖图、累积依赖图、全局变量重要性图等方法,也可以提供模型级全局解释。

  • 使用 DALEX 可以轻松地进行偏差和公平性检查:DALEX 提供了衡量模型公平性和偏差的定量方法。与 DALEX 不同,大多数 XAI 框架都没有提供评估模型公平性的明确方法。

  • DALEX ARENA 平台可以用来构建一个交互式仪表板以增强用户体验:DALEX 可以用来创建一个交互式网络应用平台,可以用来设计一个自定义仪表板,以展示 DALEX 中可用的不同模型可解释性方法的交互式可视化。我认为 DALEX 的这一独特功能为您提供了通过提供定制仪表板来满足特定最终用户需求的机会。

考虑到所有这些关键优势,我们现在继续学习如何应用 DALEX 中可用的这些功能。

首先,我们需要创建一个 DALEX 模型解释器对象,它接受训练好的模型、数据和模型类型作为输入。这可以通过以下代码行完成:

# Create DALEX Explainer object 
explainer = dx.Explainer(model, 
                         x_valid, y_valid, 
                         model_type = 'regression',
                         label='Random Forest')

一旦创建了解释器对象,它还提供了有关模型的附加元数据,如下所示。

![Figure 9.2 – The DALEX explainer metadata]

![img/B18216_09_002.jpg]

图 9.2 – DALEX 解释器元数据

这初始元数据对于构建某些生产级系统的自动化管道非常有用。接下来,让我们探索一些 DALEX 提供的模型级解释。

模型级解释

模型级解释是由 DALEX 生成的全局解释。它考虑了模型性能以及预测过程中考虑的所有特征的总体影响。可以使用一行代码来检查模型的性能:

model_performance = explainer.model_performance("regression")

根据机器学习模型的类型,可以应用不同的模型评估指标。在本例中,我们处理的是一个回归问题,因此 DALEX 使用 MSE、RMSE、R2、MAE 等指标。对于分类问题,将使用准确率、精确度、召回率等指标。如在第 3 章 中所述的 以数据为中心的方法,通过评估模型性能,我们可以估计模型的 数据可预测性,这为我们提供了预测结果正确程度的指示。

DALEX 提供全局特征重要性、部分依赖图PDPs)和累积依赖图等方法来分析模型级别预测的特征解释。首先,让我们尝试特征重要性图变量:

Var_Importance = explainer.model_parts(
  variable_groups=variable_groups, B=15, random_state=123)
Var_Importance.plot(max_vars=10, 
                    rounding_function=np.rint, 
                    digits=None, 
                    vertical_spacing=0.15,
                    title = 'Feature Importance')

这将生成以下图表:

![图 9.3 – DALEX 的全球特征解释特征重要性图图片

图 9.3 – DALEX 的全球特征解释特征重要性图

图 9.3中,我们可以看到训练模型认为球员的能力,包括球员的整体评分、球员的潜力评分以及其他能力,如速度、盘带技巧、力量和耐力,是决定球员估值的最重要因素。

与特征重要性类似,我们可以生成 PDPs。使用以下几行代码也可以生成累积依赖图:

pdp = explainer.model_profile(type = 'partial', N=800)
pdp.plot(variables = ['age', 'potential'])
ald = explainer.model_profile(type = 'accumulated', N=800)
ald.plot(variables = ['age', 'movement_reactions'])

这将为球员的聚合配置文件创建以下图表:

![图 9.4 – 年龄和潜力特征的 PDP 聚合配置文件图,用于模型级别解释用于模型级别解释的预测图片

图 9.4 – 年龄和潜力特征的 PDP 聚合配置文件图,用于模型级别解释

图 9.4展示了年龄潜力这两个整体特征如何随着预测的足球运动员估值变化。从图中我们可以看出,随着球员年龄的增加,预测估值会下降。同样,随着球员潜力评级的提高,球员的估值会增加。所有这些观察结果也与决定球员估值的真实世界观察结果非常一致。接下来,让我们看看如何使用 DALEX 获取预测级别解释。

预测级别解释

DALEX 可以提供模型无关的局部或预测级别的解释,以及全局解释。它使用交互式分解配置文件、SHAP 特征重要性值和 Ceteris Paribus 配置文件(假设配置文件)等技术,在单个数据实例级别上解释模型预测。为了理解这些技术的实际重要性,让我们使用这些技术来解释一个用于预测足球运动员整体估值的人工智能模型。在我们的例子中,我们将比较三位球员——克里斯蒂亚诺·罗纳尔多、莱昂内尔·梅西和贾登·桑乔的预测级别解释。

首先,让我们尝试交互式分解图。这可以通过以下代码行完成:

prediction_level = {'interactive_breakdown':[], 'shap':[]}
ibd = explainer.predict_parts(
  player, type='break_down_interactions', label=name)
prediction_level['interactive_breakdown'].append(ibd)
prediction_level['interactive_breakdown'][0].plot(
  prediction_level['interactive_breakdown'][1:3],
  rounding_function=lambda x, 
  digits: np.rint(x, digits).astype(np.int),
  digits=None, 
  max_vars=15)

这将为每位球员生成以下交互式分解配置文件图:

![图 9.5 – DALEX 的交互式分解图图片

图 9.5 – DALEX 的交互式分解图

图 9.5 展示了比较三个选定球员模型预测的交互式分解图。此图说明了每个特征对最终预测值的贡献。增加模型预测值的特征值与降低预测值的特征值以不同的颜色显示。此图显示了总预测值相对于数据实例中每个特征值的分解。

现在,所有三名球员都是世界级的职业足球运动员;然而,与年轻的桑乔相比,C 罗和梅西是经验丰富的球员,也是足球界的传奇人物。因此,如果你观察这个图,它显示对于 C 罗和梅西,年龄特征降低了预测值,而对于桑乔,它略有增加。观察到一个模型能够学习到随着年龄的增长足球球员的估值如何降低是非常有趣的。这一观察结果也与领域专家的观察结果一致,他们认为具有更高潜力的年轻球员具有更高的市场价值。与分解图类似,DALEX 还提供了 SHAP 特征重要性图来分析特征的贡献。这种方法提供了与分解图类似的信息,但特征重要性是基于 SHAP 值计算的。可以使用以下代码行获得:

sh = explainer.predict_parts(player, type='shap', B=10, 
                             label=name)
prediction_level['shap'].append(sh)
prediction_level['shap'][0].plot(
  prediction_level['shap'][1:3],
  rounding_function=lambda x, 
  digits: np.rint(x, digits).astype(np.int),
  digits=None, 
  max_vars=15)

接下来,我们将使用基于 DALEX 中的 Ceteris Paribus 配置文件的“如果...会怎样”图。Ceteris Paribus 配置文件类似于在 第二章 “模型可解释性方法”中介绍的 敏感性分析。它基于 Ceteris Paribus 原则,这意味着当其他一切保持不变时,我们可以确定特定特征的改变将如何影响模型预测。这个过程通常被称为 “如果...会怎样”模型分析个体条件期望。在应用方面,在我们的例子中,我们可以使用这种方法来找出贾登·桑乔的预测估值如何随着他年龄的增长或整体潜力的增加而变化。我们可以通过以下代码行来找出这一点:

ceteris_paribus_profile = explainer.predict_profile(
    player, 
    variables=['age', 'potential'],
    label=name) # variables to calculate 
ceteris_paribus_profile.plot(size=3, 
                             title= f"What If? {name}")

这将在 DALEX 中生成以下交互式“如果...会怎样”图:

图 9.6 – DALEX 中的交互式“如果...会怎样”图

图 9.6 – DALEX 中的交互式“如果...会怎样”图

图 9.6显示,对于贾登·桑乔来说,随着他年龄的增长,市场估值将开始下降;然而,随着整体潜力评分的增加,它也可能上升。我强烈建议您探索所有这些预测级别的解释选项,并从项目存储库中提供的教程笔记本中进行:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/DALEX_example.ipynb。接下来,我们将使用 DALEX 评估模型公平性。

评估模型公平性

模型公平性检查是 DALEX 的另一个重要功能。尽管模型公平性和偏差检测对于依赖于与性别、种族、民族、国籍和其他类似人口统计特征的分类问题更为重要,但我们也将将其应用于回归模型。有关使用 DALEX 进行模型公平性检查的更多详细信息,请参阅dalex.drwhy.ai/python-dalex-fairness.html。现在,让我们看看我们的模型是否没有偏差且是公平的!

我们将为公平性检查创建一个受保护变量和一个特权变量。在机器学习的公平性检查中,我们试图确保受保护变量不受任何偏差的影响。如果我们预计任何特征值或群体由于数据集不平衡等因素而存在偏差,我们可以将它们声明为特权变量。对于我们的用例,我们将根据球员的年龄进行三组不同球员的公平性检查。

所有 20 岁以下的球员被视为青年球员,20 至 30 岁的球员被视为发展球员,30 岁以上的球员被视为成熟球员。现在,让我们使用 DALEX 进行公平性检查:

protected = np.where(x_valid.age < 30, np.where(x_valid.age < 20, 'youth', 'developing'), 'developed')
privileged = 'youth'
fairness = explainer.model_fairness(protected=protected,
                                    privileged=privileged)
fairness.fairness_check(epsilon = 0.7)

这是公平性检查的结果:

No bias was detected! Conclusion: your model is fair in terms of checked fairness criteria.

我们还可以检查公平性检查的定量证据,并将它们绘制出来以进行进一步分析:

fairness.result
fairness.plot()

这将生成以下用于分析使用 DALEX 进行模型公平性检查的图表:

![图 9.7 – 使用 DALEX 的模型公平性图]

![图片 B18216_09_007.jpg]

图 9.7 – 使用 DALEX 的模型公平性图

图 9.7所示,使用 DALEX 对回归模型进行公平性分析是根据独立性、分离性和充分性等指标进行的。对于分类模型,这些指标可能有所不同,但 API 函数的使用方式相同。接下来,我们将讨论用于使用 DALEX 构建交互式仪表板的基于 Web 的 ARENA 工具。

使用 ARENA 的交互式仪表板

DALEX 的另一个有趣特性是 ARENA 仪表板平台,可以创建一个交互式 Web 应用程序,用于设计用于保存使用不同模型可解释性方法获得的 DALEX 交互式可视化元素的自定义仪表板。这一特定特性为我们提供了一个机会,通过为特定问题创建自定义仪表板来提高用户参与度。

在开始之前,我们需要创建一个 DALEX Arena 数据集:

arena_dataset = df_test[:400].set_index('short_name')

接下来,我们需要创建一个Arena对象,并将从被解释的黑盒模型创建的 DALEX 解释器对象推送到它:

arena = dx.Arena()
# push DALEX explainer object
arena.push_model(explainer)

在此之后,我们只需推送 Arena 数据集并启动服务器,使我们的 Arena 平台上线:

# push whole test dataset (including target column)
arena.push_observations(arena_dataset)
# run server on port 9294
arena.run_server(port=9294)

根据提供的端口,DALEX 服务器将在arena.drwhy.ai/?data=http://127.0.0.1:9294/上运行。最初,您将看到一个空白的仪表板,但您可以从右侧面板轻松拖放视觉元素来创建自己的自定义仪表板,如下面的截图所示:

![Figure 9.8 – An interactive Arena dashboard created using DALEX](https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/app-ml-expl-tech/img/Figure 9.8 – An interactive Arena dashboard created using DALEX)

img/B18216_09_008.jpg

图 9.8 – 使用 DALEX 创建的交互式 Arena 仪表板

此外,您还可以从配置 JSON 文件中加载现有的仪表板或将构建的仪表板导出为配置 JSON 文件。尝试使用代码库中提供的配置 JSON 文件重新创建仪表板,如图9.8所示,该代码库位于raw.githubusercontent.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/main/Chapter09/dalex_sessions/session-1647894542387.json

总体来说,我发现 DALEX 是一个非常有趣且强大的 XAI 框架。在github.com/ModelOriented/DALEXgithub.com/ModelOriented/DrWhy/blob/master/README.md上还有更多示例可供参考。请务必探索它们。然而,DALEX 似乎仅限于结构化数据。我认为作为一个未来的发展方向,使 DALEX 能够轻松应用于图像和文本数据将增加其在人工智能研究社区中的采用率。在下一节中,我们将探讨 Explainerdashboard,这是另一个有趣的 XAI 框架。

Explainerdashboard

人工智能研究社区一直认为交互式可视化是解释机器学习模型预测的重要方法。在本节中,我们将介绍 Explainerdashboard,这是一个有趣的 Python 框架,只需极少的代码即可启动一个涵盖模型可解释性各个方面的全面交互式仪表板。尽管这个框架只支持与 scikit-learn 兼容的模型(包括 XGBoost、CatBoost 和 LightGBM),但它可以提供模型无关的全局和局部可解释性。目前,它支持基于 SHAP 的特征重要性和交互,PDPs,模型性能分析,假设模型分析,甚至基于决策树的分解分析图。

该框架允许自定义仪表板,但我觉得默认版本已经包括了模型可解释性的所有支持方面。生成的基于网页的仪表板可以直接从实时仪表板导出为静态网页。否则,仪表板可以通过自动化的 持续集成 (CI)/持续部署 (CD) 部署流程以网页应用的形式进行程序化部署。我建议在开始教程演示之前,您先阅读框架的官方文档(explainerdashboard.readthedocs.io/en/latest/)和 GitHub 项目仓库(github.com/oegedijk/explainerdashboard)。

设置 Explainerdashboard

本章的完整教程笔记本已提供在代码仓库中,链接为 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/Explainer_dashboard_example.ipynb。然而,在本节中,我将提供一个完整的教程演示。同样,我们将使用 FIFA Club Position Prediction 数据集 (www.kaggle.com/datasets/adityabhattacharya/fifa-club-position-prediction-dataset) 进行本教程,但在这里,我将使用这个数据集来预测基于俱乐部球员技能和能力,下赛季足球俱乐部的联赛位置。

预测未来赛季俱乐部联赛位置的现实任务更为复杂,需要包含几个其他变量才能得到准确的预测。然而,这个预测问题仅基于为俱乐部效力的球员质量。

要开始教程,您需要安装所有必需的依赖项以运行笔记本。如果您已经执行了所有之前的教程示例,那么大多数 Python 模块应该已经安装,除了使用pip安装程序安装的explainerdashboard

!pip install explainerdashboard

Explainerdashboard 框架确实依赖于graphviz模块,这使得安装稍微有些繁琐,这取决于您的系统。在撰写本文时,我发现版本 0.18 与 Explainerdashboard 配合得最好。这可以使用 pip 安装程序安装:

!pip install graphviz==0.18

graphviz二进制文件取决于您使用的操作系统。请访问graphviz.org/获取更多信息。另外,如果您在设置此模块时遇到任何摩擦,请查看pypi.org/project/graphviz/提供的安装说明。

我们将考虑这个机器学习问题是一个回归问题。因此,类似于 DALEX 示例,我们需要执行相同的数据预处理、特征工程、模型训练和评估步骤。我建议您遵循笔记本中提供的步骤github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/Explainer_dashboard_example.ipynb。这包含了获取训练模型的必要细节。我们将使用这个训练模型作为黑盒,并在下一节中使用 Explainerdashboard 来解释它。

使用 Explainerdashboard 进行模型可解释性

在成功安装 Explainerdashboard Python 模块后,您可以导入它以验证安装:

import explainerdashboard

对于这个示例,我们将使用RegressionExplainerExplainerDashboard子模块。因此,我们将加载特定的子模块:

from explainerdashboard import RegressionExplainer, ExplainerDashboard

接下来,只需两行代码,我们就可以为这个示例启动ExplainerDashboard子模块:

explainer = RegressionExplainer(model_skl, x_valid, y_valid)
ExplainerDashboard(explainer).run()

一旦此步骤成功运行,仪表板应该在localhost上以默认端口8050运行。因此,您可以在浏览器中访问http://localhost:8050/来查看您的解释仪表板。

以下列出了 Explainerdashboards 提供的不同可解释性方法:

  • 特征重要性:与其他 XAI 框架类似,特征重要性是了解用于预测的每个属性整体贡献的重要方法。此框架使用 SHAP 值、排列重要性和 PDPs 来分析每个特征对模型预测的贡献:

![图 9.9 – Explainerdashboard 的贡献图和 PDPs]

![img/B18216_09_009.jpg]

图 9.9 – Explainerdashboard 的贡献图和 PDPs

  • 模型性能:与 DALEX 类似,Explainerdashboard 也允许您分析模型性能。对于分类模型,它使用精确度图、混淆矩阵、ROC-AUC 图、PR AUC 图等指标。对于回归模型,我们将看到残差图、拟合优度图等更多图表:

![图 9.10 – Explainerdashboard 中回归模型的模型性能分析图图片

图 9.10 – Explainerdashboard 中回归模型的模型性能分析图

  • 预测级分析:Explainerdashboard 提供了有趣的交互式图表,用于获取局部解释。这与其他 Python 框架非常相似。对于分析预测级结果来说,这一点非常重要。

  • 假设分析:Explainerdashboard 提供的另一个有趣选项是假设分析功能。我们可以使用此功能来改变特征值,并观察整体预测如何改变。我发现假设分析对于提供规范性见解非常有用:

![图 9.11 – 使用 Explainerdashboard 进行假设模型分析图片

图 9.11 – 使用 Explainerdashboard 进行假设模型分析

  • 特征依赖和交互:分析不同特征之间的依赖和交互是 Explainerdashboard 提供的另一种有趣的解释方法。大多数情况下,它使用 SHAP 方法来分析特征依赖和交互。

  • 决策树代理解释器:Explainerdashboard 使用决策树作为代理解释器。此外,它还使用决策树分解图来提高模型的可解释性:

![图 9.12 – Explainerdashboard 中的决策树代理解释器图片

图 9.12 – Explainerdashboard 中的决策树代理解释器

要停止在本地系统上运行仪表板,您只需中断笔记本单元格即可。

Explainerdashboard 为您提供了许多自定义选项。要从给定的模板中自定义自己的仪表板,建议您参考github.com/oegedijk/explainerdashboard#customizing-your-dashboard。您还可以构建多个仪表板,并将所有仪表板编译为一个解释中心:github.com/oegedijk/explainerdashboard#explainerhub。要将仪表板部署到任何地方都可以访问的实时 Web 应用中,我建议您查看github.com/oegedijk/explainerdashboard#deployment

与 DALEX 相比,我认为 Explainerdashboard 稍显落后,因为它仅限于与 scikit-learn 兼容的模型。这意味着对于建立在非结构化数据(如图像和文本)上的复杂深度学习模型,您无法使用此框架。然而,我发现它易于使用,并且对于建立在表格数据集上的机器学习模型非常有用。在下一节中,我们将介绍微软的 InterpretML XAI 框架。

InterpretML

InterpretML(https://interpret.ml/)是微软的一个 XAI 工具包。它的目的是为了模型调试、结果可解释性和机器学习模型的监管审计,提供对机器学习模型的综合理解。使用这个 Python 模块,我们可以训练可解释的玻璃盒模型解释黑盒模型

第一章,“可解释性技术的基础概念”中,我们发现一些模型(如决策树、线性模型或规则拟合算法)本质上是可解释的。然而,这些模型对于复杂数据集来说并不高效。通常,这些模型被称为玻璃盒模型,与黑盒模型相对,因为它们极其透明。

微软研究开发了一种名为可解释提升机EBM)的另一种算法,它将现代机器学习技术如提升、袋装和自动交互检测引入到经典算法如广义加性模型GAMs)中。研究人员还发现,EBMs 的准确度与随机森林和梯度提升树相当,但与这些黑盒模型不同,EBMs 是可解释且透明的。因此,EBMs 是内置到 InterpretML 框架中的玻璃盒模型。

与 DALEX 和 Explainerdashboard 相比,InterpretML 在可用性和采用率方面稍显落后。然而,由于这个框架具有很大的发展潜力,讨论这个框架是很重要的。在讨论代码教程之前,让我们讨论一下这个框架支持的解释性技术。

支持的解释方法

在撰写本文时,以下表格展示了 InterpretML 支持的解释方法,如 GitHub 项目源代码中提到的github.com/interpretml/interpret#supported-techniques

图 9.13 – InterpretML 支持的解释方法

图 9.13 – InterpretML 支持的解释方法

我建议您关注项目文档,因为我非常确信这个框架对 InterpretML 支持的解释方法将会增加。接下来,让我们探讨如何在实践中使用这个框架。

设置 InterpretML

在本节中,我将带您参观代码仓库中提供的 InterpretML 教程示例,网址为 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/InterpretML_example.ipynb。在教程中,我们使用 InterpretML 解释了一个用于肝炎检测的机器学习模型,这是一个分类问题。

要开始解决这个问题,你需要安装 InterpretML Python 模块。你可以使用 pip 安装程序来完成这个任务:

pip install interpret

虽然该框架支持 Windows、Mac 和 Linux,但它确实要求你拥有一个高于 3.6 的 Python 版本。你可以通过导入模块来验证安装是否成功:

import interpret as iml

接下来,让我们讨论本教程中使用的这个数据集。

关于数据集的讨论

肝炎检测数据集来自 UCI 机器学习仓库,网址为 https://archive.ics.uci.edu/ml/datasets/hepatitis。它包含 155 条记录和 20 个不同类型的特征,用于检测肝炎疾病。因此,这个数据集被用于解决二元分类问题。为了方便起见,我已经将这个数据集添加到代码仓库中,网址为 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter09/datasets/Hepatitis_Data

肝炎数据集引用

G.Gong(卡内基梅隆大学)通过 Bojan Cestnik,Jozef Stefan Institute (archive.ics.uci.edu/ml/datasets/hepatitis)*

关于数据集和初步探索结果的更多细节包含在教程笔记本中。然而,从非常高的层面来看,数据集是不平衡的,它有缺失值,并且包含分类连续变量。因此,在构建模型之前需要必要的转换。所有这些必要的步骤都包含在教程笔记本中,但请随时探索构建更好的机器学习模型的其他方法。

训练模型

在这个例子中,在将整个数据集划分为训练集和测试集之后,我已经使用最小超参数调整训练了一个随机森林分类器:

x_train, x_test, y_train, y_test = train_test_split(
  encoded, label, test_size=0.3, random_state=123)
model = RandomForestClassifier(
  n_estimators=500, min_samples_split = 3,
  random_state=123).fit(x_train, y_train)

注意,对于这个模型,我们没有进行充分的超参数调整,因为我们更感兴趣的是 InterpretML 的模型可解释性部分,而不是学习如何构建一个高效的机器学习模型。然而,我鼓励您进一步探索超参数调整以获得更好的模型。

在测试数据上评估模型后,我们得到了 85% 的准确率和 70% 的 ROC 曲线下面积AUC)分数。由于数据集不平衡,AUC 分数远低于准确率。这表明准确率等指标可能会误导。因此,在模型评估时,最好考虑 AUC 分数、F1 分数和混淆矩阵等指标,而不是准确率。

接下来,我们将使用 InterpretML 进行模型可解释性。

使用 InterpretML 进行可解释性

如前所述,使用 InterpretML,您可以使用可解释的玻璃盒模型作为代理解释器,或者探索某些模型无关的方法来解释黑盒模型。使用这两种方法,您都可以获得一个交互式仪表板来分析可解释性的各个方面。首先,我将介绍使用 InterpretML 中的玻璃盒模型进行模型可解释性。

使用 InterpretML 的玻璃盒模型进行解释

InterpretML 支持可解释的玻璃盒模型,例如 可解释提升机EBM)、决策树规则拟合算法。这些算法作为代理解释器应用,以提供事后模型可解释性。首先,让我们尝试一下 EBM 算法。

EBM

要使用 EBM 解释模型,我们需要在 Python 中加载所需的子模块:

from interpret.glassbox import ExplainableBoostingClassifier

一旦成功导入 EBM 子模块,我们只需创建一个训练好的代理解释器对象:

ebm = ExplainableBoostingClassifier(feature_types=feature_types)
ebm.fit(x_train, y_train)

ebm 变量是 EBM 解释器对象。我们可以使用这个变量来获取全局或局部解释。框架仅支持基于特征重要性的全局和局部可解释性,但创建交互式图表以进行进一步分析:

# Showing Global Explanations
ebm_global = ebm.explain_global()
iml.show(ebm_global)
# Local explanation using EBM
ebm_local = ebm.explain_local(x_test[5:6], y_test[5:6], 
                              name = 'Local Explanation')
iml.show(ebm_local)

图 9.14 展示了使用 InterpretML 获得的全局特征重要性图和 年龄 特征与整体数据分布的变化:

图 9.14 – 使用 InterpretML 的全局解释图

图 9.14 – 使用 InterpretML 的全局解释图

局部解释的特征重要性,已在单个数据实例的预测级别完成,如图 9.15 所示:

图 9.15 – 使用 InterpretML 的本地解释

图 9.15 – 使用 InterpretML 的本地解释

接下来,我们将探索 InterpretML 中的基于规则的算法作为 代理解释器,如在第 2 章 中讨论的 模型可解释性方法

决策规则列表

与 EBM 类似,InterpretML 中可用的另一个流行的玻璃盒代理解释器是决策规则列表。这与规则拟合算法类似,可以从数据集中学习特定规则来解释模型的逻辑工作方式。我们可以使用以下方式通过 InterpretML 应用此方法:

from interpret.glassbox import DecisionListClassifier
dlc = DecisionListClassifier(feature_types=feature_types)
dlc.fit(x_train, y_train)
# Showing Global Explanations
dlc_global = dlc.explain_global()
iml.show(dlc_global)

使用这种方法,框架显示学习到的规则,如下面的屏幕截图所示:

图 9.16 – 使用 InterpretML 的决策规则列表

图 9.16 – 使用 InterpretML 的决策规则列表

图 9.16 所示,它生成了一组学习规则列表。接下来,我们将探索 InterpretML 中的基于决策树的代理解释器。

决策树

与决策规则列表类似,我们也可以将决策树算法拟合为代理解释器,使用 InterpretML 进行模型可解释性。API 语法也非常相似,用于应用决策树分类器:

from interpret.glassbox import ClassificationTree
dtc = ClassificationTree(feature_types=feature_types)
dtc.fit(x_train, y_train)
# Showing Global Explanations
dtc_global = dtc.explain_global()
iml.show(dtc_global)

这将为模型解释生成一个决策树分解图,如下面的屏幕截图所示:

图 9.17 – InterpretML 中的基于决策树的代理解释器

图 9.17 – InterpretML 中的基于决策树的代理解释器

现在所有这些单个组件也可以通过以下行代码合并到一个单独的仪表板中:

iml.show([ebm_global, ebm_local, dlc_global, dtc_global])

图 9.18 展示了使用 InterpretML 的整合交互式仪表板:

图 9.18 – InterpretML 控制台整合所有单个图表

图 9.18 – InterpretML 控制台整合所有单个图表

在下一节中,我们将介绍 InterpretML 提供的用于提供黑盒模型模型无关解释的各种方法。

使用 InterpretML 解释黑盒模型

在本节中,我们将介绍 InterpretML 支持的四种解释黑盒模型的方法。我们将只涵盖代码部分,因为特征重要性和特征变化的可视化与玻璃盒模型非常相似。我确实建议查看教程笔记本,以与生成的图表交互并获得更多见解。支持的方法包括 LIME、Kernel SHAP、Morris 敏感性分析和部分依赖性:

from interpret.blackbox import LimeTabular, ShapKernel, MorrisSensitivity, PartialDependence

首先,我们将探索 LIME 表格方法:

#The InterpretML Blackbox explainers need a predict function, and optionally a dataset
lime = LimeTabular(predict_fn=model.predict_proba, data=x_train.astype('float').values, random_state=123)
#Select the instances to explain, optionally pass in labels if you have them
lime_local = lime.explain_local(
  x_test[:5].astype('float').values, 
  y_test[:5], name='LIME')

接下来,InterpretML 提供了 SHAP Kernel 方法进行模型无关的 SHAP 解释:

# SHAP explanation
background_val = np.median(
  x_train.astype('float').values, axis=0).reshape(1, -1)
shap = ShapKernel(predict_fn=model.predict_proba, 
                  data=background_val, 
                  feature_names=list(x_train.columns))
shap_local = shap.explain_local(
  x_test[:5].astype('float').values, 
  y_test[:5], name='SHAP')

另一种受支持的模型无关全局解释方法是 Morris 敏感性,用于获取特征的整体敏感性:

# Morris Sensitivity
sensitivity = MorrisSensitivity(
  predict_fn=model.predict_proba, 
  data=x_train.astype('float').values,                                
  feature_names=list(x_train.columns),                                
  feature_types=feature_types)
sensitivity_global = sensitivity.explain_global(name="Global Sensitivity")

InterpretML 也支持使用 PDPs 分析特征依赖性:

# Partial Dependence
pdp = PartialDependence(
  predict_fn=model.predict_proba, 
  data=x_train.astype('float').values,                        
  feature_names=list(x_train.columns),
  feature_types=feature_types)
pdp_global = pdp.explain_global(name='Partial Dependence')

最后,所有内容都可以通过一行代码合并到一个单独的仪表板中:

iml.show([lime_local, shap_local, sensitivity_global, 
          pdp_global])

这将创建一个类似的交互式仪表板,如 图 9.18 所示。

通过各种代理解释器和交互式仪表板,这个框架确实有很大的潜力,尽管存在一些限制。它仅限于表格数据集,与 PyTorch、TensorFlow 和 H20 等模型框架不兼容,我认为模型解释方法也有局限性。改善这些限制无疑可以增加该框架的采用率。

接下来,我们将介绍另一个流行的 XAI 框架——ALIBI 用于模型解释。

ALIBI

ALIBI 是另一个流行的 XAI 框架,它支持分类和回归模型的局部和全局解释。在 第二章 中,我们探讨了此框架以获取反事实示例,但 ALIBI 还包括其他模型可解释性方法,我们将在本节中探讨。ALIBI 主要因其以下列表中的模型解释方法而受到欢迎:

  • 锚点解释:锚点解释被定义为围绕局部预测充分旋转或锚定的规则。这意味着如果锚点值存在于数据实例中,那么模型预测几乎总是相同的,无论其他特征值如何变化。

  • 反事实解释CFEs):我们在 第二章 中看到了反事实。CFEs 指示哪些特征值应该改变,以及改变多少,以产生不同的结果。

  • 对比解释方法CEMs):CEMs 与分类模型一起用于局部解释,涉及 相关正面PPs),即应最小且充分存在的特征,以证明给定的分类,以及 相关负面PNs),即应最小且必要不存在的特征,以证明分类。

  • 累积局部效应ALE):ALE 图展示了属性如何影响机器学习模型的总体预测。ALE 图通常被认为是无偏的,并且是 PDPs 的更快替代方案,如 第二章 中所述,模型可解释性方法

要获取模型解释支持的详细方法总结,请查看 github.com/SeldonIO/alibi#supported-methods。请探索此框架的官方文档以了解更多信息:docs.seldon.io/projects/alibi/en/latest/examples/overview.html

现在,让我带您了解为 ALIBI 提供的代码教程。

设置 ALIBI

本章的项目仓库中提供了完整的代码教程,链接为 github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/ALIBI_example.ipynb。如果您已经跟随了 第二章 中关于 反事实解释 的教程,以及 模型可解释性方法,那么您应该已经安装了 ALIBI。

您可以从 ALIBI 导入我们将用于此示例的子模块:

import alibi
from alibi.explainers import AnchorTabular, CEM, CounterfactualProto, ale 

接下来,让我们讨论这个教程的数据集。

关于数据集的讨论

对于这个例子,我们将使用来自UCI 机器学习仓库的占用检测数据集,网址为archive.ics.uci.edu/ml/datasets/Occupancy+Detection+#。这个数据集用于检测房间是否被占用,通过提供不同的传感器值来实现。因此,这是一个可以通过在给定数据集上拟合机器学习分类器来解决的问题。详细的 数据检查、预处理和转换步骤包含在教程笔记本中。从非常高的层面来看,这个数据集略微不平衡,并且主要包含没有缺失值的数值特征。

占用检测数据集引用

L.M. Candanedo, V. Feldheim (2016) - 使用统计学习模型从光、温度、湿度和 CO2 测量值中准确检测办公室房间的占用情况。(archive.ics.uci.edu/ml/datasets/Occupancy+Detection+#)

在本教程中,我演示了如何使用 scikit-learn 的管道方法来训练机器学习模型。这是一种构建机器学习模型非常整洁的方法,尤其是在处理需要部署到生产系统的工业问题时特别有用。要了解更多关于这种方法的信息,请查看官方 scikit-learn 管道文档:scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

接下来,让我们讨论将要用于提取解释的模型。

训练模型

对于这个例子,我使用随机森林分类器进行训练,并进行了最小化超参数调整。你也可以探索其他机器学习分类器,因为算法的选择并不重要。我们的目标是探索 ALIBI 模型的可解释性,我将在下一节中介绍。

使用 ALIBI 进行模型可解释性

现在,让我们使用之前讨论过的各种解释方法来解释训练好的模型,我们可以将其视为一个黑盒。

使用锚解释

为了获取锚点,首先,我们需要创建一个锚解释对象:

explainer = AnchorTabular(
  predict_fn, 
  feature_names=list(df_train.columns), 
  seed=123)

接下来,我们需要将解释器对象拟合到训练数据上:

explainer.fit(df_train.values, disc_perc=[25, 50, 75])

我们需要为占用类和非占用类学习一个锚值。这个过程涉及到为每个类别提供一个数据实例作为输入,以估计锚点。这可以通过以下代码行来完成:

class_names = ['not_occupied', 'occupied']
print('Prediction: ', 
      class_names[explainer.predictor(
        df_test.values[5].reshape(1, -1))[0]])
explanation = explainer.explain(df_test.values[5], 
                                threshold=0.8)
print('Anchor: %s' % (' AND '.join(explanation.anchor)))
print('Prediction: ', 
      class_names[explainer.predictor(
        df_test.values[100].reshape(1, -1))[0]])
explanation = explainer.explain(df_test.values[100], 
                                threshold=0.8)
print('Anchor: %s' % (' AND '.join(explanation.anchor)))

在本例中,当光强度值大于256.7CO2值大于638.8时,获得被占用类的锚点。相比之下,对于未被占用类,当CO2值大于439时,获得锚点。本质上,这告诉我们,如果测量光强度的传感器值大于256.7且 CO2 水平大于638.8,模型预测房间是被占用的。

模型学习到的模式实际上是合适的,因为每当房间被占用时,灯光更有可能被打开,并且随着占用者的增多,CO2 水平也可能会上升。未被占用的类的锚点不太合适,也不直观或可解释,但这表明,通常情况下,当房间未被占用时,CO2 水平较低。通常,我们可以了解到模型预测结果所依赖的一些影响特征的阈值。

使用 CEM

使用 CEM,主要思想是学习应该存在的 PP(Positive Predictive Power)或条件,以证明某一类事件的发生,以及 PN(Positive Negative Power)或条件,应该不存在以指示某一类事件的发生。这用于模型无关的局部可解释性。您可以从这篇研究文献中了解更多关于这种方法的信息:arxiv.org/pdf/1802.07623.pdf

要在 Python 中应用此方法,我们需要创建一个具有所需超参数的 CEM 对象,并将训练值拟合以学习 PP 和 PN 值:

cem = CEM(predict_fn, mode, shape, kappa=kappa, 
          beta=beta, feature_range=feature_range, 
          max_iterations=max_iterations, c_init=c_init, 
          c_steps=c_steps, 
          learning_rate_init=lr_init, clip=clip)
cem.fit(df_train.values, no_info_type='median')
explanation = cem.explain(X, verbose=False)

在我们的例子中,学习到的 PP 和 PN 值显示了值应该增加或减少多少才能满足正确结果的最低标准。令人惊讶的是,我们没有获得任何 PN 值。这表明所有特征对于模型来说都很重要。任何特征或任何特定值范围的缺失都不会帮助模型预测结果。通常,对于高维数据,PN 值对于分析来说很重要。

使用 CFEs

第二章“模型可解释性方法”中,我们探讨了如何使用 ALIBI 应用 CFEs 的教程示例。对于本例,我们也将采取类似的方法。然而,ALIBI 确实允许不同的算法生成 CFEs,我强烈建议您探索:docs.seldon.io/projects/alibi/en/latest/methods/CF.html。在本章中,我们将坚持在第二章“模型可解释性方法”的 CFE 教程中涵盖的原型方法:

cfe = CounterfactualProto(predict_fn,
                          shape,
                          use_kdtree=True, 
                          theta=10., 
                          max_iterations=1000,
                          c_init=1., 
                          c_steps=10
                         )
cfe.fit(df_train.values, d_type='abdm', 
        disc_perc=[25, 50, 75])
explanation = cfe.explain(X)

一旦解释对象准备就绪,我们实际上可以比较 CFE 与原始数据实例之间的差异,以了解翻转结果所需的特征值变化。然而,使用这种方法获取正确的 CFE 可能有些挑战,因为有许多超参数需要正确的调整;因此,这种方法可能具有挑战性和繁琐。接下来,让我们讨论如何使用 ALE 图进行模型可解释性。

使用 ALE 图

与 PDPs 类似,如第第二章中所述,“模型可解释性方法”,ALE 图可以用来找到各个特征与目标类之间的关系。让我们看看如何在 Python 中应用这个方法:

proba_ale = ale.ALE(predict_fn, feature_names=numeric,
                    target_names=class_names)
proba_explain = proba_ale.explain(df_test.values)
ale.plot_ale(proba_explain, n_cols=3, 
             fig_kw={'figwidth': 12, 'figheight': 8})

这将创建以下 ALE 图:

图 9.19 – 使用 ALIBI 的 ALE 图

图 9.19 – 使用 ALIBI 的 ALE 图

图 9.19中,我们可以看到对于occupiednot occupied目标类,特征值的变化在特征光处达到最大水平,其次是 CO2 和温度,而HumidityRatio处则处于最低水平。这为我们提供了模型预测如何根据特征值的变化而变化的指示。

总体来说,我觉得 ALIBI 是一个有趣的 XAI 框架,它适用于表格和无结构数据,如文本和图像,并且确实有各种技术用于 ML 模型的可解释性。我唯一发现的问题是,其中一些方法并不非常简化,因此需要大量的超参数调整才能得到可靠的解释。请访问github.com/SeldonIO/alibi/tree/master/doc/source/examples以获取 ALIBI 提供的其他示例,以获得更多实际经验。在下一节中,我们将讨论 DiCE 作为 XAI Python 框架。

DiCE

多样化的反事实解释DiCE)是另一个流行的 XAI 框架,我们在第二章“模型可解释性方法”中简要介绍了它,用于CFE 教程。有趣的是,DiCE 也是微软研究院的关键 XAI 框架之一,但它尚未与 InterpretML 模块集成(我想知道为什么!)。我发现 CFE 的整个想法非常接近理想的、对人类友好的解释,它提供了可操作的建议。微软的这篇博客讨论了 DiCE 框架背后的动机和想法:www.microsoft.com/en-us/research/blog/open-source-library-provides-explanation-for-machine-learning-through-diverse-counterfactuals/

与 ALIBI CFE 相比,我发现 DiCE 在最小超参数调整的情况下产生了更合适的 CFE。这就是为什么我认为提到 DiCE 很重要,因为它主要是为基于示例的解释而设计的。接下来,让我们讨论 DiCE 支持的 CFE 方法。

DiCE 支持的 CFE 方法

DiCE 可以根据以下方法生成 CFE:

  • 非模型方法:

    • KD-Tree

    • 遗传算法

    • 随机采样

  • 基于梯度的方法(特定模型的方法):

    • 深度学习模型的基于损失的方法

    • 变分自编码器VAE)-基于的方法

要了解更多关于所有这些方法的信息,我请求您探索 DiCE 的官方文档(https://github.com/interpretml/DiCE),其中包含每种方法的必要研究文献。现在,让我们使用 DiCE 进行模型可解释性。

使用 DiCE 进行模型可解释性

完整的教程示例可在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/DiCE_example.ipynb找到。对于这个例子,我使用了与 ALIBI 教程相同的占用检测数据集。由于使用了相同的数据预处理、转换、模型训练和评估步骤,我们将直接使用 DALEX 进行模型可解释性部分。笔记本教程包含所有必要的步骤,所以我建议您首先查看笔记本。

我们将像在第二章的 CFE 教程中做的那样,以相同的方式使用 DiCE 框架,模型可解释性方法

因此,首先,我们需要定义一个 DiCE 数据对象:

data_object = dice_ml.Data(
  dataframe = df_train[numeric + [target_variable]],
  continuous_features = numeric,
  outcome_name = target_variable
)

接下来,我们需要创建一个 DiCE 模型对象:

model_object = dice_ml.Model(model=model,backend='sklearn')

在此之后,我们需要传递数据对象和模型对象给 DiCE 解释对象:

explainer = dice_ml.Dice(data_object, model_object, 
                         method = 'random')

接下来,我们可以使用 DiCE 解释器对象查询数据实例并生成 CFE:

test_query = df_test[400:401][numeric]
cfe = explainer.generate_counterfactuals(
    test_query, 
    total_CFs=4, 
    desired_range=None,
    desired_class="opposite",
    features_to_vary= numeric,
    permitted_range = { 'CO2' : [400, 1000]}, # Adding a constraint for CO2 feature
    random_seed = 123,
    verbose=True)
cfe.visualize_as_dataframe(show_only_changes=True)

这将生成一个 CFE DataFrame,显示需要更改以翻转模型预测结果的特征值。此方法的结果如下截图所示:

图 9.20 – 使用 DiCE 框架生成的 CFE,以 DataFrame 的形式显示

图 9.20 – 使用 DiCE 框架生成的 CFE,以 DataFrame 的形式显示

有趣的是,CFE 不仅可以从数据中提供可操作的见解。然而,它们还可以用于生成局部和全局特征重要性。这种方法认为,可以轻松改变以改变模型预测的特征更重要。让我们尝试使用 DiCE 方法应用局部特征重要性:

local_importance = explainer.local_feature_importance(test_query)
print(local_importance.local_importance)
plt.figure(figsize=(10,5))
plt.bar(range(len(local_importance.local_importance[0])), 
        list(local_importance.local_importance[0].values())/(np.sum(list(local_importance.local_importance[0].values()))), 
        tick_label=list(local_importance.local_importance[0].keys()),
        color = list('byrgmc')
       )
plt.show()

这为选定的测试查询生成了以下局部特征重要性图:

图 9.21 – 使用 DiCE 的局部特征重要性

图 9.21 – 使用 DiCE 的局部特征重要性

图 9.21 显示,对于测试查询数据,湿度、光照和 CO2 特征对于模型预测最为重要。这表明大多数 CFEs 会建议更改这些特征中的一个的特征值以改变模型预测。

总体而言,DiCE 是一个非常有前景的框架,用于稳健的 CFEs。我建议您探索生成 CFEs 的不同算法,如 KD-Trees、随机采样和遗传算法。DiCE 的示例有时可能非常随机。我的建议是始终使用随机种子来控制随机性,明确定义可操作和非可操作特征,并设置可操作特征的边界条件以生成有意义的、实际可行的 CFEs。否则,生成的 CFEs 可能非常随机,实际上不可行,因此使用效果较差。

对于 DiCE 框架在多类分类或回归问题上的其他示例,请探索github.com/interpretml/DiCE/tree/master/docs/source/notebooks。接下来,让我们介绍 ELI5,这是最初开发用于以最简化的格式解释 ML 模型的 XAI 框架之一。

ELI5

ELI5,或Explain Like I'm Five,是一个用于调试、检查和解释 ML 分类器的 Python XAI 库。它是最初开发的 XAI 框架之一,用于以最简化的格式解释黑盒模型。它支持广泛的 ML 建模框架,如与 scikit-learn 兼容的模型、Keras 等。它还集成了 LIME 解释器,可以与表格数据集以及文本和图像等非结构化数据一起工作。库文档可在eli5.readthedocs.io/en/latest/找到,GitHub 项目可在github.com/eli5-org/eli5找到。

在本节中,我们将仅介绍 ELI5 在表格数据集上的应用部分,但请自由探索 ELI5 教程示例中提供的其他示例eli5.readthedocs.io/en/latest/tutorials/index.html。接下来,让我们开始代码教程的演练。

设置 ELI5

本章 ELI5 示例的完整教程可在 GitHub 仓库中找到:github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/ELI5_example.ipynb。ELI5 可以通过 pip 安装器在 Python 中安装:

pip install eli5

如果安装过程成功,您可以通过在 Jupyter 笔记本中导入模块来验证它:

import eli5

对于这个例子,我们将使用来自 UCI 机器学习存储库(https://archive.ics.uci.edu/ml/datasets/hepatitis)相同的肝炎检测数据集,我们将其用于 InterpretML 示例。此外,我们使用了一个具有最小超参数调整的随机森林分类模型,它将作为我们的黑盒模型。因此,我们将跳过关于数据集和模型部分的讨论,并继续使用 ELI5 进行模型可解释性的部分。

使用 ELI5 进行模型可解释性

在 Python 中应用 ELI5 非常简单,只需几行代码即可完成:

eli5.show_weights(model, vec = DictVectorizer(), 
                  feature_names = list(encoded.columns))

这将生成以下特征权重表格可视化,可用于分析全局特征重要性:

![图 9.22 – 使用 ELI5 获得的特征权重图片

图 9.22 – 使用 ELI5 获得的特征权重

图 9.22 表明,特征 BILIRUBIN 具有最大的权重,因此对模型结果的影响贡献最大。显示在权重值旁边的 +/- 值可以被认为是置信区间。这种方法可以被认为是一种非常简单的方式来提供对黑盒模型的洞察。ELI5 使用树模型计算特征权重。树的每个节点都会给出一个输出分数,用于估计特征的总体贡献。决策路径上的总贡献是分数从父节点到子节点的变化量。所有特征的总权重加起来是模型预测特定类别的总概率。

我们可以使用这种方法为局部可解释性和推理数据实例提供:

no_missing = lambda feature_name, feature_value: not np.isnan(feature_value) # filter missing values
eli5.show_prediction(model, 
                     x_test.iloc[1:2].astype('float'), 
                     feature_names = list(encoded.columns), 
                     show_feature_values=True, 
                     feature_filter=no_missing,
                     target_names = {1:'Die', 2:'Live'},
                     top = 10,
                     show = ['feature_importances', 
                             'targets', 'decision_tree', 
                             'description'])

这将为分析推理数据的特征贡献生成以下表格可视化:

![图 9.23 – 使用 ELI5 进行局部可解释性的特征贡献图片

图 9.23 – 使用 ELI5 进行局部可解释性的特征贡献

图 9.23 中,我们可以看到使用 ELI5 对预测所用的局部数据进行的特征贡献。表中添加了一个 <BIAS> 项。这被认为是模型输出的预期平均分数,它取决于训练数据的分布。要了解更多信息,请查看这篇 Stack Overflow 帖子:stackoverflow.com/questions/49402701/eli5-explaining-prediction-xgboost-model

尽管 ELI5 易于使用,可能是迄今为止所有 XAI 框架中最简单的,但我认为该框架还不够全面。即使是用于分析特征贡献的提供的可视化也显得非常陈旧,可以改进。由于 ELI5 是第一个与表格数据、图像和文本数据一起工作的 XAI 框架之一,了解它很重要。

在下一节中,我将介绍 H2O AutoML 模型的模型可解释性。

H2O AutoML 解释器

在本章中,我们主要使用了基于 scikit-learn 和 TensorFlow 的模型。然而,当 AutoML 的概念首次提出时,H2O 社区是这一概念的最早采用者之一,并为 H2O ML 框架引入了 AutoML 功能:docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html

令人有趣的是,H2O AutoML 在业界非常广泛使用,尤其是在处理大量数据集时。不幸的是,与 H2O 模型兼容的模型可解释性框架如 DALEX 非常少。H2O 模型在 R 和 Python 中都有良好的应用,并且借助 AutoML 功能,这个框架承诺在极短的时间内以更少的努力启动训练和调优模型,以获得最佳性能。因此,我认为在本章中提及 H2O AutoML 解释器非常重要。这个框架确实内置了模型可解释性方法的实现,用于解释 AutoML 模型的预测(docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html)。接下来,让我们更深入地探讨 H2O 解释器。

使用 H2O 解释器进行可解释性

H2O 解释器仅支持 H2O 模型。它们可以用于提供全局和局部解释。以下列表显示了在 H2O 中提供解释的支持方法:

  • 模型性能比较(这对于尝试在相同数据集上使用不同算法的 AutoML 模型特别有用)

  • 变量或特征重要性(适用于全局和局部解释)

  • 模型相关性热图

  • 基于 TreeSHAP 的解释(仅适用于树模型)

  • PDPs(适用于全局和局部解释)

  • 单个条件期望图,也称为假设分析图(适用于全局和局部解释)

你可以在docs.h2o.ai/h2o/latest-stable/h2o-docs/explain.html了解更多关于 H2O 解释器的信息。完整的教程示例提供在github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter09/H2o_AutoML_explain_example.ipynb。在这个例子中,我演示了如何使用 H2O AutoML 根据 FIFA 俱乐部位置预测数据集(github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/tree/main/Chapter09/datasets/FIFA_Club_Position)预测顶级足球俱乐部的联赛位置,该数据集与我们在 DALEX 和 Explainerdashboard 教程中使用的数据集相同。

要安装 H2O 模块,你可以使用 pip 安装程序:

pip install h2o

由于我们已经在之前的教程中涵盖了数据准备和转换的步骤,所以在这里我将跳过这些步骤。但请参考教程笔记本以执行端到端示例。

H2O 模型与 pandas DataFrame 不兼容。因此,你需要将 pandas DataFrame 转换为 H2O DataFrame。让我们看看训练 H2O AutoML 模块的代码行:

import h2o
from h2o.automl import H2OAutoML
# Start the H2O cluster (locally) - Don't forget this step
h2o.init()
aml = H2OAutoML(max_models=20, seed=1)
train = x_train.copy()
valid = x_valid.copy()
train["position"] = y_train
valid["position"] = y_valid
x = list(train.columns)
y = "position"
training_frame = h2o.H2OFrame(train)
validation_frame=h2o.H2OFrame(valid) 
# training the automl model
aml.train(x=x, y=y, training_frame=training_frame, 
          validation_frame=validation_frame)

一旦 AutoML 训练过程完成,我们可以获取最佳模型并将其存储为变量以供将来使用:

model = aml.get_best_model()

对于模型可解释性部分,我们只需要使用来自 AutoML 模型对象的explain方法:

aml.explain(validation_frame)

这会自动创建一系列支持的 XAI 方法,并生成可视化来解释模型。在撰写本文时,H2O 的可解释性功能是最新发布的,处于实验阶段。如果您有任何反馈或发现任何错误,请在 H2O JIRA 问题跟踪器上提交工单(0xdata.atlassian.net/projects/PUBDEV)。

有了这些,我已经涵盖了除了LIMESHAPTCAV之外的所有流行的 XAI 框架,这些框架通常被使用或具有解释机器模型的高潜力。在下一节中,我将提供一个快速比较指南来比较本章涵盖的所有七个框架。

快速比较指南

在本章中,我们讨论了 Python 中可用的不同类型的 XAI 框架。当然,没有任何一个框架是绝对完美且适用于所有场景的。在各个部分中,我确实提到了每个框架的优缺点,但我相信如果你有一个快速比较指南来决定你的 XAI 框架选择,这将非常有帮助,特别是考虑到你的具体问题。

下表展示了本章涵盖的七个 XAI 框架的快速比较指南。我尝试从可解释性的不同维度、与各种机器学习模型的兼容性、对人性化的解释的定性评估、解释的鲁棒性、可扩展性的定性评估以及特定框架在生产级系统中被采纳的速度等方面进行比较:

图 9.24 – 本章涵盖的流行 XAI 框架的快速比较指南

图 9.24 – 本章涵盖的流行 XAI 框架的快速比较指南

这就结束了本章的内容。接下来,让我为本章的主要讨论主题提供一个总结。

摘要

在本章中,我们介绍了 Python 中可用的七个流行的 XAI 框架:DALEXExplainerdashboardInterpretMLALIBIDiCEELI5H2O AutoML 解释器。我们讨论了每个框架所支持的解释方法、每个框架的实际应用以及各种优缺点。因此,本章确实涵盖了大量的内容!我还提供了一个快速比较指南,以帮助您决定应该选择哪个框架。这也标志着本书第二部分的结束,该部分让您对使用 XAI Python 框架进行问题解决有了实际的接触。

本书第三部分主要面向与我一样热衷于将人工智能更接近最终用户的研究人员和专家。因此,在下一章中,我们将讨论为设计人性化的 AI 系统所推荐的 XAI 最佳实践。

参考文献

如需更多信息,请参考以下资源:

第三部分 – 将 XAI 提升到新水平

本节涵盖了将可解释人工智能XAI)应用于工业问题的指南和最佳实践。你将了解 XAI 中的一些开放挑战,这些可能是有趣的研究问题。本节还涵盖了设计可解释 AI/ML 系统的以用户为中心的设计原则,这可能会帮助将 AI 更接近最终用户,并最终增加 AI 解决方案的采用率。

本节包括以下章节:

  • 第十章**,XAI 行业最佳实践

  • 第十一章**,以用户为中心的人工智能

第十章:XAI 行业最佳实践

在本书的第一部分,我们讨论了与可解释人工智能XAI)相关的各种概念。这些概念是通过多年的研究建立的,考虑了人工智能的多种应用领域。然而,随着人工智能在工业用例中的采用增加,最近才感觉到对 XAI 在工业应用中的需求。不幸的是,由于某些挑战和如何实施人性化的可解释性方法的差距,XAI 在工业用例中的普遍认识仍然不足。

第二部分实际问题解决中,我们介绍了许多流行的 XAI Python 框架,这些框架通常用于解释机器学习ML)模型的工作原理。然而,仅仅了解如何在实践中应用 XAI Python 框架是不够的,工业问题需要可扩展和可持续的解决方案。因此,对于我们来说,讨论 XAI 在可扩展和可持续的 AI 解决方案中的最佳实践非常重要,这些解决方案用于解决工业问题。

多年来,XAI 已经发展了很多。从学术研究的主题,XAI 现在已成为 AI 和 ML 工业实践者工具箱中的强大工具。然而,XAI 在许多开放挑战上仍然存在,研究社区仍在努力工作,以使 AI 更接近最终用户。因此,我们将讨论 XAI 的现有挑战和设计可解释 ML 系统的通用建议,同时考虑开放挑战。此外,AI/ML 系统的质量与底层数据的质量一样好。因此,我们还将关注采用以数据为先的方法对于模型可解释性的重要性。

XAI 研究社区认为,XAI 是一个多学科视角,应该以最终用户为中心。因此,我们将讨论交互式机器学习IML)的概念,以创造高用户参与度的工业 AI 系统。最后,我们将介绍使用 AI/ML 作为方法来揭示 AI 模型复杂性的重要性,从而使 AI 可解释并增加用户的信任。

与前几章不同,在本章中,我们不会关注实际应用或学习新的 XAI 框架。我们的目标是了解 XAI 在工业用例中的最佳实践。因此,在本章中,我们将讨论以下主题:

  • XAI 的开放挑战

  • 设计可解释机器学习系统的指南

  • 采用以数据为先的方法进行可解释性

  • 强调以可解释性为目的的交互式机器学习(IML)

  • 强调可解释性的规范性见解

因此,让我们进一步了解这些主题。

XAI 的开放挑战

如简要讨论的那样,XAI 领域已经取得了一些显著的进展。XAI 不再仅仅是学术研究的主题;XAI 框架的可用性使得 XAI 成为工业实践者的重要工具。但这些框架足以增加 AI 的采用率吗?不幸的是,答案是否定的。XAI 还需要进一步成熟,因为有一些开放性的挑战,一旦解决,可以显著缩小 AI 与最终用户之间的差距。让我们接下来讨论这些开放性的挑战:

  • 在模型开发者和最终用户之间转移焦点:在本书中探索了许多 XAI 框架之后,你可能也感觉到,大多数框架提供的可解释性需要 ML、数学或统计学的技术知识才能真正理解模型的运作。这是因为可解释性方法或算法主要是为 ML 专家或模型开发者设计的。

随着越来越多的最终用户开始使用 AI 模型和系统,对非技术性、人性化的解释的需求正在增长。因此,对于工业应用来说,在模型开发者和最终用户之间动态转移焦点是一个挑战。

对于非技术性的最终用户来说,除非提供明确的信息,否则像特征重要性可视化这样的简单解释方法可能会变得非常复杂。为了减轻这一挑战,一般的建议是设计以用户为中心的 AI 系统。类似于任何软件应用或系统,用户应该在开发初期就参与其中,了解他们的需求,并在设计应用时包括他们的专业知识,而不是在应用生产之后。

  • 缺乏利益相关者参与:从上一个观点来看,尽管建议尽早让最终用户参与 AI 系统的开发过程,但让利益相关者加入开发过程也可能是一个挑战。对于大多数工业用例,AI 解决方案是在不涉及最终利益相关者的情况下独立开发的。根据人机交互(HCI)领域的原则,用户应该在开发过程中参与其中。

考虑到高度敏感的领域,如医疗保健、金融、法律和监管,获取利益相关者和领域专家可能是一个极其繁琐且昂贵的流程。利益相关者的可用性可能是一个挑战。即使有必要的激励和补偿,他们的兴趣或参与开发过程的动机也可能很低。由于这些困难,将最终用户纳入开发过程,设计以用户为中心的 AI 系统变得困难。

应对这一挑战的最推荐行动是通过行业和学术界的合作。通常,如医学院、法学院或其他大学等学术机构可以更广泛地接触到各自领域的真实参与者或学生,他们可以成为参与者。

以下图表说明了 XAI 是一个多学科视角:

图 10.1 – XAI 是一个多学科视角

  • 特定应用的挑战:不同的应用领域需要不同类型的可解释性。例如,在一个基于人工智能的贷款审批系统中,基于影响或基于示例的特征解释可能非常有帮助。然而,对于从 X 射线图像中检测 COVID-19 感染的应用,突出或定位感染区域可能更有帮助。因此,每个应用都可能有其自己的可解释性要求和定义,因此任何通用的 XAI 框架可能并不非常有效。

  • 缺乏定量评估指标:解释方法的定量评估一直是重要的研究课题。不幸的是,目前还没有工具或框架可以定量评估解释方法的质量。这主要是因为许多不同的 AI 算法正在处理不同类型的数据。因此,有许多关于模型可解释性的定义和许多 XAI 的方法。因此,很难概括出适用于所有不同解释方法的定量评估指标。

目前,正在使用定性评估方法,如信任实用性可操作性与先验信念的一致性影响等。要了解更多关于这些指标的信息,请参阅Accenture LabsUnderstanding Machines: Explainable AI,可在www.accenture.com/_acnmedia/pdf-85/accenture-understanding-machines-explainable-ai.pdf找到。此外,还可以查看Explanation in Artificial Intelligence: Insights from the Social Sciences,由Tim Miller撰写,可在arxiv.org/pdf/1706.07269.pdf找到。

定性评估方法确实是用户中心的,并使用人机交互(HCI)的原则从最终用户那里收集反馈,但通常,在比较不同方法时,定量指标更有用。然而,我希望能有像Quantus (github.com/understandable-machine-intelligence-lab/Quantus)这样的工具,它用于评估神经网络解释方法,在几年内会显著成熟,这将使评估解释方法变得更加容易。

  • 缺乏可操作的解释:大多数解释方法不向最终用户提供可操作的见解。因此,设计能够提供可操作解释的可解释 AI/ML 系统可能具有挑战性。反事实解释、假设分析以及基于交互式可视化的解释是唯一允许用户观察当输入特征改变时结果变化的解释方法。我建议增加这些可操作解释方法的使用,以开发可解释的 AI/ML 系统。

  • 缺乏上下文解释:任何在生产中部署的机器学习算法都依赖于特定的用例和底层数据。因此,在可解释性、模型性能、公平性和隐私性之间总是存在权衡。因此,理解可解释性的上下文是任何通用 XAI 框架都无法准确提供的现有挑战。因此,缓解这一挑战的建议是为特定用例设计个性化的可解释机器学习系统,而不是通用的实现。

如果你想在这个领域进行更多探索,可以查看Verma 等人的工作,《可解释机器学习的陷阱:行业视角》(arxiv.org/abs/2106.07758),了解更多关于 XAI 典型挑战的信息。所有这些开放挑战都是有趣的研究问题,你可以探索这些问题,以帮助研究界在这个领域取得进步。现在我们已经讨论了 XAI 的开放挑战,接下来,让我们讨论针对工业用例设计可解释机器学习系统的指南,同时考虑这些开放挑战。

设计可解释机器学习系统的指南

在本节中,我们将从行业角度讨论设计可解释机器学习系统的推荐指南,同时考虑上一节中讨论的 XAI 的开放挑战。所有这些指南都经过精心整理,来自各种出版物、会议主题演讲和来自 XAI、机器学习和软件系统领域的专家的圆桌讨论。确实,每个机器学习和人工智能问题都有其独特之处,因此很难泛化任何建议。但许多人工智能组织已经采用了以下列表中的指南来设计可解释且用户友好的机器学习系统:

  • 确定 XAI 的目标受众及其可用性环境:可解释性的定义取决于使用 AI 系统的用户。Arrieta 等人在他们的工作《可解释人工智能(XAI):概念、分类、机会和挑战,迈向负责任的人工智能》中强调了在设计可解释 AI 系统时确定 XAI 目标受众的重要性。

一个 AI 系统可以拥有不同的受众,例如技术利益相关者(即数据科学家、机器学习专家、产品所有者和开发者)、商业利益相关者(即经理和执行领导者)、领域专家(即医生、律师、保险代理等)、法律和监管机构,以及非技术最终用户。每个受众可能对可解释性有不同的需求,因此,解释方法应尽量满足受众的最佳需求。

作为初步步骤,确定可解释系统的目标受众以及他们将要使用系统的情境或背景,在设计中非常有帮助。例如,对于依赖机器学习模型预测糖尿病风险的医疗专家,解释方法的选择取决于他们的实际需求。如果他们的需求是建议改善糖尿病患者健康状况的措施,那么反事实示例可能非常有用。然而,如果他们的目的是找出导致糖尿病风险增加的因素,那么基于特征的解释方法更为相关。

图 10.2 展示了可解释 AI 系统的各种目标受众:

图 10.2 – 确定 XAI 的目标受众

  • 根据用户需求选择 XAI 技术:一旦确定了目标受众及其可用性背景,以及关于数据集类型(例如,表格、图像或文本)和用于训练模型的机器学习算法的必要技术细节,根据第二章中所述的模型可解释性方法,选择一系列可能的解释方法非常重要。

这些预选的解释方法应与目标用户将用于与 AI 模型交互的软件系统相匹配。这意味着解释技术应与软件应用或界面良好集成,甚至应在软件设计过程中考虑,以确保一致的用户体验。

  • 以人为本的 XAI:在特定领域涉及最终用户的翻译和评估 XAI 的迭代过程。类似于使用人机交互(HCI)的软件系统设计生命周期,XAI 也是一个迭代过程。它应以人为中心,并应持续评估以评估影响。在第十一章使用 XAI 进行以用户为中心的系统设计部分,以最终用户为中心的人工智能中,我包括了以人为本的 XAI 设计过程中需要考虑的其他重要方面。

  • XAI 中反馈循环的重要性:所有可解释人工智能系统都应该有捕捉最终用户反馈的选项,以评估系统提供的解释的影响、相关性、有效性和可信度。在设计以及初始开发过程中,永远不可能考虑所有边缘情况和最终用户的所有偏好。但是,通过使用反馈循环,开发者可以收集关于解释方法的特定反馈,并在必要时对其进行修改。

  • 设计过程中可扩展性的重要性:与为生产系统提供机器学习模型类似,可解释性也应该以模块化和可扩展的方式提供。提供模型解释的最佳方式是通过设计可扩展的 Web API,以便在集中式云服务器上部署。因此,当 XAI 在实践中得到实施时,务必确保解释是通过 Web API 提供的,这样它们就可以轻松地集成到任何软件界面或应用程序中。

  • 在数据、界面和可操作见解之间切换:许多专家观察到,对于最终用户来说,他们对模型解释方法的满意度是在以下方面之间的权衡:解释如何与底层数据集(或他们的先验信念)相连接,用户如何与机器学习系统互动以增强对其的信心,以及解释如何鼓励他们采取行动以获得期望的输出。数据为中心的可解释 XAIIML可操作解释是设计工业用例的可解释人工智能系统时应考虑的更广泛的研究主题。

因此,我们已经了解了 XAI 的开放挑战,并讨论了在设计时考虑这些开放挑战的设计指南。现在,我们对在设计可解释的机器学习系统时需要考虑的内容有了相当的了解。接下来,让我们在接下来的章节中详细阐述最后一条推荐的指南,以仔细理解为什么它很重要。让我们从使用以数据为中心的方法来提高可解释性的重要性开始讨论。

采用以数据为中心的方法来提高可解释性

第三章 数据为中心的方法中,我们讨论了数据为中心的可解释 XAI的重要性和各种技术。现在,在本节中,我们将阐述采用以数据为中心的方法来提高可解释性如何有助于在工业用例中获得用户的信任。

以数据为中心的人工智能基于这样一个基本理念:机器学习模型的质量与用于训练模型的底层数据集的质量一样好。对于工业用例,处理质量差的数据集是大多数数据科学家面临的主要挑战。不幸的是,数据质量通常被忽视,因为数据科学家和机器学习专家被期望施展他们的魔法,构建接近 100%准确的模型。因此,机器学习专家简单地尝试遵循以模型为中心的方法,例如调整超参数或使用复杂算法来提高模型性能。即使模型性能略有提高,随着复杂性的增加,可解释性会降低。可解释性的缺乏增加了业务利益相关者的怀疑。此外,与数据质量相关的问题,如数据异常数据泄露数据漂移和其他问题,如在第三章“以数据为中心的方法”中讨论的那样,显著增加。在这种情况下,我们该怎么办呢?

解决方案是采用以数据为中心的方法来解释机器学习过程。使用以数据为中心的可解释性方法,例如探索性数据分析EDA),我们可以从数据集中提取有关数据集的见解,例如任何有趣的模式、相关性、单调性或趋势,这些都是在数据集中使用的特征。在训练数据和推理数据之间的 EDA 和数据分析也有助于您识别数据质量问题。如果数据集中存在问题,始终建议您向业务利益相关者告知数据质量差的局限性,并正确设置关于模型性能的期望。因此,即使模型预测不正确,业务利益相关者也会理解局限性,而不是怀疑机器学习系统。

但我们为什么不尝试一下本书中涵盖的其他 XAI 框架和方法呢?采用以数据为中心的可解释性方法会有什么帮助呢?好吧,如果您适用,您可以尝试其他相关 XAI 方法,但以数据为中心的可解释性总是更容易向非技术用户解释。特别是,通过讨论在第三章“以数据为中心的方法”中的数据概要方法,我们可以确定数据集中每个类别(如果有分类问题)或预测变量的每个区间(如果有回归问题)中特征的值范围,并将模型预测与概要值进行比较。与复杂的数学概念(如Shapley 值)或其他在 XAI 框架中使用的算法相比,与概要值的简单比较更容易理解。

数据为中心的方法更可取的另一个原因是用户对历史数据的信任。一般来说,观察到大多数利益相关者对历史数据的信任比对 AI 模型的信任更高。例如,在春季,如果 AI 天气预报模型预测降雪,大多数最终用户可能会犹豫是否相信预测。这是因为春季总是与阳光和花朵盛开联系在一起,这是由于多年来全球的观察。但如果模型也表明在过去的几年里同一时间发生了降雪,或者甚至表明在过去的几天里附近有降雪,用户的信任就会更大。因此,建议您首先探索以数据为中心的可解释性,然后查看其他可解释性方法来解决任何工业机器学习问题。

下面的图表说明了数据为中心的 XAI 如何非常接近提供可解释性的自然方式,从而提高理解的便捷性:

![图 10.3 – 以数据为中心的方法对于可解释性的重要性]

![图片/B18216_10_003.jpg]

图 10.3 – 以数据为中心的方法对于可解释性的重要性

接下来,我们将讨论交互式机器学习来增强最终用户的信任。

强调以可解释性为中心的 IML

IML 是设计智能用户界面的范例,通过用户交互来促进机器学习和 AI 算法。在过去几年中,使用 IML 引导 ML 系统使用,以增加最终用户的信任,一直是 AI 和 HCI 研究社区的重要研究课题。许多研究文献推荐使用 IML 来增加 AI 系统的用户参与度。“交互式机器学习的最新研究进展”由 Jiang 等人撰写。(arxiv.org/abs/1811.04548)讨论了在 IML 领域取得的重大进展以及它与 ML 算法的信任和透明度增加的紧密关联。

IML 是 XAI 社区用来解释机器学习的另一种有趣的方法。即使在DALEXExplainerdashboards等框架中,如在第九章其他流行的 XAI 框架中所述,提供交互式仪表板和用户可以与之交互的 Web 界面,也被视为模型可解释性的方式。IML 以以下方式帮助用户:

  • 通过图表和视觉探索数据集,从而使用户更容易观察和记住数据中的关键见解。

  • 对 ML 系统更有信心,因为智能用户界面允许用户进行更改并观察结果。这使得用户在考虑任何输入更改时更容易了解模型的行为。

  • 通常,当提供交互式界面时,假设分析和局部可解释性会得到改善。

  • 交互式机器学习(IML)赋予用户更多的控制权来探索系统,IML 通常考虑以用户为中心的设计流程,以提供针对特定用例量身定制的界面。

简而言之,交互式机器学习(IML)改善了用户体验,从而有助于提高 AI 模型的采用率。我强烈建议将交互式用户界面作为可解释机器学习系统的一部分,同时使用模块化的 Web API 来提供模型的可解释性。您可以阅读以下文章,了解更多关于交互式机器学习(IML)在解决商业问题方面的有用性:hub.packtpub.com/what-is-interactive-machine-learning/

下图说明了传统机器学习与交互式机器学习之间的差异:

![Figure 10.4 – Comparing conventional ML with IML]

![img/B18216_10_004.jpg]

图 10.4 – 比较传统机器学习与交互式机器学习

如您从前面的图中所见,使用交互式机器学习(IML),最终用户可以直接与智能用户界面交互,以获取预测、解释和见解。接下来,让我们讨论规范性见解对于可解释机器学习系统的重要性。

强调规范性见解的可解释性

规范性见解是数据分析中常用的术语。它意味着从数据集中提供可操作的推荐,以实现期望的结果。它通常被认为是在数据驱动决策过程的整个过程中起到催化剂的作用。在 XAI 的背景下,如反事实示例数据中心的 XAI假设分析等解释方法被广泛用于向用户提供可操作的建议。

除了反事实之外,机器学习中的可操作回溯这一概念也被用于生成规范性见解。可操作回溯是指用户通过修改可操作的特征来改变机器学习模型的预测的能力。但它与反事实有何不同呢?可操作回溯可以被视为反事实示例想法的扩展,它使用可操作的特征而不是数据集中所有现存的特性。

现在,我们所说的可操作特征是什么意思呢?考虑一个实际场景,我们不可能在数据集中改变所有特征以任何方向达到期望的结果。例如,如年龄性别种族这样的特征无法在任何方向上改变以获得期望的输出。不幸的是,用于生成反事实示例的算法并没有考虑改变特征的实际可行性。

假设一个机器学习模型正在被用来估计糖尿病的风险。对于一个糖尿病患者来说,如果我们想使用反事实示例来推荐如何降低糖尿病的风险,患者实际上不可能通过减少 10 岁年龄或改变性别来降低风险,这是不切实际的。因此,这些是非操作性的特征。尽管理论上改变这些特征可以改变模型的预测,但实际上改变这些特征是不切实际的。因此,可操作回溯的概念更像是一个应用于可操作特征的受控反事实生成过程,并考虑了特征值的实际可行边界条件。

要生成规范性洞察,我建议你使用可操作回溯,因为它考虑了改变特征值以获得期望结果的实际可行性和难度。你可以从Ustun 等人的工作中了解更多关于可操作回溯的信息,线性分类中的可操作回溯(arxiv.org/abs/1809.06514),以及他们的 GitHub 项目github.com/ustunb/actionable-recourse

但在 XAI 中,规范性洞察真的必要吗?答案是是的!以下列出的原因解释了为什么规范性洞察在 XAI 中很重要:

  • 规范性洞察是为用户提供以获得期望结果的建议的行动。在大多数工业用例中,如果用户不知道如何达到他们的期望结果,可解释性是不完整的。

  • 生成规范性洞察是解释机器学习模型工作原理的一种主动方法。这是因为它允许用户采取必要的主动行动,而不是信任他们被动收到的解释。

  • 通过给予用户对系统的控制感,它增加了用户对系统的信任。使用可操作的解释,用户被赋予了改变模型预测的能力。

  • 它增加了企业利益相关者做出数据驱动决策的能力。

这些是你为什么在设计用于工业问题的可解释人工智能系统时,始终应考虑生成可操作解释的主要原因。图 10.5展示了使用 XAI 的规范性洞察如何为用户提供可操作的建议,以获得他们期望的结果:

图 10.5 – 可解释性中规范性洞察的重要性

图 10.5 – 可解释性中规范性洞察的重要性

通过这种方式,我们已经到达了本章的结尾。让我们总结一下接下来讨论的主题。

摘要

本章重点介绍了为工业问题设计可解释人工智能系统的最佳实践。在本章中,我们讨论了 XAI 的开放挑战和可解释机器学习系统的必要设计指南,考虑到开放挑战。我们还强调了在设计中考虑以数据为中心的可解释性、IML 和规范性洞察的重要性。

如果你是一位负责使用人工智能解决工业问题的技术专家、架构师或业务领导者,这一章节帮助你学习了在设计可解释人工智能/机器学习系统时考虑 XAI 中的开放挑战的一些最重要的指导原则。如果你是人工智能或人机交互领域的学者,章节中讨论的一些开放挑战可能成为值得考虑的研究课题。解决这些挑战可以在 XAI 领域取得重大进展。

在下一章中,我们将介绍以最终用户为中心的人工智能的原则,以弥合人工智能与最终用户之间的差距。

参考文献

如需了解本章涉及主题的更多信息,请参阅以下资源:

第十一章:以最终用户为中心的人工智能

在本书的过去 10 章中,我们已经走过了可解释人工智能XAI)的全景,涵盖了实践中用于不同可解释性维度(数据模型结果最终用户)的不同类型的可解释性方法。XAI 是一个活跃的研究领域,我认为它尚未达到其全部潜力。但该领域正在迅速发展,与更广泛的 AI 领域一起,我们将见证许多新的算法、方法和工具在未来被开发出来。很可能会出现新的 XAI 方法和工具将优于现有的方法,并能解决在第十章,“XAI 行业最佳实践”中讨论的一些XAI 的开放挑战。不幸的是,我们无法扩大本书的范围以涵盖所有可能的 XAI 方法。然而,本书的目标是提供该领域的概念理解和所需实践技能的结合,使其成为初学者的有用起点,甚至为专家提供 XAI 应用知识的补充。

在上一章中,我们从行业角度讨论了实施可解释的机器学习ML)系统的推荐实践。我们还讨论了 XAI 的现有挑战以及一些缓解挑战的推荐方法。考虑到这些现有挑战,在本章中,我们将重点关注以最终用户为中心的人工智能ENDURANCE)的理念。这是一个常用来指代以用户为中心构建的可持续和可扩展的 AI 解决方案的术语。建议您在开始本章之前阅读上一章,以便更好地理解。ENDURANCE 既不是一个新的算法,也不是一个用于 XAI 的新颖、复杂的工具。相反,它是一种实践;它是一种系统性的学科,用于弥合 AI 与最终用户之间的差距。

本章对于从多学科视角看待 XAI 的 AI 和人机交互HCI)领域的学者特别有用。对于希望利用 AI 推动问题解决并考虑无缝用户体验UX)的企业领导者来说,本章也很有用。对于 AI 开发者和思想领袖,本章将帮助您在设计 AI 解决方案时以最终用户为中心,并促进 AI 的采用。

本章重点讨论以下主要主题:

  • 以用户为中心的 XAI/ML 系统

  • 使用 EUCA 进行快速 XAI 原型设计

  • 通过 XAI 提高用户对 AI/ML 系统接受度的努力

  • 提供愉悦的用户体验

  • XAI 的下一步是什么?

让我们继续讨论下一节的第一主题。

以用户为中心的 XAI/ML 系统

对于大多数工业问题,AI 解决方案都是在孤立的情况下开发的,用户仅在最小可行解决方案准备好的开发过程的最后阶段被引入。采用这种传统方法,常常发现产品负责人或产品经理倾向于从开发团队的视角来预测解决方案,以满足用户的目标。嗯,这种方法绝对没问题,并且对于需要技术团队通过抽象进行开发的某些用例来说,可能会非常有效。然而,如果用户没有在实施过程的早期阶段参与,常常发现用户不愿意采用该解决方案。因此,ENDURANCE 理念专注于从解决方案的设计阶段就涉及最终用户来开发解决方案。

ENDURANCE 理念专注于人机交互(HCI)的原则,并强调用户分布式认知的重要性。根据这一理念,整个解决方案,包括用户界面UI)、AI 算法底层数据集XAI 组件最终用户体验,被视为一个整体系统,而不是孤立地考虑各个组件。这确保了可解释性被内置于系统中,而不是作为提供给用户的附加服务。从我观察到的来看,大多数工业 AI 解决方案都是作为单独的组件在孤立的情况下开发的,然后作为附加功能高级功能添加到主软件系统中。同样,XAI 组件也是在孤立开发后被视为附加功能。因此,无缝的用户体验可能会受到影响,AI 解决方案和 XAI 组件的主要好处可能无法充分发挥。这就是为什么我们应该关注整个以用户为中心的 XAI/ML 系统的设计和开发。

接下来,让我们讨论在设计解决方案时应该考虑的以最终用户为中心的 XAI 的各个方面。

以最终用户为中心的 XAI 的不同方面

在本节中,我们将讨论在设计 XAI 系统时应该整合的不同人因原则,使用 ENDURANCE 理念来弥合 AI 和最终用户之间的差距。

目标相关性

人机交互领域试图解决的主要问题是用户是谁?他们的需求是什么?或者换句话说,它试图理解解决方案对用户的目标相关性。如果提供的解决方案没有通过满足用户需求来有效解决问题,而没有引入其他挑战,那么它是不相关的。不考虑目标相关性可能是大多数 AI 解决方案被废弃或带着很多怀疑态度采用的主要原因之一。

评估目标相关性的推荐方法是检查用户是否能够在不引入其他挑战的情况下实现他们的目标。除了目标相关性之外,我经常建议评估解决方案的影响。当解决方案不存在时,可以通过收集用户的反馈来定性衡量解决方案的影响。

将用户需求与 AI 优势联系起来

如前所述,在大多数工业用例中,XAI 被单独使用以提供可解释性,而不考虑用户需求。相反,使用 ENDURANCE 的理念,XAI 应该将用户需求与 AI 算法的优势联系起来。一旦确定了用户需求,将用户需求转化为数据需求和模型需求。如果基础数据集不足以满足所有用户需求,则使用以数据为中心的 XAI向用户传达数据集的限制。如果确定了模型需求,则使用 XAI 来解释模型的工作原理,并相应调整以满足用户需求。

但这个过程可能具有挑战性,因为它涉及到识别用户的现有心理模型。随着 AI 和 XAI 的引入,现有的工作流程不应被打乱。

此外,还建议使用 XAI 尝试解释 AI 解决方案是否增加了任何独特的价值。但设计可解释性方法以证明优势,而不是所使用的底层技术。例如,如果系统向用户传达使用复杂的深度学习算法来预测结果,这并不会增加用户的信心。相反,如果系统传达智能解决方案可以帮助用户比传统方法快五倍地达到目标,用户将同意采用该解决方案。

用户界面 - 连接用户与 AI 解决方案的媒介

考虑到传统方法,大多数 AI 从业者只专注于开发准确的 AI 模型,而对用户与模型之间的交互关注较少。通常,用户与 AI 组件的交互由软件工程团队决定;不幸的是,在大多数组织中,数据科学和 AI 团队是孤立的。但 UI 控制着 AI 模型的可视化、可解释性或可理解性的水平,并在影响用户对系统的信任方面发挥着至关重要的作用。

第十章 XAI 行业最佳实践 中,当我们讨论 交互式机器学习 (IML) 时,我们讨论了用户通过 UI 与系统交互如何增强用户对 AI/ML 系统运作的信心。因此,UI 应与 AI 模型及其可解释性方法保持一致,以校准用户的信任。您可以在 Google PAIR 的 People + AI Guidebook 中了解更多关于如何使用 UI 校准用户信任的信息:pair.withgoogle.com/chapter/explainability-trust/

在解决方案的开发过程中尽早让最终用户参与

与传统方法不同,以用户为中心的方法建议在开发过程中尽早让最终用户参与。实际上,最终用户应该从系统的 UI 设计阶段就开始参与,以确保用户的需求正确映射到界面上。与解决方案的设计和开发生命周期类似,可解释性也应该通过从用户那里获取持续反馈的迭代过程来发展。

ENDURANCE 理念将 XAI/ML 系统视为一种解决方案,因此整个解决方案应包含一个 设计阶段原型阶段开发阶段评估阶段。这四个阶段共同构成 一次设计和开发迭代。同样,整个解决方案应在多次迭代中成熟,确保用户参与每个迭代的每个阶段。这个过程也与软件工程中遵循的 敏捷方法 保持一致。在每个阶段让用户参与确保能够收集到有用的反馈,以评估解决方案是否满足了用户的需求。早期参与也确保用户熟悉新系统的设计和运作。用户对系统的熟悉程度提高了系统的采用率。

将反馈与个性化相结合

如前文所述,在解决方案的设计和开发过程中,每个阶段的用户反馈的重要性是不可避免的。但有时,解决方案的一般框架并不能满足用户的所有需求。

例如,当使用反事实示例时,技术上可以生成使用所有用于预测的特征的示例。但假设用户只对改变一组特定的可操作变量感兴趣。在这种情况下,受控的反事实应该只修改对用户有吸引力的特征。研究发现,定制的个性化解决方案通常比通用的解决方案对最终用户更有用。因此,尝试使用从用户那里获得的反馈,提供满足用户特定痛点的个性化解决方案。

上下文和可操作的 AI

如我们之前在第十章中讨论的,XAI 行业最佳实践,解释应该是情境化的并且可操作的。整个 XAI/ML 系统也应该与用户的行为保持一致,并具有情境意识。XAI 在将 AI 与用户行为连接以及将任何 AI 解决方案修改为情境化 AI 解决方案方面发挥着至关重要的作用。

在他的文章情境 AI:人工智能的下一个前沿(business.adobe.com/blog/perspectives/contextual-ai-the-next-frontier-of-artificial-intelligence)中,Oliver Brdiczka定义了情境 AI 的以下四个支柱:

  • 可理解:情境 AI 系统应该能够解释其知识和工作原理。

  • 自适应:情境 AI 系统应该能够适应不同环境中用户的不同需求。

  • 可定制:用户应该能够控制或修改系统以满足他们的需求。

  • 情境感知:系统应该能够以与人类相同水平感知事物。

下图显示了情境 AI 的四个不同组件:

![图 11.1 – 情境 AI 的四个组件(灵感来源于 https://business.adobe.com/blog/perspectives/contextual-ai-the-next-frontier-of-artificial-intelligence)]

![img/B18216_11_001.jpg]

图 11.1 – 情境 AI 的四个组件(灵感来源于 https://business.adobe.com/blog/perspectives/contextual-ai-the-next-frontier-of-artificial-intelligence)

因此,考虑到以用户为中心的方法,XAI/ML 系统的 XAI 组件应提供可操作的见解,并且应该是情境化的,以进一步弥合 AI 与最终用户之间的差距。既然我们已经讨论了以用户为中心的方法来弥合 AI 与最终用户之间可能存在的差距,考虑到在第十章中讨论的 XAI 的开放挑战,XAI 行业最佳实践,让我们讨论使用以最终用户为中心的可解释人工智能EUCA)框架进行快速 XAI 原型设计。

使用 EUCA 进行快速 XAI 原型设计

在上一节中,我们讨论了以用户为中心的 XAI/ML 系统的关键要素。在本节中,我们将强调在 ENDURANCE 理念中快速原型设计的重要性。快速原型设计是软件工程中广泛采用的一个概念,因为软件可能是人类创造的最可塑的东西。快速构建原型是收集软件产品开发早期阶段的有用用户反馈的方法。因此,即使是设计以用户为中心的 XAI/ML 系统,快速原型设计也非常重要。

金等,在他们的研究工作 EUCA:以最终用户为中心的可解释 AI 框架 (arxiv.org/abs/2102.02437) 中,介绍了一个名为 EUCA 的工具包。EUCA 是一个非常有趣的框架,主要由 UX 研究人员、人机交互研究人员和设计师、AI 科学家和开发者设计,旨在为非技术最终用户构建快速 XAI 原型。EUCA 框架的官方 GitHub 仓库可在 github.com/weinajin/end-user-xai 找到。强烈建议使用 EUCA 构建低保真原型,并根据持续的用户反馈迭代改进原型,以提升 XAI/ML 系统的用户接受度。

该框架提供以下重要组件:

  • 12 种设计人性化的解释形式

  • 用于与功能原型集成的对应 XAI 算法

  • 相关的设计模板及其使用示例

  • 建议的原型工作流程

  • 从用户研究结果中获得的各类解释方法的详细优缺点

  • 对最终用户多样化的解释需求进行科学分析(例如,信任校准、偏差检测以及与 AI 的分歧解决)

下图展示了 EUCA 框架目前支持的不同类型的解释方法:

图 11.2 – 在 EUCA 中支持的不同类型的解释方法

图 11.2 – 在 EUCA 中支持的不同类型的解释方法

该框架是一个很好的起点,并且绝对推荐用于构建快速 XAI 原型。接下来,让我们讨论一些可以采取的额外努力,以提高用户对 AI/ML 系统的接受度。

使用 XAI 提高 AI/ML 系统用户接受度的努力

在本节中,我们将讨论一些推荐的做法,以提高使用 XAI 的 AI/ML 系统的接受度。在大多数软件系统中,用户接受测试UAT)阶段用于确定软件的“通过”或“不通过”。同样,在最终生产阶段之前,越来越多的组织更喜欢为 AI/ML 系统进行稳健的 UAT 过程。但在进行 AI/ML 系统的 UAT 时,AI 算法的可解释性有多重要可解释性能否增加 AI 的用户接受度?简短的答案是是的!让我们通过以下要点来了解为什么:

  • 用户接受度是用户信任的证明 – 由于 XAI 可以增加用户对 AI 的信任,它增加了用户接受解决方案的机会。现在,信任不是仅仅在 UAT 阶段就能建立的;相反,信任应该从开始就建立,并在整个开发过程中保持。系统的能力和限制应该从一开始就传达,以设定一个清晰的期望,即什么可行,什么不可行。

  • 将风险容忍度估计作为 UAT 标准 – 很明显,AI 系统不可能每次都 100%准确。实现零错误或零失败的系统在实际上是不可能的。但作为一种推荐做法,记录系统的可能故障点和潜在故障的后果被称为风险风险容忍度是系统在不造成巨大影响的情况下可以犯的最大允许错误。因此,在 UAT 阶段,定义解决方案的风险并估计用户最大风险容忍度非常重要。系统在风险容忍度内的性能应被视为 UAT 过程的成功标准。

  • 在 UAT(用户验收测试)过程之前尽可能多地执行用户研究 – 用户研究和用户反馈的定性和定量分析是评估系统影响力和信任度的确定方式。因此,在 UAT 过程之前进行多次用户研究,并确保用户在接受原型解决方案之前直接将系统投入生产。

之前的方法是提高用户接受度的确定方式,但最终,用户接受度取决于整体用户体验。在下一节,我们将进一步讨论提供愉悦用户体验的重要性。

提供愉悦的用户体验

在本节中,我们将关注整体用户体验的重要性,以促进 XAI/ML 系统的采用。阿伦·沃尔特在他的书《情感设计》(abookapart.com/products/designing-for-emotion)中提到了在更高动机影响用户行为之前必须满足的用户需求的基础要素。根据他的用户需求层次结构,愉悦令人愉悦的 UX 位于金字塔的顶端。以下图显示了阿伦·沃尔特的用户需求层次结构:

![图 11.3 – 阿伦·沃尔特的用户需求层次结构

![img/B18216_11_003.jpg]

图 11.3 – 阿伦·沃尔特的用户需求层次结构

这个用户需求层次结构定义了在解决用户的高级需求之前应该满足的最终用户的基本需求。因此,如果一个系统仅仅是功能性可靠可用,那么除非整体用户体验是愉悦和令人享受的,否则采用该系统是不够的!因此,XAI/ML 系统也应考虑提供无缝的整体体验,以真正弥合 AI 与最终用户之间的差距。

这本书的上一章到此结束。我们将在下一节总结讨论的关键主题。

摘要

在本章中,我们主要讨论了使用 ENDURANCE 理念设计和开发 XAI/ML 系统。我们讨论了使用 XAI 引导我们朝着构建 XAI/ML 系统的终端用户主要目标的重要性。通过本章中提出的一些原则和推荐的最佳实践,我们可以极大地弥合 AI 和终端用户之间的差距!

这也标志着本书的结束!恭喜您到达终点!本书精心设计,旨在包括对各种 XAI 概念和术语的概念理解,提供使用流行 XAI 框架进行应用问题解决的实用示例,从工业角度提供真实案例和经验,以及参考重要研究文献以进一步扩展您的知识。本书从工业和学术研究的角度介绍了 XAI 领域。本书讨论的开放挑战和 XAI 研究主题的下一阶段是人工智能研究社区正在探索的重要研究问题。

尽管这本书几乎触及了 XAI 领域的各个方面,但显然还有更多值得探索和揭示。我的建议是不要局限于这本书所提供的内容。相反,将这本书作为参考起点,但探索并应用从这本书中获得的知识,将其应用于实际案例,并向前迈进,为社区做出贡献!

参考文献

请参考以下资源以获取更多信息:

posted @ 2025-09-04 14:14  绝不原创的飞龙  阅读(4)  评论(0)    收藏  举报