Press "Enter" to skip to content

超越VIF:共线性分析以减少偏差和提高预测准确性

在机器学习中,共线性对于经验丰富的专业人士和新手来说都是一个复杂的难题。机器学习(ML)算法针对的是预测准确性,而不是解释变量对目标的影响。此外,大多数解决共线性的方法,如“方差膨胀分数”和“皮尔逊交叉相关分析”,可能导致预处理过程中的大量信息丢失。

大多数机器学习算法将选择最佳的特征组合以优化预测准确性。因此,即使存在共线性,在训练中观察到的相关性在现实世界中仍然成立,共线性在机器学习中并不是一个问题。然而,对于模型的解释能力而言,未经检查的共线性效应可能是偏见的潜在源头。

图1:波士顿房屋数据集中的共线性概述

共线性是指数据集中独立变量(IVs)之间存在高度相关性,常常在回归模型的解释中出现独特的挑战。特别是,它干扰了确定数据关系的真正原因,可能导致偏见的解释和不公平的决策。例如,在图1中,独立变量(TAX)、(B)和(RAD)是共线的IVs,也是因变量(MEDV)的良好预测变量。虽然机器学习算法将选择最佳预测变量的组合,但它们可能无法考虑将另一个共线变量(RM)添加到任何这三个变量中的模型中的效果。

为了鼓励机器学习者将共线性分析作为预处理步骤认真对待,必须有一种方法来平衡“保留共线变量的膨胀成本”和“舍弃共线变量的预测成本”。

了解共线性

为了演示未经检查的共线性如何导致意外的偏见,让我们使用一个警示性故事“如何不收集数据”:波士顿房屋数据集。由于包含一个“不可逆”变量“B”,该数据集已被揭露并从公共使用中撤回。独立变量“B”、“RM”和“TAX”之间的共线关系是一个完美的案例研究,说明虚假相关性如何压制独立变量之间的真实关系。对“B”进行“不可逆”转换(一个伪装成连续变量的二元变量)引入了一个调节偏差,可能无法被机器学习算法捕捉到。

图2:波士顿房屋数据集中的独立变量(IVs)

考虑波士顿房屋数据集中的13个独立变量(IVs),以镇上自住房屋的中位数价值(MEDV)为因变量(DV)。某些特征可能看起来是结果的强预测变量,但这种影响在很大程度上是由其他预测变量解释的。

图2:波士顿房屋数据集的交叉相关分析

在独立变量和因变量之间的双变量关系中,当引入一个新的独立变量时,可能存在以下四种可能性之一:

  1. 虚假膨胀:第三个IV的引入显著提高了第一个IV对DV的影响。
  2. 隐藏或抑制:新的IV隐藏或抑制了初始IV对因变量的影响。
  3. 调节或改变:新的变量改变了独立变量中原始关系的方向,适用于全部或部分观察值。
  4. 无效果:第三个IV不提供新信息,对IV和DV没有影响。

对于机器学习者来说,现成的共线性解决方案通常会导致预测能力的损失、过度拟合的模型和偏见。因此,一种减少信息损失的解决方案至关重要。

评估共线性

如果两个或多个自变量高度相关(RAD和TAX),共线性背后的直觉是它们可能提供关于某个“潜在”概念(大郊区房屋/城市公寓)对因变量(财产价值)影响的完全相同的信息。在存在“财产税”的情况下,径向高速公路的可达性对财产价值没有提供任何新信息(反之亦然)。当自变量之间高度相关时,回归模型的系数变得很大,从而导致对某些因素对结果的影响的推断过高。

目前,有两种处理共线性的方法,都没有考虑因变量。

  1. 逐对相关:有多少自变量与彼此“高度”相关。对于“高度相关”的特征,相关系数的截止值是主观的。然而,普遍共识认为,在相关系数为+/-0.7时,共线性成为一个严重的问题。
def dropMultiCorrelated(cormat, threshold):    ##定义阈值,以删除具有相关系数大于0.7或-0.7的特征对    threshold = 0.7    # 选择相关矩阵的上三角    upper = cormat.abs().where(np.triu(np.ones(cormat.shape), k=1).astype(np.bool))    # 找到相关系数大于阈值的特征列的索引    to_drop = [column for column in upper.columns if any(upper[column] > threshold)]    for d in to_drop:        print("正在删除 {}....".format(d))    return to_drop

2. 方差膨胀:虽然相关系数确认了两个自变量之间对应变化的程度,但它对于自变量的重要性告诉我们很少。这是因为在多变量关系中,自变量在对因变量的影响上并不真正“独立”(见图1),它们的真正“影响显著性”是在其他自变量的组合存在的情况下。

方差膨胀分数是独立变量系数由于它们依赖于其他自变量而添加的影响大小。VIF对自变量使用“一个留出”方法,将每个“留出”作为因变量,将所有“留入”作为自变量。因此,所有自变量都变成了因变量,并且每个模型产生一个(R2)值。这个R2值表示“留出”自变量解释了“留入”自变量的百分之多少的方差。估计的VIF分数如下:

图4:变量膨胀估计 - 波士顿房屋数据集

根据上述VIF估计,我们需要删除13个自变量中的11个才能完全解决共线性问题。这不仅会导致大量信息的丢失,还可能产生在现实世界中表现不佳的过度拟合模型。

在机器学习中,逐对多相关性和VIF分数不应成为舍弃或保留特征的唯一标准。

尽管存在高相关性和VIF分数,但某些特征仍可能具有重要的预测价值或对模型的解释有所贡献。

膨胀成本与预测成本对共线特征选择

为了减少信息损失,我们可以比较两个值来衡量保留共线特征的膨胀成本和放弃它们的预测成本。请注意,VIF分析是独立于结果变量进行的,因此不能完全考虑各个自变量对因变量的独立影响。

## 构建多重线性回归模型以评估自变量对因变量的真实独立影响
fs = []
for feature in X_train.columns:
    model = sm.OLS(Y_train, sm.add_constant(X_train[feature])).fit()
    fs.append((feature, model.params[feature] / model.pvalues[feature]))

## 提取并存储值
c1 = pd.DataFrame(coefs, columns=['Feature', 'VarianceEx']).sort_values("VarianceEx")

第一个指标是自变量对因变量的独立影响,即因变量的方差(R_squared)中由自变量独立解释的部分。为了保持一致性,我们还将根据这个R_squared值估计VIF分数,并将其称为VIF(IY) — 自变量重要性。第二个指标是在所有自变量存在的情况下,自变量对因变量的影响,即上述估计的VIF。我们将其称为VIF(IX) — 综合重要性。

Figure 5: Estimating Inflationary VS Predictive Cost of features to an ML Model

现在,我们可以自信地估计通过删除共线特征所放弃的真正“意外”量。在下面的图表中,X轴表示每个自变量解释的Y的方差(作为预测“有用性”的一种度量),而Y轴表示自变量由其他自变量解释的方差(作为模型“偏差性”的一种度量)。子图1中的气泡大小表示保留这些变量在模型中的通货膨胀成本,而子图2中的气泡大小表示放弃这些变量的预测成本。

由于这是一个预处理步骤,让我们使用非常宽松的VIF(IX)因子和VIF(IY)因子的“截断值”,分别为20(红线)和1.15(蓝线)。因此,在红线下的特征最不受其他自变量的解释,而蓝线后面的特征不能独立预测(Y)。

Figure 6: Feature Inflationary VS Predictive Cost

这张图总结了自变量的独立预测能力与其偏差潜力。

  • 第一象限 – 潜在的真实共线特征:这些特征(NOX、PTRATIO)由模型中的一些自变量的线性组合解释,不能独立预测因变量(它们可能依赖于其他一些自变量的有用性)。此外,它们可能会被其他自变量的线性组合抵消掉一部分预测能力(子图2)。它们的影响力受到某些其他自变量的加入而显著受到抑制。
  • 第二象限 – 潜在的偏差因素:这些特征(RM、TAX、B)与因变量和其他自变量相关。特征(RM、TAX、B)在某种程度上独立预测因变量(Y),但它们的方差也可以由其他自变量的组合解释。在解释它们对结果的重要性时,不能孤立地考虑它们所谓的独立预测能力。它们可能是结果的极强预测因子,也可能是偏差的来源。
  • 第三象限 – 依赖变量:虽然它们不能独立预测因变量(Y),但放弃其中一些特征会带来很高的预测成本。这是因为它们具有其他自变量无法解释的独特信息。只有将这种“独特”信息与其他自变量结合起来才能考虑它对预测因变量(Y)的有用性。
  • 第四象限 – 真正独立的预测因子:这些变量可以独立预测因变量(Y)。这些变量还具有其他自变量无法解释的独特信息(超过第三象限)。将这种“独特”信息用于预测因变量(Y)的有用性与其他自变量无关。然而,其他自变量的线性组合可能具有比它们独立预测更高的预测能力。
O = Y_train# 估计增加/删除特征C对自变量I和结果O之间关系的影响
conf = []
for I in X_train.columns:
    # 为自变量I对O的影响构建基准模型
    model = sm.OLS(O, sm.add_constant(X_train[I])).fit()
    IO_coef, IO_sig = model.params[I], model.pvalues[I]
    
    ## 评估对O的影响
    for C in X_train.columns:
        if C != I:
            # 构建添加C到I和O之间关系的辅助模型
            model2 = sm.OLS(O, sm.add_constant(X_train[[I, C]])).fit()
            ico_preds = model2.predict()
            ICO_coef, ICO_sig = model2.params[I], model2.pvalues[I]
            
            # 为C对O的影响构建基准模型
            model3 = sm.OLS(O, sm.add_constant(X_train[C])).fit()
            CO_coef, CO_sig = model3.params[C], model3.pvalues[C]
            
            corr_IC, _ = pearsonr(X_train[I], X_train[C]) # I与控制变量的相关性
            corr_IO, _ = pearsonr(X_train[I], O) # I与结果的相关性
            corr_CO, _ = pearsonr(X_train[C], O) # 控制变量与结果的相关性
            
            conf.append({"I_C": f"{I}_{C}", "IO_coef": IO_coef, "IO_sig": IO_sig, 
                         "CO_coef": CO_coef, "CO_sig": CO_sig, "ICO_sig": ICO_sig, 
                         "ICO_coef": ICO_coef, "corr_IC": corr_IC, "corr_IO": corr_IO, 
                         "corr_CO": corr_CO})

cc = pd.DataFrame(conf)
corr_ic = (cc['corr_IC'] > 0.5) | (cc['corr_IC']  0.5) | (cc['corr_CO']  0.5) | (cc['corr_IO'] < -0.5) # C与O相关

## C和O显著相关
co_sig = (cc['CO_sig'] < 0.01) # C对O独立预测

io_sig = (cc['IO_sig'] < 0.01)

cc[corr_ic & corr_io & corr_co & co_sig & io_sig]

变量BTAXRM显著预测彼此,也独立预测结果。这可能是最能预测因变量MEDV的自变量的线性组合。或者,这些自变量中的任意两个之间的预测相关性可能因第三个自变量的存在而被夸大或抑制。为了研究这一点,应该从包含所有自变量的基线模型中逐个删除每个变量。

图7:删除自变量对基线模型的影响

随后,应以百分比的方式量化剩余变量对结果的显著性的相应变化。这个过程将有助于揭示被其他自变量解释的自变量,它们伪装成重要的。

在红线上方,消除共线性偏差

红线上方的共线变量可能对其他自变量与因变量之间的关系产生三种主要影响(关注)。它们可能起到中介(抑制)、混淆(夸大)或调节(改变)的作用。

调节变量、中介变量和混淆变量的概念在机器学习中并没有真正讨论。这些概念通常留给“社会科学家”,毕竟他们是唯一需要“解释”系数的人。然而,这些概念解释了共线性如何引入机器学习模型的偏差。

请注意,如果没有进行更深入的因果分析,这些影响是无法真正确定的,但作为偏差去除的预处理步骤,我们可以使用这些概念的简单定义来筛选这些关系。

图8:波士顿住房数据集中的中介关系

中介变量解释了自变量和因变量之间的关系,即它们之间的关系过程。中介变量必须满足三个标准:

a) 对第一个自变量有显著预测作用,b) 对因变量有显著预测作用,c) 在第一个自变量存在的情况下,对因变量有显著预测作用。

它“中介”是因为它的包含不会改变第一个自变量和因变量之间的关系方向。如果从模型中移除一个中介变量,第一个自变量和因变量之间的关系强度应该变得更强,因为中介变量确实解释了部分效应。

## 寻找中介变量cc = pd.DataFrame(conf)co_sig = (cc['CO_sig'] < 0.01) # C对Y有独立预测io_sig = (cc['IO_sig'] < 0.01) # I对Y有独立预测icoi_sig = (cc['ICO_I_sig'] < 0.01) # I和C对Y有预测icoc_sig = (cc['ICO_C_sig'] < 0.05) # C对Y在I存在的情况下有独立预测icoci_sig = (cc['IO_sig'] > cc['ICO_I_sig']) # I和O之间的直接关系在没有C的情况下应该更强

例如,在(RM)、(TAX)和(MEDV)之间的关系中,房间数量可能解释了财产税与财产价值之间的关系。

混淆变量很难用相关性和显著性来定义。混淆变量是一个与因变量和自变量都相关的外部变量,因此可能扭曲它们之间的关系。与中介变量相反,第一个自变量和因变量之间的关系是无意义的。而且,删除混淆变量不能保证会减弱或加强第一个自变量和因变量之间的关系。

一座房子的房间数量既可以是中介变量,也可以是混淆变量,它取决于(B)与(RM)之间的关系。如果(RM <-> MEDV)和(RM <-> B)之间的关系方向相同,删除(RM)应该会削弱(B)对(MEDV)的影响。然而,如果(RM <-> MEDV)和(RM <-> B)之间的关系方向相反,删除(RM)应该会增强(B)的影响。

(RM <—> MEDV) 和 (RM <-> B) 在同一个方向上(图1的子图3),然而,去除 (RM) 加强了 (B) 的效果。

请参见下面的图表,在第一个自变量和因变量之间有一个良好的决策边界。这表明了 (RM) 和 (TAX) 之间的关系基于 (B) 的值而有所不同。

图9:调节回归

在有调节变量的情况下,第一个自变量与因变量之间的关系根据调节变量的值而有所不同。如果一栋房子的成本是 $100,00,那你可以期待支付多少财产税呢?嗯,这取决于城镇中黑人人口的比例和该房子的房间数量。事实上,有一些城镇的财产税保持一致,不论房间数量如何,只要 (B) 保持在某个特定阈值以下。

图10:波士顿住房数据集的调节关系

调节变量通常是数据中的分类特征或组。传统的预处理步骤会为每个组标签创建虚拟变量。这可能会解决该组对因变量的调节效应。然而,具有低方差的排序变量或连续变量 (B) 也可以作为调节变量。

结论

总之,在回归建模中,共线性是一个具有挑战性的问题,但通过仔细评估和管理,可以提高机器学习模型的预测能力和可靠性。考虑到信息损失的能力,为特征选择提供了一个有效的框架,使解释性和预测准确性达到平衡。

Leave a Reply

Your email address will not be published. Required fields are marked *