{count, plural, other {课程}}
许多行业和组织正在使用人工智能与机器学习模型来做出明智决策。然而,随着这些技术不断发展并变得更加复杂,人类越来越难以理解并追溯这些 AI 解决方案的决策过程。运用可解释人工智能(简称 XAI)可以应对这一挑战。
本文将先介绍什么是可解释人工智能,随后强调其重要性,并阐明其目标与优势。第二部分将概述两种常用的替代模型 LIME 与 SHAP,并给出其 Python 实现,帮助解释机器学习模型。
什么是可解释人工智能(XAI)?
可解释人工智能指一组流程与方法,旨在为 AI 与机器学习模型生成的决策提供清晰、易于人类理解的解释。
通过在这些模型中集成可解释层,数据科学家与机器学习从业者可以构建更值得信赖且更透明的系统,为开发者、监管者与终端用户等各类利益相关方提供支持。
通过可解释 AI 构建信任
以下是有助于建立信任的一些可解释 AI 原则:
- 透明性。确保利益相关方理解模型的决策过程。
- 公平性。确保模型的决策对所有人都是公平的,包括受保护群体(种族、宗教、性别、残障、族裔)。
- 信任。评估人类用户在使用 AI 系统时的信心程度。
- 稳健性。对输入数据或模型参数变化具有抗扰性,即使面对不确定性或意外情况,仍能保持一致、可靠的表现。
- 隐私。保证对用户敏感信息的保护。
- 可解释性。为其预测与结果提供人类可理解的解释。

实施可解释 AI 带来多重益处。对于决策者和其他利益相关方,它能清晰呈现 AI 驱动决策背后的理由,帮助他们做出更明智的选择。它还可帮助识别模型中的潜在偏差或错误,从而获得更准确与更公平的结果。
可解释 AI 的示例
模型可解释性大致分为两类:特定模型方法与与模型无关的方法。本节将理解二者的差异,并重点关注与模型无关的方法。
两种技术都能在确保模型有效与可问责的同时,为机器学习模型的内部工作机制提供有价值的洞察。
为更好地展示这些工具,我们将使用 Kaggle 的糖尿病数据集。我们会先构建一个简单的分类器,然后实现可解释性。
构建分类器
我们基于糖尿病数据集构建一个随机森林分类器,以预测糖尿病结局。代码分为几个步骤:(1)导入相关库,(2)创建训练集与测试集,(3)构建模型,(4)通过分类报告输出性能指标。
# Load useful libraries
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
# Separate Features and Target Variables
X = diabetes_data.drop(columns='Outcome')
y = diabetes_data['Outcome']
# Create Train & Test Data
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3,
stratify =y,
random_state = 13)
# Build the model
rf_clf = RandomForestClassifier(max_features=2, n_estimators =100 ,bootstrap = True)
rf_clf.fit(X_train, y_train)
# Make prediction on the testing data
y_pred = rf_clf.predict(X_test)
# Classification Report
print(classification_report(y_pred, y_test))
最后一条打印语句会生成如下报告:

该随机森林分类器在预测糖尿病结局方面表现尚可,显然可以通过不同模型进一步改进。
现在,我们可以为该模型加入可解释层,为其预测提供更多洞见。下一节将聚焦两大类可解释性方法:特定模型方法与与模型无关的方法。
我们的文章《机器学习中的分类:入门》可帮助您了解机器学习中的分类,涵盖其概念、用途以及一些分类算法示例。
与模型无关的方法
这类方法可应用于任何机器学习模型,而不受其结构或类型限制。它们侧重分析特征的输入—输出配对。本节将介绍并讨论两种广泛使用的替代模型:LIME 和 SHAP。
SHAP
SHAP 是 SHapley Additive exPlanations 的缩写。该方法旨在通过计算每个特征对预测的贡献来解释某个样本/观测的预测结果,可通过以下 pip 命令安装。
!pip install shap
安装完成后:
- 导入主 shap 库。
- 使用 TreeExplainer 类来解释基于树的模型,并配合 initjs 使用。
- shap.initjs() 函数用于在 Jupyter Notebook 环境中初始化显示 SHAP 可视化所需的 JavaScript 代码。
- 最后,将随机森林分类器传入 TreeExplainer 实例后,计算测试数据集中每个样本各特征的 SHAP 值。
import shap
import matplotlib.pyplot as plt
# load JS visualization code to notebook
shap.initjs()
# Create the explainer
explainer = shap.TreeExplainer(rf_clf)
shap_values = explainer.shap_values(X_test)
SHAP 提供了多种可视化工具以增强模型可解释性,下一节将讨论其中两类:(1)通过总结图展示变量重要性,(2)针对特定目标的总结图,以及(3)依赖图。
用总结图展示变量重要性
在该图中,特征按其平均 SHAP 值排序,最重要的特征位于顶部,最不重要的位于底部,使用 summary_plot() 函数生成。这有助于理解每个特征对模型预测的影响。
print("Variable Importance Plot - Global Interpretation")
figure = plt.figure()
shap.summary_plot(shap_values, X_test)

上述图形可以得到以下解读:
- 我们可以观察到,每一类的水平矩形中红色与蓝色大致各占一半。这意味着每个特征对糖尿病(label=1)与非糖尿病(label=0)两类的分类影响相对均衡。
- 然而,Glucose、Age 与 BMI 是预测力最强的前三个特征。
- 相较之下,Pregnancies、SkinThicknes、Insulin 与 BloodPressure 的贡献不及前三者。
针对特定标签的总结图
这种方式可以更细粒度地概览每个特征对某一特定结果(标签)的影响。
在下面的示例中,shap_values[1] 表示对被分类为标签 1(患有糖尿病)的样本对应的 SHAP 值。
shap.summary_plot(shap_values[1], X_test)

从上图可以看到:
- Y 轴表示按平均绝对 SHAP 值排序的特征,类似于图 2。
- X 轴表示 SHAP 值。对于某一特征,正值会将模型预测推向所考察的标签(label=1),而负值则将预测推向相反类别(label=0)。
- 个体若血糖值较高(红点),更可能被诊断为糖尿病(阳性结果);而血糖值较低则更可能不被诊断为糖尿病。
- 同样地,年龄较大的患者更可能被诊断为糖尿病。然而,对于年轻患者,模型似乎存在不确定性。
针对 Age 特征的这种不确定性,可以使用依赖图来获取更多洞见。
依赖图
与总结图不同,依赖图展示了在数据中每个样本上,某个特定特征与预测结果之间的关系。进行这种分析的原因有多种,不仅限于获取更细粒度的信息,还包括通过验证或挑战总结图或其他全局特征重要性度量的发现,来确认所分析特征的重要性。

依赖图显示,30 岁以下患者被诊断为糖尿病的风险较低;相反,30 岁以上个体更有可能被诊断为糖尿病。
LIME
LIME 全称为 Local Interpretable Model-agnostic Explanations(本地可解释、与模型无关的解释)。与针对整个数据集提供模型的全局理解不同,LIME 专注于解释模型对单个样本的预测。
LIME 解释器的设置主要分两步:(1)导入 lime 模块;(2)使用训练数据与目标拟合解释器。在此阶段,mode 设为 classification,与当前任务相对应。
# Import the LimeTabularExplainer module
from lime.lime_tabular import LimeTabularExplainer
# Get the class names
class_names = ['Has diabetes', 'No diabetes']
# Get the feature names
feature_names = list(X_train.columns)
# Fit the Explainer on the training data set using the LimeTabularExplainer
explainer = LimeTabularExplainer(X_train.values, feature_names =
feature_names,
class_names = class_names,
mode = 'classification')
下面的代码片段会基于随机森林分类器,为测试数据中的第 8 个样本生成并显示 LIME 解释,并以表格形式呈现最终的特征贡献。

结果从左至右包含三部分关键信息:(1)模型预测,(2)特征贡献,(3)每个特征的实际取值。
可以看到,第 8 位患者被预测为患有糖尿病,置信度为 72%。模型做出该决定的原因包括:
- 患者的血糖值大于 99。
- 血压大于 70。
这些取值可在右侧表格中核对。
特定模型方法
与与模型无关的方法相反,这些方法只能应用于有限类别的模型。其中包括线性回归、决策树以及神经网络的可解释性。对于深度学习模型,可以利用诸如 DeepLIFT、Grad-CAM 或 Integrated Gradients 等技术进行解释。
当使用决策树模型时,可通过 scikit-learn 的 plot_tree 函数生成树形图,从上到下解释模型的决策过程,示例如下所示。
文章《深度学习——数据科学家的教程》将回答关于深度学习的常见问题,并通过真实案例探讨深度学习的各个方面。
在生成树形图之前,我们先用特定的超参数(如 max_depth 与 min_samples_leaf)训练一个决策树分类器。
from sklearn.tree import DecisionTreeClassifier, plot_tree
dt_clf = DecisionTreeClassifier(max_depth = 3, min_samples_leaf = 2)
dt_clf.fit(X_train, y_train)
# Predict on the test data and evaluate the model
y_pred = dt_clf.predict(X_test)
print(classification_report(y_pred, y_test))
上述打印语句会生成如下模型分类报告。

模型的决策过程可通过以下代码进行可视化:
fig = plt.figure(figsize=(25,20))
_ = plot_tree(dt_clf,
feature_names = feature_names,
class_names = class_names,
filled=True)

通过检查树结构,可以追踪每个样本的决策路径,从而洞察模型行为并提升可解释性。
在上图中,每个节点表示基于某个特征取值的决策或分裂。对于内部节点,图中显示用于分裂的特征、分裂阈值、基尼不纯度以及到达该节点的样本数量。
在叶子节点中,会显示多数类别及样本数量。此外,节点颜色代表多数类别,颜色的深浅表示该节点中主导类别所占比例。例如,左分支的橙色节点对应糖尿病标签,而蓝色则对应非糖尿病。
XAI 的挑战与未来展望
随着 AI 技术持续进步并日益复杂,理解与解释算法以辨析其如何产生结果变得愈发具有挑战性,这也促使研究人员不断探索新方法并改进现有方法。
许多可解释 AI 模型需要对底层模型进行简化,可能会导致预测性能下降。此外,当前的可解释方法可能无法覆盖决策过程的所有方面,从而限制了解释的效用,尤其是在处理更复杂的模型时。
新的研究正致力于通过开发更有效的算法来增强可解释 AI 技术,既能应对伦理问题,又能提供更易用的解释。
最后,随着研究不断推进,我们更有可能获得更为成熟的方法,以促进透明性、可信度与公平性。
结论
本文概述了什么是可解释 AI,并介绍了一些有助于建立信任的原则,这些原则可为数据科学家与其他利益相关方提供相关技能,以构建可信模型并辅助制定可执行的决策。
我们还介绍了与模型无关与特定模型的方法,并重点讲解了前者中的 LIME 与 SHAP。此外,本文还强调了可解释 AI 的挑战、局限以及部分研究方向。
如需进一步了解相关技术背后的伦理问题,欢迎查看我们的课程《数据伦理导论》,内容涵盖数据伦理原则、其与 AI 伦理的关系,以及数据生命周期不同阶段的特征。
一位多才多艺、乐于分享知识并回馈他人的数据科学家。Zoumana 是 YouTube 内容创作者,也是 Medium 上的顶尖科技写作者。他热爱演讲、编程与教学。Zoumana 拥有两个硕士学位:其一是在法国巴黎获得的计算机科学硕士,专注于机器学习;其二是在美国德州理工大学获得的数据科学硕士。他的职业生涯始于法国 Groupe OPEN 的软件开发工程师,随后加入 IBM 担任机器学习顾问,为保险公司构建端到端的 AI 解决方案。之后,Zoumana 加入了 Axionable——一家总部位于巴黎与蒙特利尔的首家“可持续 AI”初创公司。在那里,他担任数据科学家,为来自法国、蒙特利尔、新加坡和瑞士的客户交付 AI 产品,主要聚焦 NLP 场景。此外,他将 5% 的时间投入到研发工作。目前,他在 IFC(世界银行集团)担任高级数据科学家。
