方差膨胀因子的介绍及python实现

一、概要

在机器学习中,多重共线性在一定程度上是不影响模型的预测能力,但是肯定会影响模型的可解释性。尤其是在获取构建模型时的特征重要性(或者对特征进行排名)时,多重共线性会严重影响其解释性。

二、方差膨胀因子

方差膨胀因子(Variance Inflation Factor,以下简称VIF),是指解释变量之间存在多重共线性时的方差与不存在多重共线性时的方差之比。
在这里插入图片描述
上图公式可以看出在方差膨胀因子的检测中:

每个自变量都会有一个膨胀因子值 V I F i VIF_i VIFi,最后根据值的大小来选择是否删减

  • R i 2 R_i^2 Ri2 表示相关性,是谁跟谁的相关性呢?是自变量中的某一变量与除它外剩余的自变量进行多元线性回归,取回归结果,即模型精度来作为这个变量与剩余自变量的相关性。

    • 听起来可能有点绕,这里举一下实例(用 “ 面积、卧室数量和浴室数量 ” 作为自变量来预测房价,在进行自变量的方差膨胀因子的检测时,面积、卧室数和浴室数轮流做单独的因变量,剩下的两个变量作为自变量,来看看这三个自变量中那个变量对其余两个变量的解释性高)
  • R i 2 R_i^2 Ri2 越大,如已经到了 0.9,那分母就很小, V I F i VIF_i VIFi 的值就等于 10,即表示这个自变量已经同时解释了另外的某个或多个自变量,存在多元共线性,可以考虑删除一些自变量。

  • VIF越大,显示共线性越严重。经验判断方法表明:当0<VIF<10,不存在多重共线性;当10≤VIF<100,存在较强的多重共线性;当VIF≥100,存在严重多重共线性。

三、实现

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
    # 默认情况下不会添加截距,使得获得的VIF值偏大;
    # 因此,在数据框中再增加一列,代表一个常数(使用常数1)。这将是方程式的截距项。
    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
  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值