5.1. 局部依赖与个体条件期望图#
局部依赖图(PDP)和个体条件期望图(ICE)可用于可视化和分析目标响应 [1] 与一组感兴趣的输入特征之间的交互。
PDPs [H2009] 和 ICEs [G2015] 都假定感兴趣的输入特征与补充特征是独立的,但这一假定在实践中常被违反。因此,在特征相关的情况下,我们将创建荒谬的数据点来计算 PDP/ICE [M2019]。
5.1.1. 局部依赖图#
局部依赖图(PDP)显示了目标响应与一组感兴趣的输入特征之间的依赖关系,它通过对所有其他输入特征(“补充”特征)的值进行边缘化来获得。直观地,我们可以将局部依赖解释为作为感兴趣输入特征的函数的预期目标响应。
由于人类感知的限制,感兴趣的输入特征集的大小必须很小(通常是一个或两个),因此感兴趣的输入特征通常从最重要的特征中选择。
下图展示了使用 HistGradientBoostingRegressor
针对共享单车数据集绘制的两个单向和一个双向局部依赖图。

单向 PDPs 告诉我们目标响应与感兴趣的输入特征之间的交互(例如线性、非线性)。上图左侧的图显示了温度对共享单车租赁数量的影响;我们可以清楚地看到,温度越高与租赁数量越多相关。类似地,我们可以分析湿度对租赁数量的影响(中间图)。因此,这些解释是边缘化的,一次只考虑一个特征。
具有两个感兴趣输入特征的 PDPs 显示了这两个特征之间的交互。例如,上图中的双变量 PDP 显示了共享单车租赁数量对温度和湿度联合值的依赖关系。我们可以清楚地看到这两个特征之间存在交互:当温度高于 20 摄氏度时,主要是湿度对共享单车租赁数量有强烈影响。对于较低温度,温度和湿度都对共享单车租赁数量有影响。
sklearn.inspection
模块提供了一个便捷函数 from_estimator
来创建单向和双向局部依赖图。下面的示例展示了如何创建局部依赖图网格:特征 0
和 1
的两个单向 PDP,以及这两个特征之间的一个双向 PDP。
>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> from sklearn.inspection import PartialDependenceDisplay
>>> X, y = make_hastie_10_2(random_state=0)
>>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,
... max_depth=1, random_state=0).fit(X, y)
>>> features = [0, 1, (0, 1)]
>>> PartialDependenceDisplay.from_estimator(clf, X, features)
<...>
你可以使用 plt.gcf()
和 plt.gca()
访问新创建的图形(figure)和坐标轴(Axes)对象。
要绘制包含类别特征的局部依赖图,你需要使用参数 categorical_features
指定哪些特征是类别的。此参数接受索引列表、类别特征名称或布尔掩码。类别特征的局部依赖图形表示可以是条形图或二维热力图。
多分类的 PDPs#
对于多分类任务,你需要通过 target
参数设置应为其创建 PDPs 的类别标签。
>>> from sklearn.datasets import load_iris
>>> iris = load_iris()
>>> mc_clf = GradientBoostingClassifier(n_estimators=10,
... max_depth=1).fit(iris.data, iris.target)
>>> features = [3, 2, (3, 2)]
>>> PartialDependenceDisplay.from_estimator(mc_clf, X, features, target=0)
<...>
在多输出回归设置中,也使用相同的参数 target
来指定目标。
如果你需要局部依赖函数的原始值而不是图,你可以使用 sklearn.inspection.partial_dependence
函数。
>>> from sklearn.inspection import partial_dependence
>>> results = partial_dependence(clf, X, [0])
>>> results["average"]
array([[ 2.466..., 2.466..., ...
>>> results["grid_values"]
[array([-1.624..., -1.592..., ...
局部依赖函数应在其上进行评估的值直接从 X
生成。对于双向局部依赖,会生成一个二维值网格。sklearn.inspection.partial_dependence
返回的 values
字段给出了网格中每个感兴趣输入特征所使用的实际值。这些值也对应于图的轴。
5.1.2. 个体条件期望(ICE)图#
与 PDP 类似,个体条件期望(ICE)图显示了目标函数与感兴趣的输入特征之间的依赖关系。然而,与显示输入特征平均效应的 PDP 不同,ICE 图为每个样本单独可视化了预测对某一特征的依赖关系,每条线代表一个样本。由于人类感知的限制,ICE 图仅支持一个感兴趣的输入特征。
下图展示了使用 HistGradientBoostingRegressor
针对共享单车数据集绘制的两个 ICE 图。图中绘制了覆盖在 ICE 线上的相应 PD 线。

虽然 PDPs 擅长显示目标特征的平均效应,但它们可能会掩盖由交互作用产生的异构关系。当存在交互时,ICE 图将提供更多的洞察。例如,我们看到温度特征的 ICE 图提供了一些额外信息:一些 ICE 线是平坦的,而另一些则显示当温度高于 35 摄氏度时依赖性下降。我们观察到湿度特征也存在类似模式:当湿度高于 80% 时,一些 ICE 线显示急剧下降。
sklearn.inspection
模块的便捷函数 PartialDependenceDisplay.from_estimator
可以通过设置 kind='individual'
来创建 ICE 图。在下面的示例中,我们展示了如何创建 ICE 图网格。
>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> from sklearn.inspection import PartialDependenceDisplay
>>> X, y = make_hastie_10_2(random_state=0)
>>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,
... max_depth=1, random_state=0).fit(X, y)
>>> features = [0, 1]
>>> PartialDependenceDisplay.from_estimator(clf, X, features,
... kind='individual')
<...>
在 ICE 图中,可能不容易看出感兴趣的输入特征的平均效应。因此,建议将 ICE 图与 PDPs 一起使用。它们可以通过设置 kind='both'
一同绘制。
>>> PartialDependenceDisplay.from_estimator(clf, X, features,
... kind='both')
<...>
如果 ICE 图中有太多线条,可能难以区分单个样本之间的差异并解释模型。将 ICE 在 x 轴上的第一个值处居中,可以生成居中个体条件期望(cICE)图 [G2015]。这强调了个体条件期望与平均线的偏离,从而更容易探索异构关系。cICE 图可以通过设置 centered=True
来绘制。
>>> PartialDependenceDisplay.from_estimator(clf, X, features,
... kind='both', centered=True)
<...>
5.1.3. 数学定义#
设 \(X_S\) 为感兴趣的输入特征集(即 features
参数),\(X_C\) 为其补集。
响应函数 \(f\) 在点 \(x_S\) 处的局部依赖定义为
其中 \(f(x_S, x_C)\) 是给定样本的响应函数(predict、predict_proba 或 decision_function),其值由 \(X_S\) 中的特征的 \(x_S\) 定义,以及由 \(X_C\) 中的特征的 \(x_C\) 定义。请注意,\(x_S\) 和 \(x_C\) 可以是元组。
计算 \(x_S\) 的不同值的此积分会生成如上所示的 PDP 图。一条 ICE 线被定义为在 \(x_{S}\) 处评估的单个 \(f(x_{S}, x_{C}^{(i)})\)。
5.1.4. 计算方法#
有两种主要方法来近似上述积分,即 'brute'
方法和 'recursion'
方法。method
参数控制使用哪种方法。
'brute'
方法是一种通用方法,适用于任何估计器。请注意,ICE 图的计算仅支持 'brute'
方法。它通过计算数据 X
上的平均值来近似上述积分:
其中 \(x_C^{(i)}\) 是第 i 个样本在 \(X_C\) 中特征的值。对于 \(x_S\) 的每个值,此方法需要对数据集 X
进行一次完整遍历,这计算量很大。
每个 \(f(x_{S}, x_{C}^{(i)})\) 对应于在 \(x_{S}\) 处评估的一条 ICE 线。对 \(x_{S}\) 的多个值进行计算,就可以得到一条完整的 ICE 线。正如所见,ICE 线的平均值对应于局部依赖线。
'recursion'
方法比 'brute'
方法更快,但它仅受某些基于树的估计器对 PDP 图的支持。其计算方式如下。对于给定的点 \(x_S\),执行加权树遍历:如果一个分裂节点涉及感兴趣的输入特征,则跟随相应的左分支或右分支;否则,两个分支都被跟随,每个分支按进入该分支的训练样本比例进行加权。最后,局部依赖由所有访问过的叶节点值的加权平均值给出。
使用 'brute'
方法时,参数 X
既用于生成 \(x_S\) 的值网格,也用于生成补充特征值 \(x_C\)。然而,在使用 'recursion'
方法时,X
仅用于网格值:隐式地,\(x_C\) 值是训练数据的值。
默认情况下,对于支持它的基于树的估计器,绘制 PDPs 时使用 'recursion'
方法,其余情况使用 'brute'
方法。
注意
尽管两种方法通常应该接近,但在某些特定设置下它们可能会有所不同。'brute'
方法假设数据点 \((x_S, x_C^{(i)})\) 的存在。当特征相关时,这样的人工样本可能具有非常低的概率质量。因此,'brute'
和 'recursion'
方法在局部依赖值上可能会存在分歧,因为它们会以不同的方式处理这些不太可能的样本。然而请记住,解释 PDPs 的主要假设是特征应该是独立的。
示例
脚注
参考文献
T. Hastie, R. Tibshirani 和 J. Friedman, 统计学习基础(The Elements of Statistical Learning), 第二版, 第 10.13.2 节, Springer, 2009。
C. Molnar, 可解释机器学习(Interpretable Machine Learning), 第 5.1 节, 2019。