5.1. 部分依赖和个人条件期望图#
部分依赖图(PDF)和个人条件期望(ICE)图可用于可视化和分析目标反应之间的相互作用 [1] 以及一组感兴趣的输入特征。
两个PDP [H2009] 和冰 [G2015] 假设感兴趣的输入特征独立于补充特征,并且这个假设在实践中经常被违反。因此,在相关特征的情况下,我们将创建荒谬的数据点来计算DP/ICE [M2019].
5.1.1. 部分依赖图表#
部分依赖图(PDF)显示目标响应和一组感兴趣的输入特征之间的依赖性,并边缘化所有其他输入特征(“补充”特征)的值。直观地,我们可以将部分依赖性解释为作为感兴趣的输入特征的函数的预期目标响应。
由于人类感知的限制,感兴趣的输入特征集的大小必须很小(通常是一两个),因此感兴趣的输入特征通常被选择在最重要的特征中。
下图显示了自行车共享数据集的两个单向和一个双向部分依赖图,其中 HistGradientBoostingRegressor
:

单向PDP告诉我们目标响应和感兴趣的输入特征(例如线性、非线性)之间的相互作用。上图左侧的图显示了温度对自行车租赁数量的影响;我们可以清楚地看到,较高的温度与较多的自行车租赁数量有关。同样,我们可以分析湿度对自行车租赁数量的影响(中间图)。因此,这些解释是边缘性的,每次考虑一个特征。
具有两个感兴趣的输入功能的DPP显示了这两个功能之间的相互作用。例如,上图中的双变量PDF显示了自行车租赁数量对温度和湿度联合值的依赖性。我们可以清楚地看到这两个特征之间的相互作用:在温度高于20摄氏度的情况下,主要是湿度对自行车租赁数量有很大影响。对于较低的气温,温度和湿度都会对自行车租赁数量产生影响。
的 sklearn.inspection
模块提供便利功能 from_estimator
创建单向和双向部分依赖图。在下面的示例中,我们展示了如何创建部分依赖性图网格:要素的两个单向DPP 0
和 1
以及两个功能之间的双向PDF::
>>> 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()
.
要制作具有分类要素的部分相关性图,您需要使用参数指定哪些要素是分类要素 categorical_features
.此参数采用索引列表、类别特征名称或布尔屏蔽。类别特征的部分依赖性的图形表示是条形图或2D热图。
用于多类别分类的DPP#
对于多类别分类,您需要设置应通过 target
论点::
>>> 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
.对于2向部分依赖性,会生成2D值网格。的 values
返回的字段 sklearn.inspection.partial_dependence
给出网格中每个感兴趣的输入特征使用的实际值。它们还对应于图的轴。
5.1.2. 个人条件期望(ICE)图#
与PDP类似,个体条件期望(ICE)图显示目标函数和感兴趣的输入特征之间的依赖性。然而,与显示输入特征的平均效应的显示不同,ICE图分别以每个样本一条线可视化预测对每个样本的特征的依赖性。由于人类感知的限制,ICE图仅支持一个感兴趣的输入特征。
下图显示了自行车共享数据集的两个ICE图,其中 HistGradientBoostingRegressor
.这些图绘制了叠加在ICE线上的相应PD线。

虽然DPP善于显示目标特征的平均效果,但它们可能会掩盖交互创建的异类关系。当存在相互作用时,ICE图将提供更多见解。例如,我们看到温度特征的ICE为我们提供了一些额外的信息:一些ICE线是平坦的,而其他一些则显示出对35摄氏度以上温度的依赖性降低。我们观察到湿度特征的类似模式:当湿度超过80%时,一些ICE线显示出急剧下降。
的 sklearn.inspection
模块的 PartialDependenceDisplay.from_estimator
方便功能可通过设置创建ICE图 kind='individual'
.在下面的示例中,我们展示了如何创建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图与DPP一起使用。它们可以与一起绘制 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\) 定义为:
where \(f(x_S, x_C)\) is the response function (predict, predict_proba or decision_function) for a given sample whose values are defined by \(x_S\) for the features in \(X_S\), and by \(x_C\) for the features in \(X_C\). Note that \(x_S\) and \(x_C\) may be tuples.
计算各种值的该积分 \(x_S\) 生成如上所述的DP图。ICE线路被定义为单个 \(f(x_{S}, x_{C}^{(i)})\) 时评价 \(x_{S}\) .
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)})\) 对应于评价的一条ICE线 \(x_{S}\) .计算多个值 \(x_{S}\) ,则获得完整的ICE线。可以看出,ICE线的平均值对应于部分相关性线。
的 'recursion'
方法比 'brute'
方法,但它仅由一些基于树的估计器支持用于ATP图。计算如下。给定点 \(x_S\) ,执行加权树穿越:如果分裂的节点涉及感兴趣的输入特征,则遵循相应的左或右分支;否则,遵循两个分支,每个分支都通过进入该分支的训练样本的比例加权。最后,部分依赖性由所有访问的叶子值的加权平均值给出。
与 'brute'
方法、参数 X
既用于生成价值网格 \(x_S\) 以及补充特征值 \(x_C\) .然而,使用“递归”方法, X
仅用于网格值:隐式地, \(x_C\) 值是训练数据的值。
默认情况下 'recursion'
方法用于在支持它的基于树的估计器上绘制DPP,其余的则使用“brug”。
备注
虽然这两种方法总体上应该很接近,但在某些特定设置中它们可能会有所不同。的 'brute'
方法假设数据点的存在 \((x_S, x_C^{(i)})\) .当特征相关时,此类人工样本可能具有非常低的概率质量。的 'brute'
和 'recursion'
方法可能会对部分依赖性的值产生分歧,因为它们会以不同的方式对待这些不太可能的样本。然而,请记住,解释DPP的主要假设是功能应该是独立的。
示例
sphx_glr_auto_examples_inspection_plot_partial_dependence.py
脚注
引用
T.哈斯蒂河蒂布希拉尼和J·弗里德曼, The Elements of Statistical Learning ,第二版,第10.13.2节,Springer,2009年。
C.莫尔纳, Interpretable Machine Learning ,第5.1节,2019年。