跳至主要内容

回归中的多重共线性:数据科学家指南

揭示多重共线性对回归模型的影响。学习检测多重共线性的方法,保持模型可靠性,并用实用方案加以解决。
· 9分钟 阅读

使用 AI 探索

构建高效回归模型的主要挑战之一就是所谓的多重共线性。Multicollinearity 指的是模型中的两个或多个自变量高度相关,导致统计推断不可靠。如果您需要准确解读回归系数,或检验对它们的置信度,这都会成为一个大问题。

在本文中,我将带您了解多重共线性的关键概念、如何检测它,以及如何应对它。如果您刚接触线性回归,请先阅读我们的教程 Simple Linear Regression: Everything You Need to Know 作为起点,同时务必继续学习 Multiple Linear Regression in R: Tutorial With Examples,它讲解了包含多个自变量的回归——这正是多重共线性可能出现的地方。 

什么是多重共线性?

构建准确的机器学习模型颇具挑战,因为影响因素众多。数据应具备足够的质量、规模等。然后您需要构建合适的机器学习算法。不过,在两者之间有一个数据准备阶段,虽然不如构建预测模型那样吸引眼球,但往往是机器学习生命周期成败的关键。

在数据准备阶段,我们要留意多重共线性——当回归模型中的自变量彼此相关时,就说明它们并非相互独立。这对模型而言不是好迹象,因为多重共线性常常会扭曲回归系数的估计、放大标准误,从而降低模型的统计效力,也使得衡量模型中各变量的重要性变得困难。

多重共线性的类型

多重共线性主要有两种形式,它们影响回归模型中自变量的相互作用方式,以及所得估计的可靠性。

完全多重共线性

当模型中的某个自变量可以由一个或多个其他自变量精确预测时,就发生了完全多重共线性。这意味着它们之间存在完全的关系。

设想您有两个变量 X1 和 X2,且满足方程:X1 = 2*X2 + 3,这基本意味着回归模型无法区分 X1 和 X2 的效应,因为它们本质上在讲同一个故事。换言之,一个变量是另一个变量的完美线性函数。

不完全多重共线性

在不完全多重共线性中,变量高度相关,但不像完全多重共线性那样一一对应。变量可能具有很高的相关性,意味着当一个变量变化时,另一个变量也倾向于变化,但这种关系并非精确预测。

在这种情况下,并不是说模型无法给出结果。问题在于结果可能不稳定,也就是数据的微小变化可能导致估计系数的大幅波动,这使得可靠地解释各变量的重要性更加困难。

结构性多重共线性

结构性多重共线性源自模型构建方式,而非变量之间的自然关系。这通常发生在模型中包含交互项或多项式项时。

例如,如果您认为一个变量的效应会随另一个变量的增加而增强,您可能会加入一个交互项。但如果这些变量本来就有一定相关性,加入交互项可能会“加码过头”,引发多重共线性问题。

回归中的多重共线性

多重共线性会在您试图估计自变量(预测因子)与因变量(结果)之间关系时制造麻烦。具体来说,它会增加系数估计的方差,使其对模型或数据的微小变化非常敏感。 

当系数变得不稳定时,标准误会变大,进而即使变量确实重要,也可能出现不显著的 p 值。需要注意的是,多重共线性并不影响模型的整体预测能力,但会影响模型的可解释性,因为误差被放大且估计不稳定。

如何检测多重共线性

检测多重共线性需要多种诊断工具。我们将使用 Kaggle 上住房价格竞赛数据集的一个子集来演示。我们使用的数据子集可在 此 GitHub 仓库 获取。使用下面的代码加载并探索数据集: 

import pandas as pd
import numpy as np
import seaborn as sns
from statsmodels.stats.outliers_influence import variance_inflation_factor

df = pd.read_csv('mc_df.csv')
df.head()

相关矩阵

检测多重共线性的一种常用方法是查看相关矩阵,它有助于可视化变量之间关系的强度。该矩阵显示变量两两之间的相关系数,反映它们线性关系的强弱(取值范围为 -1 到 1)。一个我常用的经验法则是,相关系数的绝对值大于 0.6 表示存在较强的多重共线性。

由于多重共线性是针对自变量检测的,我们需要从数据集中移除目标变量 SalePrice。可用下面的代码完成。

multi_c_df = multi_c_df.drop('SalePrice', axis=1)

现在我们可以进行相关性分析了。下面的代码计算数据框 multi_c_df 的相关矩阵。计算完成后,代码使用 Seaborn 的 heatmap() 函数将相关矩阵可视化为热图。参数 annot=True 会在热图上直接标注数值相关系数。 

# Correlation matrix
correlation_matrix = multi_c_df.corr()

# Set up the matplotlib figure
plt.figure(figsize=(10, 6))

# Create a heatmap for the correlation matrix
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f", linewidths=0.5)

# Title for the heatmap
plt.title("Correlation Heatmap", fontsize=16)

# Show the heatmap
plt.show()

以热图展示的相关矩阵。图片来源:作者

上面的输出显示部分自变量之间存在相关性。例如,BedroomAbvGr 与 TotRmsAbvGrd 的相关性较高(0.68)。此外,GarageCars 与 OverallQual 的相关性为 0.60,表明它们也有关联。因此,一些自变量之间存在相当程度的相关性,提示这些变量(至少部分变量)存在多重共线性。

此时需要特别注意,即使变量之间没有明显的两两相关性,也可能出现多重共线性,因为某个变量可能与多个其他变量的线性组合相关。这就是为什么还要考虑方差膨胀因子,下一节我们将介绍它。  

方差膨胀因子(VIF)

方差膨胀因子(VIF)是检测多重共线性最常见的技术之一。简单来说,它用一个数值来表示某个回归系数的方差因多重共线性被放大了多少。VIF 大于 5 表示中度共线性,而大于 10 则表示严重共线性。

让我们在数据集中进行计算。我们将为每个自变量计算 VIF 值。下面的代码使用 variance_inflation_factor() 函数来完成这一任务。

# Calculate VIF for each numerical feature 
vif_data = pd.DataFrame()
vif_data["feature"] = multi_c_df.columns

# Calculate VIF and round to 4 decimal places
vif_data["VIF"] = [round(variance_inflation_factor(multi_c_df.values, i), 4) for i in range(df.shape[1])]

# Sort VIF values in descending order
vif_data = vif_data.sort_values(by="VIF", ascending=False)

# Display the VIF DataFrame
print(vif_data)

数值变量的 VIF 值。图片来源:作者

您可以看到有多个变量的 VIF 值大于 10,表明存在多重共线性。

条件指数

条件指数也是一种用于检测多重共线性的诊断工具,数值超过 10 表示中度共线性,而超过 30 表示严重共线性。条件指数通过考察特征值之间的关系,来检查自变量彼此之间的相关程度。

下面的代码计算条件指数以检查回归模型中的多重共线性。它首先计算相关矩阵(反映变量之间关系)的特征值。然后用最大特征值除以最小特征值,得到条件指数。 

from numpy.linalg import eigvals

# Calculate the condition index
eigenvalues = eigvals(correlation_matrix)
condition_index = max(eigenvalues) / min(eigenvalues)

print(f'Condition Index: {condition_index}')

在我们的例子中,条件指数为 13,表明模型存在中度多重共线性。虽然根据条件指数判断其程度并不算严重,但仍可能影响回归系数估计的精度,并使区分相关变量各自的贡献更加困难。如果您想进一步了解特征值,请阅读我们的文章 Eigenvectors and Eigenvalues: Key Insights for Data Science。

如何应对多重共线性

为在回归模型中有效管理多重共线性,可以采用多种技术。这些方法有助于在自变量彼此紧密相关时,仍保持模型的准确性和可解释性。

移除冗余预测变量

最简单的应对方法之一是直接移除高度相关的变量中的一个,通常是 VIF 最高的那个。这种方法有效,但若处理不当会丢失有用信息。

合并变量

另一种方法是当两个或多个变量高度相关时,可使用主成分分析(PCA)等技术将其合并为一个预测因子。这在保留关键信息的同时降低模型维度。其主要缺点是可解释性下降,因为很难向非技术受众解释 PCA 背后的原理与数学。

岭回归与套索回归

对于数据科学家而言,使用岭回归和套索回归等正则化技术也是处理多重共线性问题的常用方法。这些正则化方法对回归模型施加惩罚,从而收缩相关变量的系数,减轻多重共线性的影响。

常见错误与最佳实践

处理多重共线性时,有一些常见错误会导致模型表现不佳。了解这些误区并遵循最佳实践,有助于构建更可靠的回归模型。

误解高 VIF 值

当您看到某个变量的方差膨胀因子(VIF)很高时,往往会立刻将其从模型中移除,认为它导致了多重共线性。然而这可能是错误的,因为即便某个变量的 VIF 很高,它仍可能对预测结果非常重要。如果不先检查其重要性就移除它,模型表现可能更差。关键是在移除之前认真评估该变量是否必不可少。

过度依赖相关矩阵

相关矩阵是识别变量关系强度与方向的有用工具,但问题在于它只展示线性关系。那么复杂的非线性关系怎么办?很遗憾,矩阵无法捕捉到。因此,单靠相关矩阵无法给出完整图景。这就是为什么需要结合 VIF 和条件指数等指标,获得更全面的认识。

处理多重共线性的替代方法

除传统方法外,还有多种先进方法可用于处理多重共线性问题。下面讨论其中的一些技术。

特征选择方法

自动化的特征选择方法(如递归特征消除,RFE)是不錯的替代方案。这些方法会分析每个预测因子的贡献,并自动移除价值不高的变量。这样可以简化流程,让您无需手动决定去除哪些变量,也能降低多重共线性。

收集更多数据

增加样本量可以通过为数据集引入更多变异来降低多重共线性,使区分不同预测因子的贡献更容易。因此,另一种解决办法就是收集更多数据。数据集变大后,变量的变异性增加,更易区分不同预测因子的效应,从而减轻多重共线性的影响。

结论

理解并解决多重共线性对于构建稳健且可解释的回归模型至关重要。通过使用 VIF、相关矩阵和条件指数等技术检测多重共线性,并采用 套索与岭回归 或移除冗余预测因子等方法加以处理,您就能确保模型结果可靠且有意义。在回归建模时务必检查多重共线性,并采取适当的解决方案,以维护分析结果的完整性。

若想进一步学习并复习如何在您常用的工作环境中进行线性回归,建议参考以下资源:

Vikash Singh

作者

Vikash Singh

在数据科学、人工智能、分析与数据战略方面经验丰富的专业人士。

关于多重共线性的常见问题

什么是多重共线性?

多重共线性是指回归模型中的两个或多个自变量高度相关。

什么是方差膨胀因子(VIF)?

VIF 衡量回归系数的方差因多重共线性而被放大的程度。高 VIF 表示某变量与其他变量高度相关,可能使模型不稳定、可靠性下降。

多重共线性如何影响我的回归模型?

多重共线性会放大回归系数的标准误,使得更难判断哪些变量显著。

完全与不完全多重共线性有何区别?

完全多重共线性发生在一个变量是另一个变量的精确线性组合时,此时无法计算模型系数。相比之下,不完全多重共线性是变量高度相关但并非精确关系,不过也会导致模型估计不稳定。

条件指数如何帮助检测多重共线性?

如果条件指数高于 10,表示中度共线性;若高于 30,则表示严重共线性。

主题