今天我们综合了星球同学的一些需求,给大家梳理了这样一篇风控建模中特征筛选,希望对所有的风控人员在模型开发上都有所启发。
本文,我们会跟大家介绍特征选择的内容,包括其中的重点问题跟注意的细节。
因为完整内容较长,本次整体的内容将分成五大部分跟大家介绍,特别是第五部分,内容更会带领大家领略整个模型调参的内容,整体目录如下:
Part1.特征筛选的目的和步骤
Part2.特征筛选方法–过滤式
Part3.特征筛选方法–包裹式
Part4.特征筛选方法–嵌入式
Part5.实操–基于特征重要性的筛选–后向选择及交叉验证方法
特征筛选是风控建模中非常重要的步骤,其目标是寻找最优特征子集来提升模型效果,减短训练时间和提高可解释性,本文将从特征筛选的目的出发,介绍过滤式,包裹式,嵌入式三种常用的特征筛选方法。
正文部分如下:
Part1.特征筛选的目的和步骤
一.特征筛选的目的:
1.降低模型发生过拟合的风险
过拟合的意思是模型在训练集和测试集上的表现差异过大,发生过拟合的主要原因为
1)训练样本太少,数据不够全面。
2)训练数据里的噪声干扰过大,而模型又学到了这些“统计噪声“
3)模型过于复杂,表现为模型死记硬背的记下了训练数据的规律,而对未知的预测数据不知道变通,导致泛化能力很差。
特征数过多一方面增加了模型的复杂度,另一方面特征多也引入了更多的噪声数据,使模型更容易学到噪声,增大了发生过拟合的风险,需要注意的是,特征多不是导致过拟合,而是更容易过拟合,两者并不是本质上的联系。
2.提高可解释性
对于一个模型,入模50个特征和只入模10个特征,当然是10个特征来解释更加方便。特征数量的下降有助于风控和业务对模型的理解,尤其是金融这种对可解释性要求比较高的场景。
3.提高模型训练速度,节省存储空间
建模过程中也要考虑到时间成本,特别是大量数据和用集成模型的情况下,做特征筛选是非常有必要的。
二.特征筛选的步骤
首先要知道哪些特征是需要筛掉的:
1)垃圾/无用特征,这些特征对模型预测基本起不到什么效果,并且可能带来噪声数据
2)弱特征,对模型预测有微弱的效果,去除这些特征对模型结果不会有大的影响
3)相关性特征,这些特征会影响模型的解释性,也有可能对模型效果有影响
一般做特征筛选是先粗筛再细筛,先筛掉垃圾/无用特征,再对弱特征和相关特征做细致的筛选。对于逻辑回归建模,特征筛选需要细致一点,最后入模的特征控制在8-20个,筛选的步骤为:
对于Xgboost,Lightgbm建模,特征筛选可以粗一点,因为算法本身就自带了对特征的选择,筛选的步骤为:
xgboost和lightgbm特征筛选的差异:
xgboost不能处理类别型特征,而lightgbm可以在算法中自动处理。当类别型特征较多时,如果用xgboost要先做哑编码,哑编码会造成特征比较稀疏,需要将那些稀疏性很高的特征筛除,用lightgbm的话就可以直接带进模型训练输出重要性来做筛选
Part2.特征筛选方法–过滤式
过滤式方法是根据特征本身的属性,或者特征之间,特征和标签之间的关系来做筛选,常见的方式有:
方差筛选,缺失率筛选,常值占比筛选,IV值筛选,PSI筛选,共线性筛选
1.方差筛选
方差是衡量一组数据离散程度的度量,计算公式为:
从公式中可以发现如果特征都是同一个值,那方差为0,这种特征对于模型预测基本没有作用。所以方差很小的特征携带的信息可能就很少,但方差容易受到异常值的影响,所以在做筛选时,最好只筛掉方差等于0或者极其接近0的特征。
2.缺失率筛选
特征的缺失率越高,携带的信息也就越少,预测能力越弱,所以要把缺失率较高的特征筛掉,那缺失率的阈值定在多少合适呢?这个跟用的算法有关系,逻辑回归对缺失比较敏感,并且模型对特征的预测能力要求较高,所以筛的会紧一点,一般将阈值定在50%-70%之间,集成算法可以自动处理缺失值,而且能很好利用那些缺失率高的特征(弱特征),所以筛的会松一点,阈值一般定在80%-90%之间。另外也可以计算缺失率在时间上的变化,缺失率在时间上波动非常大的特征也可考虑筛除。
3.常值占比筛选
如果特征中某个值占比过大,那特征携带的信息也比较少,这个跟方差的逻辑类似。在计算常值占比时,需要先剔除缺失的样本,筛选的阈值一般定在85-95%之间。
4.PSI筛选
PSI衡量的是特征/模型在实际分布和预期分布之间的稳定性,简单理解就是把两个分布叠在一起,比较两个分布的差异有多大,PSI的计算公式为:
PSI = SUM( (实际占比 - 预期占比)* ln(实际占比 / 预期占比) )
PSI值越小,代表两个分布之间差异越小,代表越稳定,取值范围如下:
0-0.1 稳定性比较好
0.1-0.25 稳定性稍差
0.25 稳定性比较差
对特征做PSI筛选时,有两种方式:
1)计算特征在训练集和测试集之间的PSI,这是衡量在训练集和测试集的稳定性。
2)将训练集按时间顺序分割成几部分,例如训练集包含了1-6月份的数据,那按月份分为6部分数据,以1月份的样本作为预期分布,2-6月份作为实际分布算每个月的PSI,观察PSI的值在时间上是否稳定,如果波动比较大则考虑筛除。这是衡量在时间维度上的稳定性。
PSI筛选不是必须要做,一方面要看样本的时间跨度和样本量是否支持做PSI筛选,另外一方面如果取的样本处在业务不稳定时期,或者风控决策变动频繁,那大部分特征都不会稳定,这样会把很多重要的特征都筛掉,直接影响模型的效果。
5.woe和IV值筛选
在风控模型中,woe用于特征的转换(一种编码方式),IV用于评估特征的预测能力,IV是在woe的基础上计算的,在进行woe编码前,需要对特征做分箱处理(离散化),然后计算每个箱体内的好人数(bin_goods)和坏人数(bin_bads),接着分别除以总的好人数(all_goods)和总的坏人数(bad_goods),得到每个箱体内的边际好人占比(goodattr)和边际坏人占比(badattr),然后计算每个箱的woe = In(badattr/goodattr),每个箱的IV = (badattr-goodattr)*woe,将每个箱的IV加起来就是这个特征的IV值,具体的计算公式如下:
IV值的评价标准如下:
<0.02: 预测能力几乎没有
0.02-0.1:预测能力很弱
0.1-0.3:预测能力中等
0.3-0.5:预测能力比较强
0.5: 结果不太可信,可能存在标签泄漏问题
IV筛选一般用在逻辑回归建模中,定筛选的阈值时,要根据总体特征IV值的情况来定,例如IV值都在0.2以下,那阈值要设的松一点,可以保留IV>0.05的特征,如果IV值都比较高,那阈值可以设的紧一点,例如可以保留IV>0.1的特征。另外为了加快计算IV的时间,可以选择决策树分箱,比卡方,最优分箱效率要高得多。
6.共线性筛选
共线性是指特征之间存在线性相关关系,衡量共线性一般用皮尔逊相关系数和方差膨胀系数(VIF),皮尔逊相关系数在-1到1之间,系数的绝对值越大,说明两个特征之间线性关系越强,一般认为系数绝对值在0.65-0.8以上说明存在高度线性关系。方差膨胀系数的值越大,说明特征之间存在多重共线性的可能性越大,一般来说,VIF超过5或10,说明存在严重的多重共线性。
共线性主要影响模型的稳定性和可解释性,由于逻辑回归非常注重解释性,所以建模时必须要做共线性筛选,而集成模型对解释性要求不高,并且共线性对其影响较小,如果共线性的特征不是很多且样本量比较大,可以不做筛选,如果共线性特征太多,那还是做一下筛选比较好,可以提高训练速度,也能降低模型复杂度。
Part3.特征筛选方法–包裹式
常见的包裹式筛选方法为前向选择,后向选择,主要应用在共线性筛选和特征重要性筛选中。以共线性筛选为例,如果特征很多,特征之间的线性关系比较复杂时,这时候用包裹式的方法来筛选就比较简单高效。
1.前向选择的步骤(皮尔逊相关系数筛选):
2.后向选择的步骤(VIF筛选):
Part4.特征筛选方法–嵌入式
嵌入式是将特征选择嵌入到模型的构建中,通过模型对特征的评价指标作为筛选依据,常见的有逻辑回归中L1正则化筛选和集成模型中的重要性筛选。
一.基于L1正则化的嵌入式选择
正则化是指在损失函数中加入惩罚项,来降低过拟合的风险,提高模型的泛化能力。正则化包含L1正则化和L2正则化,L1正则化可以产生稀疏权值矩阵,将特征的系数值趋向于0,那我们可以将系数等于0的特征剔除来做筛选。
用逻辑回归建模时,可以设置正则化参数(penalty)为L1,加大惩罚力度©,然后输出每个特征的系数值,将那些系数等于0或非常接近于0的特征剔除掉。这里需要注意的是,共线性会使特征系数值的方差增大,使系数值不稳定,所以在做L1正则化选择前,需要先做共线性的筛选。
二.基于特征重要性的嵌入式选择
1.xgboost,lightgbm三种特征重要性的计算方法
weight–在子树进行分裂时,用到该特征的次数,这里计算的是所有的子树
gain–指在节点分裂时,该特征带来信息增益(目标函数)优化的平均值
cover–就是树模型在分裂时,特征下的叶子结点涵盖的样本数除以特征用来分裂的次数,分裂越靠近树的根部,cover值越大
一般我们用weight来计算重要性,重要性等于10说明特征在所有树中作为分裂属性用到了10次,次数越多,说明特征分裂时带来的信息增益越大,特征区分能力越强。
2.特征重要性存在的问题
- 因为重要性是特征的分裂次数,那子树的数量,树的深度等都会影响重要性的值,所以重要性的筛选阈值不好确定,这一块基本以主观判断为主。
- 共线性和噪声对重要性有很大影响,举个例子,一个xgb模型由20棵决策树组成,假如A是个强特征,在每棵树的第一层分裂时都用到了,那A的重要性为1*20 =20,现在加入与它高相关性的特征B,在第一层分裂时,由于A和B高度相关,模型只能选择其中一个来分裂,如果模型随机挑一个,那20棵树里有10棵选择了A,另外10棵选择了B,这样A的重要性就从20变成了10,重要性被稀释掉了,导致计算出的重要性不是真实的,所以在做重要性筛选前,最好做一下共线性的筛选。
3)随机性的影响,一方面是划分训练集和测试集的随机性,实验中发现不同的随机种子下,某些特征的重要性排名和值不稳定,另一方面是行列抽样的随机性,例如设置了列抽样为0.7,那特征有30%的概率不会被选中来做分裂,这样算出的重要性与实际有偏差。所以评估特征重要性时行列抽样最好都设置为1。
3.特征重要性筛选的方式
1)刚才提到重要性会受到样本划分随机性的影响,这个可以通过交叉验证来解决,以10折交叉验证为例(如下图),将样本随机划分为10份,每次随机选择其中的9份作为训练集,另外1份作为验证集,在验证集中评估模型并输出特征重要性,这样就训练出了10个模型和10个重要性的结果。下面通过两种方式来筛选特征:
一是找出10个结果中重要性都为0或者重要性都很低的特征,这种就是将无用和弱特征剔除。二是根据排名前N来筛选,例如找出10个结果中排名都在前50的特征,这些特征不容易受到随机性的影响,在10个模型中都能排进前50,说明效果比较稳定。
2) 用后向选择的方法,先训练一次模型得出重要性排名,将特征按重要性进行排序,然后先剔除重要性最低的特征,再训练一次看模型效果是否有下降,如果没有,则继续剔除重要性最低的特征再训练,直到模型效果有下降,这种就是剔除冗余特征(去掉后对模型效果影响很小),达到降维的目的。
随机森林输出重要性的原理和xgboost,lightgbm不同,它是基于基尼系数的,如果特征X出现在决策树J中的结点M,则计算节点M分枝前后的Gini指数变化量,假设随机森林由N棵树,则计算N次的Gini系数,最后将所有的Gini系数做一个归一化处理就得到了该特征的重要性。所以单个特征重要性的值都小于1,所有特征重要性加总为1。不过筛选的方法是一样的,同样是将重要性很低的特征剔除或者只保留排名前N的特征。
Part5.实操–基于特征重要性的筛选–后向选择及交叉验证方法
1.导入训练数据和OOT数据,特征一共是137个,特征名做了脱敏处理
2.利用交叉验证筛选特征,这里设定K折的数量为5折,训练5个模型,输出5个重要性结果,将5次结果中重要性都在前50的特征筛选出来,需要注意行列抽样的参数subsample和colsample_bytree都要设为1。
3.基于重要性的后向选择,先训练一次模型得出全部特征的重要性,按从小到大排序,并得出OOT的KS为0.378,然后进行后向选择,每剔除重要性最低的特征后就重新训练模型计算OOT的KS是否有下降,这里设定下降阈值为0.005,当KS下降了0.5个百分点,则循环停止。最后特征从137个筛选到94个,OOT的KS变为0.372,起到了降维的作用,而模型效果基本不受影响。
本次内容最完整的内容,请参考番茄风控的最新的课程内容:
相关的代码内容,手把手的系列,更可以参考本次上传到知识星球的帖子,具体请看:
模型开放相关内容,更可以关注番茄风控训练营中的内容,相关细节可关注:
《第五期训练营》:
~原创文章
…
end