4.1 部分依赖图¶
部分依赖图( Partial dependence plots ,PDP)显示了目标响应[1]和一组“目标”特征之间的依赖关系,并边缘化其他特征(“ 补充(complement) ”特征)的值。直观地,我们可以将部分依赖关系解释为预期目标响应与“目标”特征的函数。
由于人类感知的局限性,目标特征集的大小必须很小(通常为一或两个),因此目标特征通常在最重要的特征中选择。
下图利用GradientBoostingRegressor
显示了加利福尼亚住房数据集的四个单向和一个双向PDP:
单向PDP告诉我们目标响应和目标特征(例如线性,非线性)之间的相互作用。上图的左上子图显示了一个地区的收入中位数对房价中位数的影响;我们可以清楚地看到它们之间的线性关系。请注意,PDP假设目标特征独立于互补特征,但是在现实中经常违反此假设。
具有两个目标特征的PDP显示了两个特征之间的相互作用。例如,上图中的两变量PDP显示了房价中位数对房屋年龄与每户平均居住者的交互项的依赖性。我们可以清楚地看到这两个特征之间的相互作用:对于平均入住率大于2的房屋,房价几乎与房屋年龄无关,而对于小于2的房屋,房价与年龄呈现出强烈的依赖性。
sklearn.inspection
模块提供了一个方便的功能 plot_partial_dependence
,可以创建单向和双向部分依赖图。在下面的示例中,我们会展示如何创建局部依赖图的网格:用于0
、1
特征的单向PDP 以及这两个特征之间的双向PDP:
>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> from sklearn.inspection import plot_partial_dependence
>>> 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)]
>>> plot_partial_dependence(clf, X, features)
你可以使用plt.gcf()
和plt.gca()
访问新创建的figure和axis对象。
对于多类分类,需要通过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)]
>>> plot_partial_dependence(mc_clf, X, features, target=0)
在多输出回归中,可以使用相同的参数target
指定目标变量。
如果需要局部依赖函数的原始值而不是图,可以使用sklearn.inspection.partial_dependence
函数:
>>> from sklearn.inspection import partial_dependence
>>> pdp, axes = partial_dependence(clf, X, [0])
>>> pdp
array([[ 2.466..., 2.466..., ...
>>> axes
[array([-1.624..., -1.592..., ...
局部依赖关系的值直接由x
生成 。对于双向部分依赖关系,将生成值的二维网格。由 sklearn.inspection.partial_dependence
返回的values
参数给出了每个目标特征在网格中使用的实际值。它们还对应于图形的轴。
4.1.1 数学定义
是目标特征(即features
参数)的集合,为其补充特征。
响应的部分依赖 在某一点 上定义为:
这里 是给定样本的响应函数(predict, predict_proba或decision_function),样本中,在和中的特征分别被定义为和 。注意 和 可能是元组。
对于各种取值计算这个积分,就会产生如上所述的图。
4.1.2 计算方法
有两种近似上述积分的主要方法,即“brute”和“recurtion”方法。利用method
参数可以控制使用哪种方法。
"brute"方法是可与任何估计器一起使用的通用方法。它通过计算数据的平均值来近似上述积分:
是里的第个样本特征值。 对于里对的每个值,此方法需要对庞大的数据集进行完全遍历。
“recurtion”方法比“brute”方法快,但是仅支持某些基于树的估计器。计算如下,对于给定的特征,执行加权树遍历:如果拆分节点涉及“目标”特征,则遵循相应的左分支或右分支;否则,两个分支都会被跟踪,每个分支都会按进入该分支的训练样本的比例加权。最后,部分依赖关系由所有访问的叶子节点的加权平均值给出。
使用“ brute”方法时,参数X
用于对目标特征,和补充特征值生成值网格。但是,对于“recurtion”方法,该方法X
仅用于网格值,是训练数据的值。
默认情况下,“recurtion”方法用于支持它的基于树的估计器,其他的估计器则使用“ brute”。
注意 |
---|
虽然这两种方法通常应该很接近,但是在某些特定设置上可能会有所不同。“brute”方法假定存在数据点。当特征相关时,这样的样本可能具有非常低的概率质量。“brute”和“recurtion”方法可能会在部分依赖的价值上存在分歧,因为它们将对这些样本进行不同的处理。但值得注意的是,解释PDP的主要假设是特征之间应是独立的。 |
脚注 |
---|
[1] 对于分类,目标响应可以是某个类别的概率(用于二进制分类的肯定类别)或决策函数。 |
例子: |
---|
部分依赖图 |
参考文献 |
---|
T. Hastie,R。Tibshirani和J.Friedman,《统计学习的要素》,第二版,第10.13.2节,Springer,2009年。 C.Molnar,可解释机器学习,第5.1节,2019年。 |