如何消除多重共线性

article/2025/9/19 23:58:22

介绍

机器学习是一种解决不能明确编码的问题的方法,例如,分类问题。机器学习模型将从数据中学习一种模式,因此我们可以使用它来确定数据属于哪个类。

但有个问题。这个模型是如何工作的?一些人不能接受一个性能良好的模型,因为它不能被解释。这些人关心可解释性,因为他们想确保模型以合理的方式预测数据。

在解释ML模型之前,消除多重共线性是一个必要的步骤。多重共线性是指一个预测变量与另一个预测变量相关的情况。多重共线性虽然不影响模型的性能,但会影响模型的可解释性。如果我们不去除多重共线性,我们将永远不会知道一个变量对结果的贡献有多大。因此,我们必须消除多重共线性。

本文将向您展示如何使用Python消除多重共线性。

数据源

为了演示,我们将使用一个名为Rain in Australia的数据集。它描述了不同日期和地点的天气特征。这个数据集也是一个监督学习问题,我们可以使用这些数据来预测明天是否下雨。这个数据集可以在Kaggle上找到,你可以在这里访问它。

import pandas as pddf = pd.read_csv('data.csv')
print(df.shape)
df.head()

预处理的数据

加载数据之后,下一步是对数据进行预处理。在本例中,我们将不使用分类列,并删除每个列至少缺少一个值的行。下面是这样做的代码:

df = df[list(df.columns[2:])]
df = df.drop(['WindGustDir', 'WindDir9am', 'WindDir3pm'], axis=1)
df = df.dropna()
print(df.shape)
df.head()

计算VIF值

在我们有了干净的数据之后,让我们计算方差膨胀因子(VIF)值。VIF是什么?

VIF是一个决定变量是否具有多重共线性的数值。这个数字也代表了一个变量因与其他变量线性相关而被夸大的程度。

VIF取值从1开始,没有上限。如果这个数字变大,就意味着这个变量有巨大的多重共线性。

为了计算VIF,我们将对每个变量进行线性回归过程,其中该变量将成为目标变量。在我们完成这个过程之后,我们计算出R的平方。最后,我们用这个公式计算VIF值:

在Python中,我们可以使用statmodels库中的variance_inflation_factor函数来计算VIF。下面是这样做的代码和结果:

import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factorX = df[list(df.columns[:-2])]vif_info = pd.DataFrame()
vif_info['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif_info['Column'] = X.columns
vif_info.sort_values('VIF', ascending=False)

从上面可以看到,几乎所有变量的VIF值都大于5。甚至压力变量的VIF值也超过40万。这是一个很大的因素!

因此,我们需要从数据中清除这些多重共线性。

消除多重共线性

为了消除多重共线性,我们可以做两件事。我们可以创建新的特性,也可以从数据中删除它们。

首先不建议删除特征。因为我们去掉了这个特征,就有可能造成信息丢失。因此,我们将首先生成新特性。

从数据中,我们可以看到有一些特征有它们对。例如,’ Temp9am ‘加上’ Temp3pm ', ’ Pressure9am ‘加上’ Pressure3pm ', ’ Cloud9am ‘加上’ Cloud3pm ',等等。

从这些特性中,我们可以生成新的特性。新特性将包含这些对之间的差值。在我们创建这些特性之后,我们可以安全地将它们从数据中删除。

下面是这样做的代码和结果:

df['TempDiff'] = df['Temp3pm'] - df['Temp9am']
df['HumidityDiff'] = df['Humidity3pm'] - df['Humidity9am']
df['CloudDiff'] = df['Cloud3pm'] - df['Cloud9am']
df['WindSpeedDiff'] = df['WindSpeed3pm'] - df['WindSpeed9am']
df['PressureDiff'] = df['Pressure3pm'] - df['Pressure9am']X = df.drop(['Temp3pm', 'Temp9am', 'Humidity3pm', 'Humidity9am', 'Cloud3pm', 'Cloud9am', 'WindSpeed3pm', 'WindSpeed9am', 'Pressure3pm', 'Pressure9am', 'RainToday', 'RainTomorrow'], axis=1)X.head()

现在让我们看看数据的VIF值是怎样的:

vif_info = pd.DataFrame()
vif_info['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif_info['Column'] = X.columns
vif_info.sort_values('VIF', ascending=False)

正如你从上面看到的,我们仍然得到了具有巨大VIF值的变量。但是,我们仍然从生成新功能中得到了一个很好的结果。

现在让我们删除VIF值大于5的特性。下面是这样做的代码和结果:

X = X.drop(['MaxTemp', 'MinTemp', 'TempDiff', 'Sunshine'], axis=1)vif_info = pd.DataFrame()
vif_info['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif_info['Column'] = X.columns
vif_info.sort_values('VIF', ascending=False)

好了!现在我们有所有VIF值小于5的变量。有了这些变量,现在我们就可以解释结果了。但首先,让我们建立我们的机器学习模型。

构建模型

在这种情况下,我们将使用支持向量机(SVM)算法来建模我们的数据。简而言之,SVM是一种模型,它将创建一个超平面,可以最大限度地分离使用不同标签的数据。

因为我们的数据属于一个分类任务,所以我们将使用scikit-learn中的SVC对象来创建模型。下面是这样做的代码:

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.svm import SVCencoder = LabelEncoder()
y_encoded = encoder.fit_transform(y)
print(encoder.classes_)
print(y_encoded)X_train, X_test, y_train, y_test = train_test_split(X.values, y_encoded)model = SVC()
model.fit(X.values, y_encoded)print(model.score(X_test, y_test))

利用排列特征重要性进行解释

理论上,支持向量机模型是不可解释的。这是因为我们不能仅仅通过查看参数来解释结果。但幸运的是,我们有几种方法可以解释这个模型。我们可以使用的方法之一是排列特征的重要性。

排列特征重要性通过观察改变特征值后误差增加了多少来衡量一个特征的重要性。如果特征值的变化增加了模型的误差,那么该特征是重要的。

要实现这个方法,可以使用scikit-learn库中的permutation_importance函数来计算特性的重要性。根据这个结果,我们将创建一个箱线图来可视化特性的重要性。

下面是这样做的代码和结果:

from sklearn.inspection import permutation_importanceresult = permutation_importance(model, X.values, y_encoded, n_repeats=10, random_state=42)perm_imp_idx = result.importances_mean.argsort()
plt.boxplot(result.importances[perm_imp_idx].T, vert=False,labels=X.columns[perm_imp_idx])
plt.title('Feature Importance from Rain in Australia Dataset')
plt.show()

从上面可以看到,HumanityDiff特性是对最终结果有巨大贡献的最重要的特性。然后是降雨特性,这是第二个最重要的特性。其次是风速(WindGustSpeed)、蒸发(vaporize)、风速差(WindSpeedDiff)、气压差(PressureDiff)和云l量差(CloudDiff)。

最后总结

做得好!现在您已经学习了如何使用Python从数据集中删除多重共线性。我希望这篇文章能帮助你消除多重共线性,以及如何解释机器学习模型。

作者:Irfan Alghani Khalid


http://chatgpt.dhexx.cn/article/pe9NATuO.shtml

相关文章

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

什么是多重共线性呢? 就是回归模型多个特征之间具有很强的相关性。 多重共线性,听起来很就很严重,其实没有很大的危害,只是容易过拟合,或者导致模型无法解释。尤其是在实际项目中,我们需要解释模型的特征对目标变量…

特征共线性问题

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

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

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

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

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

多重共线性如何分析?

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

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

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

多重共线性

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

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

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

如何处理多重共线性问题

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

谈多重共线性

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

多重共线性详解

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

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

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

共线性那些事儿

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

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

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

好好谈谈共线性问题

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

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

项目场景: 如何使用SIM7600系列的4G通信模块进行PPP网上拨号以实现4G通信,在讲解前,未搭建好树莓派远程连接桌面的读者可以先转向树莓派4B环境搭建电脑远程连接打开文件管理闪退(上)。 模块简介: 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卡,4G模块一定要接上天线4、根据安卓系统和安卓版本发给模块厂要求其提供ril库5、预置ril库6、在framework中添加根据pid和vid关联ril库的代码7、可以通过一下命令查看ril…

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

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

4G模块的使用

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