前言
探索性数据分析、数据清洗与预处理和多元线性回归模型构建完毕后,为提升模型精度及其稳健性,还需进行许多操作。方差膨胀因子便是非常经典的一步,原理简单,实现优雅,效果拔群。
原理趣析
多重线性回归模型的主要假设之一是我们的预测变量(自变量)彼此不相关。我们希望预测变量与反应变量(因变量)相关,而不是彼此之间具有相关性。如言情剧中的 A 喜欢B,B 却喜欢 C,结果发现 C 其实喜欢 A;而 B 的一举一动很有可能影响着 A,所以当我们把 B和C 作为自变量来预测因变量 A 的行为时,这两个自变量之间的相互影响就会有点让人难受。
公式解释
方差膨胀因子(Variance Inflation Factor,以下简称VIF),是指解释变量之间存在多重共线性时的方差与不存在多重共线性时的方差之比。
上图公式可以看出在方差膨胀因子的检测中:
- 每个自变量都会有一个膨胀因子值VIF_i,最后根据值的大小来选择是否删减
- Ri^2 表示相关性,是谁跟谁的相关性呢?是自变量中的某一变量与除它外剩余的自变量进行多元线性回归,取回归结果,即模型精度来作为这个变量与剩余自变量的相关性。 听起来可能有点绕,这里举一下实例(用 “ 面积、卧室数量和浴室数量 ” 作为自变量来预测房价,在进行自变量的方差膨胀因子的检测时,面积、卧室数和浴室数轮流做单独的因变量,剩下的两个变量作为自变量,来看看这三个自变量中那个变量对其余两个变量的解释性高)
- Ri^2 越大,如已经到了 0.9,那分母就很小,vif_i 的值就等于 10,即表示这个自变量已经同时解释了另外的某个或多个自变量,存在多元共线性,可以考虑删除一些自变量。
VIF越大,显示共线性越严重。经验判断方法表明:当0<VIF<10,不存在多重共线性;当10≤VIF<100,存在较强的多重共线性;当VIF≥100,存在严重多重共线性。
效果实现
本文将使用 Python 数据分析利器 Jupyter Notebook 实现。虽然前人大神们已经有了完整的实现步骤 https://etav.github.io/python/vif_factor_python.html
但他们的实现方法还是会轻微复杂,笔者这里提供一个自写函数的方法
使用自写函数来检测各自变量的方差膨胀因子
发现变量 bedrooms 和 bathrooms 的方差膨胀因子都超过了 10。其实方差因子通常成对出现,通常较大的两个方差膨胀因子表明这两个变量自身本来就具有高度相关性,即这两个变量一起才解释一种东西,可以考虑去除一个自己并不怎么感兴趣的变量即可,也回到了我们最开始的目的:多重线性回归模型的主要假设之一是我们的预测变量彼此不相关,我们希望预测变量与反应变量相关,而不是彼此之间具有相关性。
bedrooms 和 bathrooms 的方差膨胀因子异常也能从上一张 ols 建模结果的图中看到端倪。将变量之间的相关性以热力图的形式呈现后,发现 ols 建模的结果是 bedrooms 每增加一个单位,房价还减少 -2925.8063 ???而热力图则反映出bedrooms 与房价呈现比较强的正相关关系。
所以我们可考虑去掉方差膨胀因子最大的变量 bedrooms,后再进行一次 ols 建模
对比两次建模结果,发现其实删除某个方差膨胀因子异常的变量后建模结果也不变,但我们需要注意的是:具体问题还得结合具体业务来分析,有时候尽管出现了多元共线性,但也还是需要保留方差膨胀因子异常的变量。