Scikit-Learn 1.4使用指南:检查 偏依赖图和个体条件期望图

scikit-learn 1.6 官网中文文档翻译已经上线了,欢迎使用:http://www.aidoczh.com/scikit-learn/


sklearn.inspection

偏依赖图 (Partial Dependence Plots, PDP) 和个体条件期望图 (Individual Conditional Expectation Plots, ICE) 可以用于可视化和分析目标响应1与一组感兴趣的输入特征之间的交互作用。

PDP [H2009] 和 ICE [G2015] 都假设感兴趣的输入特征与补充特征是独立的,但在实践中这种假设经常被违反。因此,在存在相关特征的情况下,我们将创建荒谬的数据点来计算 PDP/ICE [M2019]

偏依赖图

偏依赖图 (PDP) 显示了目标响应与一组感兴趣的输入特征之间的依赖关系,通过边际化所有其他输入特征(“补充”特征)的值。直观地说,我们可以将偏依赖解释为目标响应作为感兴趣的输入特征的函数的期望。

由于人类感知的限制,感兴趣的输入特征的集合的大小必须很小(通常为一个或两个),因此通常从最重要的特征中选择感兴趣的输入特征。

下图显示了自行车共享数据集的两个单向和一个双向偏依赖图,使用了 ~sklearn.ensemble.HistGradientBoostingRegressor

图 1: 自行车共享数据集的偏依赖图

单向 PDP 可以告诉我们目标响应与一个感兴趣的输入特征之间的交互作用(例如线性、非线性)。上图左侧的图表显示了温度对自行车租赁数量的影响;我们可以清楚地看到温度越高,自行车租赁数量越多。类似地,我们可以分析湿度对自行车租赁数量的影响(中间图)。因此,这些解释是边际的,一次只考虑一个特征。

具有两个感兴趣的输入特征的 PDP 显示了这两个特征之间的交互作用。例如,上图中的双变量 PDP 显示了自行车租赁数量与温度和湿度的联合值之间的依赖关系。我们可以清楚地看到两个特征之间的交互作用:在温度高于摄氏20度时,主要是湿度对自行车租赁数量有很大影响。对于较低的温度,温度和湿度都对自行车租赁数量有影响。

sklearn.inspection 模块提供了一个方便的函数 ~PartialDependenceDisplay.from_estimator 来创建单向和双向偏依赖图。在下面的示例中,我们展示了如何创建一个偏依赖图网格:两个特征 01 的单向 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() 访问新创建的图和轴对象。

要制作具有分类特征的偏依赖图,您需要使用参数 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["values"]
[array([-1.624..., -1.592..., ...

偏依赖应该评估的值直接从 X 生成。对于二维偏依赖,生成一个二维网格的值。sklearn.inspection.partial_dependence 返回的 values 字段给出了用于每个感兴趣的输入特征的网格中使用的实际值。它们也对应于图表的轴。

个体条件期望图

个体条件期望图 (Individual Conditional Expectation, ICE) 与 PDP 类似,显示了目标函数与感兴趣的输入特征之间的依赖关系。然而,与 PDP 不同的是,PDP 显示了输入特征的平均效果,而 ICE 图用每个样本的一条线分别可视化了预测对特征的依赖关系。由于人类感知的限制,ICE 图仅支持一个感兴趣的输入特征。

下图显示了自行车共享数据集的两个 ICE 图,使用了 ~sklearn.ensemble.HistGradientBoostingRegressor。图中的 PD 线覆盖在 ICE 线上。

图 2: 自行车共享数据集的个体条件期望图

虽然 PDP 在显示目标特征的平均效果方面表现良好,但它们可能会掩盖由交互作用产生的异质关系。当存在交互作用时,ICE 图将提供更多的见解。例如,我们可以看到温度特征的 ICE 图提供了一些额外的信息:一些 ICE 线是平坦的,而另一些 ICE 线显示了温度超过摄氏35度时依赖性的下降。我们观察到湿度特征也有类似的模式:当湿度超过80%时,一些 ICE 线显示出急剧下降。

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 轴的第一个值上,可以生成居中的个体条件期望 (Centered Individual Conditional Expectation, cICE) 图 [G2015]。这强调了个体条件期望与平均线的差异,从而更容易探索异质关系。可以通过设置 centered=True 来绘制 cICE 图:

PartialDependenceDisplay.from_estimator(clf, X, features,
    kind='both', centered=True)

X S X_S XS 为感兴趣的输入特征集合(即特征参数), X C X_C XC 为其补集。

在点 x S x_S xS 处,响应函数 f f f 的偏依赖性定义如下:

p d X S ( x S ) = d e f E X C [ f ( x S , X C ) ] = ∫ f ( x S , x C ) p ( x C ) d x C , \begin{aligned} pd_{X_S}(x_S) &\overset{def}{=} \mathbb{E}_{X_C}\left[ f(x_S, X_C) \right]\\ &= \int f(x_S, x_C) p(x_C) dx_C, \end{aligned} pdXS(xS)=defEXC[f(xS,XC)]=f(xS,xC)p(xC)dxC,

其中 f ( x S , x C ) f(x_S, x_C) f(xS,xC) 是给定样本的响应函数(predictpredict_probadecision_function),其值由特征集合 X S X_S XS 中的 x S x_S xS 和补集 X C X_C XC 中的 x C x_C xC 定义。注意, x S x_S xS x C x_C xC 可能是元组。

对于不同的 x S x_S xS 值计算这个积分会得到一个 PDP 图。ICE 线被定义为在 x S x_S xS 处评估的单个 f ( x S , x C ( i ) ) f(x_{S}, x_{C}^{(i)}) f(xS,xC(i))

计算方法

有两种主要的方法来近似上述积分,即“brute”方法和“recursion”方法。方法参数控制使用哪种方法。

“brute”方法是一种通用方法,适用于任何估计器。请注意,只有使用“brute”方法才支持计算 ICE 图。它通过对数据集 `X` 进行平均来近似上述积分:

p d X S ( x S ) ≈ 1 n samples ∑ i = 1 n f ( x S , x C ( i ) ) , pd_{X_S}(x_S) \approx \frac{1}{n_\text{samples}} \sum_{i=1}^n f(x_S, x_C^{(i)}), pdXS(xS)nsamples1i=1nf(xS,xC(i)),

其中 x C ( i ) x_C^{(i)} xC(i) 是特征集合 X C X_C XC 中第 i 个样本的值。对于每个 x S x_S xS 的值,该方法需要对数据集 X 进行完整遍历,这在计算上是非常耗时的。

每个 f ( x S , x C ( i ) ) f(x_{S}, x_{C}^{(i)}) f(xS,xC(i)) 对应于在 x S x_{S} xS 处评估的一个 ICE 线。通过计算多个 x S x_{S} xS 的值,可以得到完整的 ICE 线。正如可以看到的那样,ICE 线的平均值对应于偏依赖线。

“recursion”方法比“brute”方法更快,但只有一些基于树的估计器支持在 PDP 图中使用它。计算过程如下。对于给定的点 x S x_S xS,执行加权树遍历:如果一个分裂节点涉及到一个感兴趣的输入特征,则跟随相应的左分支或右分支;否则跟随两个分支,每个分支的权重由进入该分支的训练样本的比例确定。最后,偏依赖性由所有访问过的叶节点的值的加权平均值给出。

使用“brute”方法时,参数 X 用于生成值网格 x S x_S xS 和补集特征值 x C x_C xC。然而,使用“recursion”方法时,X 仅用于网格值:隐含地, x C x_C xC 的值是训练数据的值。

默认情况下,在支持的基于树的估计器上绘制 PDP 图时使用“recursion”方法,对于其他情况使用“brute”方法。

[!NOTE]
虽然两种方法在一般情况下应该是接近的,但在某些特定情况下可能会有所不同。"brute"方法假设存在数据点 ( x S , x C ( i ) ) (x_S, x_C^{(i)}) (xS,xC(i))。当特征相关时,这些人工样本可能具有非常低的概率质量。"brute"方法和"recursion"方法在处理这些不太可能的样本时可能会对偏依赖性的值产生不同的处理。然而,请记住,解释 PDP 的主要假设是特征应该是独立的。

示例:

  • sphx_glr_auto_examples_inspection_plot_partial_dependence.py

脚注

参考文献


  1. 对于分类问题,目标响应可能是类的概率(对于二分类是正类)或决策函数。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数智笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值