对于Linear回归、Logistic回归等线性模型来讲,特征变量的多重共线性是衡量模型性能的一个重要维度。因此,如何有效识别并解决模型特征的多重共线性问题,是实际业务场景建立线性模型过程的必要环节。本文首先对特征多重共线性的定义进行描述,然后结合实际样例重点介绍多重共线性的常用检验方法。
1、多重共线性定义
对于多元线性模型
Y=k0+k1X1+k2X2+…+knXn,如果特征变量X1、X2、Xn之间存在高度线性相关关系,则称为多重共线性。从特征共线性程度的大小进行区分,可以分为完全共线性和近似共线性。
例如,对于多个特征变量,多重共线性的公式可以表示为
a1X1+a2X2+…+anXn=0,
如果系数an不全为0,即某个特征变量可以用其他特征变量的线性组合表示,则称特征变量之间存在完全共线性,假设系数an均为1,则X1=-(X2+X3+…+Xn)。
近似共线性可以通过公式a1X1+a2X2+…+anXn+b=0说明,若系数an不全为0,b为误差随机项,则称特征变量之间存在近似共线性,假设系数an均为1,b为-1,则X1=1-(X2+X3+…+Xn)。
现举个实际回归模型样例,进一步解释特征多重共线性的影响。对于Y=X1+1000,其中Y为授信额度,X1为消费等级,公式表明当消费等级X1增加1个单位时,授信额度Y也会增加1个单位。假设此模型引入另一个特征变量X2,含义为网购等级,且样本数据分布与X1完全相同,则对于模型Y=X1+1000可变换为Y=0.5X1+0.5X2+1000,此时当X1(消费等级)增加1个单位时,Y(授信额度)仅会增加0.5个单位,这个结果有些不符合实际业务情况,X2(网购等级)在很大程度上减弱了X1(消费等级)的信息价值。从这里可以看出,多重共线性会降低模型某些特征的实际重要性,对模型的预测结果产生不利的影响。
因此,在实际业务场景中,多重共线性会对模型产生较多影响,使得线性模型的方程式精准度下降,标准误差增大,降低某些重要特征的贡献性,甚至使模型输出不符合实际应用的结论。根据特征变量的多重共线性问题,在工作实际场景中经常采用的分析方法是相关系数判断、方差膨胀系数检验,接下来我们分别对其原理逻辑进行阐述。在具体分析过程中,本文采用的样例数据共包含6000条样本和8个特征变量,其中前10条样本如图1所示,详见附件样本数据。

图1 样本数据示例
2、相关系数判断
特征变量之间的相关性系数主要是通过pearson、spearman等指标来衡量,在Python语言中采用corr()函数可以很方便算出特征变量之间的相关性系数,默认输出pearson相关系数。若需要算出spearman相关系数,则需要在函数中定义对应参数,即corr(method=‘spearman’)。
对于pearson、spearman系数的区别,pearson系数反映了数据的线性关系,而spearman并不一定是线性关系。一般情况下,对于连续型线性关系数据或符合正态分布数据,用pearson相关系数是最为合适的,虽然用spearman相关系数也可以,只是效率相比pearson系数较低。但是,对于定序数据,代表了样本数据的等级或顺序的逻辑关系,此时需要采用spearman系数来衡量数据的相关性程度。
在分析pearson、spearman系数时,二者的业务意义是一致的,取值范围均为[-1,1],正值代表正相关,负值代表负相关,绝对值越大,说明变量之间的相关性越强。在实际业务理解中,当系数值在<0.5时,相关性程度较弱;当系数值在0.5~0.7之间时,相关性程度较强;当系数值>0.7时,相关性程度很强。
根据图1数据样例可知,待评估特征变量X1~X6均为连续型数据,因此可以采用pearson、spearman系数来分析各特征的相关性程度,实现代码如图2所示,最终输出的相关系数结果如图3、4所示,当然,我们优先关注pearson系数。

图2 相关性系数代码


图3 pearson系数


图4 spearman系数

以上pearson与spearman的系数结果,第i行第j列的数值代表第i个特征变量与第j个特征变量之间的相关系数。例如,特征X1与特征X2的pearson相关系数为0.189056,pearson相关系数为0.177538,由于取值均小于0.5,说明X1与X2的相关性程度较弱。此外,通过pearson系数与spearman系数的结果对比可知,整体分布规律类似,即变量之间的pearson系数较高时,对应的spearman系数也较高,这也反映了二者有较多相似之处,但在具体应用过程中,需要根据数据的分布类型决定哪个系数更为合适。结合本文数据样例的特征属性,以pearson系数来衡量变量的相关性程度,spearman系数仅作为参考。
由图3的pearson系数结果可以了解到,X2与X6的相关性系数为0.998051,相关性很强,此外相关性强的变量组合还有X3与X4(0.762773)、X3与X5(0.846644)、X4与X5(0.735877),这些变量之间的相关系数均大于0.7,说明相关性程度很强。在实际业务中,此种情况为了避免模型变量多重共线性问题,可以对其中相关性较强的变量进行删除,但是具体删除哪个特征,需要从多个维度分析。例如,特征X2与X6的相关性很强,且各自与其他特征(X1、X3、X4、X5)的相关性均较弱,因此可以考虑根据特征信息值IV进行选择,保留IV值较高的特征。现通过代码实现的特征IV的输出,具体如图5所示:

图5 信息值IV代码

通过以上代码得到各特征变量的IV值如图6所示,对于相关性很强的特征X2与X6,由于IV值比较接近(0.042与0.043),删除其中一个均可;对于相关性也很强的特征X3与X5,由于X3的IV值(0.058)明显大于X5的IV值(0.038),可以直接删除特征X5。当然,在具体场景中,对于变量的选择还可以考虑特征的区分度、覆盖率、业务含义等信息,这里是通过较为常用的IV指标,说明下在特征相关性较强的情况下对变量筛选的思路。

图6 特征IV值

3、方差膨胀系数
方差膨胀系数(Variance Inflation Factor)的计算公式为VIFi=1/(1-Ri2),其中VIFi衡量的是自变量Xi是否与其他自变量具有多重共线性的方差膨胀系数,Ri2是将自变量Xi作为因变量,其他自变量作为特征变量时回归的可决系数,即R-squared值,是用来衡量拟合程度的。当Ri2的取值越大,VIFi值就越大,表示自变量Xi与其他自变量之间的多重共线性较为严重。在实际业务中,一般认为VIFi<10时,该自变量与其余自变量之间的多重共线性不明显;当10<=VIFi<100时,变量之间存在较强的多重共线性;当VIFi>=100时,变量之间存在严重的多重共线性。

在Python中可以通过statsmodels模块的variance_inflation_factor()函数来得到变量之间的方差膨胀系数,如图5所示。

图7 VIF系数代码1

在上图的函数代码中,通过for循环依次算出每个特征变量的方差膨胀系数,并将结果保存至列表中,其中data_X.columns.get_loc(i)返回的是指定列的列序号数字。通过以上代码算出各变量的VIF方差膨胀系数如图8所示。

图8 方差膨胀系数1

从VIF结果来看,特征变量X2与X6的方差膨胀系数都明显大于100,说明变量之间存在严重的多重共线性,这里很容易通过前边分析特征相关性得到的结果来解释,即X2与X6的相关性程度很强(pearson系数=0.998051),此处指标VIF值自然也会很高,进一步说明了特征X2与X6的数据分布很类似。因此,需要删除VIF值较大的特征,但对于X2与X6只需要删除其中一个就可以了,原因是X2与X6的VIF值较大是二者相互导致的,这里删除VIF值最大的变量X6。接着我们看下余下特征的VIF值,具体实现代码与输出结果分别如图9、10所示。

图9 VIF系数代码2


图10 方差膨胀系数2

通过图10的VIF值结果可以看出,当删除特征X6之后,其余特征的方差膨胀系数VIF都低于10,说明这些特征变量的多重共线性较弱,满足业务场景需求,从而较大程度地降低了最终模型可能出现的共线性问题。
综上所述,对于线性回归、逻辑回归等以线性方程表达式为基础的机器学习模型,在数据建模过程中,需要特别关注多重共线性的影响。如果特征变量之间存在较强的多重共线性,必须采取相应处理方法,例如可以删除某个引起多重共线性的特征变量等,尤其是方差膨胀系数的检验,这是实际业务场景中对于判断多重共线性最常用的方法。
为了便于大家对特征变量多重共线性处理方法的理解与掌握,我们准备了具体的样本数据集与Python代码,供各位小伙伴实操练习,详情请大家移步至知识星球查看相关内容。


~原创文章

实操|特征变量多重共线性的分析与检验(含代码)相关推荐

  1. 超全万字汇总!科研论文绘图实操干货!11类Matplotlib图表,含代码

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 Matplotlib 是一个 Python 的 2D绘图库, ...

  2. 不同类型特征变量之间相关性分析

    站在2022的第一天想说点啥总结却迟迟不知道该如何下笔,年前的立的各种风控技能Flag还没一一勾除又有新的Flag要立,风控人不容易-不管怎样,学习总是必要的,今天带来番茄风控2022年第一篇实操干货 ...

  3. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  4. 医疗器械系统测试用例编写实操(二)流程图分析法

    一.流程分析法设计用例步骤 画出业务流程图 设置功能路径优先级 确定测试路径 选取测试数据 构造测试用例 二.图解业务流程图分析法 三.流程分析法例子 四.流程分析实操 功能背景:CT器械用于医院设备 ...

  5. ML实操 - 贷款用户逾期情况分析

    目录 任务描述 实现过程 基本思路 1. 数据集预览 2. 数据预处理 3. 特征工程 4. 模型选择 4.1 数据及划分及数据归一化 4.2 LR 4.3 SVM 4.4 决策树 4.5 Xgboo ...

  6. Flink实操 : 广播变量/累加器/分布式缓存

    . 一 .前言 二 .广播变量使用 2.1.前言 2.2. 使用 三 .累加器 3.1. 前言 3.2. 使用 四 .分布式缓存 4.1. 前言 4.2.使用 一 .前言 二 .广播变量使用 2.1. ...

  7. 【Kubernetes】k8s网络概念和实操详细说明【calico网络】【含docker不同容器网络互通配置,k8s网络互通配置】【1】

    文章目录 calico网络之间通信配置[docker容器互通流程配置] calico网络原理分析 一.Calico基本介绍 二.Calico结构组成 三.Calico 工作原理 四.Calico网络方 ...

  8. 手把手教你实操部署FISCO BCOS联盟链(附每一步代码)

    感谢FISCO BCOS社区贡献者--刘海锋,贡献此文. 贡献无大小,分享永留传.谢谢你们的每一次贡献.最后,如果你也想成为Mr.FISCO BCOS,一起干出点改变世界,到老了可以跟孙辈们吹吹牛的事 ...

  9. 强化学习代码实操和讲解(一)

    强化学习代码实操 写在最前面 总体思路 背景介绍 重点代码解析 环境设置 reset函数设置 act函数设置 step函数 杂项代码解析 simulate函数 figure_2_2:对比ε的作用 fi ...

最新文章

  1. java导包及注意事项_STS导项目的顺序及注意事项
  2. sklearn下的ROC与AUC原理详解
  3. C++中ASCII、unicode与Utf8之间的相互转化
  4. AWS 专家教你使用 Spring Boot 和 DJL ,轻松搭建企业级机器学习微服务!
  5. IDEA 惊天 bug:进程已结束,退出代码 1073741819
  6. 学习 | Spring Cloud Config 从入门到精通
  7. 威马汽车否认接盘ST众泰:没有任何兴趣参与
  8. Golang的cookie
  9. 简述数字电路在计算机的应用,数字电路应用举例
  10. java gbk转机内码_\xd5\xd2\xb2\xbb\xb5\xbd\xd6 gbk内码转中文方法
  11. Dr_can模型预测控制笔记与代码实现
  12. 收获与期待——2016第四届中国计算机行业发展成就奖揭晓
  13. jTopo的基本使用
  14. 几分钟就可做出的酷炫PPT动画效果
  15. 用matlab绘制圆锥曲线,如何用几何画板绘制圆锥曲线?
  16. python二元一次方程组用鸡兔同笼的思路来写编程_3应用二元一次方程组——鸡兔同笼教学设计...
  17. 明尼苏达双城大学计算机排名,明尼苏达大学双城分校排名
  18. 国产硬件防火墙横向对比
  19. CSS 单(多)行文本超过部分显示省略号,解决数字或英文不换行问题
  20. 字母对应的日期 moment Element JAVA oracle mysql的日期格式

热门文章

  1. javascript进行hex、base64、bytes[]、string的互转
  2. java程序调试步骤
  3. 一种生成和验证基于DRR算法的用于优化使用计算机放射成像系统获得的胸片的计算机模拟方法
  4. 面试官:一个 TCP 连接可以发送多少个 HTTP 请求?问倒一大片。。。
  5. Linux C 输入输出重定向
  6. Unity3D引擎之高级渲染技术
  7. Office365 Exchange Hybrid No.23 共享日历
  8. 金融危机下毕业生的16条忠告
  9. HTTP Status 405 - JSPs only permit GET POST or HEAD
  10. 构建显示全年日历的SQL