一、概要
在机器学习中,多重共线性在一定程度上是不影响模型的预测能力,但是肯定会影响模型的可解释性。尤其是在获取构建模型时的特征重要性(或者对特征进行排名)时,多重共线性会严重影响其解释性。
二、方差膨胀因子
方差膨胀因子(Variance Inflation Factor,以下简称VIF),是指解释变量之间存在多重共线性时的方差与不存在多重共线性时的方差之比。
上图公式可以看出在方差膨胀因子的检测中:
每个自变量都会有一个膨胀因子值 V I F i VIF_i V I F i ,最后根据值的大小来选择是否删减
- R i 2 R_i^2 R i 2 表示相关性,是谁跟谁的相关性呢?是自变量中的某一变量与除它外剩余的自变量进行多元线性回归,取回归结果,即模型精度来作为这个变量与剩余自变量的相关性。
- 听起来可能有点绕,这里举一下实例(用 ” 面积、卧室数量和浴室数量 ” 作为自变量来预测房价,在进行自变量的方差膨胀因子的检测时,面积、卧室数和浴室数轮流做单独的因变量,剩下的两个变量作为自变量,来看看这三个自变量中那个变量对其余两个变量的解释性高)
- R i 2 R_i^2 R i 2 越大,如已经到了 0.9,那分母就很小,V I F i VIF_i V I F i 的值就等于 10,即表示这个自变量已经同时解释了另外的
某个或多个自变量
,存在多元共线性,可以考虑删除一些自变量。 - VIF越大,显示共线性越严重。经验判断方法表明:当0
; 三、实现
3.1 基于定义创建VIF函数
def vif(df, col_i):
from statsmodels.formula.api import ols
cols = list(df.columns)
cols.remove(col_i)
cols_noti = cols
formula = col_i + '~' + '+'.join(cols_noti)
r2 = ols(formula, df).fit().rsquared
return 1.0 / (1.0 - r2)
for i in data.columns:
print(i, "\t", vif(df=data, col_i=i))
3.2 基于内建函数
def checkVIF_new(df):
from statsmodels.stats.outliers_influence import variance_inflation_factor
df['c'] = 1
name = df.columns
x = np.matrix(df)
VIF_list = [variance_inflation_factor(x,i) for i in range(x.shape[1])]
VIF = pd.DataFrame({'feature':name,"VIF":VIF_list})
VIF = VIF.drop('c',axis = 0)
max_VIF = max(VIF_list)
print(max_VIF)
return VIF
Original: https://blog.csdn.net/nixiang_888/article/details/122342338
Author: Xiaofei@IDO
Title: 方差膨胀因子的介绍及python实现
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/629979/
转载文章受原作者版权保护。转载请注明原作者出处!