2021-03-23 特征选择的效果评估

在初步特征筛选之后,若使用树模型,特征经过数值化处理后就可以模型进行效果评估,一般会给出一个AUC或KS的模型评估结果。这里假设我们放入的特征数量为N,我期盼的是通过丢弃某些无效的特征,进一步提升模型效果

特征选择有常用的三种方法,Filter(过滤法)、Wrapper(包裹法)、Embedded(嵌入法)。我们常用的IV计算、相关性计算、PSI计算、自变量方差分析都属于Filter;而模型中的L1和L2正则化以及模型产出的importance features部分等于0属于Embedded,也就是模型本身提供的一些消除无效特征的方法。剩下唯一的方法Wrapper就是这次研究对象。

Wrapper可能听到的不多,但我常听到向前搜索(Forward)、向后搜索(Backward)以及双向搜索(Bidirectional),就是属于这个框架之下。因为这些方法根据模型不同,无论的模型类型、模型参数还是评价指标都可能不同,因此目前我还没有在网络上找到一套成熟的解决方案加理论基础。给我研究的深度多了一层探索空间。

我打算测试以下方法,来验证效果给予未来特征选择做出更多的一套解决方案备选。这里挑战的是提升效果vs执行效果,在后期计算复杂度会慢慢体现起重要性。

  • Backward、Forward、Bidirectional三者的选择
  • 可能选择验证的计算复杂度讨论
  • 常用的策略方案(评价指标+筛选策略)
  • 实验结果以及对自己的启示

Backward、Forward、Bidirectional三者的选择

因为已经选择了树模型,使用模型适应性通用参数和最佳效果AUC差异在0.0X的级别,保持在相同参数情况下,对特征选择而言是公平的,因此优先选择Backward方法。

方案一,选择Backward,使用Boruta工具(随机森林给变量打分工具)若不会这个工具也可以使用模型本身的importance feature的score作为排序条件,逐一丢弃特征看在train和test上的效果。结果没有向上向下的明显表现,仅在最后10个特征丢弃时效果有下降的显现。从提升模型效果角度看,因此不建议使用。

Boruta从弱到强逐一丢弃

方案二,选择Bidirectional,需要考虑这些问题,1使用如何评价效果,2判断是否丢弃或者拿回,3如何迭代过程控制,4信息记录保存。问题分解后结合用Xgboost测试特征的时候出现计算3-4小时的用时,产生下面的计算复杂度问题需要考虑。

可能选择验证的计算复杂度讨论

根据Wikipedia对“时间复杂度”的解释,在计算机科学中,算法的时间复杂度是一个函数,定性描述该算法的运行时间。

当等待时间过久,一个测试一个错误甚至本身上线的可能性都会受到影响,面对生产问题时间复杂度变得重要不可或缺。常用O(N)来表示,常数时间O(1)、线性时间O(n)、二次方时间O(n2)、指数时间2O(n)。根据这次计算初步知道若150个特征,做一次全局搜索找最优解需要2^150=1427247692705959881058285969449495136382746624,若按照一次程序6秒计算,是一个不可计量的时间复杂度度,设计一个更好的搜索方法在Bidirectional中找到相对的最优解就是我的目标。

应对的策略方案(追求模型AUC最大化)

按照150个变量,用LightGBM通用模型预估6秒一轮计算。

方案 排序策略 选子集策略 执行计划 时间复杂度 时间预估
全变量搜索 无指向 逐一剔除和替换 1选子集->重复1 2^O(n) 无穷
迭代排序迭代筛选1 原模型下删除1个特征后计算AUC 删除AUC上升且影响最大的变量 1排序->2选子集->重复12 O(n^2) 39小时
迭代排序迭代筛选2 原模型下统计importance 删除importance效果最差的特征 1排序->2选子集->重复12 O(2n) 30分钟
一轮排序迭代筛选 原模型下统计importance 删除importance效果最差的特征 1排序->2选子集->重复2 O(n) 15分钟
一轮排序迭代筛选3 原模型下删除1个特征后计算AUC 删除importance效果最差的特征+bidirectional 1排序->2选子集->重复2 O(n*(n+1)/2) 90分钟
  • 模型AUC效果和importance feature的分数是否相关?
    答:题目指原模型提供的importance feature的分数,是否排序靠后的特征当剔除后模型AUC效果提升是最明显的?是否会出现以下情况,a.剔除后模型效果不变;b.其他重要变量丢弃反而带来了模型提升。
    不相关。importance feature和丢弃特征后的AUC并没有相关性,相关性系数(spearman)仅仅0.04,用图形展示也没有明显区别。

  • 是否在60分钟以内完成验证的更好优化方案?
    答:使用“一轮排序迭代筛选3”来验证效果,因为目标是AUC效果的提升,因此选择评价也采用AUC作为基准,同时可以为后期验证效果差异做对照。

  • 对比相同特征放入LightGBM模型的AUC计算结果存在差异,造成误差。
    答:根据树模型的底层原理具有随机性,相同变量顺序不同也会导致模型效果存在差异。引入两个方法解决,a.对所有模型训练时的特征先做排序;b.计算P值确定置信区间下的一定存在差异的情况,再做排除或保留处理(前期仅仅比较大小,未考虑随机扰动导致的误差)。
    另一个引起的原因是ligbtgbm.cv使用的nflod每次分割结果不相同。解决方案,使用sklearn固定分割方法,使得每次拿到的数据是一样的。

  • 针对上一个结果的复查,是否有其他问题?
    答:因为特征字段反复替换,删除+补回这样的操作在LIST中会出现位置变化,而建模fit或者cv都是针对特征处理,当训练好后特征位置都将固定,若在执行过程中将位置修改,模型再次验证时将产生偏差。
    可以使用numpy.array的方式,初期会觉得不习惯,但熟悉后发现矩阵方式获取数据和处理位置都是非常稳定,且代码表达力清晰。
    才相同设计结构,对LR(Logistic Regression)和LGB(LightGBM)分别进行特征筛选,图形结果上LR更平缓而LGB像齿轮一样波动,有很大的不确定性。因此对每轮的AUC、停止数量、重要性分数做相关性分析,发现停止数量对模型效果产生影响。前期为了追求效果,特意让树模型训练具有30个自动停止的优化功能,也许产生了反效果。

    LR模型丢弃特征—图形平滑

    LGB模型丢弃特征—图形陡曲

    Pearson + Spearman—停止数量和最终模型效果存在相关性

  • 从原来自动寻找最佳停止点变成固定停止点看效果?
    答:固定点不为永久,以每次循环开始initial时确定,每次丢弃一个特征的算法采用initial时的固定值,仅考虑丢弃特征对模型的效果差异。
    执行速度略快,从效果上看和动态停止点类似,依旧波动较大,存在上下起伏的情况。

类型 效果 速度
动态停止点 Test更平稳效果下降更缓慢 略久,多跑stop rounds
固定停止点 Test陡峭下降不稳定 略快,约节省10%时间
Dynamic vs Fixed, Dynamic更平稳
  • 从多变量使用阈值丢弃特征方案?
    答:

实验结果以及对自己的启示

  1. 树模型中的特征重要性feature importance对变量选择而言,并不适用。可能的原因是模型训练时起正向负向效果都是重要,我们期望的是把负向(干扰项)找到并丢弃,而0分的特征仅仅说明对模型没有正负效果而已。

  2. 停止点对模型产生影响,结合固定和动态从效果上看动态更稳定。不同特征组合放入模型后效果存在差异,因此采用动态搜索可以更好的证明当前特征的效果。

你可能感兴趣的:(2021-03-23 特征选择的效果评估)