经常使用H统计量剖析机器学习模型特色相关性

Friedman 的 h 统计量 (h-stat) 为复杂的机器学习模型提供了一个弱小的窗口。详细来说,它可以协助咱们了解它们能否经常使用交互来启动预测。咱们将看到,这种XAI(可解释性机器学习)方法可以通知咱们一个特色能否与任何其余特色或一个特定特色交互。为此,咱们将:

H-stat 是什么?

相互作用是指特色与目的变量之间的相关取决于另一个特色的值。h-stat 经过将两个或多个特色的联结局部依赖 (PD) 函数与假定特色不相互作用的联结 PD 启动比拟来量化此相互作用。

关键的一点是,该目的有两个版本:

为了能够依据特色成果的百分比来解释目的,咱们对它们启动了归一化。但是,这个环节有时会夸张交互效应。这种状况或许出当初虽然特色的大局部成果来自交互,但全体成果很小的状况下。这就是为什么咱们也有这两个目的的非归一化版本。当运行该方法时,咱们会看到一切这些版本相互补充。

artemis 经常使用

要运行 H-stat,咱们将经常使用artemis包。这是一个用于剖析机器学习模型中交互的有用包。它提供了其余方法,包括 Greenwell 方法和一些特定于模型的方法。

import pandas as pdimport matplotlib.pyplot as pltimport randomfrom sklearn.ensemble import RandomForestRegressorfrom artemis.interactions_methods.model_agnostic import FriedmanHStatisticMethod

数据和模型

咱们将经常使用鲍鱼数据集()来了解 ALE 的上班原理。鲍鱼是一种美味的贝类。咱们宿愿经常使用壳重和去壳重量(肉的重量)等特色来预测其壳中的环数。图 1显示了此数据集中一切数值特色的相关性热图。你可以看到咱们正在处置一些高度相关的特色。

这是一个关键的疑问。H -stat 的局限性之一是,当特色实践上高度相关时,它可以识别交互作用。这些被称为虚伪交互作用。随后咱们可以经过经常使用散点图确认 h-stat 的结果。

图 1:鲍鱼数据集中数值特色的相关性热图

咱们加载数据集并选用目的变量。咱们还启动了一些特色工程。首先,咱们扫除一些高度相关的特色。这是由于在图 1中咱们看到它们与其余特色的相关性为 1。最后,咱们为性别特色创立独热编码。

#导入数据集data = pd.read_csv("../../data/abalone.data",names=["sex","length","diameter","height","whole weight","shucked weight","viscera weight","shell weight","rings"])y =>

咱们经常使用这些特色来训练模型来预测环的数量。在本例中,咱们经常使用了随机森林模型(h-stat 与模型有关,因此这应该能够将其运行于大少数建模包)。

# 训练模型model = RandomForestRegressor()model.fit(X, y)

总体H-stat

H-stat 的计算老本很高,很多场景不太适宜高维数据集。这里咱们首先从特色矩阵中随机选用一组 100 个实例,以取得稳固的目的预计值。

# 随机选用 100 个观测值random.seed(8)X_exp = random.choices(X.to_numpy(), k=100)X_exp = pd.DataFrame(X_exp, columns=X.columns)

创立一个 H-stat 对象。而后经常使用 100 个实例来计算模型的 H-stats。

# 计算 H 统计量h_stat = FriedmanHStatisticMethod()h_stat.fit(model, X_exp)

间接将目的可视化为全体交互的图。

# 全体交互图fig, ax = plt.subplots(figsize=(10 , 5))h_stat.plot(vis_type='bar_chart_ova', ax=ax)

从该图表中,咱们可以看出,壳重和去壳重量的相互作用仿佛很清楚(或至少比其余特色更清楚)。壳重对预测环数的影响中约有35%来自与其余特色的相互作用。关于去壳重量,该值约为27%,而关于其余特色,该值不到10% 。

图 3:H 统计量显示与一切其余特色的相互作用

成对 H-stat

疑问是壳重和去壳重量与哪些特色有相互作用?。为此可以经常使用上方的代码绘制成对的 H-stat。

# 成对 h-statfig, ax = plt.subplots(figsize=( 10 , 4 ))h_stat.plot(vis_type='bar_chart', ax=ax)

该图标明这些特色相互作用。它们的联结 PDP 中约24%的变动来自两个特色之间的相互作用。长度和内脏重量(length:viscera weigh)之间的相互作用或许也不太清楚。

图 4:显示成对相互作用的 H 统计量的条形图

更直观的可视化此消息的方法是经常使用热图(间接设置参数即可)。对角线给出了每个特色的陈列特色关键性分数。咱们可以看到,不只这两个特色(shell weight:shucked weight)的相互作用清楚,而且它们的自身作用也清楚。

# 交互热图h_stat.plot()

图 5:H-stat 热图显示成对相互作用

非规范化H-stat

如上所述,经过规范化 H-stat,咱们可以夸张一些相互作用。artimise 包可以计算未规范化的值。为此,咱们经常使用与之前相反的代码,只是咱们将 normalized 参数设置为 False。

h_stat_unnormalized = FriedmanHStatisticMethod(normalized= False )h_stat_unnormalized.fit(model, X_exp)# 绘制热图h_stat_unnormalized.plot()

交互值不再所有介于 0 和 1 之间。内脏重量和长度( viscera weight: length)之间的交互仿佛不再清楚。所以兴许它在之前的图中被夸张了。

图 6:H 统计量热图显示未规范化的成对相互作用

此时,咱们应该思考H-stat 的另一个弱点——虚伪相互作用。在图 1中,咱们看到模型特色都高度相关。因此,咱们须要确保 H-stat 不会将多重共线性与相互作用混杂。

一种方法是将底层数据集中的交互可视化。为此,咱们创立了壳重与去壳重的散点图。咱们依据环数对点启动着色,并参与色彩条。如今可以清楚地看到这种相互作用的性质。

# 壳重量和去壳重量之间的相互作用plt.scatter(X["shell weight"], X["shucked weight"], c=y, cmap="bwr")plt.colorbar(label="Number of Rings", orientatinotallow="vertical")plt.xlabel("shucked weight", size=15)plt.ylabel("shell weight", size=15)

咱们可以看到,环的数量会随着去壳重量的参与而参与。同时,当去壳重量(鲍鱼肉的重量)相关于鲍鱼壳较大时,环的数量也会更多。或许出现的状况是,鲍鱼的壳会随着年龄的增长而增长,在某个时刻,它会中止增长。但是,鲍鱼肉会继续增长。这就是为什么咱们看到最老的鲍鱼肉比鲍鱼壳更多。

图 7:散点图显示壳重和去壳重量之间的相互作用

因此,虽然存在多重共线性,该方法依然发生了一些有价值的结果。这是一个经验,虽然你应该防止在模型中蕴含高度相关的特色,但它们不必定是模型有关方法的终点。你只要经常使用其余方法验证结果即可。

咱们看到了全体、成对和非规范化 h-stat 如何协同上班,以提供模型中交互的明晰视图。但是,与一切方法一样,它们也有其局限性。为了对消这些局限性,值得运行其余XAI]方法来剖析交互。

您可能还会对下面的文章感兴趣: