多重共线性(方差膨胀因子)。在进行模型之前要删除的变量

数据挖掘 机器学习 scikit-学习 共线性
2022-03-14 20:42:43

我正在 python 中执行机器学习系统模块的练习,该模块采用汽车数据集(气缸、年份、消耗量......)并要求模型,作为预测汽油消耗量的变量。由于它具有三个分类变量,因此我生成了假人。

在此处输入图像描述

在练习中,我需要消除具有多重共线性的变量,因此我使用了课程笔记中显示的方法:

from sklearn.linear_model import LinearRegression

def calculateVIF(data):
    features = list(data.columns)
    num_features = len(features)

    model = LinearRegression()

    result = pd.DataFrame(index = ['VIF'], columns = features)
    result = result.fillna(0)

    for ite in range(num_features):
        x_features = features[:]
        y_featue = features[ite]
        x_features.remove(y_featue)

        x = data[x_features]
        y = data[y_featue]

        model.fit(data[x_features], data[y_featue])

        result[y_featue] = 1/(1 - model.score(data[x_features], data[y_featue]))

    return result

然后,如果我启动该方法,它会为每个变量计算一个系数:

在此处输入图像描述

在我的课程笔记中说:

  • VIF>5是一个很高的价值。
  • VIF>10是一个非常高的价值

我该怎么办?我需要删除具有VIF>10在执行模型之前?

我看到的问题是,对于我的分类变量汽缸,只有汽缸_5 的 VIF 低于 10,所以我应该删除其他汽缸并留下 cyclinders_5 吗?

3个回答

这是我为处理数据集中的多重共线性而编写的代码。此代码段能够处理以下列出的项目:

  • 使用可变通货膨胀因子 (VIF) 的多重共线性,设置为默认阈值 5.0
  • 您只需要传递数据框,其中仅包含要测试多重共线性的那些列。
  • 此函数将删除那些仅包含 1 个值的列。有关这一点的更多详细信息,请查看我对如何在 pandas 数据帧上运行多重共线性测试的回答?.
  • VIF 的计算在多个内核上并行进行。
    from joblib import Parallel, delayed
    from statsmodels.stats.outliers_influence import variance_inflation_factor
    
    def removeMultiColl(data, vif_threshold = 5.0):
        for i in data.columns:
            if data[i].nunique() == 1:
                print(f"Dropping {i} due to just 1 unique value")
                data.drop(columns = i, inplace = True)
        drop = True
        col_list = list(data.columns)
        while drop == True:
            drop = False
            vif_list = Parallel(n_jobs = -1, verbose = 5)(delayed(variance_inflation_factor)(data[col_list].values, i) for i in range(data[col_list].shape[1]))
            max_index = vif_list.index(max(vif_list))
            if vif_list[max_index] > vif_threshold:
                print(f"Dropping column : {col_list[max_index]} at index - {max_index}")
                del col_list[max_index]
                drop = True
        print("Remaining columns :\n", list(data[col_list].columns))
        return data[col_list]

祝你好运 !

1)首先,您需要进行变量回归,即对数据集中的每一列进行简单的线性回归并计算 p 值……从而了解每列相对于目标变量的重要性。

2)情节影响情节检查cooks_d值

 import statsmodels.api as sm
  infl = model1.get_influence()
  sm_fr = infl.summary_frame()

3) 您将从 sm_fr 数据帧中获得 cooks_d 值

4)选择 cooks_d 值>1 的行点,然后从数据框中删除该行,现在您已经删除了有影响的点。5)现在检查包含变量的新集合数据框的 VIF 值,并删除具有 vif>5 的变量,因为它们无关紧要......您还可以检查它们的显着性计算 p 值。

有关构建满足多元线性回归的所有假设(如线性、同方差、多元正态性和无多重共线性)的多元线性回归模型的总体过程,请参见下面的创业公司利润预测示例

https://github.com/tharun435/Data-Science-/blob/master/startups.ipynb

永远不要从数据集中删除特征。始终尝试利用它们。尝试使用一些 DR 技术(如 PCA)来消除特征之间的多重共线性。删除功能意味着您丢失了一些信息。除非多重共线性意味着它们之间的相关性为 1,否则您可以安全地删除它们。使用基于树的模型将捕获特征之间的这些微小差异。