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)}\) 是 \(X_C\) 中特征的第i个样本的值。对于 \(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的主要假设是特征应该是独立的。
示例
脚注
参考文献