全局可解释代表着,是判定、选择某个特征的方法,包括:过滤法,嵌入法,包装法,和降维算法。 其中,嵌入法最为熟知,包括了特征重要性。
参考文章[2] [7]
过滤法选择特征,其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。
文章[11]也提到,特征选择时,主要遵循如下两个原则: – 波动性 – 相关性
波动性是指该特征取值发生变化的情况,用方差来衡量,如果方差很小,说明该特征的取值很稳定,可以近似理解成该特征的每个值都接近,这样的特征对模型是没有任何效果,是不具备区分度的,比如年龄这个特征,都是20岁左右大小的。反之,方差越大,则特征对模型的区分度越好。
相关性是就是该特征和目标结果的相关性大小,常用皮尔逊相关系数来度量。
过滤法的主要对象是:需要遍历特征或升维的算法们, 而过滤法的主要目的是:在维持算法表现的前提下,帮助算法们降低计算成本。
随机森林运行时间与特征数无关(每次都直选几十个特征),决策树与特征数有关(一次建模需要挑选很多特征),其他想svm、KNN等的运行时间更是与特征数量相关
方差过滤不能保证模型效果变好,但能保证运行时间的降低。方差过滤中的超参数threshold可以通过画学习曲线来找到最好的点,但是一般不太这么做,因为计算量太大了。
嵌入法选择特征,其主要思想是:在模型既定的情况下学习出对提高模型准确性最好的属性。这句话并不是很好理解,其实是讲在确定模型的过程中,挑选出那些对模型的训练有重要意义的属性。 最常用的是使用L1正则化和L2正则化来选择特征如Ridge Regression。正则化惩罚项越大,那么模型的系数就会越小。 当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。 也就是说,我们选择特征系数较大的特征。
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)
可选参数:
属性:
方法:
文章[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、依次将每一列特征按上述方法做,得到每二个特征对预测的影响。
结果分析:
在文章[12]中得实验来看, 全部特征、RF前30特征、LightGBM前30特征、LR前30特征。可以看到LightGBM通过PermutationImportance选出来的30个特征的模型的泛化性要好于用全部变量建模。
包装法选择特征,其主要思想是:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA,PSO,DE,ABC等
主要的方式: – 递归消除特征法(recursive feature elimination,简称RFE ),递归消除特征法的主要过程是,采用一个机器学习模型进行多次的训练,每一次的训练,都会消除若干部分权重系数的特征,然后再采用新的一组训练集进行训练。如条件互信息等。 – 递归过程可以是前向的或者后向的以及前后结合的。 – 常用的特征子集搜索算法还有:完全搜索;基于贪心的启发式搜索(前向/后向搜索等);随机搜索(模拟退火、遗传算法等)。
计算成本:嵌入>包装>过滤
经验来说,过滤法更快速,但更粗糙。 包装法和嵌入法更精确,比较适合具体到算法去调整,但计算量比较大,运行时间长。 当数据量很大的时候,优先使用方差过滤和互信息法调整,再上其他特征选择方法。 使用逻辑回归时,优先使用嵌入法。使用支持向量机时,优先使用包装法。
各类特征选择方法的优缺点
一篇文章里面的特征选择方法:Automatic Feature Interaction Selection(AutoFIS)。
推荐和广告系统中特征交叉非常重要,设计得当通常能获得巨大的提升。
虽然现在已经由一些模型来做部分的自动特征组合交叉,如xDeepFM,DeepCross,PNN,DIN等等,但是出于性能以及简便考虑,通常我们还是手动或者枚举着进行特征选择。
这篇文章的出发点是提出一种方法来进行特征交叉的选择,达到减少冗余交叉降低噪声,使训练更容易,进而提升效果的目的。
文章号称AutoFIS能自动地识别factorization模型中的所有重要的特征交互,而计算量和训练目标模型到收敛差不多。
可参考另外几篇: – 机器学习模型可解释性进行到底 —— 从SHAP值到预测概率(二) – 机器学习模型可解释性进行到底 —— SHAP值理论(一) – 机器学习模型可解释性进行到底 ——PDP&ICE图(三)
文章[13] 来看一下SHAP模型,是比较全能的模型可解释性的方法,既可作用于之前的全局解释,也可以局部解释,即单个样本来看,模型给出的预测值和某些特征可能的关系,这就可以用到SHAP。
SHAP 属于模型事后解释的方法,它的核心思想是计算特征对模型输出的边际贡献,再从全局和局部两个层面对“黑盒模型”进行解释。SHAP构建一个加性的解释模型,所有的特征都视为“贡献者”。 对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。 基本思想:计算一个特征加入到模型时的边际贡献,然后考虑到该特征在所有的特征序列的情况下不同的边际贡献,取均值,即某该特征的SHAPbaseline value
文章[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值的各类神图:
在文章[附代码!视频点击预测大赛初赛第二名方案 ]
通过训练模型发现,存在大量的原始特征,特征的重要性为0,然后对这些特征重要性为0的数据进行了删除。
在训练模型的时候发现,lightgbm和XGBoost的特征重要性差别非常大,所以我们对这两个模型的特征重要性进行了求和。
同时,获取特征重要性的不同方式,也会对特征重要性有所影响。在某种方式下重要性较低,另一种方式下可能会比较高,所以我们同样考虑到使用多种不同的特征重要性的获取方式。
文章:SHAP知识点全汇总
一致性:每当我们更改模型以使其更依赖于某个特征时,该特征的归因重要性不应该降低。 如果一致性不成立,意味着当一个模型被更改为某个特征对模型输出的影响更大时,反而会降低该特征的重要性,那么我们不能比较任意两个模型之间的归因重要性,因为具有较高分配归因的特征并不意味着模型实际上更依赖该特征。
下面举两个模型的例子对归因方法的一致性进行比较,假设模型的输出是基于人的症状的风险评分,对于二元特征发烧(Fever)和咳嗽(Cough),模型A只是一个简单的”和”函数,模型B是相同的函数,但是当为咳嗽时预测值会增加(加10分),使得模型更依赖于咳嗽,这时因咳嗽更重要,导致在模型B中咳嗽先分裂。
比较A、B模型在下面六种归因方法上的差别:
个性化特征归因方法:Tree SHAP、Sabbas,只有SHAP值能够保证反映特征的重要性,而Saabas值可能会给出错误的结果,比如模型B中认为更大的原因是发烧,而不是咳嗽,这是不一致的表现。
全局特征归因方法:mean(|Tree SHAP |)、增益、分裂数和特征置换,只有mean(|Tree SHAP |)和置换认为模型B咳嗽比发烧更重要,这意味着在一致性上增益和分裂数不是全局特性重要性的可靠度量。
所以gain、split count和Saabas方法中的特征重要度都不一致(使B模型更加依赖咳嗽时,却认为发烧更重要),这意味着模型改变为更多地依赖于给定的特性时,分配给该特征的重要性却降低了。
通常我们期望树根附近的特征比在叶子附近分裂的特征更重要(因为树是贪婪地构造的),然而增益方法偏向于更重视较低的分裂,这种偏差会导致不一致,当咳嗽变得更加重要时(因此在根部分裂),其归因重要性实际上下降。
个性化的Saabas方法在我们下降树时计算预测的差异,因此它也会受到与树中较低分割相同的偏差,随着树木越来越深,这种偏差只会增长。
相比之下,Tree SHAP方法在数学上等效于平均所有可能的特征排序的预测差异,而不仅仅是它们在树中的位置指定的排序。
所以在我们考虑的方法中,只有SHAP值和置换的方法是具有一致性的,而其中又只有SHAP值是个性化的,所以SHAP值是唯一一致的个性化特征归因方法。
文章[干货 | 用户画像在携程商旅的实践] 提到,用户画像标签体系的数据监控中,会把特征重要性也作为监控指标,
在特征计算阶段,需要监控各数值特征的统计值(最大值、最小值、均值、标准差等)是否在合理区间内、 类别特征是否不在枚举范围内、特征重要性(方差、卡方、信息增益)监控。 如一个指标在前三个月属于重要性的指标,随着业务变化,该指标的重要性已经降低了, 以此来指导模型迭代(特征选择、超参数调整)。
文章[消费金融场景下的用户购买预测【冠军方案】分享]提到, 特征选择: 基于XGB的特征重要性 先训练一个XGBoost模型,输出其特征重要性,然后将重要性为0的特征删除,即完成了特征选择。 基于wrapper的方式 基于贪心算法,寻找最优特征子集,如上图所示。
3 sklearn.feature_selection.SelectFromModel 特征重要性选择(嵌入法的一种)
4 官方 1.13.4. Feature selection using SelectFromModel
8 kaggle | Machine Learning for Insights Challenge
11 机器学习中的特征选择
12 利用PermutationImportance挑选变量
13 可解释性机器学习_Feature Importance、Permutation Importance、SHAP
原文:https://zhuanlan.zhihu.com/p/364922142
既然来了,说些什么?