机器学习中的特征选择

特征选择是很重要的

    有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。

    推荐和广告系统中特征选择同样重要,虽然深度学习能在一定程度上解决自动特征组合以及交互的问题,但是现阶段的实际应用中仍然需要做一些特征设计以及显示的特征组合。枚举所有的特征交叉对内存以及延迟的影响不容忽略,而且多余的无效特征会引入噪声并且给训练带来困难。

特征设计

    在特征选择之前,我们需要先设计特征,特征如何设计需要结合经验以及当前的业务需要,有时候结合具体业务痛点所设计的特征对业务效果的提升会很大。结合经验和业务后我们就有了特征设计的方向,这时候还需要进行一定的特征处理,通过结合量纲统一、取值范围确定、特征变换和映射、缺失值处理以及哈希等方法得到具体的特征值。

    无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

    缺失值是计算模型时最大的绊脚石,如果出现缺失值的情况,模型就不能正常进行数据拟合,会报错导致程序无法运行,所以我们需要对缺失值进行填充。一般处理缺失值的方式有:直接删除有缺失值的样本,用中位数、随机数、平均值、分位数等替代,只使用其他值预测缺失值,把变量映射到高维增加显式的缺失标识等。

    有时候原始特征值有对模型不是很方便处理或者表达的不够精确或过于精确等问题,因此需要对模型进行进一步的变换或映射。一般来讲有二值化、one hot、multi hot、分桶、平滑等。

    分桶方式主要有(1)等距分桶,每个桶的值域是固定的,这种方式适用于样本分布较为均匀的情况;(2)等频分桶,即使得每个桶里数据一样多,这种方式可以保证每个桶有相同的样本数,但也会出现特征值差异非常大的样本被放在一个桶中的情况;(3)模型分桶,使用模型找到最佳分桶,例如利用聚类的方式将特征分成多个类别,或者树模型,这种非线性模型天生具有对连续型特征切分的能力,利用特征分割点进行离散化。

    常用的行为次数与曝光次数比值类的特征,由于数据的稀疏性,这种计算方式得到的统计量通常具有较大的偏差,需要做平滑处理,比如广告点击率常用的贝叶斯平滑技术。而在我们推荐场景中,也会用到很多统计类特征、比率特征。如果直接使用,比如由于不同item的下发量是不同的,这会让推荐偏向热门的类目,使得越推越窄,无法发现用户的个体差异,也不利于多样性的探索。常见的有贝叶斯平滑和威尔逊区间平滑等。

    时序类特征:俗话说,路遥知马力,日久见人心。包括时间滑窗数量统计类特征、时间滑窗占比统计类特征、时间滑窗趋势统计类特征、时间滑窗稳定性衍生特征,以及序列id列表等。序列id类特征对应的模型有din和dien等等。关于时间窗口可以有固定行为数窗口、固定时间窗口、连续行为窗口等。

    特征编码方式有独热编码、散列编码、打分排名编码等。

    另外进行特征设计的时候还可以考虑显式交叉如类别特征之间、类别特征和数值类特征组合交叉。实际业务中还可以考虑多维度、根据业务目标定制特征生成方式,去噪声异常值处理,考虑系统性能以及效果进行截断等操作。

    另外比较流行的方式是对特征引入分布式表示,“万物皆可embedding”。如word2vec、PCA、autoencoder、LDA、FM、DeepWalk等等处理方法都可以将对应的原始特征映射到一个高维embedding空间中。通过这种方式可以对稀疏值或者隐含信息进行比较好的表示。

特征选择的目的

    直观上我们需要所选出来的特征是与任务相关的而不是不相关的,是精简的而不是冗余的。但想选出这种最理想的状态对一般任务来讲是不可能的,目前还没发现有方法能对所有任务的特征选择有效,因此我们只能通过不同的选择方法逐渐逼近理想状态,原则是尽量不错过一个可能有用的特征,但是也不滥用太多的特征。

特征选择方式

    特征选择的方式一般可以分成Fliter、Wrapper、Embedded以及Hybrid几种。第一类过滤法比较简单,它按照特征的发散性或者相关性指标对各个特征进行评分,设定评分阈值或者待选择阈值的个数,选择合适特征。上面我们提到的方差筛选就是过滤法的一种。第二类是包装法,根据目标函数,通常是预测效果评分,每次选择部分特征,或者排除部分特征。第三类嵌入法则稍微复杂一点,它先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。类似于过滤法,但是它是通过机器学习训练来确定特征的优劣,而不是直接从特征的一些统计学指标来确定特征的优劣。

过滤法选择特征

    过滤法选择特征,其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。主要的方法有:相关系数、方差、Chi-squared test(卡方检验),information gain(信息增益),互信息、correlation coefficient scores(相关系数),以及单特征auc等。

包装法选择特征

    包装法选择特征,其主要思想是:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA,PSO,DE,ABC等。主要的方式:递归消除特征法(recursive feature elimination,简称RFE ),递归消除特征法的主要过程是,采用一个机器学习模型进行多次的训练,每一次的训练,都会消除若干部分权重系数的特征,然后再采用新的一组训练集进行训练。如条件互信息等。递归过程可以是前向的或者后向的以及前后结合的。常用的特征子集搜索算法还有:完全搜索;基于贪心的启发式搜索(前向/后向搜索等);随机搜索(模拟退火、遗传算法等)。

嵌入法选择特征

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

    基于决策树的算法,如随机森林、GBDT,xgboost,在每次选择分类节点时,都会选择最佳分类特征来进行切分,重要的特征更有可能出现在分裂较早的节点,作为分裂节点的次数也越多。因此,可以基于树模型中特征出现次数等指标对特征重要性进行排序。

混合法选择特征

一般可以综合运用上面的特征选择方法,从不同角度对特征进行重要性分析以及选择,而且还可以对选择出来的结果结合经验和业务进行人工干预。对选出来的结果进行覆盖度分析以及特征重要性验证。特征重要性的验证可以简单使用单特征auc和特征值置换(置换为0、随机值以及随机打乱)的方式在模型上进行验证。完成以上步骤选择好特征之后,通常还要结合模型进行调整,通过反复离线训练验证特征的有效性和实用性。实际应用中通常还要对最终选出的组合进行线上验证,通过ABTest的方式验证收益。

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

    一般有5种比较常见的评价函数

距离度量:如果 X 在不同类别中能产生比 Y 大的差异,那么就说明 X 要好于 Y;

信息度量:主要是计算一个特征的信息增益(度量先验不确定性和期望后验不确定性之间的差异);

依赖度量:主要用来度量从一个变量的值预测另一个变量值的能力。最常见的是相关系数:用来发现一个特征和一个类别的相关性。如果 X 和类别的相关性高于 Y与类别的相关性,那么X优于Y。对相关系数做一点改变,用来计算两个特征之间的依赖性,值代表着两个特征之间的冗余度。

一致性度量:对于两个样本,如果它们的类别不同,但是特征值是相同的,那么它们是不一致的;否则是一致的。找到与全集具有同样区分能力的最小子集。严重依赖于特定的训练集和 最小特征偏见(Min-Feature bias)的用法;找到满足可接受的不一致率(用户指定的参数)的最小规模的特征子集。

误分类率度量:主要用于Wrapper式的评价方法中。使用特定的分类器,利用选择的特征子集来预测测试集的类别,用分类器的准确率来作为指标。这种方法准确率很高,但是计算开销较大。

    各类特征选择方法有各自的优缺点。实际使用中需要根据业务以及数据集的复杂程度选择合适的方法。各类优缺点简单列举如下图。

 

一个特征选择的方法介绍:AutoFIS

    这里介绍最近刚看到的一篇文章里面的特征选择方法:Automatic Feature Interaction Selection(AutoFIS)。推荐和广告系统中特征交叉非常重要,设计得当通常能获得巨大的提升。虽然现在已经由一些模型来做部分的自动特征组合交叉,如xDeepFM,DeepCross,PNN,DIN等等,但是出于性能以及简便考虑,通常我们还是手动或者枚举着进行特征选择。这篇文章的出发点是提出一种方法来进行特征交叉的选择,达到减少冗余交叉降低噪声,使训练更容易,进而提升效果的目的。文章号称AutoFIS能自动地识别factorization模型中的所有重要的特征交互,而计算量和训练目标模型到收敛差不多。

    为了自动学习特征交叉,文中使用了gate来控制每个特征交叉的输出是否进入到下一层。文中提出了分成两个步骤来自动选择FM类模型中的低阶和高阶特征组合。在search阶段,放松选择的gate为一个连续值并使用SGD类方法来与网络参数同时学习来获取每个交互组合的重要性。使用的优化器是GRDA;之后再re-train阶段,选择交互组合中重要性非零的部分进行重新训练,让重要性成为一个类似attention的存在。PS:这里类似于对每个交叉组合学习一个权重,类似于整个交叉组合学习了一个大的attention,然后在之后的training或者serving的时候对这个attention部分进行了剪枝,去掉了其中0的部分?那么特征选择时候就可以初步用这个attention的权重来进行筛选。

    上面的交互权重是和交叉组合的结果一起进行训练的,因此交叉组合的scale会影响权重的大小,因此需要对交叉组合结果的分布进行限制。比如下面的式子中对这两项进行放和缩达到整体不变的目的,但是显然交互权重已经不一样了。

    文章中使用batch norm进行统一分布,进而解耦交叉组合结果和交叉权重的作用。PS:BatchNorm对DNN的作用好像一直没有一个确定的结论,这里不一定达到这种目的?

    原始的BatchNorm式子如下:

    因为是要统一分布,所以将其中的scale和shift参数固定为1和0。PS:那么这里就是相当于一个归一化操作?

    优化的时候使用了GRDA优化器:

PS:这里类似于添加了L1和L2正则?

    按我的理解就是将交叉结果统一在同一个量纲下,以一个与网络同步学习的系数来表示对应的交叉组合的重要性,以训练出的重要性对特征交叉组合进行剪枝得到剪枝过后的可用于实际系统的模型。那么其实重新训练的时候这个权重是不是直接就可以搞成AFM这种对FM进行一个加权的操作或者直接去掉(反正其实理论上是可以学到交叉的每一项的)?

    具体效果暂时没试过,后续有时间可以尝试一下。

结论

    路漫漫其修远兮,吾将上下而求索。

 

 

参考:

https://www.zhihu.com/question/28641663 

万字长文浅谈微视推荐系统中的特征工程

风控特征—时间滑窗统计特征体系

https://blog.csdn.net/hren_ron/article/details/80914491

https://zhuanlan.zhihu.com/p/95061281

https://www.cnblogs.com/ranjiewen/p/6216128.html

An introduction to variable and feature selection

https://www.zhihu.com/question/336110178

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值