使用Shapley值的特征选择包装方法

504 阅读7分钟

选择特征是构建强大的机器学习模型的一个重要步骤。挑选对预测数据集中每次出现的目标值有用的输入变量的难度被称为特征选择。本文主要介绍使用Shapley值的特征选择包装方法。这个方法将使用Powershap python库来实现。以下是将要涉及的主题。

内容列表

  1. Shapley值的描述
  2. 如何使用Shapley值进行特征选择?
    1. 解释组件
    2. 核心组件
  3. 用Powershap实现特征选择

边际贡献的加权平均值就是Shapley值。该技术试图解释为什么一个ML模型在给定的输入上会返回这样的结果。让我们深入了解一下Shapley值。

Shapley值的描述

沙普利值是一个博弈论解决方案的概念,它需要公平地将利润和成本分享给在联盟中运作的众多代理人。当两个或更多的参与者或组成部分参与到一个战略中,以获得一个期望的结果或报酬,这被称为博弈论。

当每个行动者的贡献是不均衡的,但每个人都为实现收益或报酬而共同努力时,沙普利值最适用。沙普利价值保证了每个行为人获得与他们单独行动时相同或更多的收益。获得的价值是至关重要的,因为否则行为者就没有互动的动力。

例如,对于一个决定是否应该授予信用卡申请的模型,我们想知道为什么一个退休人员(比如说,人A)的信用卡申请被拒绝,或者为什么该模型估计违约的可能性为80%。

在这里,我们需要知道为什么人A被拒绝而其他人没有被拒绝的原因,或者为什么这个人被认为有80%的违约可能性,而典型的申请人从模型中只得到20%的可能性。

当比较所有被批准的候选人时,发现被拒绝的常见原因,如个人A需要大幅提高其工资。然而,通过将个人A与所有其他被接受的退休候选人进行比较,个人可能会发现,预期的高违约率是由于高于平均水平的债务。Shapley值以这种方式使用比较组进行背景分析。

因此,沙普利值技术将模型对个人以及一些比较组的申请人的输出,并将个人和比较组之间的差异有多少是由每个特征所占的。例如,对于被录取的退休人员申请人,80%的预测违约率和10%的预期违约率之间有70%的差距可以解释。沙普利可以根据每个特征对总分差的平均边际贡献,将个人贷款债务的50%,15%分配给低净值,5%分配给退休后的低收入。

Shapley值将如何用于特征选择?

该技术是基于这样的假设:一个已知的随机特征对预测的影响应该比一个信息量大的特征小。该算法由两部分组成,共同实现特征选择。

解释部分

在解释部分中,一个单一的已知随机统一(RandomUniform)特征被引入到训练机器学习模型的特征集中。在一个样本外的数据子集上使用Shapley值,可以量化每个特征对结果的影响。为了确定真正的无偏的影响,在未见过的数据上测试Shapley值。最后,计算所有Shapley值的绝对值并取其平均值,得到每个特征的总体平均影响力。这里采用的是单一的平均值,使统计比较变得容易。

此外,当使用绝对Shapley值时,正负值都包括在总体影响中,这可能会导致与基尼系数的分布不同。然后,这个程序要重复几次,每次迭代都要用不同的随机特征重新训练模型,并使用不同的数据子集来量化Shapley值,从而得到一个平均影响的经验分布,用于统计比较。

核心部分

考虑到每个迭代中每个特征的平均影响,可以比较核心Powershap组件中随机特征的影响。百分位数公式被用来量化这种比较,它由一个单一特征的平均Shapley值数组组成,其长度与重复次数相同,是一个单一的值,也是指标函数。这个公式计算出单一数值大于迭代的平均沙普利值的迭代比例,因此可被视为p值。该公式产生的p值比应该看到的要低。随着迭代次数的减少,较小的p值也就更普遍了。

由于假设表明随机特征的影响平均来说应该小于任何信息特征的影响,所有随机特征的影响再次被平均化,产生一个可以在百分位数函数中使用的单一值。这就产生了每个独特特征的p值。这个p值显示了该特征的重要性低于随机特征的平均情况比例。可以使用假设和这些p值估计值来进行单样本单尾学生t小统计量测试的启发式实施。

  • 无效假设(H0)。随机特征不比被测特征更重要。
  • 备选假设(H1)。随机特征比被测特征更重要。

因此,在这个统计测试中,正数表示一个正确的无效假设。与假定为典型高斯分布的正常学生-t统计学测试相比,这种启发式方法并不假定被测特征上的分布会影响分数。然后可以找到信息量大的特征集合,并给出输出的阈值P值

用Powershap实现特征选择

本文使用了一个与安全饮用水分类有关的数据集,基于不同的特征,如ph值、硬度、TDS等。关于这些特征的详细知识请阅读这里

Powershap是一个基于包装的特征选择方法,它采用统计假设检验和Shapley值的功率计算来实现快速和直接的特征选择。

让我们从安装Powershap包开始:

! pip install powershap

导入必要的库

import pandas as pd
from powershap import PowerShap
 
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionCV
from sklearn.ensemble import GradientBoostingClassifier

读取数据并进行预处理

data=pd.read_csv('water_potability.csv')
data[:5]

印度分析杂志

data_utils=data.dropna(axis=0)
X=data_utils.drop(['Potability'],axis=1)
y=data_utils['Potability']

将数据分别分割成标准的30:70比例的测试和训练。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, shuffle=True, random_state=42)

通过定义用于分类的模型来构建Powershap函数。目前只有sklearn支持Powershap包。在这篇文章中,我们要建立两个选择器,一个是梯度提升分类器算法,另一个是逻辑回归CV算法。

selector = PowerShap(
    model = GradientBoostingClassifier(),
    automatic=True, limit_automatic=100)
selector.fit(X_train, y_train)

印度分析杂志

selector.transform(X_test)

这将给出具有高影响值的特征,并且有一个真实的无效假设,即给定的特征比随机特征更重要。

印度分析杂志

根据该算法,在使用梯度提升分类器基础模型时,10个特征中有3个是重要的。我们还可以通过使用这个代码看到影响分数和其他统计值。

selector._processed_shaps_df

印度分析杂志

类似地检查其他选择器。

selector_2 = PowerShap(
    model = LogisticRegressionCV(max_iter=200),
    automatic=True, limit_automatic=100,
)
selector_2.fit(X_train, y_train)

印度分析杂志

selector_2.transform(X_test)

印度分析杂志

根据该算法,在使用Logistic回归CV进行200次迭代时,10个中有5个重要特征。

selector_2._processed_shaps_df

印度分析》杂志

结论

包裹式特征选择方法的Shapley值和统计检验被用来确定特征的相关性,结果是显著的。为了实现快速、强大、可靠的特征选择,powershap以自动模式进行功率计算,优化所需的迭代次数。通过这篇文章,我们了解了Shapley值在特征选择中的用法和Powershap的实现。

参考文献