百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

如何消除多重共线性 解决多重共线性的方法

lipiwang 2024-10-28 17:28 8 浏览 0 评论


介绍

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

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

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

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

数据源

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

import pandas as pd
df = 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_factor
X = 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 SVC
encoder = 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_importance
result = 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

相关推荐

想减少Windows 11内存占用?请取消固定Teams

如果你想要提高Windows11系统的运行速度,那么可以禁用某些默认启用的功能和设置。如果你的Windows11是安装在已经停止支持的设备或者内存容量不高的旧设备,那么应该立即限制或禁用固...

Windows查看端口占用、查看PID对应的进程、并终止进程

Windows下:查看端口占用netstat-ano|findstr"端口号"获取到pid查看PID对应的进程tasklist|findstr"进程ID"...

计算机组成原理(36): 分时之一——进程

建立一个虚拟机VM目标:给每个程序一个自己的虚拟机“VirtualMachine”,程序并不知道其他的虚拟机。1.1进程(Process)为了捕获正在运行的程序,我们创建一个称为“进程(Proce...

window系统如何停止端口被占用的进程(高手版)

如上图1,作为开发人员是不是经常遇到这个问题?(Webserverfailedtostart.Port9527wasalreadyinuse.)当然,如果在你知道确实有某个进程正占...

电脑的文件无法删除咋回事?你需要这款神兵利器

很多朋友用电脑的时候,都遇到过文件无法删除的情况。这往往是由于文件被某个软件、进程所调用所引发的——在Windows中,某个文件如果被使用,这个文件可能就没法进行删除、重命名之类的操作了。想要进一步操...

Windows日志分析(windows 日志文件)

1.Windows日志文件简介1.1Windows日志核心分类1.系统日志系统日志包含由Windows系统组件记录的事件,记录系统进程和设备驱动程序的活动。由它审核的系统事件包括启动失败的设备驱动程...

电脑软件崩溃、闪退不用慌!DJS Tech 教你几招轻松解决

当你正全神贯注用电脑处理重要文件、沉浸在精彩的游戏世界,或是观看喜欢的视频时,软件突然崩溃、闪退,那一刻的烦躁简直难以言喻。别着急,DJSTech作为深耕计算机领域多年的专业团队,为你带来一系列超...

微软Win11推进淘汰控制面板,时间服务器配置迁移至设置应用

IT之家5月29日消息,科技媒体Winaero昨日(5月28日)发布博文,报道称微软在Windows11系统中,继续推进“淘汰控制面板”进程,配置时间服务器地址选项迁移到设置应...

微软 PowerToys更新,可帮你找出 Win11上哪些进程正在占用该文件

IT之家11月3日消息,微软针对Windows11和Windows10的PowerToys已经更新到了最新的0.64.0版本,并上线了一个名为“文件锁匠FileLock...

Windows基础操作 认识任务管理器(windows任务管理器的使用)

Windows基础操作:认识任务管理器任务管理器(TaskManager)是Windows系统中一个功能强大的实用工具,它为用户提供了实时监控系统资源、管理正在运行的程序和服务的能力。掌握任务管理器...

windows——netstat过滤(终止进程)

windows——netstat过滤(终止进程)在Windows操作系统中,使用netstat命令可以查看网络连接的状态。要过滤特定协议或端口的连接,可以使用以下命令:查看所有连接:netstat-...

只要这么做 Windows Defender与第三方就能和平共存啦

无论大家是否喜欢WindowsDefender,伴随着Windows10的不断升级,它已经成为系统的底层必备组件之一。虽然我们有各种各样的方法去关闭它,换用顺手的第三方,但只要更新打补丁,噩梦就来...

Win10如何彻底关闭wsappx进程(win10 wsappx怎么关闭)

win10如何彻底关闭wsappx进程?wsappx进程是什么?wsappx进程是Windows10系统的一部分,这个进程是WindowsStore和微软通用应用程序平台(UWP)的依赖进程。...

Windows环境黑客入侵应急与排查(黑客入侵电脑原理)

1文件分析1.1临时目录排查黑客往往可能将病毒放在临时目录(tmp/temp),或者将病毒相关文件释放到临时目录,因此需要检查临时目录是否存在异常文件。假设系统盘在C盘,则通常情况下的临时目录如下...

Windows 11 24H2 KB5044384出现大面积安装失败、任务管理器0进程等问题

Windows11KB5044384更新由于出现大量错误而无法在Windows1124H2上安装、其中包括一个奇怪的错误,即由于0x800f0922、0x800736b3和0x8...

取消回复欢迎 发表评论: