精华内容
下载资源
问答
  • 多重共线性问题的几种解决方法在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系,也就是说,解释变量X1,X2,……,Xk中的任何一个都不能是其他解释变量线性组合。...

    多重共线性问题的几种解决方法

    在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系,也就是说,解释变量X1,X2,……,Xk中的任何一个都不能是其他解释变量的线性组合。如果违背这一假定,即线性回归模型中某一个解释变量与其他解释变量间存在线性关系,就称线性回归模型中存在多重共线性。多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。

    所谓多重共线性是指线性回归模型的解释变量之间由于存在精确相关关系或者高度相关关系而使模型评估失真或者不准确。这里,我们总结了8个处理多重共线性问题的可用方法,大家在遇到多重共线性问题时可作参考:

    1、保留重要解释变量,去掉次要或可替代解释变量

    自变量之间存在共线性,说明自变量所提供的信息是重叠的,可以删除不重要的自变量减少重复信息。但从模型中删去自变量时应该注意:从实际经济分析确定为相对不重要并从偏相关系数检验证实为共线性原因的那些变量中删除。如果删除不当,会产生模型设定误差,造成参数估计严重有偏的后果。

    2、改变解释变量的形式

    改变解释变量的形式是解决多重共线性的一种简易方法,例如对于横截面数据采用相对数变量,对于时间序列数据采用增量型变量。

    3、差分法

    4、逐步回归分析

    逐步回归(Stepwise Regression)是一种常用的消除多重共线性、选取“最优”回归方程的方法。其做法是将逐个引入自变量,引入的条件是该自变量经F检验是显著的,每引入一个自变量后,对已选入的变量进行逐个检验,如果原来引入的变量由于后面变量的引入而变得不再显著,那么就将其剔除。引入一个变量或从回归方程中剔除一个变量,为逐步回归的一步,每一步都要进行F 检验,以确保每次引入新变量之前回归方程中只包含显著的变量。这个过程反复进行,直到既没有不显著的自变量选入回归方程,也没有显著自变量从回归方程中剔除为止。

    5、主成份分析

    主成分分析作为多元统计分析的一种常用方法在处理多变量问题时具有其一定的优越性,其降维的优势是明显的,主成分回归方法对于一般的多重共线性问题还是适用的,尤其是对共线性较强的变量之间。

    6、偏最小二乘回归

    7、岭回归

    岭回归估计是通过最小二乘法的改进允许回归系数的有偏估计量存在而补救多重共线性的方法,采用它可以通过允许小的误差而换取高于无偏估计量的精度, 因此它接近真实值的可能性较大。灵活运用岭回归法, 可以对分析各变量之间的作用和关系带来独特而有效的帮助。

    8、增加样本容量

    多重共线性问题的实质是样本信息的不充分而导致模型参数的不能精确估计,因此追加样本信息是解决该问题的一条有效途径。但是,由于资料收集及调查的困难,要追加样本信息在实践中有时并不容易。

    这次我们主要研究逐步回归分析方法是如何处理多重共线性问题的。

    逐步回归分析方法的基本思想是通过相关系数r、拟合优度R2和标准误差三个方面综合判断一系列回归方程的优劣,从而得到最优回归方程。具体方法分为两步:

    第一步,先将被解释变量y对每个解释变量作简单回归:

    对每一个回归方程进行统计检验分析(相关系数r、拟合优度R2和标准误差),并结合经济理论分析选出最优回归方程,也称为基本回归方程。

    第二步,将其他解释变量逐一引入到基本回归方程中,建立一系列回归方程,根据每个新加的解释变量的标准差和复相关系数来考察其对每个回归系数的影响,一般根据如下标准进行分类判别:

    1.如果新引进的解释变量使R2得到提高,而其他参数回归系数在统计上和经济理论上仍然合理,则认为这个新引入的变量对回归模型是有利的,可以作为解释变量予以保留。

    2.如果新引进的解释变量对R2改进不明显,对其他回归系数也没有多大影响,则不必保留在回归模型中。

    3.如果新引进的解释变量不仅改变了R2,而且对其他回归系数的数值或符号具有明显影响,则认为该解释变量为不利变量,引进后会使回归模型出现多重共线性问题。不利变量未必是多余的,如果它可能对被解释变量是不可缺少的,则不能简单舍弃,而是应研究改善模型的形式,寻找更符合实际的模型,重新进行估计。如果通过检验证明回归模型存在明显线性相关的两个解释变量中的其中一个可以被另一个很好地解释,则可略去其中对被解释变量影响较小的那个变量,模型中保留影响较大的那个变量。

    下边我们通过实例来说明逐步回归分析方法在解决多重共线性问题上的具体应用过程。

    具体实例

    例1设某地10年间有关服装消费、可支配收入、流动资产、服装类物价指数、总物价指数的调查数据如表1,请建立需求函数模型。

    表1  服装消费及相关变量调查数据

    e22d8bfdde543d867f66a2609b481071.png

    (1)设对服装的需求函数为

    用最小二乘法估计得估计模型:

    模型的检验量得分,R2=0.998,D·W=3.383,F=626.4634

    R2接近1,说明该回归模型与原始数据拟合得很好。由得出拒绝零假设,认为服装支出与解释变量间存在显著关系。

    (2)求各解释变量的基本相关系数

    上述基本相关系数表明解释变量间高度相关,也就是存在较严重的多重共线性。

    (3)为检验多重共线性的影响,作如下简单回归:

    各方程下边括号内的数字分别表示的是对应解释变量系数的t检验值。

    观察以上四个方程,根据经济理论和统计检验(t检验值=41.937最大,拟合优度也最高),收入Y是最重要的解释变量,从而得出最优简单回归方程。

    (4)将其余变量逐个引入,计算结果如下表2:

    表2 服装消费模型的估计

    3eae77f5df4ea0f16c8fc4761c57f79b.png

    结果分析:

    ①在最优简单回归方程中引入变量Pc,使R2由0.9955提高到0.9957;根据经济理论分析,正号,负号是合理的。然而t检验不显著(),而从经济理论分析,Pc应该是重要因素。虽然Y与Pc高度相关,但并不影响收入Y回归系数的显著性和稳定性。依照第1条判别标准,Pc可能是“有利变量”,暂时给予保留。

    ②模型中引入变量L,R2由0.9957提高到0.9959,值略有提高。一方面,虽然Y与L,Pc与L均高度相关,但是L的引入对回归系数、的影响不大(其中的值由0.1257变为0.1387,值由-0.0361变为-0.0345,变化很小);另一方面,根据经济理论的分析,L与服装支出C之间应该是正相关关系,即的符号应该为正号而非负号,依照第2条判别标准,解释变量L不必保留在模型中。

    ③舍去变量L,加入变量P0,使R2由0.9957提高到0.9980,R2值改进较大。、、均显著(这三个回归系数的t检验值绝对值均大于),从经济意义上看也是合理的(服装支出C与Y,P0之间呈正相关,而与服装价格Pc之间呈负相关关系)。根据判别标准第1条,可以认为Pc、P0皆为“有利变量”,给予保留。

    ④最后再引入变量L,此时R2=0.9980没有增加(或几乎没有增加),新引入变量对其他三个解释变量的参数系数也没有产生多大影响,可以确定L是多余变量,根据判别标准第2条,解释变量L不必保留在模型中。

    因此我们得到如下结论:回归模型为最优模型。

    通过以上案例的分析,我们从理论和实际问题两方面具体了解了逐步回归分析是如何对多重共线性问题进行处理的。事实上,一般统计软件如SPSS,在回归模型的窗口中都会提供变量逐步进入的选项,勾选后实际上就是选择了运用逐步回归的思想来构建回归模型。运用SPSS软件不需要我们懂得其背后的运行规律,然而作为分析师,了解并理解模型背后的理论知识,将更有助于我们理解模型、解释结论背后的内在含义,从而达到更好地分析问题的目的。

    喜欢 (2)or分享 (0)

    展开全文
  • 如何消除多重共线性

    千次阅读 2021-06-13 08:42:13
    介绍 机器学习是一种解决不能明确...多重共线性是指一个预测变量与另一个预测变量相关的情况。多重共线性虽然不影响模型的性能,但会影响模型的可解释性。如果我们不去除多重共线性,我们将永远不会知道一个变量对结果

    介绍

    机器学习是一种解决不能明确编码的问题的方法,例如,分类问题。机器学习模型将从数据中学习一种模式,因此我们可以使用它来确定数据属于哪个类。

    但有个问题。这个模型是如何工作的?一些人不能接受一个性能良好的模型,因为它不能被解释。这些人关心可解释性,因为他们想确保模型以合理的方式预测数据。

    在解释ML模型之前,消除多重共线性是一个必要的步骤。多重共线性是指一个预测变量与另一个预测变量相关的情况。多重共线性虽然不影响模型的性能,但会影响模型的可解释性。如果我们不去除多重共线性,我们将永远不会知道一个变量对结果的贡献有多大。因此,我们必须消除多重共线性。

    本文将向您展示如何使用Python消除多重共线性。

    数据源

    为了演示,我们将使用一个名为Rain in Australia的数据集。它描述了不同日期和地点的天气特征。这个数据集也是一个监督学习问题,我们可以使用这些数据来预测明天是否下雨。这个数据集可以在Kaggle上找到,你可以在这里访问它。

    import pandas as pd
    
    df = pd.read_csv('data.csv')
    print(df.shape)
    df.head()
    

    预处理的数据

    加载数据之后,下一步是对数据进行预处理。在本例中,我们将不使用分类列,并删除每个列至少缺少一个值的行。下面是这样做的代码:

    df = df[list(df.columns[2:])]
    df = df.drop(['WindGustDir', 'WindDir9am', 'WindDir3pm'], axis=1)
    df = df.dropna()
    print(df.shape)
    df.head()
    

    计算VIF值

    在我们有了干净的数据之后,让我们计算方差膨胀因子(VIF)值。VIF是什么?

    VIF是一个决定变量是否具有多重共线性的数值。这个数字也代表了一个变量因与其他变量线性相关而被夸大的程度。

    VIF取值从1开始,没有上限。如果这个数字变大,就意味着这个变量有巨大的多重共线性。

    为了计算VIF,我们将对每个变量进行线性回归过程,其中该变量将成为目标变量。在我们完成这个过程之后,我们计算出R的平方。最后,我们用这个公式计算VIF值:

    在Python中,我们可以使用statmodels库中的variance_inflation_factor函数来计算VIF。下面是这样做的代码和结果:

    import statsmodels.api as sm
    from statsmodels.stats.outliers_influence import variance_inflation_factor
    
    X = df[list(df.columns[:-2])]
    
    vif_info = pd.DataFrame()
    vif_info['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
    vif_info['Column'] = X.columns
    vif_info.sort_values('VIF', ascending=False)
    

    从上面可以看到,几乎所有变量的VIF值都大于5。甚至压力变量的VIF值也超过40万。这是一个很大的因素!

    因此,我们需要从数据中清除这些多重共线性。

    消除多重共线性

    为了消除多重共线性,我们可以做两件事。我们可以创建新的特性,也可以从数据中删除它们。

    首先不建议删除特征。因为我们去掉了这个特征,就有可能造成信息丢失。因此,我们将首先生成新特性。

    从数据中,我们可以看到有一些特征有它们对。例如,’ Temp9am ‘加上’ Temp3pm ', ’ Pressure9am ‘加上’ Pressure3pm ', ’ Cloud9am ‘加上’ Cloud3pm ',等等。

    从这些特性中,我们可以生成新的特性。新特性将包含这些对之间的差值。在我们创建这些特性之后,我们可以安全地将它们从数据中删除。

    下面是这样做的代码和结果:

    df['TempDiff'] = df['Temp3pm'] - df['Temp9am']
    df['HumidityDiff'] = df['Humidity3pm'] - df['Humidity9am']
    df['CloudDiff'] = df['Cloud3pm'] - df['Cloud9am']
    df['WindSpeedDiff'] = df['WindSpeed3pm'] - df['WindSpeed9am']
    df['PressureDiff'] = df['Pressure3pm'] - df['Pressure9am']
    
    X = df.drop(['Temp3pm', 'Temp9am', 'Humidity3pm', 'Humidity9am', 'Cloud3pm', 'Cloud9am', 'WindSpeed3pm', 'WindSpeed9am', 'Pressure3pm', 'Pressure9am', 'RainToday', 'RainTomorrow'], axis=1)
    
    X.head()
    

    现在让我们看看数据的VIF值是怎样的:

    vif_info = pd.DataFrame()
    vif_info['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
    vif_info['Column'] = X.columns
    vif_info.sort_values('VIF', ascending=False)
    

    正如你从上面看到的,我们仍然得到了具有巨大VIF值的变量。但是,我们仍然从生成新功能中得到了一个很好的结果。

    现在让我们删除VIF值大于5的特性。下面是这样做的代码和结果:

    X = X.drop(['MaxTemp', 'MinTemp', 'TempDiff', 'Sunshine'], axis=1)
    
    vif_info = pd.DataFrame()
    vif_info['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
    vif_info['Column'] = X.columns
    vif_info.sort_values('VIF', ascending=False)
    

    好了!现在我们有所有VIF值小于5的变量。有了这些变量,现在我们就可以解释结果了。但首先,让我们建立我们的机器学习模型。

    构建模型

    在这种情况下,我们将使用支持向量机(SVM)算法来建模我们的数据。简而言之,SVM是一种模型,它将创建一个超平面,可以最大限度地分离使用不同标签的数据。

    因为我们的数据属于一个分类任务,所以我们将使用scikit-learn中的SVC对象来创建模型。下面是这样做的代码:

    from sklearn.preprocessing import LabelEncoder
    from sklearn.model_selection import train_test_split
    from sklearn.svm import SVC
    
    encoder = LabelEncoder()
    y_encoded = encoder.fit_transform(y)
    print(encoder.classes_)
    print(y_encoded)
    
    X_train, X_test, y_train, y_test = train_test_split(X.values, y_encoded)
    
    model = SVC()
    model.fit(X.values, y_encoded)
    
    print(model.score(X_test, y_test))
    

    利用排列特征重要性进行解释

    理论上,支持向量机模型是不可解释的。这是因为我们不能仅仅通过查看参数来解释结果。但幸运的是,我们有几种方法可以解释这个模型。我们可以使用的方法之一是排列特征的重要性。

    排列特征重要性通过观察改变特征值后误差增加了多少来衡量一个特征的重要性。如果特征值的变化增加了模型的误差,那么该特征是重要的。

    要实现这个方法,可以使用scikit-learn库中的permutation_importance函数来计算特性的重要性。根据这个结果,我们将创建一个箱线图来可视化特性的重要性。

    下面是这样做的代码和结果:

    from sklearn.inspection import permutation_importance
    
    result = permutation_importance(model, X.values, y_encoded, n_repeats=10, random_state=42)
    
    perm_imp_idx = result.importances_mean.argsort()
    plt.boxplot(result.importances[perm_imp_idx].T, vert=False,
                labels=X.columns[perm_imp_idx])
    plt.title('Feature Importance from Rain in Australia Dataset')
    plt.show()
    

    从上面可以看到,HumanityDiff特性是对最终结果有巨大贡献的最重要的特性。然后是降雨特性,这是第二个最重要的特性。其次是风速(WindGustSpeed)、蒸发(vaporize)、风速差(WindSpeedDiff)、气压差(PressureDiff)和云l量差(CloudDiff)。

    最后总结

    做得好!现在您已经学习了如何使用Python从数据集中删除多重共线性。我希望这篇文章能帮助你消除多重共线性,以及如何解释机器学习模型。

    作者:Irfan Alghani Khalid

    展开全文
  •  多重共线性: 也即使用的多个预测变量之间存在线性相关。多重共线性会导致解的不稳定,进而可能导致意外的结果。在线性代数中,基坐标必须是相互正交的,也即不相关的,此处在做多元回归预测时,必须保证预测变量...

    一  概念

           多重共线性: 也即使用的多个预测变量之间存在线性相关。多重共线性会导致解的不稳定,进而可能导致意外的结果。在线性代数中,基坐标必须是相互正交的,也即不相关的,此处在做多元回归预测时,必须保证预测变量之间是不相关的。

       避免手段: 

         (1)分析之前:

            a. 逐个计算预测变量之间的相关系数。 

    > cor(sugar$sugars,sugar$shelf)
    [1] 0.1004379
    > cor(sugar$fiber,sugar$potass)
    [1] 0.9033737
                可以看到纤维和钾含量存在高度相关性,需要注意

          b.为预测变量建立矩阵图

        

    > #同时画多个变量的对照图需要使用 car包中的 scatterplotMatrix函数
    >install.packages("car")
    >library(car)
    >#使用谷物数据集的 “糖”,“纤维”,“钾”三列数据
    > sugar_frame<-as.data.frame(sugar[,c("糖","纤维","钾")])
    >#画出对照图
    > scatterplotMatrix(sugar_frame,spread=F,lty.smooth=2,var.labels=c("糖","纤维","钾"))

           结果如下图:

      

     可以看到第四张和第六张是纤维和钾的相关图,可以看出他们之间有很强相关性。

     (2)分析之后:方差膨胀因子(variance inflation factors,VIFs)

                                     

        其中Ri^2表示R^2的值是通过在其他预测变量上回归分析xi得到的。假设xi和其他变量没有任何关系,那么Ri^2=0,于是可以得到VIFi=1/(1-0)=1。也即VIF最小值为1,没有最大值.

        VIFi的变化对第i个系数的变化率Sbi如何产生影响,有如下公式:

                  

      如果xi与其他预测变量不想管,那么VIFi=1,而且相关系数的标准差Sbi没有增大。然而如果xi与其他变量相关,那么较大的VIFi值会使得相关系数的标准差Sbi过度膨胀。因此,方差估计的膨胀会导致估计精度的下降。粗略的经验法则如下:

                VIF>=5    模型有中度的多重共线性(相当于R^2=0.08) 

           VIF>=10  模型中有严重多重共线性(相当于R^2=0.90)


      下面来查看谷物数据集中 糖、纤维、钾的膨胀因子

       

    > #回归拟合
    > fit<-lm(data=sugar,rating~sugars+fiber+potass)
    >#注意,我们只是用了sugar数据集中包含“糖”,“纤维”,“钾”三列数据的sugar_frame
    >#进行膨胀因子计算时,需要使用gvlma包中的vif函数,因此需要先安装
    > install.packages("gvlma")
    > library(gvlma)
    Warning message:
    程辑包‘gvlma’是用R版本3.0.2 来建造的 
    >#线性模型的综合验证
    > gvlma(fit)
    Call:
    lm(formula = rating ~ sugars + fiber + potass, data = sugar)
    
    Coefficients:
    (Intercept)       sugars        fiber       potass  
        52.6762      -2.0510       4.3701      -0.0543  
    
    
    ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
    USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
    Level of Significance =  0.05 
    
    Call:
     gvlma(x = fit) 
    
                         Value p-value                   Decision
    Global Stat        7.24415 0.12353    Assumptions acceptable.
    Skewness           5.61716 0.01779 Assumptions NOT satisfied!
    Kurtosis           0.02125 0.88411    Assumptions acceptable.
    Link Function      0.40164 0.52624    Assumptions acceptable.
    Heteroscedasticity 1.20410 0.27250    Assumptions acceptable.
    >#查看膨胀因子 vif
    > vif(fit)
      sugars    fiber   potass 
    1.164237 6.327286 6.204047
    


    二.  变量选择方法

            为帮助数据分析人员确定在多元回归模型中应该包含哪些变量,下面是几种变量选择方法:向前选择、向后排除、逐步选择和最优子集。注意四种选择方法所使用的数据集都是 “谷物数据集”
         

         2.1   向前选择程序

             (1)对于第一个加入模型的变量,选择与回应变量相关度最高的预测变量(假设为x1)如果所有变量对模型都不重要,则停止,否则执行(2)。
      (2)对其余的每个变量,F统计序列式F(x2|x1),F(x3|x1),F(x4|x1).第二次通过此算法时是,F(x3|x1,x2),F(x4|x1,x2)。选择具有最大F统计序列的变量
       (3)对(2)选择出来的变量,进行F统计序列的显著性检验。如果结果模型没有重大意义,则停止,否咋将从(2)得到的变量加入到模型中,然后返回(2)。


        初始:模型中没有变量
         过程:把与回应变量(营养级别) 密切相关的变量选出来,如果是显著的就加入到模型中。变量糖在所有预测变量中与营养级别有最高的相关系数(r=0.762)。然后进行序列F检验,例如F(纤维|糖)和F(钠|糖)等,然后看到,F(纤维|糖)显著性检验具有最高的F统计序列值,这样变量纤维作为第二个变量加入到模型中。再进行一次序列F检验,比如F(钠|糖,纤维)和F(脂肪|糖,纤维),等等。F(钠|糖,纤维)具有最高的序列F统计值。因而钠作为第三个变量加入到模型中
        结束:一次按照第二步进行,得到如下变量加入顺序:脂肪,蛋白质,碳水化合物,卡里路,维生素和钾。此时再也找不到其他显著的变量加入模型中才中断,此时的多元回归模型如下:
             y=b0+b1(糖)+b2(纤维)+b3(钠)+b4(脂肪)+b5(蛋白质)+b6(碳水化合物)+b7(卡里路)+b8(钾)+e

                                               下图显示了一个顺序选择的模型概览:


         
      2.2 向后排除程序
       
       向后排除程序是从模型中所有变量或者所有用户自定义变量集开始的。步骤如下:
      (1)在全模型中执行向后排除,即使用所有变量的模型。例如,可能全模型中有4个变量x1,x2,x3,x4
      (2)对于当前模型中的每个变量,计算出它的偏F统计量。第一次是:F(x1,x2,x3,x4)、F(x2|x1,x3,x4)、F(x3|x1,x2,x4)和F(x4|x1,x2,x3)。选择具有最小偏F统计量的比那辆,其值用Fmin表示
      (3)检验Fmin的显著性。如果Fmin不显著,从模型中删除与Fmin对应的变量,然后返回执行(2),如果Fmin显著,停止这个过程。

       实例:
      起始时模型包含了所有变量,然后计算该模型中每个变量的偏F统计量。例如,这些统计量分别是F(重量|糖,纤维,....杯子),F(杯子|糖,纤维,.....重量|)。找到最小偏F统计量(Fmin)对应的变量。第一次是重量,此时Fmin不显著,因而从模型中去掉,接下来变量具有最小偏F统计是杯子,也是不显著的,因而需要被剔除。第三次具有最小偏F统计量的是货架2的指标变量,但是Fmin对应的p值并没有大道可以从模型中剔除,因而保留并中断。得到的模型为:
               y=b0+b1(糖)+b2(纤维)+b3(钠)+b4(脂肪)+b5(蛋白质)+b6(碳水化合物)+b7(卡里路)
                   +b8(维生素)+b9(钾)+b10(货架2)+e

                
      模型1表示包含所有预测变量,模型2中剔除了重量之外所有预测变量,于是有:
              SS重量|所有其他变量=SS所有变量-SS重量以外所有变量=12980.078-14980.005=0.073
      上表信息中显示,偏F统计量的结果为:
                 F(重量|所有其他变量)=SS重量|所有其他变量/MSE所有变量=0.073/0.261=.0280
      F统计量的值0.28 落在F1,n-p-2=F1,72分布的40%点处,对应的p值是0.60,因而重量不应该包含在模型中。

      2.3 逐步选择程序


       逐步选择程序是向前选择方法的一种改进。在向前选择中会出现这种情况,当新加入的变量加入到模型时,向前选择过程中已经加入的变量可能就显得不重要了,这在向前选择方法中是没有考虑的。逐步选择过程可以检验这种情况,方法是每一步在现有变量的基础上计算每个变量的部分平方和,执行偏F检验。如果模型中有一个变量不再是显著的,这个含有最小偏F统计的变狼就会被移出模型。当不再有变量加入或者移出模型时,结束过程并得到最终模型。

    2.4  最优子集程序


        对于预测变量集不是太大的数据集,最优子集是一种较好方法。但是如果预测变量超过30个,最优子集方法就会产生组合爆炸,难以控制。步骤如下:
        (1)分析人员需要指定需要多少个(假设为m)供筛选的模型,以及在一个模型中含有最大预测变量个数(假设          为n)
        (2)对于含有一个预测变量的所有模型,例如:y=b0+b1(糖),y=b0+b1(纤维),....等。计算对应的R^2,修正R^2          和S值都计算出来,最优的m个模型是基于这些统计值得到。
        (3)对于含有两个...........最优的m个模型是基于这些统计值得到。
        (4)重复以上,直到达到最大的预测变量(n)个数,然后分析人员把预测变量个数为1,2,,..n的最优模型罗            列,以选择最佳总体模型。

       实例,下图是最优子集程序用于谷物数据集的省略概览  
        (注意,整个过程比下图要复杂,例如变量数为1时,本应该有12行结果,下图中只简要用了两行,其他的也是


         
         图中,每一行代表一个不同的模型,某模型中包含了哪个变量,该变量对应的方格被涂成黑色。如,第一个模型(第一行)仅包含了变量糖;第四个模型(第四行)包含了糖和钾。其中的最优模型子集被红色覆盖的那个模型(也即那一行)。
        
    展开全文
  • 上篇文章《简单而强大的线性回归详解》(点击跳转)详细介绍了线性回归分析方程、损失方程及求解、模型评估指标等内容,其中在推导多元...本文将详细介绍线性回归中多重共线性问题,以及一种线性回归的缩减(shrinkage...

    上篇文章《简单而强大的线性回归详解》(点击跳转)详细介绍了线性回归分析方程、损失方程及求解、模型评估指标等内容,其中在推导多元线性回归使用最小二乘法的求解原理时,对损失函数求导得到参数向量 的方程式

    上式中有解,即能够得到最后一步的前提条件是存在逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。

    本文将详细介绍线性回归中多重共线性问题,以及一种线性回归的缩减(shrinkage)方法 ----岭回归(Ridge Regression),并对其进行了Python实现

    多重共线性

    多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

    从线性等式理解,对于  个变量,如果存在常数 使得如下公式,可近似表示为

    那么通常称这 个变量存在多重共线性。

    下面从特征矩阵的角度出发,深入探究多重共线性将究竟如何影响对损失函数求解,以便深刻理解改进原理。

    逆矩阵存在的充要条件

    逆矩阵计算公式

    其中 是伴随矩阵,其存在没有限制条件,当然也不会影响逆矩阵的存在性。而矩阵的行列式 存在于分母上,其值不能为零。由此得到,逆矩阵存在的充分必要条件是:矩阵的行列式不能为0。

    即 存在逆矩阵的充要条件为 不能为0。这是使用最小二乘法来求解线性回归的核心条件之一。

    行列式与矩阵

    矩阵(matrix)是一组数按照一定方式排列的数表,它不能从整体上被看成一个数(只有一个数的1阶矩阵除外),记为

    在线性代数中,行列式(determinant)是一个函数,它将每个 矩阵 对应到一个纯量(scalar),简单讲即是行列式是这一组数按照某种运算法则计算出的一个数,记为 或

    行列式不为零的充要条件

    假设特征矩阵 的结构为,则

    一般行列式计算不会通过展开的方式,而是通过行列初等行变换/列变换将其整合成一个梯形的行列式

    由于梯形行列式下半部分为0,整个矩阵的行列式其实就是梯形行列式对角线上的元素相乘。

    由此可见,如果对角线上的任一个元素为0,则行列式结果即为0。反之,如果对角线上的任一元素均不为0,则行列式不为0。

    矩阵满秩是矩阵的行列式不为0的充分必要条件。

    满秩矩阵

    一个结构为 的矩阵 ,若 转换为梯形矩阵后,没有任何全为0的行或者全为0的列,则称 为满秩矩阵。简单来说,只要对角线上没有一个元素为0,则这个矩阵中绝对不可能存在全为0的行或列。

    矩阵满秩的充要条件

    精确相关关系

    即完全相关,矩阵两行之间或两列之间存在完全线性关系,这种精确相关关系会使得矩阵的行列式为0,则矩阵的逆矩阵不存在。在最小二乘法中,如果矩阵 中存在这种精确相关关系,则逆矩阵不存在,线性回归无法使用最小二乘法求出结果

    无解

    即当 则会发生除零错误 。

    高度相关关系

    即不完全相关,这种高度相关关系下,矩阵的行列式不为0,但是一个非常接近0的数,矩阵的逆是存在的,但接近无限大,直接影响参数向量求解。

    这种情况下,结果参数向量 无穷大,直接影响模型结果,造成模型偏差大或不可用。

    精确相关关系和高度相关关系并称"多重共线性"。

    矩阵行与行或列于列之间相互独立,其矩阵的行列式经初等变换后的对角线上没有任何元素特别接近于0,因此矩阵求得的参数向量不会对模型产生影响,对拟合结果也是较理想的。

    正常值

    由此可见,一个矩阵如果要满秩,则要求矩阵中每个向量之间不能存在多重共线性,这也构成了线性回归算法对于特征矩阵的要求。

    多重共线性与相关性

    多重共线性(Multicollinearity)是一种统计现象,是指线性模型中的特征(解释变量)之间由于存在精确相关关系或高度相关关系, 多重共线性的存在会使模型无法建立,或者估计失真。多重共线性使用指标方差膨胀因子(variance inflation factor,VIF)来进行衡量(from statsmodels.stats.outliers_influence import variance_inflation_factor), 通常当我们提到"共线性",都特指多重共线性。

    相关性(Correlation)是衡量两个或多个变量一起波动的程度的指标,它可以是正的,负的或者0。一般而言,变量之间具有相关性,通常是指线性相关性,线性相关一般由皮尔逊相关系数进行衡量,非线性相关可以使用斯皮尔曼相关系数或者互信息法进行衡量。此部分可参见数据探索分析(点击跳转)。

    多重共线性对回归模型的影响

    回归系数的估计值方差变大,回归系数的置信度变宽,估计的精确性大幅度降低,使得估计值稳定性变差。

    会使得一些回归系数通不过显著性检验,回归系数的正负号也可能出现倒置,使得回归方程无法得到合理的解释,直接影响最小二乘法的计算结果。

    多重共线性如果存在,则线性回归就无法使用最小二乘法来进行求解,或者求解就会出现偏差。不能存在多重共线性,不代表不能存在相关性——机器学习不要求特征之间必须独立,必须不相关,只要不是高度相关或者精确相关就好。

    改进线性回归处理多重共线性

    处理多重共线性方法有多种,其中最直接的方法是手动移除共线性的变量。具体做法是先对数据进行相关分析,若两个特征的相关系数大于某特定值(一般为0.7),则手动移除其中一个特征,再继续做回归分析。这种做法会导致估计结果产生偏差,会引起遗漏变量问题。而且有时数据特征本来就很少,或并不想直接删除特征,此时可考虑其他更加有效的方法。

    改进线性回归即是当前解决多重共线性问题的最有效的方法。

    岭回归

    岭回归分析(Ridge Regression)是一种改良的最小二乘法,其通过放弃最小二乘法的无偏性,以损失部分信息为代价来寻找效果稍差但回归系数更符合实际情况的模型方程。该模型求解的回归模型的损失函数为线性最小二乘函数,正则化采用l2-范数。也称为岭回归(Ridge Regression)或吉洪诺夫正则化(Tikhonov regularization)。岭回归与套索回归(Lasso Regression)两个算法不是为了提升模型表现,而是为了修复漏洞而设计的。(Lasso回归将在下一篇章介绍)

    岭回归原理和逻辑是将求解 的过程转化为一个带条件的最优化问题,然后再用最小二乘法求解。岭回归在多元线性回归的损失函数上加上了正则项,表达为系数 的L2-范式(即系数 的平方项)乘以正则化系数 。

    最小化目标函数:

    假设我们的特征矩阵结构为(m,n),系数 的结构是(1,n), 是构为(n,n)单位矩阵则

    最终得到

    从而转化为只需 存在逆矩阵,就能求解出参数向量 。

    假设原本的特征矩阵存在共线性,即非满秩矩阵

    最后得到的这个行列式还是一个梯形行列式,但已经不存在全0行或者全0列了,除非以下两种情况,否则矩阵永远都是满秩。

    (1) 

    (2) 原本的矩阵存在对角线上元素为 ,且其他元素都为0的行或者列

    以上两种情况,在sklearn中都可以轻松应对:自由控制 ;当出现无法求解时,更换 取值即可。则可认为 是存在的

    其中

    通过调整正则化系数 大小,来避免"精确相关关系"及"高度相关关系"带来的影响。如此,多重共线性就被控制住了:最小二乘法一定有解,并且这个解可以通过 来进行调节,以确保不会偏离太多。当然了, 挤占了 中由原始的特征矩阵贡献的空间,因此 如果太大,也会导致的估计出现较大的偏移,无法正确拟合数据的真实面貌。我们在使用中,需要找出 让模型效果变好的最佳取值。

    语法:
    sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver=’auto’, random_state=None)
    重要参数:

    alpha : {float, ndarray of shape (n_targets,)}, default=1.0

    正则化参数,必须是正浮点数。正则化改善了问题的条件,降低了估计的方差。值越大表示正则化惩罚越强。对应于其它线性模型中的 C−1,如LogisticRegression或LinearSVC。如果传递了数组,则惩罚特定目标。

    例:
    >>> from sklearn.linear_model import Ridge
    >>> import numpy as np
    >>> n_samples, n_features = 10, 5
    >>> rng = np.random.RandomState(0)
    >>> y = rng.randn(n_samples)
    >>> X = rng.randn(n_samples, n_features)
    >>> clf = Ridge(alpha=1.0)
    >>> clf.fit(X, y)
    Ridge()

    虽然岭回归和Lasso不是设计来提升模型表现,而是专注于解决多重共线性问题的,但当 在一定范围内变动的时候,消除多重共线性也许能够一定程度上提高模型的泛化能力。

    案例

    波士顿房价数据集中看岭回归处理多重共线性。

    from sklearn.datasets import load_boston
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    from sklearn.linear_model import Ridge
    import numpy as np
    from sklearn.linear_model import LinearRegression # 线性回归模型
    from sklearn.model_selection import train_test_split# 交叉验证
    X = load_boston().data
    y = load_boston().target
    Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3,random_state=420)
    #先查看方差的变化,再看R2的变化
    alpha_range = np.arange(1,1001,100)
    ridge_var, lr_var, ridge_mean, lr_mean = [], [], [], []
    plt.figure(figsize=(16,10))
    plt.style.use('seaborn')
    for alpha in alpha_range:
        ridge = Ridge(alpha=alpha)
        linear = LinearRegression()
        score_rig = cross_val_score(ridge,X,y,cv=5,scoring="r2")
        score_linear = cross_val_score(linear,X,y,cv=5,scoring="r2")
        ridge_var.append(score_rig.var())
        lr_var.append(score_linear.var())
        ridge_mean.append(score_rig.mean())
        lr_mean.append(score_linear.mean())
    name = ['variance', 'mean']
    for i,j in enumerate([[ridge_var, lr_var], [ridge_mean, lr_mean]]):
        plt.subplot(2,2,i+1)
        plt.plot(alpha_range,j[0],color="green",label="Ridge")
        plt.plot(alpha_range,j[1],color="blue",label="LR")
        plt.title(f"cross_val_score {name[i]} for different alpha values")
        plt.xlabel("alpha")
        plt.ylabel(f"{name[i]}")
        plt.legend()
    #细化学习曲线
    alpha_range = np.arange(100,300,10)
    ridge_score, lr_score = [], []
    for alpha in alpha_range:
        reg = Ridge(alpha=alpha)
        linear = LinearRegression()
        regs = cross_val_score(reg,X,y,cv=5,scoring = "r2").mean()
        linears = cross_val_score(linear,X,y,cv=5,scoring = "r2").mean()
        ridge_score.append(regs)
        lr_score.append(linears)
    for i,j in enumerate([[ridge_score,"Ridge", "green"], [lr_score, "LR", 'blue']]):
        plt.subplot(2,2,i+3)
        plt.plot(alpha_range,j[0],color=j[2],label=j[1])
        plt.title("cross_val_score mean for different alpha values")
        plt.xlabel("alpha")
        plt.ylabel("Mean")
        plt.legend()
    plt.suptitle("cross_val_score of the LR and Ridge for different alpha values", y=0.95, fontsize=18)
    plt.show()  
    输出结果

    38c43ba93c81f92ef9f9370deb04c442.png

    可以发现,比起加利佛尼亚房屋价值数据集,波士顿房价数据集的方差降低明显,偏差也降低明显,可见使用岭回归还是起到了一定的作用,模型的泛化能力是有可能会上升的。

    选择最佳正则化系数

    使用交叉验证类 RidgeCV 来选择最佳的正则化系数。

    sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)
    重要参数

    alphas : numpy array of shape [n_alphas]

    需要测试的正则化参数的取值的元祖

    scoring : string, callable or None, optional, default: None

    用来进行交叉验证的模型评估指标,默认是,可自行调整

    store_cv_values : boolean, default=False

    是否保存每次交叉验证的结果,默认False

    cv : int, cross-validation generator or an iterable, optional

    交叉验证的模式,默认是None,表示默认进行留一交叉验证可以输入Kfold对象和StratifiedKFold对象来进行交叉验证 注意,仅仅当为None时,每次交叉验证的结果才可以被保存下来当cv有值存在(不是None)时,store_cv_values无法被设定为True

    重要属性

    alpha_ : float

    查看交叉验证选中的alpha

    cv_values_ : array, shape = [n_samples, n_alphas] or shape = [n_samples, n_targets, n_alphas], optional

    调用所有交叉验证的结果,只有当 store_cv_values=True 的时候才能够调用,因此返回的结构是 (n_samples, n_alphas)

    重要接口

    score

    调用Ridge类不进行交叉验证的情况下返回的

    >>> import numpy as np
    >>> from sklearn import linear_model
    >>> reg = linear_model.RidgeCV(alphas=np.logspace(-6, 6, 13))
    >>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
    RidgeCV(alphas=array([1.e-06, 1.e-05, 1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01,
          1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06]))
    >>> reg.alpha_
    0.01

    另一种方式是使用岭迹图来判断正则项参数的最佳取值,了解即可,实际工作中不建议使用。

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import linear_model
    #创造10*10的希尔伯特矩阵
    X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
    y = np.ones(10)
    #计算横坐标
    n_alphas = 200
    alphas = np.logspace(-10, -2, n_alphas)
    #建模,获取每一个正则化取值下的系数组合
    coefs = []
    for a in alphas:
        ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
        ridge.fit(X, y)
        coefs.append(ridge.coef_)
    #绘图展示结果
    ax = plt.gca()
    ax.plot(alphas, coefs)
    ax.set_xscale('log')
    ax.set_xlim(ax.get_xlim()[::-1])  #将横坐标逆转
    plt.xlabel('正则化参数alpha')
    plt.ylabel('系数w')
    plt.title('岭回归下的岭迹图')
    plt.axis('tight')
    plt.show()

    c6a6162cdb7d763c13d57cf98d5f61d7.png

    岭迹图

    以正则化参数即岭参数 为横坐标,线性模型求解的系数即岭系数 为纵坐标的图像,其中每一条彩色的线都是一个岭系数 。其目标是建立岭参数 与岭系数 之间的直接关系,以此来观察岭参数的变化如何影响了岭系数 的拟合。

    岭迹图认为,线条交叉越多,则说明特征之间的多重共线性越高。我们应该选择系数较为平稳的喇叭口所对应的 取值作为最佳的正则化参数的取值。不存在奇异性时,岭迹图应稳定的逐渐趋向于0。

    希伯尔特矩阵

    岭回归分析是一种用于存在多重共线性(自变量高度相关)数据的技术。在线性回归基础上增加L2正则化项 。

    除常数项以外,这种回归的假设与最小二乘回归类似;它收缩了相关系数的值,但没有达到零,这表明它没有特征选择功能,这是一个正则化方法,并且使用的是L2正则化。

    转载请联系笔者

    点赞关注转发在看支持笔者,关注持续获取最新数据分析相关干货。

    展开全文
  • 6.6 对第5章思考与练习中第9题(xt5.9)财政收入的数据,分析数据的多重共线性,并根据多重共线性剔除变量,将所得结果与用逐步回归法所得的选元结果相比较。 rm(list=ls()) # ---- xt5.9 逐步回归法 ---- data5.9 ...
  • 当数据涉及的维度过多时,我们就很难保证维度之间互不相关,而这些维度又都对结果产生一定影响,当一组维度或者变量之间有较强的相关性时,就认为是一种违背多元线性回归模型基本假设的情形。今天我们就讲解一下如何...
  • 多重共线性是如何影响回归模型的

    千次阅读 2021-10-11 08:54:13
    当回归模型中的自变量之间高度相关时,存在多重共线性。 例如,如果你的模型包括2个变量,即工作经验年数和工资,那么在你的模型中就很有可能存在多重共线性。原因是从常识上讲,经验越丰富,薪水越高。 它对线性...
  • 多元线性回归中多重共线性Linear Regression is one of the simplest and most widely used algorithms for Supervised machine learning problems where the output is a numerical quantitative variable and the ...
  • 多重共线性详解

    千次阅读 多人点赞 2020-12-26 23:04:23
    目录 1、多重共线性的现象 2、出现的原因 3、判别标准 4、检验方法 5、多重共线性有什么影响 6、多重共线性处理方法 7、其他说明 8、多重共线性识别-python代码8.1、vif检验8.2 相关系数8.3 聚类 9、宏观把握共线性...
  • 多重共线性的解决方法

    万次阅读 2017-06-19 16:18:20
    多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。
  • 如果违背这一假定,即线性回归模型中某一个解释变量与其他解释变量间存在线性关系,就称线性回归模型中存在多重共线性多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。 所谓多重...
  • 多重共线性问题

    2020-05-11 18:18:03
    多重共线性问题
  • 文章目录多重共线性@[toc]1 什么是多重共线性1.1 多重共线性含义1.2 多重共线性产生原因2 多重共线性后果2.1 完全型2.2 不完全型3 多重共线性检验3.1 简单相关系数检验3.2 方差膨胀因子法3.3 经验法3.4 逐步回归检测...
  • 机器学习:多重共线性

    2021-03-08 10:52:05
    1 什么是多重共线性
  • Content线性回归的多重共线性1. 前提2. 由损失函数推导ω(基于最小二乘法OLS)3. 上述计算结果不成立3.1 多重共线性的机器学习解释3.2 多重共线性的解决4. Ridge & Lasso4.1 Ridge4.2 Lasso 线性回归的多重共线性...
  • 多重共线性在python中的解决方法 本文将讨论多重共线性的相关概念及利用python自动化消除多重共线性的方法,以供参考,欢迎拍砖 线性模型与非线性模型 关于线性模型与非线性模型的定义,似乎并没有确切的定论,但是...
  • 当回归模型中两个或两个以上的自变量彼此相关时,则称回归模型中存在多重共线性,也就是说共线性的自变量提供了重复的信息。 那么这种多重共线性会有什么不好的影响吗?答案是会的,而且影响非常不好。总结一下就是...
  • 多重共线性问题的几种解决方法

    千次阅读 2018-06-14 11:17:08
    如果违背这一假定,即线性回归模型中某一个解释变量与其他解释变量间存在线性关系,就称线性回归模型中存在多重共线性多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。 所谓多重共...
  • 数据多重共线性Multicollinearity is likely far down on a mental list of things to check for, if it is on a list at all. This does, however, appear almost always in real-life datasets, and it’s ...
  • 对于线性回归模型,数据中是不能有多重共线性的。我想知道如果使用决策树或者随机森林或者其他一些基于树的模型,数据中的多重共线性的现象对模型有没有什么影响? 1、回答1 随机森林的预测能力不受多重共线性影响。...
  • 多元线性回归中多重共线性Linear Regression is one of the simplest and most widely used algorithms for Supervised machine learning problems where the output is a numerical quantitative variable and the ...
  • Python 多重共线性检验

    千次阅读 2021-03-13 10:28:41
    多重共线性概念 共线性问题指的是输入的自变量之间存在较高的线性相关度。共线性问题会导致回归模型的稳定性和准确性大大降低,另外,过多无关的维度计算也很浪费时间。 多重共线性产生原因 样本量太少,导致部分...
  • 逻辑回归中解决多重共线性问题

    千次阅读 2020-03-03 09:57:56
    所以多重共线性本质上是数据问题。 造成多重共线性的原因有一下几种: 1、解释变量都享有共同的时间趋势; 2、一个解释变量是另一个的滞后,二者往往遵循一个趋势; 3、由于数据收集的基础不够宽,某些解释变量可能...
  • 回归中的多重共线性是一个当模型中一些预测变量与其他预测变量相关时发生的条件。严重的多重共线性可能会产生问题,因为它可以增大回归系数的方差,使它们变得不稳定。以下是不稳定系数导致的一些后果: 即使预测...
  • 多重共线性是指自变量彼此相关的一种情况。当你拟合模型并解释结果时,多重共线性可能会导致问题。数据集的变量应该是相互独立的,以避免出现多重共线性问题。 在本文中,您可以阅读为什么多重共线性是一个问题,...
  • 多重共线性检验之方差膨胀因子VIF

    千次阅读 2021-05-03 22:22:51
    1、构造每一个自变量与其余自变量线性回归模型,例如,数 据集中含有p个自变量,则第一个自变量与其余自变量线性组合可以 表示为 2、根据如上线性回归模型得到相应的判决系数R2R^2R2,进而计算第 一个自变量的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,409
精华内容 3,363
关键字:

多重共线性删除变量