机器学习模型可解释性进行到底——特征重要性(四)

机器学习︱R+python 专栏收录该内容
75 篇文章 6 订阅


可参考另外几篇:


1 四种全局可解释的方法论

全局可解释代表着,是判定、选择某个特征的方法,包括:过滤法,嵌入法,包装法,和降维算法。
其中,嵌入法最为熟知,包括了特征重要性。

参考文章[2] [7]

1.1 过滤法

过滤法选择特征,其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。

在这里插入图片描述

1.1.1 方差过滤方差过滤

文章[11]也提到,特征选择时,主要遵循如下两个原则:

  • 波动性
  • 相关性

波动性是指该特征取值发生变化的情况,用方差来衡量,如果方差很小,说明该特征的取值很稳定,可以近似理解成该特征的每个值都接近,这样的特征对模型是没有任何效果,是不具备区分度的,比如年龄这个特征,都是20岁左右大小的。反之,方差越大,则特征对模型的区分度越好。

相关性是就是该特征和目标结果的相关性大小,常用皮尔逊相关系数来度量。

过滤法的主要对象是:需要遍历特征或升维的算法们,
而过滤法的主要目的是:在维持算法表现的前提下,帮助算法们降低计算成本。

随机森林运行时间与特征数无关(每次都直选几十个特征),决策树与特征数有关(一次建模需要挑选很多特征),其他想svm、KNN等的运行时间更是与特征数量相关

在这里插入图片描述

方差过滤不能保证模型效果变好,但能保证运行时间的降低。方差过滤中的超参数threshold可以通过画学习曲线来找到最好的点,但是一般不太这么做,因为计算量太大了。

1.1.2 相关性过滤

在这里插入图片描述

1.2 嵌入法

嵌入法选择特征,其主要思想是:在模型既定的情况下学习出对提高模型准确性最好的属性。这句话并不是很好理解,其实是讲在确定模型的过程中,挑选出那些对模型的训练有重要意义的属性。
最常用的是使用L1正则化和L2正则化来选择特征如Ridge Regression。正则化惩罚项越大,那么模型的系数就会越小。
当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。
也就是说,我们选择特征系数较大的特征。

1.2.1 SelectFromModel - 筛选特征

feature_selection.SelectFromModel从模型选择

sklearn在Feature selection模块中内置了一个SelectFromModel,该模型可以通过Model本身给出的指标对特征进行选择,其作用与其名字高度一致,select (feature) from model
SelectFromModel是一个通用转换器,其需要的Model只需要带有conef_或者feature_importances属性,那么就可以作为SelectFromModel的Model来使用. 如果相关的coef_或者 featureimportances 属性值低于预先设置的阈值,这些特征将会被认为不重要并且移除掉。
除了指定数值上的阈值之外,还可以通过给定字符串参数来使用内置的启发式方法找到一个合适的阈值。可以使用的启发式方法有 mean 、 median 以及使用浮点数乘以这些(例如,0.1*mean )。

与threshold标准结合使用时,可以使用 max_features参数设置对要选择的要素数量的限制

函数包括(参考文章[3]):
class sklearn.feature_selection.SelectFromModel(estimator, *, threshold=None, prefit=False, norm_order=1, max_features=None)

简单案例:

# https://www.cnblogs.com/cgmcoding/p/13588878.html

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
X, y = load_iris(return_X_y=True)
X.shape
# (150, 4)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)  #已经fit过了,所以必须带上参数prefit
X_new = model.transform(X)   
X_new.shape
 #(150, 3)

可选参数:

  • (1)estimator: object,用来构建变压器的基本估算器。既可以是拟合的(如果prefit设置为True),也可以是不拟合的估计量。拟合后,估计量必须具有 feature_importances_或coef_属性
  • (2)threshold: str, float, optional default None,用于特征选择的阈值。保留重要性更高或相等的要素,而其他要素则被丢弃。如果为“中位数”(分别为“均值”),则该threshold值为特征重要性的中位数(分别为均值)。也可以使用缩放因子(例如,“ 1.25 *平均值”)。如果为None(无),并且估计器的参数惩罚显式或隐式设置为l1(例如Lasso),则使用的阈值为1e-5。否则,默认情况下使用“平均值”
  • (3)prefit: bool, default False,预设模型是否期望直接传递给构造函数。如果为True,transform必须直接调用和SelectFromModel不能使用cross_val_score, GridSearchCV而且克隆估计类似的实用程序。否则,使用训练模型fit,然后transform进行特征选择。
  • (4)norm_order: 非零 int, inf, -inf, default 1,在估算器threshold的coef_属性为维度2 的情况下,用于过滤以下系数矢量的范数的顺序 ,正则化
  • (5)max_features:int or None, optional,要选择的最大功能数。若要仅基于选择max_features,请设置threshold=-np.inf

属性:

  • estimator_:一个估算器,用来建立变压器的基本估计器。只有当一个不适合的估计器传递给SelectFromModel时,才会存储这个值,即当prefit为False时。
  • threshold_:float,用于特征选择的阈值

方法:

  • fit(X [,y])适合SelectFromModel元变压器。
  • fit_transform(X [,y])适合数据,然后对其进行转换。
  • get_params([deep])获取此估计量的参数。
  • get_support([index])获取所选特征的掩码或整数索引
  • inverse_transform(X)反向转换操作
  • partial_fit(X [,y])仅将SelectFromModel元变压器安装一次。
  • set_params(**参数)设置此估算器的参数。
  • transform(X)将X缩小为选定的特征。

1.2.2 PermutationImportance - 排列重要性

文章[12][13]提及了PermutationImportance。

文档对该方法介绍如下:eli5 provides a way to compute feature importances for any black-box estimator by measuring how score decreases when a feature is not available; the method is also known as “permutation importance” or “Mean Decrease Accuracy (MDA)”.

我的理解是:若将一个特征置为随机数,模型效果下降很多,说明该特征比较重要;反之则不是。

简单来说,就是改变数据表格中某一列的数据的排列,保持其余特征不动,看其对预测精度的影响有多大。

计算步骤:
1、用上全部特征,训练一个模型。
2、验证集预测得到得分。
3、验证集的一个特征列的值进行随机打乱,预测得到得分。
4、将上述得分做差即可得到特征x1对预测的影响。
5、依次将每一列特征按上述方法做,得到每二个特征对预测的影响。

在这里插入图片描述

结果分析:

  • 靠近上方的绿色特征,表示对模型预测较为重要的特征;
  • 为了排除随机性,每一次 shuffle 都会进行多次,然后取结果的均值和标准差;
  • ±后面的数字表示多次随机重排之间的差异值。
  • 这个例子里,最重要的特征是第三个 ‘petal length (cm)’, 和feature_importances_输出结果一致。

在文章[12]中得实验来看,
全部特征、RF前30特征、LightGBM前30特征、LR前30特征。可以看到LightGBM通过PermutationImportance选出来的30个特征的模型的泛化性要好于用全部变量建模。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaLFmXIy-1618323200023)(en-resource://database/73113:1)]

1.3 包装法

包装法选择特征,其主要思想是:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA,PSO,DE,ABC等

主要的方式:

  • 递归消除特征法(recursive feature elimination,简称RFE ),递归消除特征法的主要过程是,采用一个机器学习模型进行多次的训练,每一次的训练,都会消除若干部分权重系数的特征,然后再采用新的一组训练集进行训练。如条件互信息等。
  • 递归过程可以是前向的或者后向的以及前后结合的。
  • 常用的特征子集搜索算法还有:完全搜索;基于贪心的启发式搜索(前向/后向搜索等);随机搜索(模拟退火、遗传算法等)。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rpD9gqs3-1618323200024)(en-resource://database/73096:1)]

1.4 几种方法对比

计算成本:嵌入>包装>过滤

经验来说,过滤法更快速,但更粗糙。
包装法和嵌入法更精确,比较适合具体到算法去调整,但计算量比较大,运行时间长。
当数据量很大的时候,优先使用方差过滤和互信息法调整,再上其他特征选择方法。
使用逻辑回归时,优先使用嵌入法。使用支持向量机时,优先使用包装法。

各类特征选择方法的优缺点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeM8SoPV-1618323200024)(en-resource://database/73095:1)]

1.5 额外的交叉特征筛选模型:AutoFIS

一篇文章里面的特征选择方法:Automatic Feature Interaction Selection(AutoFIS)。

推荐和广告系统中特征交叉非常重要,设计得当通常能获得巨大的提升。

虽然现在已经由一些模型来做部分的自动特征组合交叉,如xDeepFM,DeepCross,PNN,DIN等等,但是出于性能以及简便考虑,通常我们还是手动或者枚举着进行特征选择。

这篇文章的出发点是提出一种方法来进行特征交叉的选择,达到减少冗余交叉降低噪声,使训练更容易,进而提升效果的目的。

文章号称AutoFIS能自动地识别factorization模型中的所有重要的特征交互,而计算量和训练目标模型到收敛差不多。


2 SHAP(SHapley Additive exPlanation)

可参考另外几篇:

文章[13]
来看一下SHAP模型,是比较全能的模型可解释性的方法,既可作用于之前的全局解释,也可以局部解释,即单个样本来看,模型给出的预测值和某些特征可能的关系,这就可以用到SHAP。

SHAP 属于模型事后解释的方法,它的核心思想是计算特征对模型输出的边际贡献,再从全局和局部两个层面对“黑盒模型”进行解释。SHAP构建一个加性的解释模型,所有的特征都视为“贡献者”。
对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。
基本思想:计算一个特征加入到模型时的边际贡献,然后考虑到该特征在所有的特征序列的情况下不同的边际贡献,取均值,即某该特征的SHAPbaseline value

2.1 SHAP 与 Permutation importance 的差异

文章[8]提及:Permutation importance很不错,因为它用很简单的数字就可以衡量特征对模型的重要性。但是它不能handle这么一种情况:当一个feature有中等的permutation importance的时候,这可能意味着这么两种情况:
1:对少量的预测有很大的影响,但是整体来说影响较小;
2:对所有的预测都有中等程度的影响。

SHAP 就可以应用的上,来看一下SHAP呈现的几种图,本轮笔者 是直接拿slundberg/shap中的代码,发现0.39.0版本,跟之前的版本差异非常大,很多函数名称都发生了变化。

笔者实验下述代码的环境:anaconda + py3.7 + jupyter notebook + shap==0.39.0


pip install shap
or
conda install -c conda-forge shap

那就从拆解当下slundberg/shap的案例入手,开始解读SHAP值的各类神图:


2.2 特征归因的一致性

2.2.1 树模型importance的不稳定

在文章[附代码!视频点击预测大赛初赛第二名方案 ]

通过训练模型发现,存在大量的原始特征,特征的重要性为0,然后对这些特征重要性为0的数据进行了删除。

在训练模型的时候发现,lightgbm和XGBoost的特征重要性差别非常大,所以我们对这两个模型的特征重要性进行了求和。

同时,获取特征重要性的不同方式,也会对特征重要性有所影响。在某种方式下重要性较低,另一种方式下可能会比较高,所以我们同样考虑到使用多种不同的特征重要性的获取方式。

2.2.2 SHAP值是唯一一致的个性化特征归因方法

文章:SHAP知识点全汇总

一致性:每当我们更改模型以使其更依赖于某个特征时,该特征的归因重要性不应该降低。
如果一致性不成立,意味着当一个模型被更改为某个特征对模型输出的影响更大时,反而会降低该特征的重要性,那么我们不能比较任意两个模型之间的归因重要性,因为具有较高分配归因的特征并不意味着模型实际上更依赖该特征。

下面举两个模型的例子对归因方法的一致性进行比较,假设模型的输出是基于人的症状的风险评分,对于二元特征发烧(Fever)和咳嗽(Cough),模型A只是一个简单的"和"函数,模型B是相同的函数,但是当为咳嗽时预测值会增加(加10分),使得模型更依赖于咳嗽,这时因咳嗽更重要,导致在模型B中咳嗽先分裂。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3CATsHKM-1618323200026)(en-resource://database/73400:1)]

比较A、B模型在下面六种归因方法上的差别:

  • Tree SHAP,本文提出的一种新的个性化方法。(个性化特征归因方法,为单个预测计算)
  • Saabas,个性化的启发式特征归因方法。(个性化特征归因方法,为单个预测计算)
  • mean(|Tree SHAP |),基于个性化Tree SHAP归因的平均幅度的全局归因方法(全局特征归因方法,为整个数据集计算,实际为所有样本的Tree SHAP值按照特征计算均值)
  • 增益(全局特征归因方法,为整个数据集计算)
  • 分裂数(全局特征归因方法,为整个数据集计算)
  • 置换(全局特征归因方法,为整个数据集计算)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cZJz9mb-1618323200026)(en-resource://database/73399:1)]

个性化特征归因方法:Tree SHAP、Sabbas,只有SHAP值能够保证反映特征的重要性,而Saabas值可能会给出错误的结果,比如模型B中认为更大的原因是发烧,而不是咳嗽,这是不一致的表现。

全局特征归因方法:mean(|Tree SHAP |)、增益、分裂数和特征置换,只有mean(|Tree SHAP |)和置换认为模型B咳嗽比发烧更重要,这意味着在一致性上增益和分裂数不是全局特性重要性的可靠度量。

所以gain、split count和Saabas方法中的特征重要度都不一致(使B模型更加依赖咳嗽时,却认为发烧更重要),这意味着模型改变为更多地依赖于给定的特性时,分配给该特征的重要性却降低了。

通常我们期望树根附近的特征比在叶子附近分裂的特征更重要(因为树是贪婪地构造的),然而增益方法偏向于更重视较低的分裂,这种偏差会导致不一致,当咳嗽变得更加重要时(因此在根部分裂),其归因重要性实际上下降。

个性化的Saabas方法在我们下降树时计算预测的差异,因此它也会受到与树中较低分割相同的偏差,随着树木越来越深,这种偏差只会增长。

相比之下,Tree SHAP方法在数学上等效于平均所有可能的特征排序的预测差异,而不仅仅是它们在树中的位置指定的排序。

所以在我们考虑的方法中,只有SHAP值和置换的方法是具有一致性的,而其中又只有SHAP值是个性化的,所以SHAP值是唯一一致的个性化特征归因方法。


3 工业案例

3.1 ML平台中 特征重要性

文章[干货 | 用户画像在携程商旅的实践] 提到,用户画像标签体系的数据监控中,会把特征重要性也作为监控指标,

在特征计算阶段,需要监控各数值特征的统计值(最大值、最小值、均值、标准差等)是否在合理区间内、
类别特征是否不在枚举范围内、特征重要性(方差、卡方、信息增益)监控。
如一个指标在前三个月属于重要性的指标,随着业务变化,该指标的重要性已经降低了,
以此来指导模型迭代(特征选择、超参数调整)。

3.2 一些比赛经验

文章[消费金融场景下的用户购买预测【冠军方案】分享]提到,
特征选择:
基于XGB的特征重要性
先训练一个XGBoost模型,输出其特征重要性,然后将重要性为0的特征删除,即完成了特征选择。
基于wrapper的方式
基于贪心算法,寻找最优特征子集,如上图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvft4Rto-1618323200027)(en-resource://database/73094:1)]


参考文献

1 数据科学竞赛:你从未见过的究极进化秘笈
2 sklearn之特征工程
3 sklearn.feature_selection.SelectFromModel 特征重要性选择(嵌入法的一种)
4 官方 1.13.4. Feature selection using SelectFromModel
5 干货 | 用户画像在携程商旅的实践
6 消费金融场景下的用户购买预测【冠军方案】分享
7 笔记:机器学习中的特征选择 一
8 kaggle | Machine Learning for Insights Challenge
9 特征选择怎么做?这篇文章告诉你
10 AutoML:mljar-supervised
11 机器学习中的特征选择
12 利用PermutationImportance挑选变量
13 可解释性机器学习_Feature Importance、Permutation Importance、SHAP

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值