一文带您理解多重共线性:检测和纠正多重共线性

一文带您理解多重共线性:检测和纠正多重共线性在机器学习的回归模型中 多重共线性是指两个或更多的自变量之间存在明显的相关性 多重共线性 空值和噪声数据等都是机器学习中常见的问题 因此在构建机器学习模型之前必须对数据进行预处理 检测 解决多重共线性问题 以便构建更优的预测模型

大家好,欢迎来到IT知识分享网。

在机器学习的回归模型中,多重共线性(Multicollinearity)是指两个或更多的自变量之间存在明显的相关性。即这些自变量之间有显著的线性关系,因此它们无法为回归分析提供任何独特的信息。这种显著的相关性可能会对机器学习模型的性能(效果)产生负面影响。多重共线性、空值和噪声数据等都是机器学习中常见的问题,因此在构建机器学习模型之前必须对数据进行预处理,检测、解决多重共线性问题,以便构建更优的预测模型。

多重共线性是一个问题,因为它会扭曲自变量的统计显著性。

回归分析的目的是确定自变量和因变量之间的函数关系。

一文带您理解多重共线性:检测和纠正多重共线性

这里,Y 是因变量,X1、X2…..Xp 是自变量,b0 是截距,b1、b2…….bn 是回归系数。

在回归分析( regression)中,回归系数表示因变量 (Y) 随其中一个自变量 (X) 的变化而变化,同时保持其他自变量不变。这有助于确定每个自变量如何驱动因变量的预测。但是,如果两个或多个变量具有高度相关性,则更改一个变量也可能改变另一个变量的值。在这种情况下,回归系数不能有效地建立各自变量与因变量之间的独立关系。

一文带您理解多重共线性:检测和纠正多重共线性

多重共线性的后果

多重共线性影响模型的可解释性和整体性能。多重共线性的后果是:

  1. 解释困难:当两个或多个变量相关时,很难确定是哪一个变量在驱动因变量的变化。
  2. 降低模型预测能力:数据中的共线性会增加方差并导致模型过拟合,从而导致模型在推理时对看不见的数据的性能不佳。此外,每个自变量对因变量的影响可能会被错误地计算。

除上述两点之外,它还降低了参数估计的精度,增加了标准误差,并使机器学习预测模型不稳定。

为避免多重共线性,自变量之间必须不存在显著的线性相关性。例如,当一个自变量是另一自变量的倍数时,就会出现这种情况。在这种情况下,由于变量完全相关,一个自变量完全解释了另一个自变量,并且在回归模型中使用这两个变量没有附加价值。实际数据中,完全的线性相关性几乎不会发生,而是会讨论各个自变量彼此高度相关的多重共线性情况。在这种情况下,各个变量的影响无法清楚地分开。在存在多重共线性的情况下,回归系数无法以有意义的方式进行解释,但仍然可以使用回归模型进行预测。

检测多重共线性

多重共线性是一个问题。如何识别它,解决或缓解数据中的多重共线性问题。下面我们使用SmartNotebook 来分析BMI数据集,BMI下载地址:https://github.com/gouravsinghbais/Detecting-and-Remedying-Multicollinearity-in-Your-Data-Analysis/blob/master/bmi.csv

import pandas as pd bmi=pd.read_csv('bmi.csv') bmi
一文带您理解多重共线性:检测和纠正多重共线性

描述性方法

方差膨胀因子 (VIF)

检测数据中多重共线性的最直接方法是使用方差膨胀因子(VIF:Variance Inflation Factor) 的指标。VIF识别自变量之间的相关性,并量化这种相关性的强度。它以值 1 开头,表示自变量之间没有相关性。介于 1 和 5 之间的值表示中等相关性,可能影响不大。大于 5 的值表示变量中有显著的相关性。

Python 中的 statsmodel 库提供了 VIF 的实现。

from statsmodels.stats.outliers_influence import variance_inflation_factor bmi['Gender'] = bmi['Gender'].map({'Male':0, 'Female':1}) vif = pd.DataFrame() vif["features"] = bmi.columns vif["VIF Factor"] = [variance_inflation_factor(bmi.values, i) for i in range(X.shape[1])] vif
一文带您理解多重共线性:检测和纠正多重共线性

身高、体重和指数的 VIF 值非常高。这表明该数据集中存在很强的相关性。

相关矩阵

检测数据集中多重共线性的另一种简单方法是使用相关矩阵。该矩阵由不同的相关系数组成,这些系数表示数据中一个预测变量与其他预测变量的相关性。> 0.7 的绝对值表示变量之间的强相关性。此外,任何预测变量与自身的相关性为 1。

有多种方法可以计算此相关矩阵,但最流行和最常用的方法是皮尔逊相关方法。Pandas 库已经有一个内置方法,用于计算给定数据帧上的相关矩阵。corr()

correlation_matrix = bmi.corr() correlation_matrix
一文带您理解多重共线性:检测和纠正多重共线性

如结果所见,Weight、Index列的相关性值为 0.8,这表示很强的相关性,和 VIF 方法获得的结果类似。

图形方法

热力图

热力图不是一种检测多重共线性的方法,热力图只是帮助您轻松可视化相关结果。Python中的Seaborn库提供了使用相关矩阵创建热力图的方法。heatmap()

import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(6,5)) sns.heatmap(correlation_matrix, annot=True) plt.title('Correlation Matrix')
一文带您理解多重共线性:检测和纠正多重共线性

聚类图

聚类图是热力图的变体,用于表示数据中不同行和列的分层聚类。

它们特别用于表示数据中不同预测变量的相关性,因为它们可以将高度相关的变量聚类到一组中。Seaborn模块提供了在Python中创建聚类图的方法。clustermap()

plt.figure(figsize=(6,5)) sns.clustermap(correlation_matrix, annot=True) plt.title('Correlation Matrix')
一文带您理解多重共线性:检测和纠正多重共线性

回归分析方法

特征值(Eigenvalues)

特征值可用于检查数据中的多重共线性,因为它们捕获了数据中的方差。较小的特征值表示回归系数估计的不稳定性和预测变量之间的高多重共线性。通常,小于1(接近0)的值表示数据中存在较高的共线性,而大于1的值表示中等或无共线性。

注意:并没有固定的预定义阈值告诉我们多重共线性的程度。经验法则是,如果数据中的一个特征值远小于其他特征值,则可能存在多重共线性。

要计算特征值,您需要首先计算预测变量的相关矩阵。Numpy库提供了计算特征值的方法:eigvals()。

correlation_matrix = bmi.corr() eigenvalues = np.linalg.eigvals(correlation_matrix) eigenvalues
一文带您理解多重共线性:检测和纠正多重共线性

第二个值远远低于其他值,这表明存在多重共线性。

条件指数(Condition Index)

VIF的另一种替代方法是条件指数方法。该方法显示了变量的多重共线性程度。

它被计算为数据中最大特征值和随后特征值之间比率的平方根。虽然没有标准值告诉我们相关性的严重程度,但通常在5到10之间的值表示弱相关性,而大于30的值表示强相关性。

使用Numpy库计算条件指数,条件指数依赖于相关系数矩阵,根据相关系数矩阵计算特征值,最后计算最大特征值和随后特征值之间比率的平方根。

correlation_matrix = bmi.corr() eigenvalues = np.linalg.eigvals(correlation_matrix) condition_index = np.sqrt(max(eigenvalues) / eigenvalues) print(f"Condition Index: {condition_index}")
一文带您理解多重共线性:检测和纠正多重共线性

这种方法并未显示出强烈的相关性。并不是所有检测多重共线性的方法都能同样有效地工作或在每个数据集上提供一致的结果。多重共线性检测方法的有效性可能会因数据集的特征和存在的多重共线性的性质等多种因素而有所不同。

解决多重共线性问题

上面是检测数据中多重共线性的不同方法,接下来如何摆脱/解决多重共线性。

删除冗余变量

处理多重共线性的直接方法是从数据集中删除一个或多个相关的预测变量。尽管删除冗余变量很简单,但它需要领域知识和明确的目标,只有熟悉数据的业务意义,才可以确定保留哪个特征(有意义的特征)或删除哪个特征。您可以使用Pandas中的方法从数据中删除一个或多个变量。

bmi_2 = bmi.drop(['Index', 'Weight'], axis=1) vif = pd.DataFrame() vif["VIF Factor"] = [variance_inflation_factor(bmi_2.values, i) for i in range(bmi_2.shape[1])] vif["features"] = bmi_2.columns vif
一文带您理解多重共线性:检测和纠正多重共线性

在删除高度相关的变量之后,VIF值已经正常。

主成分分析(PCA)

尽管删除相关特征似乎很简单,但可能会导致关键信息的丢失,从而导致模型参数的估计不准确。

另一种常用的方法是主成分分析(PCA),可以消除数据中的多重共线性。PCA通过将一个或多个相关的预测变量组合成单个或多个称为主成分的变量来帮助纠正多重共线性。PCA也是解决维数灾难的方法。PCA概念和应用请参考 《一文带您了解数据降维:常见降维方法及Python示例》。

PCA方法帮助我们将高度相关的特征转换为单个或多个特征。可以使用sklearn包中的PCA.fit_transform()的训练和推断中使用相同的数据。

from sklearn.decomposition import PCA pca = PCA(n_components=1) data = bmi.copy() data['pca'] = pca.fit_transform(bmi[['Index', 'Weight']]) data = data.drop(['Index', 'Weight'], axis=1) data
一文带您理解多重共线性:检测和纠正多重共线性

一旦生成了新列,新列就可以摆脱高度相关的变量并使用新生成的变量。PCA中的参数n_components告诉算法生成N个主成分。

正则化的方法(regularization )

在这些Ridge Regression(岭回归), Lasso Regression, or Elastic Net Regression(弹性网络回归)等机器学习模型,通过引入正则化的方法帮助纠正多重共线性问题,而不需要对数据进行变更处理。

例如,岭回归通过引入正则化项来帮助纠正多重共线性,鼓励较小的系数值,有效降低模型对相关预测变量的敏感性。这种正则化可以导致更稳定和可解释的回归系数,并可以改善模型在存在多重共线性的情况下的整体性能。

scikit-learn库提供了所有回归算法的实现,包括岭回归。只需在构建机器学习模型时调整相应的正则化的超参数,然后fit()方法即可。

from sklearn.linear_model import Ridge X = bmi.drop('Index', axis=1) y = bmi['Index'] ridge = Ridge(alpha=0.1) ridge.fit(X, y)

这将帮助您获得最佳的回归系数,并且模型将能够产生更好的预测。

其他方法

除了上面提到的方法之外,您还可以使用特征选择方法针对不同的数值和分类变量来选择最佳参数,从而减少多重共线性的影响。在某些情况下,将不同的预测特征(特征缩放)缩放到相同的尺度可能会减少共线性的影响。

需要注意的是并不是所有的方法都会在您的数据集上起到相同的作用,因为处理多重共线性始终取决于其类型、来源和性质。

修复多重共线性需要关注数据类型和业务属性

多重共线性的检测和修复方法取决于数据类型和业务用例,有时需要结合使用它们以提高数据分析效果。通过处理多重共线性,可以确保模型的准确性和可靠性,使得模型能够准确反映每个变量的独特贡献,从而支持明智的决策。通过了解多重共线性的原因和类型,可以更好地选择适合您情况的方法。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/170429.html

(0)
上一篇 2025-02-17 13:25
下一篇 2025-02-17 13:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信