scikit-learn 部分依赖图

2023-02-20 14:29 更新

部分依赖图( Partial dependence plots ,PDP)显示了目标响应[1]和一组“目标”特征之间的依赖关系,并边缘化其他特征(“ 补充(complement) ”特征)的值。直观地,我们可以将部分依赖关系解释为预期目标响应与“目标”特征的函数。

由于人类感知的局限性,目标特征集的大小必须很小(通常为一或两个),因此目标特征通常在最重要的特征中选择。

下图利用GradientBoostingRegressor显示了加利福尼亚住房数据集的四个单向和一个双向PDP:


单向PDP告诉我们目标响应和目标特征(例如线性,非线性)之间的相互作用。上图的左上子图显示了一个地区的收入中位数对房价中位数的影响;我们可以清楚地看到它们之间的线性关系。请注意,PDP假设目标特征独立于互补特征,但是在现实中经常违反此假设。

具有两个目标特征的PDP显示了两个特征之间的相互作用。例如,上图中的两变量PDP显示了房价中位数对房屋年龄与每户平均居住者的交互项的依赖性。我们可以清楚地看到这两个特征之间的相互作用:对于平均入住率大于2的房屋,房价几乎与房屋年龄无关,而对于小于2的房屋,房价与年龄呈现出强烈的依赖性。

sklearn.inspection模块提供了一个方便的功能 plot_partial_dependence,可以创建单向和双向部分依赖图。在下面的示例中,我们会展示如何创建局部依赖图的网格:用于01特征的单向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参数)的集合,为其补充特征。

响应的部分依赖 在某一点 上定义为:

这里 是给定样本的响应函数(predictpredict_probadecision_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年。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号