特征选择
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。
通常来说,从两个方面考虑来选择特征:
特征是否发散
如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性
这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。
特征选择主要有两个目的:
1.减少特征数量、降维,使模型泛化能力更强,减少过拟合;
2.增强对特征和特征值之间的理解。
拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。接下来将结合 Scikit-learn提供的例子 介绍几种常用的特征选择方法,它们各自的优缺点和问题。
根据特征选择的形式又可以将特征选择方法分为3种:
Filter
过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
- 移除低方差的特征 (Removing features with low variance)
假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
- 单变量特征选择 (Univariate feature selection)
单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些变量重要,剔除那些不重要的变量。
对于分类问题(y离散),可采用:
- 卡方检验
- f_classif
- mutual_info_classif
- 互信息
对于回归问题(y连续),可采用:
- 皮尔森相关系数
- f_regression,
- mutual_info_regression
- 最大信息系数
这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效)。
- SelectKBest 移除得分前 k 名以外的所有特征(取top k)
- SelectPercentile 移除得分在用户指定百分比以后的特征(取top k%)
- 对每个特征使用通用的单变量统计检验: 假正率(false positive rate) SelectFpr, 伪发现率(false discovery rate) SelectFdr, 或族系误差率 SelectFwe.
- GenericUnivariateSelect 可以设置不同的策略来进行单变量特征选择。同时不同的选择策略也能够使用超参数寻优,从而让我们找到最佳的单变量特征选择策略。
卡方(Chi2)检验
经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次chi2 测试来选择最佳的两项特征
Pearson相关系数 (Pearson Correlation)
皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。
Wrapper
包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
- 递归特征消除 (Recursive Feature Elimination)
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。对特征含有权重的预测模型(例如,线性模型对应参数coefficients),RFE通过递归减少考察的特征集规模来选择特征。首先,预测模型在原始特征上训练,每个特征指定一个权重。之后,那些拥有最小绝对值权重的特征被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。
RFECV 通过交叉验证的方式执行RFE,以此来选择最佳数量的特征:对于一个数量为d的feature的集合,他的所有的子集的个数是2的d次方减1(包含空集)。指定一个外部的学习算法,比如SVM之类的。通过该算法计算所有子集的validation error。选择error最小的那个子集作为所挑选的特征。
Embedded
嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
- 使用SelectFromModel选择特征 (Feature selection using SelectFromModel)
- 将特征选择过程融入pipeline (Feature selection as part of a pipeline)
工作中我们更倾向于使用什么方法?
首先来回顾一下我们在业务中的模型会遇到什么问题。
模型效果不好
*原始数据存在问题
训练集效果好,跨时间测试效果不好
*跨时间数据规律变化,重新进行特征选择对比,找出哪些特征出现变化
跨时间测试效果也好,上线之后效果不好
*线下线上模型变量逻辑出现问题
上线之后效果还好,几周之后分数分布开始下滑
*类似第二条
一两个月内都比较稳定,突然分数分布骤降
*外部因素比较大
没有明显问题,但模型每个月逐步失效
*重新迭代模型
然后我们来考虑一下业务所需要的变量是什么。
变量必须对模型有贡献,也就是说必须能对客群加以区分
逻辑回归要求变量之间线性无关
逻辑回归评分卡也希望变量呈现单调趋势 (有一部分也是业务原因,但从模型角度来看,单调变量未必一定比有转折的变量好)
客群在每个变量上的分布稳定,分布迁移无可避免,但不能波动太大
为此我们从上述方法中找到最贴合当前使用场景的几种方法。
1)变量重要性
IV值
卡方检验
模型筛选
这里我们使用IV值或者模型筛选多一点
IV其实就是在WOE前面加上一项。
𝑝𝑦𝑖=𝑦𝑖𝑦𝑇
𝑝𝑛𝑖=𝑛𝑖𝑛𝑇
𝑤𝑜𝑒𝑖=𝑙𝑛(𝑝𝑦𝑖𝑝𝑛𝑖)
𝑖𝑣𝑖=(𝑝𝑦𝑖−𝑝𝑛𝑖)×𝑤𝑜𝑒𝑖
最后只需要将每一个区间的iv加起来就得到总的iv值:
𝐼𝑉=∑𝑖𝑣𝑖
2)共线性
相关系数 COR
方差膨胀系数 VIF
在多元回归中,我们可以通过计算方差膨胀系数VIF来检验回归模型是否存在严重的多重共线性问题。定义:𝑉𝐼𝐹=11−𝑅2
其中,𝑅𝑖为自变量 对其余自变量作回归分析的负相关系数。方差膨胀系数是容忍度1−𝑅2的倒数。
方差膨胀系数VIF越大,说明自变量之间存在共线性的可能性越大。一般来讲,如果方差膨胀因子超过10,则回归模型存在严重的多重共线性。又根据Hair(1995)的共线性诊断标准,当自变量的容忍度大于0.1,方差膨胀系数小于10的范围是可以接受的,表明白变量之间没有共线性问题存在。
VIF函数详细使用方法可以看statsmodels官方文档.
3)单调性
bivar图
4)稳定性
PSI
跨时间交叉检验
跨时间交叉检验
就是将样本按照月份切割,一次作为训练集和测试集来训练模型,取进入模型的变量之间的交集,但是要小心共线特征!
解决方法
不需要每次都进入模型,大部分都在即可
先去除共线性(这也是为什么集成模型我们也会去除共线性)
群体稳定性指标(population stability index)
公式:𝑃𝑆𝐼=∑(实际占比−预期占比)∗ln(实际占比预期占比)
来自知乎的例子:
比如训练一个logistic回归模型,预测时候会有个概率输出p。
你测试集上的输出设定为p1吧,将它从小到大排序后10等分,如0-0.1,0.1-0.2,…。
现在你用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。
实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。
意义就是如果模型跟稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。
一般认为psi小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。
注意分箱的数量将会影响着变量的PSI值。
PSI并不只可以对模型来求,对变量来求也一样。只需要对跨时间分箱的数据分别求PSI即可。