怎么利用Python快速发现数据集的多重共线性_计算VIF方差膨胀因子与热力图分析

陌晨大大_8172

陌晨大大_8172

2026-04-28

735人浏览

原创

使用statsmodels计算VIF前必须先用sm.add_constant()显式添加截距项,否则variance_inflation_factor会误将第一列当截距导致结果错误;VIF>5提示中度共线性,>10需排查,但高VIF不等于模型失效,且仅适用于OLS类模型。

怎么利用python快速发现数据集的多重共线性_计算vif方差膨胀因子与热力图分析

用 statsmodels 计算 VIF 前必须处理截距项

直接对原始特征矩阵调用 variance_inflation_factor 会报错或结果失真,因为该函数默认假设设计矩阵已包含常数项(截距)。如果你的数据没有显式添加截距列,statsmodels.stats.outliers_influence.variance_inflation_factor 会把第一列当作截距,导致后续所有 VIF 计算错误。

正确做法是:先用 sm.add_constant() 显式添加截距,再传入每列(不含常数列)单独计算:

import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
<p>X = df[feature_cols]  # 不含目标变量,也不含常数列
X_with_const = sm.add_constant(X)  # 添加 const 列
vif_data = pd.DataFrame()
vif_data["feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X_with_const.values, i + 1) 
for i in range(len(X.columns))]  # i+1 跳过 const 列(索引为 0)
</p>
  • VIF > 5 通常提示中度共线性,> 10 强烈建议排查
  • 不要对 const 列本身计算 VIF —— 它没意义
  • 如果用 sklearn 预处理过数据(如标准化),VIF 值不变,但解释时仍以原始尺度为准

热力图里 corr() 默认不处理非数值列,且缺失值会静默丢弃

df.corr() 只保留全部为数值的列,遇到 object 或 category 类型列会直接跳过,不报错也不提醒。更隐蔽的问题是:只要某两列在相同行存在任一 NaN,corr() 就按 pairwise 方式剔除该行——这可能导致不同变量对之间的相关系数基于不同样本量计算,热力图颜色失去横向可比性。

稳妥做法是显式清洗并限定方法:

import numpy as np
numeric_df = df.select_dtypes(include=[np.number]).dropna()  # 先筛再删,避免隐式行为
corr_matrix = numeric_df.corr(method='pearson')  # 明确指定 method,避免未来版本变更影响
  • 别依赖 df.corr().abs() 后直接画图 —— 绝对值会掩盖负向强相关(比如 X1 和 X2 高度负相关,和 Y 的关系可能完全相反)
  • 热力图配色建议用 sns.heatmap(..., center=0),让 0 附近的变化更清晰
  • 若变量量 > 30,加 annot=False,否则数字重叠看不清

高 VIF 不一定等于模型失效,但会放大系数估计的方差

VIF 是线性回归中衡量“某个特征被其余特征解释程度”的指标,它不直接判断预测能力好坏。一个变量 VIF 很高,但若它本身与目标变量强相关,移除后 R² 可能反而下降;反之,VIF 低的变量也可能因测量噪声大而实际贡献微弱。

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 优先检查高 VIF 变量是否语义重复(例如同时有 age_in_years 和 age_in_days)
  • 尝试用 PCA 或岭回归替代删除变量 —— 尤其当所有高 VIF 变量都业务关键时
  • 注意:逻辑回归、树模型不受 VIF 影响,VIF 仅对最小二乘类估计器(OLS、Ridge、Lasso 回归系数解释)有诊断价值

一键生成带阈值标记的 VIF 报告和相关热力图

把上面逻辑封装成函数,避免每次重复写 add_constant 和循环。重点在于返回可读性强的结果,而不是炫技:

def diagnose_multicollinearity(df, features, vif_thresh=5, corr_thresh=0.7):
    X = df[features]
    X_const = sm.add_constant(X)
    vifs = [variance_inflation_factor(X_const.values, i+1) for i in range(len(features))]
<pre class="brush:php;toolbar:false;">vif_df = pd.DataFrame({"feature": features, "VIF": vifs})
high_vif = vif_df[vif_df["VIF"] > vif_thresh]

corr = X.corr().abs()
high_corr_pairs = [(i, j) for i in corr.index for j in corr.columns 
                  if i != j and corr.loc[i, j] > corr_thresh and i  {}: ".format(vif_thresh), list(high_vif["feature"]))
print("⚠️  |corr| > {}: ".format(corr_thresh), high_corr_pairs)
return vif_df, corr

调用

vif_result, corr_mat = diagnose_multicollinearity(df, ["x1", "x2", "x3", "x4"])

这个函数输出两件事:哪些变量 VIF 超限,哪些变量对相关性过强。它不自动删变量、不拟合模型、不画图——因为决策必须由人做,工具只负责暴露事实。

真正容易被忽略的是:VIF 对异常值敏感,单个离群样本可能让某个变量 VIF 突然飙升到 20+。做诊断前,先用箱线图或 zscore 粗筛一下数值特征的分布。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4524

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26577

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3227

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习