浅谈特征筛选中的多重共线性问题
关注“金科应用研院”,回复“ZH”
领取“风控资料合集”
在我们评分卡建模之前,筛选合适的特征入模是至关重要的一步,这一步很大程度上决定了我们模型的最终结果是否有效。而在特征筛选中,有一个不可忽视的因素就是特征之间是否存在多重共线性。那么今天我们就给大家详细聊一聊多重共线性问题。
一、何为多重共线性
在线性回归模型中:
这里有一个前提假设是各因变量X之间相互独立,不能存在线性相关。所谓线性相关,就是指
和
之间存在
这种情况。而一旦有因变量之间存在完全的或者高度近似的线性相关关系,便会导致模型的参数估计发生偏差,难以得到Y和X之间真正的关系,这便是我们所说的多重共线性(multicollinearity)。
看定义如果难以理解我们可以举一个简单的例子,比如说存在:
且
那么就会存在比如:
等等式子同时成立的情况,即模型的表达式存在无数种形式,以至于我们无法估算出因变量X真正的参数,甚至连Y与X之间是正相关和负相关也无法确定,模型估计的结果就无效了。
二、多重共线性产生的原因
特征之间产生多重共线性的原因有许多,首先,在我们的评分卡建模中,每个客户他作为一个个体,其特征之间自然会存在一定程度上的关联。
比方说教育程度和收入水平分别都是客户的特征,而一般而言教育程度高的个体其收入水平也会相对偏高,这就是特征之间的相关性。其次,错误使用虚拟变量也会导致多重共线性问题。对于类别型特征(假设有n类),常用的处理方式是生成n-1个虚拟变量来入模,因为n-1个变量刚好能表示n个类别的所有结果:比如有三个类别,则可以分别用(1,0),(0,1),(0,0)来表示。而很多人对此不理解,习惯性会认为应该生成n个虚拟变量,比方说用(1,0,0),(0,1,0),(0,0,1)来表示三个类别,看着没什么问题,但此时
三个虚拟变量就线性相关了,产生多重共线性问题。除了上述原因之外,变量相关的共同趋势,滞后变量的引入和样本资料的限制等原因也会导致多重共线性。
三、多重共线性的检验
因此,特征之间的多重共线性是普遍存在的,这就要求我们在筛选入模特征的时候能够及时识别,通常我们使用的方法有相关系数检验和VIF检验:
1)相关系数检验
在特征初筛阶段,可以通过相关系数对所有特征的相关关系进行快速的检验。一般而言,若两个特征的相关系数绝对值在0.7以上,可以认为二者之间具有强相关,此时需要根据实际需求进一步考虑是否删去其中IV值较低的特征了。
利用Python我们可以很方便地得到特征之间的相关系数矩阵,并利用seaborn画出热力图:(随机数独立同分布,理论上不存在多重共线性问题,本例中使用随机生成的数据仅作为操作展示,无实际意义)。
通过热力图我们可以很直观地看到各个特征之间的相关关系,本例中特征1和特征4之间的相关系数绝对值大于0.7,具有强相关性,而特征1和特征3之间相关系数也高达0.64,值得注意。
这里需要说明的是,较高的相关系数只是多重共线性存在的充分非必要条件。特别是在多于两个解释变量的回归模型中,有时较低的相关系数也可能存在多重共线性。因此并不能简单地依据相关系数进行多重共线性的准确判断,只能作为变量初筛时的一个参考。初筛阶段无法识别出来的多重共线性我们可以后续使用VIF检验作进一步的识别。
2)VIF检验
VIF,全称方差膨胀系数(variance inflation factor),是专门用于衡量多元线性回归模型中多重共线性严重程度的一种度量。
这里是
自变量
与其他自变量组成的线性模型的决定系数,
称为容忍度,而VIF则是容忍度的倒数。
VIF的取值大于1,且越大说明多重共线性更严重。其没有明确的阈值,一般而言,VIF<10时特征才可用,但根据工作中实际的精确度需求,很多人会把标准提升到VIF<5,甚至VIF<3。
通过python计算出上述数据各特征的VIF,结果表明,特征1和特征3的VIF大于10,说明这两个特征导致了多重共线性问题的产生。这与初筛阶段相关系数矩阵得到的结果也是一致的,并且额外识别出了特征3存在的问题。
四、多重共线性问题的解决
在正确识别出特征之间的共线性之后,应该如何解决这个问题呢?
首先考虑增大样本量,排除因样本容量不足而产生的偶然性共线性问题。这种方法对数据的影响最小,但是不一定有效,而且增加样本在实际情况下往往是较难实现的,因为数据获取的来源是有限的。
除此以外常用的方法是人工或者用逐步回归的方法排除掉引起共线性的变量。但随便删去变量也可能引发一些问题,这对建模人员的业务经验提出了更高的要求,而且在实际工作中,某些变量是我们不希望删去的。
此时可以考虑用差分法、LASSO回归、岭回归等方法来解决。差分法对于时间序列变量有着良好的效果,两个特征相关但他们的差分项不一定相关;LASSO回归和岭回归则通过引入惩罚函数,降低估计精度来换取更为可靠的回归因数。对于这些方法的原理及其python的代码实现,如果大家有兴趣,我们可以在后续的文章中再详细介绍。
感谢Dominic的精彩分享,如果你喜欢、想要看更多的干货类型的文章,可以把公众号设为星标 ,顺便转发分享~
FAL长期对外征稿,邀请各大风控人士加入我们,在风控圈分享你的经验与知识 征稿,快到碗里来,有稿费那种!