高相关特征直接破坏线性模型数值稳定性,当| r | > 0.95时,XᵀX接近奇异导致条件数爆炸、权重估计失真甚至溢出;树模型则因分裂优先级争夺而使feature_importances_失真,需结合VIF>5、业务含义、缺失率及RFE迭代综合判断删除策略。

高相关特征直接破坏线性模型的数值稳定性
当 df.corr() 显示两列相关系数 > 0.95,比如 price 和 discounted_price,它们在矩阵求逆(如线性回归的正规方程解 (XᵀX)⁻¹Xᵀy)中会导致 XᵀX 接近奇异——条件数爆炸,浮点计算误差被放大,权重估计剧烈震荡甚至溢出。这不是“效果差”,而是解本身不可靠。
- 典型现象:
LinearRegression.coef_输出里出现1e+12或nan;训练损失在迭代中忽高忽低 - 树模型虽不直接受影响,但高相关特征会争夺分裂优先级,导致重要变量被挤出,
feature_importances_失真 - 别只看单对相关性:三个变量 A-B、B-C 高相关,A-C 却未超阈值,这种“传递冗余”仍会抬高 VIF 值
热力图只是表象,真正要查的是多重共线性
seaborn.heatmap(df.corr()) 只反映两两线性关系,而模型崩溃常源于多个特征联合解释同一信息。必须用 statsmodels.stats.outliers_influence.variance_inflation_factor 计算每个特征的 VIF 值:
- VIF > 5 表示该特征被其他特征显著冗余解释,应优先移除
- 计算前务必用
dropna=True,否则缺失值处理不一致会让 VIF 失真 - 不要对原始数据直接算 VIF:分类变量需先
pd.get_dummies(),否则corr()会误把标签编码当连续值
删特征不能只看热力图颜色深浅
热力图上 abs(corr) > 0.95 的红色区块,只是筛选起点。实际删除逻辑得结合业务和模型反馈:
- 保留业务含义更强的变量,比如
user_age比衍生的age_group更可控 - 优先删缺失率高的那个,
df[col].isnull().mean()超过 10% 就危险 - 用
sklearn.feature_selection.RFE迭代剔除对模型贡献最小的高相关变量,比硬阈值更鲁棒 - 删完立刻重跑
df.corr()—— 有时删掉一个,原本不显眼的第三变量突然和剩下变量强相关,得循环检查
热力图配置错误会让问题更难发现
如果你的热力图没显示数字或颜色发灰,可能根本没看出真实相关性强度:
立即学习“Python免费学习笔记(深入)”;
- 缺
annot=True:只看颜色深浅容易误判,0.87和0.93在图上差异极小,但对模型影响天壤之别 - 没设
cmap="coolwarm":默认色阶非对称,-0.9和0.9颜色接近,负相关风险被掩盖 - 用了
method='spearman'却没处理离散变量:对类别型字段强行排序秩次,结果无业务意义 - 忘了
numeric_only=True:Pandas 新版本下,自动跳过疑似非数值列,corr()返回的矩阵列数变少,你还以为数据干净


















