4.1. 部分依赖和个体条件期望图#
部分依赖图 (PDP) 和个体条件期望 (ICE) 图可用于可视化和分析目标响应 [1] 与一组感兴趣的输入特征之间的相互作用。
PDP [H2009] 和 ICE [G2015] 都假设感兴趣的输入特征独立于补充特征,而这种假设在实践中经常被违反。因此,在特征相关的情况下,我们将创建虚假数据点来计算 PDP/ICE [M2019]。
4.1.1. 部分依赖图#
部分依赖图 (PDP) 显示目标响应与一组感兴趣的输入特征之间的依赖关系,对所有其他输入特征(“补充”特征)的值进行边缘化。直观地说,我们可以将部分依赖解释为目标响应作为感兴趣的输入特征函数的期望值。
由于人类感知的局限性,感兴趣的输入特征集的大小必须很小(通常为一个或两个),因此感兴趣的输入特征通常选择在最重要的特征中。
下图显示了自行车共享数据集的两个单变量和一个双变量部分依赖图,使用 HistGradientBoostingRegressor
单变量 PDP 告诉我们目标响应与感兴趣的输入特征之间的相互作用(例如,线性、非线性)。上图中的左侧图显示了温度对自行车租赁数量的影响;我们可以清楚地看到,更高的温度与更高的自行车租赁数量相关。类似地,我们可以分析湿度对自行车租赁数量的影响(中间图)。因此,这些解释是边际的,一次考虑一个特征。
具有两个感兴趣的输入特征的 PDP 显示了这两个特征之间的相互作用。例如,上图中的双变量 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()
访问新创建的图形和 Axes 对象。
要使用分类特征创建部分依赖图,您需要使用参数 categorical_features
指定哪些特征是分类特征。此参数接受索引列表、分类特征名称或布尔掩码。分类特征的部分依赖的图形表示是条形图或二维热图。
多类分类的 PDP#
对于多类分类,您需要使用 target
参数设置应创建 PDP 的类标签
>>> 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
字段给出了用于每个感兴趣的输入特征的网格中的实际值。它们也对应于绘图的轴。
4.1.2. 个体条件期望 (ICE) 图#
与 PDP 类似,个体条件期望 (ICE) 图显示了目标函数与感兴趣的输入特征之间的依赖关系。但是,与显示输入特征的平均效应的 PDP 不同,ICE 图分别为每个样本可视化了预测对特征的依赖关系,每个样本对应一条线。由于人类感知的局限性,ICE 图仅支持一个感兴趣的输入特征。
下图显示了自行车共享数据集的两个 ICE 图,使用 HistGradientBoostingRegressor
:。这些图绘制了叠加在 ICE 线上的相应 PD 线。
虽然 PDP 擅长显示目标特征的平均效应,但它们可能会掩盖由交互作用产生的异质关系。当存在交互作用时,ICE 图将提供更多见解。例如,我们看到温度特征的 ICE 给我们提供了一些额外的信息:一些 ICE 线是平坦的,而另一些则显示出温度高于 35 摄氏度时依赖关系的下降。我们观察到湿度特征也存在类似的模式:一些 ICE 线在湿度高于 80% 时显示出急剧下降。
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 图与 PDP 一起使用。它们可以与 kind='both'
一起绘制。
>>> PartialDependenceDisplay.from_estimator(clf, X, features,
... kind='both')
<...>
如果 ICE 图中有太多条线,则可能难以看到各个样本之间的差异并解释模型。将 ICE 居中到 x 轴上的第一个值,会生成居中的个体条件期望 (cICE) 图 [G2015]。这将重点放在各个条件期望与平均线的偏差上,从而更容易探索异质关系。可以通过设置 centered=True
来绘制 cICE 图
>>> PartialDependenceDisplay.from_estimator(clf, X, features,
... kind='both', centered=True)
<...>
4.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)})\)。
4.1.4. 计算方法#
有两种主要方法可以近似上述积分,即“蛮力”和“递归”方法。 method
参数控制使用哪种方法。
“蛮力”方法是一种通用方法,适用于任何估计器。请注意,计算 ICE 图仅在“蛮力”方法中受支持。它通过计算数据 X
上的平均值来近似上述积分
其中 \(x_C^{(i)}\) 是第 i 个样本在 \(X_C\) 中的特征的值。对于 \(x_S\) 的每个值,此方法都需要对数据集 X
进行完整遍历,这在计算上很密集。
每个 \(f(x_{S}, x_{C}^{(i)})\) 对应于在 \(x_{S}\) 处评估的一条 ICE 线。计算多个 \(x_{S}\) 值,就可以得到完整的 ICE 线。可以看出,ICE 线的平均值对应于偏依赖线。
“递归”方法比“蛮力”方法更快,但它仅受某些基于树的估计器的 PDP 图支持。它的计算方式如下。对于给定点 \(x_S\),执行加权树遍历:如果拆分节点涉及感兴趣的输入特征,则遵循相应的左分支或右分支;否则遵循两个分支,每个分支的权重为进入该分支的训练样本的比例。最后,偏依赖由所有访问的叶节点值的加权平均值给出。
使用“蛮力”方法,参数 X
用于生成值 \(x_S\) 的网格以及补集特征值 \(x_C\)。但是,使用“递归”方法,X
仅用于网格值:隐式地,\(x_C\) 值是训练数据的那些值。
默认情况下,对于支持它的基于树的估计器,使用“递归”方法来绘制 PDP,而对于其他估计器,则使用“蛮力”。
注意
虽然两种方法通常应该很接近,但在某些特定设置中可能会有所不同。“蛮力”方法假设存在数据点 \((x_S, x_C^{(i)})\)。当特征相关时,此类人工样本可能具有非常低的概率质量。“蛮力”和“递归”方法可能会在偏依赖的值方面存在分歧,因为它们会以不同的方式处理这些不太可能的样本。但是,请记住,解释 PDP 的主要假设是特征应该是独立的。
示例
脚注
参考文献