去除多重共线性的5种方法,你学废了嘛?

article/2025/9/19 23:56:38

什么是多重共线性呢?

就是回归模型多个特征之间具有很强的相关性。

多重共线性,听起来很就很严重,其实没有很大的危害,只是容易过拟合,或者导致模型无法解释。尤其是在实际项目中,我们需要解释模型的特征对目标变量的影响时,最好要消除多重共线性。

本文就说说怎么去除多重共线性,这里随手找到一份数据,是“快乐星球指数”,显示不同国家国民的幸福指数。

选取的特征有多个维度:寿命,福利,生态碳足迹,GDP,人口等,假如我们需要预测HappyPlanetIndex,而且模型需要可解释,那么怎么选择特征呢?

这里列出5种方法去除共线性特征:

目录

    • 定性分析
    • 相关系数热力图
    • 方差膨胀系数VIF
    • PCA分析
    • 基于相关系数的迭代法

本文技术工具来自技术群小伙伴的分享,想加入按照如下方式

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群+CSDN

file ='data/hpi.csv'
df = pd.read_csv(file)
feature_cols= ['AverageLifeExpectancy','AverageWellBeing','HappyLifeYears','Footprint','InequalityOfOutcomes','InequalityAdjustedLifeExpectancy','InequalityAdjustedWellbeing','GDPPerCapita','Population','HappyPlanetIndex']
num_df = df[feature_cols]

定性分析

该方法用于定性分析,画出散点图,可以直观的看到每两个特征对的相关性。

如果出现一条完美线性直线,那就保留一个特征即可。

如果相关性太强,也可以只保留一个。

g= sns.pairplot(num_df)

在这里插入图片描述

相关系数热力图

这里就是定量分析了,我们可以设定一个阈值,比如0.6。

当相关系数的绝对值大于这个阈值的时候,我们就认定为多重共线性,可以多选一。

fig, ax = plt.subplots(figsize=(10,10)) 
heatmap = sns.heatmap(num_df.corr(), vmin=-1, vmax=1, annot=True,ax=ax)

在这里插入图片描述

方差膨胀系数VIF

方差膨胀系数(variance inflation factor,VIF)是衡量多元线性回归模型中复 (多重)共线性严重程度的一种度量。它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。怎么计算呢?假如我们有5个特征,我们可以用其中的4个特征,去拟合最后一个特征,如果拟合的效果越好(r方越接近100%),那么说明这4个特征里面有“近亲”。

1/(1- R2)就是VIF。

  • 经验值来看,VIF大于1小于5,一般可以人为没有多重共线性问题。

  • 如果是大于5,小于10,勉强接受。

  • 如果大于10,那就要考虑删除一些特征了。

可以直接调用statsmodels模块里面的variance_inflation_factor函数直接计算VIF.

但是这个VIF计算会有bug,因为statsmodels的线性回归算法默认不包含截距信息(intercept),从而导致VIF计算偏大。

所以建议采用修正版的计算公式,这里我写了两个版本,一个是基于sklearn的,一个是基于statsmodels的。

def variance_inflation_factor_sm_corr(exog, exog_idx):k_vars = exog.shape[1]exog = np.asarray(exog)x_i = exog[:, exog_idx]mask = np.arange(k_vars) != exog_idxx_noti = exog[:, mask]r_squared_i = OLS(x_i, sm.add_constant(x_noti)).fit().rsquaredvif = 1. / (1. - r_squared_i)return vifdef variance_inflation_factor_sklearn(exog, exog_idx):k_vars = exog.shape[1]exog = np.asarray(exog)x_i = exog[:, exog_idx]mask = np.arange(k_vars) != exog_idxx_noti = exog[:, mask]r_squared_i = LinearRegression(fit_intercept=True).fit(x_noti, x_i).score(x_noti, x_i)vif = 1. / (1. - r_squared_i)return vifdef calc_vif(df,method='all'):    vif_data = pd.DataFrame()vif_data["feature"] = df.columnsif method == 'sm_corr':vif_data["VIF"] = [variance_inflation_factor_sm_corr(df.values, i)for i in range(len(df.columns))]elif method == 'sklearn':vif_data["VIF"] = [variance_inflation_factor_sklearn(df.values, i)for i in range(len(df.columns))]elif method == 'sm':vif_data["VIF"] = [variance_inflation_factor(df.values, i)for i in range(len(df.columns))]else:vif_data["VIF_sm_corr"] = [variance_inflation_factor_sm_corr(df.values, i)for i in range(len(df.columns))]vif_data["VIF_sklearn"] = [variance_inflation_factor_sklearn(df.values, i)for i in range(len(df.columns))]vif_data["VIF_sm"] = [variance_inflation_factor(df.values, i)for i in range(len(df.columns))]return vif_data
calc_vif(num_df,method='all')

在这里插入图片描述

PCA分析

有一种消除多重共线性的方法是采用PCA分析,但是缺点也是明显了,PCA得到的已经不是原有的特征了,更不利于模型的解释。

pca = PCA(n_components=4)
pca.fit(sel_df)
percent_var_explained = pca.explained_variance_/(np.sum(pca.explained_variance_))
cumm_var_explained = np.cumsum(percent_var_explained)

基于相关系数的迭代法

这个思路很简单,就是基于相关系数,优先选取最小的一对特征,然后去除和它们相关的特征,直至筛选完所有的特征。这里我写了一个函数,用于迭代。

def get_best_feature_couple(df,threshold=0.8):corr_matrix = df.corr().abs()best_couple = df.corr().abs().stack().idxmin()best_value = df.corr().abs().min().min()if best_value <threshold:high_corr_col = []for i in best_couple:c = corr_matrix[i]high_corr_col += list(c[c>threshold].index)else:best_couple = []high_corr_col = []low_corr_col = [i for i in df.columns if i not in high_corr_col]return best_couple,low_corr_coldef feature_selection_by_corr(df,corr_threshold=0.4):mask = []while True:best_couple,low_corr_col = get_best_feature_couple(df,threshold=corr_threshold)if len(best_couple) > 0:mask += best_coupleif len(low_corr_col) >=2:df = df[low_corr_col]elif len(low_corr_col) ==1:mask += low_corr_colbreakelse:breakreturn mask

在这里插入图片描述

feature_cols = feature_selection_by_corr(num_df,corr_threshold=0.8)
fig, ax = plt.subplots(figsize=(10,10)) 
heatmap = sns.heatmap(num_df[feature_cols].corr(), vmin=-1, vmax=1, annot=True,ax=ax)

总结

以上就是对共线性特征筛选的5种方法,学会了吗?


http://chatgpt.dhexx.cn/article/7ueSpysc.shtml

相关文章

特征共线性问题

多重共线性是使用线性回归算法时经常要面对的一个问题。在其他算法中&#xff0c;例如决策树或者朴素贝叶斯&#xff0c;前者的建模过程时逐渐递进&#xff0c;每次都只有一个变量参与&#xff0c;这种机制含有抗多重共线性干扰的功能&#xff1b;后者假设变量之间是相互独立的…

多重共线性问题的几种解决方法

在多元线性回归模型经典假设中&#xff0c;其重要假定之一是回归模型的解释变量之间不存在线性关系&#xff0c;也就是说&#xff0c;解释变量X1&#xff0c;X2&#xff0c;……&#xff0c;Xk中的任何一个都不能是其他解释变量的线性组合。如果违背这一假定&#xff0c;即线性…

多重共线性问题如何解决?

​ 一、多重共线性说明 多重共线性一般是指&#xff1a;如果有两个或者多个自变量高度相关&#xff08;相关系数大于0.8&#xff09;&#xff0c;难以区分一个自变量对因变量的影响和作用&#xff0c;将自变量相关性产生的后果定义为多重共线性&#xff0c;一般提出多重共线性…

多重共线性如何分析?

判断标准 常见的直观判断方法共有四个&#xff0c;如下&#xff1a; &#xff08;1&#xff09;某些自变量的相关系数值较大&#xff08;比如大于0.8&#xff09;等&#xff0c;可以利用pearson相关系数检验法一般是利用解释变量之间的线性相关程度判断&#xff0c;一般标准是…

多元回归自变量存在共线性

多重线性回归要求各个自变量之间相互独立&#xff0c;不存在多重共线性。所谓多重共线性&#xff0c;是指自变量之间存在某种相关或者高度相关的关系&#xff0c;其中某个自变量可以被其他自变量组成的线性组合来解释。 医学研究中常见的生理资料&#xff0c;如收缩压和舒张压…

多重共线性

1.回归模型自变量彼此相关称为多重共线性&#xff0c;它给模型提供重复信息 2.多重共线性会造成模型不稳定&#xff0c;可能会得到无法解释的现象 3.检测共线性的方法通常有相关性分析&#xff0c;显著性检验和方差膨胀因子分析 4.处理共线性的方法通常有提前筛选变量&#xff…

多重共线性的影响、判定及消除的方法

目录 1 什么是多重共线性&#xff1f; 2 多重共线性的影响 3 共线性的判别指标&#xff08;方差膨胀因子&#xff09; 3.1 拟合优度 3.2 方差膨胀因子VIF 4 多重共线性处理方法 4.1 手动移除出共线性的变量 4.2 逐步回归法 4.2.1 向前法 4.2.2 后退法 4.2.3 逐步选…

如何处理多重共线性问题

一、说明 当回归模型中两个或者两个以上的自变量高度相关&#xff08;比如相关系数大于0.7&#xff09;时&#xff0c;则称为多重共线性。虽然在实际分析中&#xff0c;自变量高度相关是很常见的&#xff0c;但是在回归分析中存在多重共线性可能会导致一些问题&#xff0c;比如…

谈多重共线性

谈多重共线性 本文主要讨论古典假定中无多重共线性被违反的情况&#xff0c;主要情况包括多重共线性的实质和产生的原因、后果、检验方法及无多重共线性假定违反后的处置方法。 第一节 什么是多重共线性 一、多重共线性的含义 讨论多元线性回归模型的估计时&#xff0c;强调…

多重共线性详解

目录 解释变量与自变量&#xff0c;被解释变量与因变量 1、多重共线性的现象 2、出现的原因 3、判别标准 4、检验方法 5、多重共线性有什么影响 6、多重共线性处理方法 7、其他说明 8、多重共线性识别-python代码8.1、vif检验8.2 相关系数8.3 聚类 9、宏观把握共线性问题9.1、共…

浅谈共线性的产生以及解决方法(中篇——今生)

浅谈共线性的产生以及解决方法(中篇——今生) 上篇我们讲到共线性概念以及共线性问题存在时对模型的影响。那么如何对样本数据中存在的共线性问题进行诊断呢&#xff1f; 3 多重共线性的诊断方法 3.1 相关系数法 对于一个样本数据集&#xff0c;我们要了解解释变量&#xf…

共线性那些事儿

我们经常听说&#xff0c;建模时应当尽量避免共线性&#xff08;collinearity&#xff09;&#xff0c;共线性会导致参数估计不稳定、模型不可靠等等。那么共线性究竟有多可怕&#xff1f;共线性具体会带来什么问题&#xff1f;共线性得到的模型是否真的不行&#xff1f;笔者通…

多元线性模型中共线性产生的原因解析

在很多书籍中谈到了共线性问题&#xff0c;作为多元统计中基本假设之一&#xff0c;却经常被违背&#xff0c;影响模型稳定性和统计power。在不少的论文中谈到了&#xff0c;国内的很多书籍往往一笔带过。因为&#xff0c;属于统计计算领域内容&#xff0c;非专业人士&#xff…

好好谈谈共线性问题

好好谈谈共线性问题 马东什么 算法工程师 8 人 赞同了该文章 共线性&#xff0c;即 同线性或同线型。统计学中&#xff0c;共线性即 多重共线性。 多重共线性&#xff08;Multicollinearity&#xff09;是指线性回归模型中的解释变量之间由于存在精确 相关关系或高度相关关系而…

树莓派中SIM7600G-H 4G DONGLE模块使用记录(一)PPP拨号上网/4G上网

项目场景&#xff1a; 如何使用SIM7600系列的4G通信模块进行PPP网上拨号以实现4G通信&#xff0c;在讲解前&#xff0c;未搭建好树莓派远程连接桌面的读者可以先转向树莓派4B环境搭建电脑远程连接打开文件管理闪退(上)。 模块简介&#xff1a; SIM7600X 4G DONGLE是一款工业级…

Linux系统下使用4G模块EC20实现拨号上网

驱动的实现过程 实现4G功能分为两步,第一步内核能成功识别出该设备,第二步实现拨号上网.最后提一下自带的定位功能 一.添加内核USB驱动 这里直接使用内核已经存在的USB驱动,只需要让内核能识别出该USB设备,并自动加载驱动生成对应的/devUSB*设备节点 获取EC20的PID和VID 把模块…

4G模块适配与调试

笔记目录 RK平台4G模块适配1、识别VID、PID2、添加VID\PID到android的option驱动中3、插上sim卡&#xff0c;4G模块一定要接上天线4、根据安卓系统和安卓版本发给模块厂要求其提供ril库5、预置ril库6、在framework中添加根据pid和vid关联ril库的代码7、可以通过一下命令查看ril…

Linux 4G模块pppd拨号上网脚本解析

在编写脚本之前&#xff0c;要先安装好ppp相关驱动&#xff0c;pppd 已知pppd位于 /usr/sbin , chat 位于 /usr/sbin , options 位于 /etc/ppp 。 要编写脚本&#xff0c;就要切换目录到 /etc/ppp/peers&#xff0c;若没有peers目录则自行创建。因为是在/etc目录之下&#xf…

4G模块的使用

一、&#xff14;G相关知识 4G是第四代通讯技术。能够传输高质量视频图像。4G的下载速度达100Mbps&#xff0c;比目前的拨号上网快2000倍&#xff0c;上传的速度也能达到20Mbps&#xff0c;并能够满足几乎所有用户对于无线服务的要求。此外&#xff0c;4G可以在DSL和有线电视调…

4G模块使用总结

4G模块使用总结 一、APN名称 2G: 移动的CMWAP 联通的UNIWAP 移动的CMNET 联通的UNINET 3G/4G: 移动CMNET 联通3GNET 电信CTNET 二、模块信息参数获取 AT/r //检测串口通信状态 ATE设置回显功能 ATE0:回显关闭 ATE1:回显开启 ATCGMI 返回模块厂家信息 ATCGMM 返回模块型…