多重共线性检验-方差膨胀系数(VIF)-相关系数(机器学习)sklearn

本文详细介绍了如何通过方差膨胀系数(VIF)来检验深度学习和机器学习项目中的多重共线性问题。作者提供了Python代码示例,展示了如何计算VIF并分析特征之间的相关性。通过模型调整,删除相关性较高的特征如账户资金和累计交易佣金,观察模型性能变化,强调了正确处理多重共线性对于提高模型准确性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


🌠 『精品学习专栏导航帖』



✌ 多重共线性检验-方差膨胀系数(VIF)

1、✌ 原理:

方差膨胀系数是衡量多元线性回归模型中多重共线性严重程度的一种度量。
它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。

2、✌ 多重共线性:

是指各特征之间存在线性相关关系,即一个特征可以是其他一个或几个特征的线性组合。如果存在多重共线性,求损失函数时矩阵会不可逆,导致求出结果会与实际不同,有所偏差。

例如:

x1=[1,2,3,4,5]
x2=[2,4,6,8,10]
x3=[2,3,4,5,6]
# x2=x1*2
# x3=x1+1

上述x2,x3都和x1成线性关系,这会进行回归时,影响系数的准确性,说白了就是多个特征存在线性关系,数据冗余,但不完全是,所以要将成线性关系的特征进行降维

3、✌ 检验方法:

✌ 方差膨胀系数(VIF):

通常情况下,当VIF<10,说明不存在多重共线性;当10<=VIF<100,存在较强的多重共线性,当VIF>=100,存在严重多重共线性

# 导入计算膨胀因子的库
from statsmodels.stats.outliers_influence import variance_inflation_factor 
# get_loc(i) 返回对应列名所在的索引
vif=[variance_inflation_factor(x.values,x.columns.get_loc(i)) for i in x.columns]
list(zip(list(range(1,21)),vif))

✌ 相关性检验:

这个就不举例子,很容易的

import pandas as pd
data=pd.DataFrame([[3,4],[4,5],[1,2]])
data.corr()

4、✌ 代码测试

说明:由于只是介绍多重相关性,所以建模的参数都为默认,只是基本结构

4.1 ✌ 导入相关库

# 画图
import seaborn as sns
# 制作数据集
from sklearn.datasets import make_blobs
# VIF膨胀因子
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 分割数据集
from sklearn.model_selection import train_test_split
# 逻辑回归
from sklearn.linear_model import LogisticRegression
# AUC和准确度
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_auc_score

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

4.2 ✌ 准备数据

在这里插入图片描述

data=pd.read_excel('股票客户流失'.xlsx)
# 提取特征矩阵和标签
x=data.drop(columns=['是否流失'])
y=data['是否流失']

4.3 ✌ 计算膨胀因子

在这里插入图片描述

vif=[variance_inflation_factor(x.values,x.columns.get_loc(i)) for i in x.columns]
list(zip(list(range(1,21)),vif))

4.4 ✌ 计算相关系数

在这里插入图片描述

x.corr()
# 可以画出热力图进行展示
plt.subplots(figsize=(20,16))
ax=sns.heatmap(x.corr(),vmax=1,square=True,annot=True)

在这里插入图片描述

4.5 ✌ 分割测试集

x_train,x_test,y_train,y_test=train_test_split(x,
                                               y,test_size=0.2,
                                               random_state=2021
                                               )

4.6 ✌ 模型选择

clf=LogisticRegression(max_iter=300)
clf.fit(x_train,y_train)
y_pred=clf.predict(x_test)
accuracy_score(y_test,y_pred)

在这里插入图片描述

4.7 ✌ AUC值

roc_auc_score(y_test,clf.predict_proba(x_test)[:,1])

在这里插入图片描述

4.8 ✌ 模型调整

由上述VIF值可以看出 累计交易佣金和账户资金有较强的多重相关性,所以考虑删除二者中的某个特征进行建模,我们分别删除两个特征进行对比

4.8.1 ✌ 删除 账户资金
x=x.drop(columns=['账户资金(元)'])
x=pd.DataFrame(x)
y=y
vif=[variance_inflation_factor(x.values,x.columns.get_loc(i)) for i in x.columns]
vif

在这里插入图片描述

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=2021)
clf=LogisticRegression(max_iter=300)
clf.fit(x_train,y_train)
y_pred=clf.predict(x_test)
accuracy_score(y_test,y_pred)

在这里插入图片描述

roc_auc_score(y_test,clf.predict_proba(x_test)[:,1])

在这里插入图片描述

4.8.2 ✌ 删除 累计交易佣金
x=x.drop(columns=['累计交易佣金(元)'])
x=pd.DataFrame(x)
y=y
vif=[variance_inflation_factor(x.values,x.columns.get_loc(i)) for i in x.columns]
vif

在这里插入图片描述

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=2021)
clf=LogisticRegression(max_iter=300)
clf.fit(x_train,y_train)
y_pred=clf.predict(x_test)
accuracy_score(y_test,y_pred)

在这里插入图片描述

roc_auc_score(y_test,clf.predict_proba(x_test)[:,1])

在这里插入图片描述

5、✌ 总结

ScoreAUC面积
原始特征0.78060.8194
删除账户资金0.78210.8149
删除累计交易佣金0.75860.7272
  • 我们可以看出当我们删除账户资金这列特征时,分数有所上升,而AUC值下降了一点,不过影响不大,那么删除了共线性的特征是对我们模型的准确性是有作用的
  • 但是我们发现删除累计交易佣金这列特征时,准确性反倒有所下降,这是为什么?不是删除共线性的特征对模型有帮助吗,这时我们就会想可能是累计交易佣金这列特征所包含的信息较多,贸然删除的化,可能会导致模型拟合不足(欠拟合)
  • 而账户资金和累计交易时相关的,可以理解为账户资金的信息依靠累计交易,类似于数学里面的子集这种(不过这种理解是错误的),就是两列数据存在强烈的相关性,但累计交易佣金这列数据包含的数据相对于账户资金这列数据对模型的贡献比较高
### VIF指标用于多重共线性检测 方差膨胀因子(VIF,Variance Inflation Factor)是一种统计量,用来衡量回归分析中的自变量之间是否存在多重共线性问题。当两个或多个预测变量高度相关时,这会使得模型参数估计变得不稳定,降低系数估计的精度[^3]。 #### 计算方法 对于给定的一个解释变量 \( X_i \),其对应的VIF定义如下: \[ \text{VIF}_i = \frac{1}{(1-R_{i}^{2})} \] 其中 \( R_i^2 \) 是该解释变量对其他所有解释变量做线性回归得到的决定系数。如果某个解释变量与其他解释变量完全不相关,则\( R_i^2=0\) ,此时 \( \text{VIF}=1 \); 反之,随着 \( R_i^2 \) 的增大,VIF也会随之增加,表明存在更严重的多重共线性问题[^2]。 通常情况下,认为VIF大于等于5或者10表示有较强的多重共线性影响;具体阈值取决于实际应用场景以及研究者的要求。 ```python import pandas as pd from statsmodels.stats.outliers_influence import variance_inflation_factor def calculate_vif(X): vif_data = pd.DataFrame() vif_data["feature"] = X.columns vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))] return vif_data # 假设X是一个DataFrame对象,包含了所有的特征列 vif_result = calculate_vif(X) print(vif_result) ``` 此代码片段展示了如何利用Python库`statsmodels`来计算数据集中各个特征之间的VIF值,并将其存储在一个新的Pandas DataFrame中以便查看哪些特征可能引起多重共线性问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋 之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值