精华内容
下载资源
问答
  • 多重共线性和非线性回归的问题
    2021-04-21 10:26:51

    前几天她和我说,在百度里有个人连续追着我的回答,三次说我的回答错了。当时非常惊讶,赶紧找到那个回答的问题,看看那个人是怎么说。最终发现他是说多重共线性和非线性回归的问题,他认为多个自变量进行不能直接回归,存在共线性的问题,需要进行因子分析(或主成分分析);说非线性回归不能转换成线性回归的方法,这里我详细说说这两方面的问题到底是怎么回事(根据我的理解),我发现很多人很怕这个多重共线性的问题,听到非线性回归,脑袋就更大了。。。

    (1)多重共线性问题

    我们都知道在进行多元回归的时候,特别是进行经济上指标回归的时候,很多变量存在共同趋势相关性,让我们得不到希望的回归模型。这里经常用到的有三种方法,而不同的方法有不同的目的,我们分别来看看:

    第一个,是最熟悉也是最方便的——逐步回归法。

    逐步回归法是根据自变量与因变量相关性的大小,将自变量一个一个选入方法中,并且每选入一个自变量都进行一次检验。最终留在模型里的自变量是对因变量有最大显著性的,而剔除的自变量是与因变量无显著线性相关性的,以及与其他自变量存在共线性的。用逐步回归法做的多元回归分析,通常自变量不宜太多,一般十几个以下,而且你的数据量要是变量个数3倍以上才可以,不然做出来的回归模型误差较大。比如说你有10个变量,数据只有15组,然后做拟合回归,得到9个自变量的系数,虽然可以得到,但是精度不高。这个方法我们不仅可以找到对因变量影响显著的几个自变量,还可以得到一个精确的预测模型,进行预测,这个非常重要的。而往往通过逐步回归只能得到几个自变量进入方程中,有时甚至只有一两个,令我们非常失望,这是因为自变量很多都存在共线性,被剔除了,这时可以通过第二个方法来做回归。

    第二个,通过因子分析(或主成分分析)再进行回归。

    这种方法用的也很多,而且可以很好的解决自变量间的多重共线性。首先通过因子分析将几个存在共线性的自变量合为一个因子,再用因子分析得到的几个因子和因变量做回归分析,这里的因子之间没有显著的线性相关性,根本谈不上共线性的问题。通过这种方法可以得到哪个因子对因变量存在显著的相关性,哪个因子没有显著的相关性,再从因子中的变量对因子的载荷来看,得知哪个变量对因变量的影响大小关系。而这个方法只能得到这些信息,第一它不是得到一个精确的,可以预测的回归模型;第二这种方法不知道有显著影响的因子中每个变量是不是都对因变量有显著的影响,比如说因子分析得到三个因子,用这三个因子和因变量做回归分析,得到第一和第二个因子对因变量有显著的影响,而在第一个因子中有4个变量组成,第二个因子有3个变量组成,这里就不知道这7个变量是否都对因变量存在显著的影响;第三它不能得到每个变量对因变量准确的影响大小关系,而我们可以通过逐步回归法直观的看到自变量前面的系数大小,从而判断自变量对因变量影响的大小。

    第三个,岭回归。

    通过逐步回归时,我们可能得到几个自变量进入方程中,但是有时会出现自变量影响的方向出现错误,比如第一产业的产值对国民收入是正效应,而可能方程中的系数为负的,这种肯定是由于共线性导致出现了拟合失真的结果,而这样的结果我们只能通过自己的经验去判断。通常我们在做影响因素判断的时候,不仅希望得到各个因素对因变量真实的影响关系,还希望知道准确的影响大小,就是每个自变量系数的大小,这个时候,我们就可以通过岭回归的方法。

    岭回归是在自变量信息矩阵的主对角线元素上人为地加入一个非负因子k,从而使回归系数的估计稍有偏差、而估计的稳定性却可能明显提高的一种回归分析方法,它是最小二乘法的一种补充,岭回归可以修复病态矩阵,达到较好的效果。在SPSS中没有提供岭回归的模块,可以直接点击使用,只能通过编程来实现,当然在SAS、Matlab中也可以实现。做岭回归的时候,需要进行多次调试,选择适当的k值,才能得到比较满意的方程,现在这个方法应用越来越普遍。在07年的时候,我的一个老师还觉得这个方法是他的看家本领,但是现在很多人都会这个方法,而且用的越来越多了,得到的结果也非常合理。

    特别提醒的是:多重共线性说的是变量之间线性关系,和非线性不要混淆了。多组变量之间两种极端的关系是完全多重共线性关系和完全非线性关系,即完全是平行直线的关系和完全无规则的曲线关系(是什么形状,还真不好形容,自己悟去吧^_^)。当然解决多重共线性问题的方法还有,比如差分微分模型,应用的很少,我估计是非常专业的人才会用的吧,呵呵,反正我不会这个方法。接下来说说非线性回归。

    (2)非线性回归的问题。

    非线性回归,顾名思义自变量和因变量是非线性的关系,比如平方、次方等等,但是大多数的非线性方程都可以转换成线性的方程,比如我们通常知道的二次函数:y=a0+a1*x+a2*x^2,这里就可以转换成线性方程,首先将x^2计算得到x1,方程就变成y=a0+a1*x+a2*x1,而这个方程就是我们一般见到的多元线性回归,直接进行线性拟合就可以了。

    这里需要特别提醒的是:我说的可以转换成线性的非线性方程,是一元非线性方程,而不是多元非线性方程。我们知道在SPSS回归分析中有单独一个模块叫曲线估计,它里面提供的11个非线性模型都是可以转换成线性模型的,而且在进行系数拟合的时候都是通过转换成线性方程进行拟合的,这就是为什么同样是非线性方程,在曲线估计里面不需要输入系数的初始值,而在非线性回归中却要输入。

    将非线性方程转换成线性方程再进行拟合,不是因为我们不会做非线性拟合,而改成线性拟合我就会做了,主要原因不是因为这个。而是因为同样的非线性方程拟合比转换成的线性方程拟合误差更大一些,而且由于迭代次数的增多,计算时间会更长,由于我们平时计算的数据不是很多,这种感觉不是非常明显,但是当我们做实际问题的时候,特别是规划问题中,我们将非线性方程转换成线性方程时,计算速度会明显加快。还有一个原因是,做非线性回归的时候,我们要在拟合之前设置初始值,而初始值的选择直接影响后面系数的确定,你改变初始值,拟合出来的系数都会发生变化,这样也会增加非线性回归产生的误差,前面说的误差是计算上产生的误差,而这里是人为经验上产生的误差。因此在做非线性回归时,如果能转换成线性回归,一定转换成线性的来做。

    说到那个人,他在留言中说,这样我没有考虑到转换之后自变量之间的多重共线性,不能这样做,还声嘶力竭的喊我误人子弟。这里我要详细说明是怎么回事,要不要考虑这里的多重共线的问题,如果他也能看到更好。一般我们做回归分析的时候,通常第一步看自变量和因变量之间的散点图,通过散点图我们大致判断两者之间存在怎么的关系,再来选择适当的模型。而通常我们不知道具体选择哪个模型,可以选择几个可能相似的模型比较一下,选择一个拟合效果最好的。这里比如说两个变量之间知道是非线性的,但是不知道是二次的、三次的还是四次及以上的关系(通常次方数越低越好),你可以同时考虑,然后根据拟合的结果来判断。如将方程设置为:y=a0+a1*x+a2*x^2+a3*x^3+a4*x^4,转换成线性方程就是:y=a0+a1*x+a2*x2+a3*x3+a4*x4,而这里需不需要考虑这四个自变量之间的共线性呢,上面说过,多重共线性指的是变量之间的线性关系,而这里的四个自变量他们是非线性的关系(x、x^2、x^3、x^4),即使他们的线性相关系数很高(这是因为二次或者三次曲线用直线拟合得到效果也不错,但是我们知道他们之间的确是非线性的关系,而不是线性关系),因此,我们可以他们的多重共线性,在拟合的时候,选择逐步回归法,也可以不考虑,选择直接进入法,两者得到的结果几乎一样,我亲自试验了。如果得到的结果的确有四次方的关系,那么x4自变量就会通过检验,我们可以通过检验来判断两个变量到底存在什么样的曲线关系。

    这样还需要简单说下多元非线性回归,多元非线性回归也可以进行转换,但是转换完之后就必须要考虑变量之间的多重共线性了,因为我们不能明确的知道转换之后的自变量是否不存在线性的关系。上次有个人在百度里提问说,我有十几个自变量,想做非线性回归,我们一般不推荐这么多自变量做多元非线性回归,除非你发现十几个自变量都和因变量存在非线性的关系。因为多元非线性回归计算非常复杂,迭代次数非常庞大,而得到的结果也不尽如人意。

    好了,这些都是根据我自己的理解和经验来写的,如果一不小心被统计高手或者老师看到,如发现说的不对的地方,请一定要在下面指正出来,非常感谢。

    更多相关内容
  • 多重共线性

    2021-02-24 11:53:21
    多重共线性 如何借助OLs在线性回归中找到多重共线性
  • 这项工作旨在检测和解决回归分析中的多重共线性问题。 因此,方差膨胀因子(VIF)和条件指数(CI)被用作这种检测的量度。 除了传统的简单线性回归之外,岭回归(RR)和主成分回归(PCR)是建模中使用的其他两种方法...
  • 多重共线性的确认: 做出自变量间的相关系数矩阵:如果相关系数超过0.9的变量在分析时将会存在共线性问题。在0.8以上可能会有问题。但这种方法只能对共线性作初步的判断,并不全面。 【1】容忍度(Tolerance):有 ...
  • 卡内基梅隆大学(CMU)统计教授课件中关于(Multicollinearity)多重共线性R语言讲解
  • 第十二讲 多重共线性案例分析 多重共线性的侦查与处理 o研究美国每人的子鸡消费量 Y=每人的子鸡消费量,磅 X,=每人实际可支配收入,美元 ,=每磅子鸡实际零售价格,美元 3=每磅猪肉实际零售价格,美元 ,=每磅牛肉实际零售...
  • 多重共线性问题

    2018-11-25 15:43:29
    多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。 一般来说,由于经济数据的限制使得模型设计不当,导致设计矩阵中解释变量间存在普遍的相关关系。...
  • 第五章 多重共线性

    2021-01-21 09:50:54
    nullnull第五章 多重共线性Multi-Collinearity计量经济学第一节 多重共线性一、多重共线性的概念第一节 多重共线性一、多重共线性的概念 对于模型
  • 多重共线性问题的几种解决方法在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系,也就是说,解释变量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

    展开全文
  • 多重共线性详解

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

    解释变量与自变量,被解释变量与因变量

    Y=aX+b
    解释变量被解释变量看,Y是被X解释的变量。因此,X是解释变量,Y是被解释变量。
    自变量因变量看,X是自身变量的量,Y是随着X变化而变化的量。因此,X是自变量,Y是因变量。

    1、多重共线性的现象

    在进行线性回归分析时,容易出现自变量(解释变量)之间彼此相关的现象,我们称这种现象为多重共线性

    适度的多重共线性不成问题,但当出现严重共线性问题时,会导致分析结果不稳定,出现回归系数的符号与实际情况完全相反的情况。
    本应该显著的自变量不显著,本不显著的自变量却呈现出显著性,这种情况下就需要消除多重共线性的影响。

    2、出现的原因

    多重共线性问题就是指一个解释变量的变化引起另一个解释变量的变化。

    原本自变量应该是各自独立的,根据回归分析结果能得知哪些因素对因变量Y有显著影响,哪些没有影响。

    如果各个自变量x之间有很强的线性关系,就无法固定其他变量,也就找不到x和y之间真实的关系了。

    除此以外,多重共线性的原因还可能包括:

    • 数据不足。 (在某些情况下,收集更多数据可以解决共线性问题)
    • 错误地使用虚拟变量。(比如,同时将男、女两个虚拟变量都放入模型,此时必定出现共线性,称为完全共线性)
    • 自变量都享有共同的时间趋势
    • 一个自变量是另一个的滞后,二者往往遵循一个趋势
    • 由于数据收集的基础不够宽,某些自变量可能会一起变动

    3、判别标准

    有多种方法可以检测多重共线性,较常使用的是回归分析中的VIF——方差扩大因子(variance inflation factor)值,VIF值越大,多重共线性越严重。一般认为VIF大于10时(严格是5),代表模型存在严重的共线性问题。

    有时候也会以容差值作为标准,容差值=1/VIF,所以容差值大于0.1则说明没有共线性(严格是大于0.2),VIF和容差值有逻辑对应关系,两个指标任选其一即可。

    除此之外,

    • 直接对自变量进行相关分析,查看相关系数和显著性也是一种判断方法。如果一个自变量和其他自变量之间的相关系数显著,则代表可能存在多重共线性问题。
    • 发现系数估计值的符号不对
    • 某些重要的解释变量 t 值(SPSS中T的数值对回归参数的显著性检验值)低,而不低
    • 当一不太重要的解释变量被删除后回归结果显著变化;

    4、检验方法

    1. 相关性分析,相关系数高于0.8,表明存在多重共线性;但相关系数低,并不能表示不存在多重共线性;(摘抄《计量经济学中级教程》潘省初主编)
    2. vif检验
    3. 条件系数检验

    5、多重共线性有什么影响

    共线性会导致回归参数不稳定,即增加或删除一个样本点或特征,回归系数的估计值会发生很大变化。

    这是因为某些解释变量之间存在高度相关的线性关系,XTX会接近于奇异矩阵,即使可以计算出其逆矩阵,逆矩阵对角线上的元素也会很大,这就意味着参数估计的标准误差较大,参数估计值的精度较低,这样,数据中的一个微小的变动都会导致回归系数的估计值发生很大变化。

    总结共线性对线性模型影响:

    • 回归模型缺乏稳定性。样本的微小扰动都可能带来参数很大的变化;
    • 难以区分每个解释变量的单独影响;
    • 参数的方差增大;
    • 变量的显著性检验失去意义;
    • 影响模型的泛化误差。

    6、多重共线性处理方法

    多重共线性是普遍存在的,通常情况下,如果共线性情况不严重(VIF<5),不需要做特别的处理。如存在严重的多重共线性问题,可以考虑使用以下几种方法处理

    1. 手动移除出共线性的变量
      先做下相关分析,如果发现某两个自变量X(解释变量)的相关系数值大于0.7,则移除掉一个自变量(解释变量),然后再做回归分析。此方法是最直接的方法,但有的时候我们不希望把某个自变量从模型中剔除,这样就要考虑使用其他方法。
    2. 逐步回归法
      让系统自动进行自变量的选择剔除,使用逐步回归分析将共线性的自变量自动剔除出去。此种解决办法有个问题是,可能算法会剔除掉本不想剔除的自变量,如果有此类情况产生,此时最好是使用岭回归进行分析。
    3. 增加样本容量
      增加样本容量是解释共线性问题的一种办法,但在实际操作中可能并不太适合,原因是样本量的收集需要成本时间等。
    4. 岭回归
      上述第1和第2种解决办法在实际研究中使用较多,但问题在于,如果实际研究中并不想剔除掉某些自变量,某些自变量很重要,不能剔除。此时可能只有岭回归最为适合了。岭回归可以减小参数估计量的方差,是当前解决共线性问题最有效的解释办法。

    岭回归是一种改良的最小二乘法,其通过放弃最小二乘法的无偏性,以损失部分信息为代价来寻找效果稍差但回归系数更符合实际情况的模型方程。针对共线性的病态数据,岭回归的耐受性远强于普通线性最小二乘法回归。

    其他方法:

    • 对模型施加某些约束条件

    • 将模型适当变形

    • 差分法
      时间序列数据、线性模型:将原模型变换为差分模型。

    • 主成分分析(PCA)

    • 简单相关系数检验法

    • 变量聚类、方差膨胀因子vif、相关系数、L1 L2正则化:在特征比较多的时候,先变量聚类,每类中选择单特征比较强的,也可以根据1-r²小的选择有代表性的特征(r²表示的是其他变量能否线性解释的部分,1-r²表示的是容忍度,也就是其他变量不能解释的部分;变量聚类是多选一,因此需要选择一个具有代表性的变量,选择容忍度小的变量;另vif就是容忍度的倒数); 在变量聚类的步骤中也可以结合 方差膨胀因子、相关系数以及业务理解来筛选特征; vif选择多少合适(一般样本集在10w以上VIF>10就有严重的共线性问题了,样本集在10w以下,VIF>5也是严重的共线性问题。在小样本时,一般保证在2以下。当然,这也不能保证一定排除了,最后在检验下模型参数,判断是否仍旧存在共线性)

      检验模型参数

      • 看模型系数,和实际业务是否相符合。(注:在进行完证据权重转化后,系数正负,不在具有实际的业务意义。当woe是好客户占比/坏客户占比时,系数都为负,反之系数都为正。(相关原因可以公式推导))
      • 模型R^2较高,通过F检验,系数不能通过t检验

    7、其他说明

    1. 多重共线性是普遍存在的,轻微的多重共线性问题可不采取措施,如果VIF值大于10说明共线性很严重,这种情况需要处理,如果VIF值在5以下不需要处理,如果VIF介于5~10之间视情况而定
    2. 如果模型仅用于预测,则只要拟合程度好,可不处理多重共线性问题,存在多重共线性的模型用于预测时,往往不影响预测结果。(这个“往往不影响预测结果”结论小编自己觉得前提条件“拟合程度好”很重要,小编觉得可能还是有些许影响的,有查到一些论文《多重共线性的检验及对预测目标影响程度的定量分析
      在这里插入图片描述 3. 解释变量理论上的高度相关与观测值高度相关没有必然关系,有可能两个解释变量理论上高度相关,但观测值未必高度相关,反之亦然。所以多重共线性本质上是数据问题
    3. 严重的多重共线性问题,一般可根据经验或通过分析回归结果发现。如影响系数符号,重要的解释变量t值(对回归参数的显著性检验值)很低。要根据不同情况采取必要措施。

    8、多重共线性识别-python代码

    8.1、vif检验

    目前业界检验共线性最常用的方法是VIF检验。VIF越高,多重共线性的影响越严重。

    两种方式,一种方式是直接掉包(https://zhuanlan.zhihu.com/p/56793236?utm_source=qq),另一种方式是自己写的函数,两个结果一致。

    import pandas as pd
    import numpy as np
    #数据
    df = pd.DataFrame([[15.9,16.4,19,19.1,18.8,20.4,22.7,26.5,28.1,27.6,26.3]
                         ,[149.3,161.2,171.5,175.5,180.8,190.7,202.1,212.1,226.1,231.9,239]
                         ,[4.2,4.1,3.1,3.1,1.1,2.2,2.1,5.6,5,5.1,0.7]
                         ,[108.1,114.8,123.2,126.9,132.1,137.7,146,154.1,162.3,164.3,167.6]]).T
    columns = ["var1","var2","var3","var4"]
    df.columns=columns
    
    
    #方式1:直接调包
    #def_function
    def calulate_vif(X):
        from statsmodels.stats.outliers_influence import variance_inflation_factor
        #✨✨✨务必注意✨✨✨,一定要加上常数项,#如果没有常数项列,计算结果天差地别,可能VIF等于好几千
        X[X.shape[1]]=1
        #vif
        vif=[]
        for i in range(X.shape[1]-1):
            #计算第i+1个变量的(第i+1列)的方差膨胀因子
            vif.append(variance_inflation_factor(X.values,i))
        #result_out
        yy=pd.DataFrame(X.columns[:-1,])
        yy.rename(columns={0:"var_name"},inplace=True) 
        yy["vif"]=vif
        print(yy)
    
    #call
    calulate_vif(df[["var1","var2","var3","var4"]])
    
    
    #函数2:自定义函数,结果与调包的结果一致
    #def_function
    def calulate_vif2(x_data):
        var_name=pd.DataFrame(x_data.columns)
        var_name.rename(columns={0:"var_name"},inplace=True)
        vif=[]
        for i in range(x_data.shape[1]):
            y=x_data.loc[:,x_data.columns[i]] 
            y.values.reshape(-1,1)    
            x=x_data.drop([x_data.columns[i]],axis=1)   
            x.values.reshape(-1,1)
    
            model=linear.fit(x,y)
            R_2=linear.score(x,y)
            vif_re=1/(1-R_2)
            vif.append(vif_re)
        var_name["vif"]=vif
        print(var_name)
    
    #call
    calulate_vif2(df[["var1","var2","var3","var4"]])
    

    8.2 相关系数

    #生成数据集
    df = pd.DataFrame([[15.9,16.4,19,19.1,18.8,20.4,22.7,26.5,28.1,27.6,26.3]
                         ,[149.3,161.2,171.5,175.5,180.8,190.7,202.1,212.1,226.1,231.9,239]
                         ,[4.2,4.1,3.1,3.1,1.1,2.2,2.1,5.6,5,5.1,0.7]
                         ,[108.1,114.8,123.2,126.9,132.1,137.7,146,154.1,162.3,164.3,167.6]]).T
    columns = ["var1","var2","var3","var4"]
    df.columns=columns
    
    
    def calulate_cor(cor_data):
        # calculate pearson cor
        coefficient1 =cor_data.corr(method = 'pearson')
        print(coefficient1)
        # Plot
        plt.figure(figsize=(12,10), dpi= 80)
        sns.heatmap(cor_data.corr(), xticklabels=cor_data.corr().columns, yticklabels=cor_data.corr().columns, cmap='RdYlGn', center=0, annot=True)
        # Decorations
        plt.title('Correlogram of mtcars', fontsize=22)
        plt.xticks(fontsize=12)
        plt.yticks(fontsize=12)
        plt.show()
        
    calulate_cor(df[["var1","var2","var3","var4"]])
    

    输出结果为:在这里插入图片描述

    8.3 聚类

    可能不是很好用

    #生成数据集
    df = pd.DataFrame([[15.9,16.4,19,19.1,18.8,20.4,22.7,26.5,28.1,27.6,26.3]
                         ,[149.3,161.2,171.5,175.5,180.8,190.7,202.1,212.1,226.1,231.9,239]
                         ,[4.2,4.1,3.1,3.1,1.1,2.2,2.1,5.6,5,5.1,0.7]
                         ,[108.1,114.8,123.2,126.9,132.1,137.7,146,154.1,162.3,164.3,167.6]]).T
    columns = ["var1","var2","var3","var4"]
    df.columns=columns
    
    #方式一:
    def var_cluster(clusterNum,cluster_data):
        from scipy.cluster.vq import vq,kmeans,whiten
        transed=whiten(np.array(cluster_data.T))  #归一化
        transed
        #cluster
        model = kmeans(transed,clusterNum)
        #cluster_result
        result = vq(transed,model[0])[0]
        result
        #result_out
        aa=pd.DataFrame(cluster_data.columns)
        aa.rename(columns={0:"var_name"},inplace=True)  
        bb=pd.DataFrame(result)
        bb.rename(columns={0:"cluster"},inplace=True)
        var_cluster=pd.concat([aa,bb],axis=1)
        var_cluster.sort_values(by=["cluster"],ascending=(True),inplace=True)
        print(var_cluster)
    
    #call   
    var_cluster(2,df[["var1","var2","var3","var4"]])
    
    
    #方式二:
    def var_cluster2(clusterNum,cluster_data):
        import numpy as np
        from sklearn.cluster import KMeans
    
        #array
        transed=np.array(cluster_data.T)
        #model_fit
        kmeans=KMeans(n_clusters=clusterNum).fit(transed)
        pred=kmeans.predict(transed)
        print(pred)
    
        #result_out
        aa=pd.DataFrame(cluster_data.columns)
        aa.rename(columns={0:"var_name"},inplace=True)  
        bb=pd.DataFrame(pred)
        bb.rename(columns={0:"cluster"},inplace=True)
    
        var_cluster=pd.concat([aa,bb],axis=1)
        var_cluster.sort_values(by=["cluster"],ascending=(True),inplace=True)
        print(var_cluster)
    
    #call 
    var_cluster2(2,df[["var1","var2","var3","var4"]])
    

    参考:

    • https://zhuanlan.zhihu.com/p/72722146
    • https://zhuanlan.zhihu.com/p/96793075
    • https://zhuanlan.zhihu.com/p/146298015

    9、宏观把握共线性问题

    参考:https://zhuanlan.zhihu.com/p/88025370

    9.1、共线性的一般性的影响

    太多相关度很高的特征并没有提供太多的信息量,并没有提高数据可以达到的上限,相反,数据集拥有更多的特征意味着更容易收到噪声的影响,更容易收到特征偏移的影响等等。

    简单举个例子

    N个特征全都不受到到内在或者外在因素干扰的概率为k,则2N个特征全部不受到内在或外在因素干扰的概率必然远小于k。这个问题实际上对于各类算法都存在着一定的不良影响。

    9.2、共线性对线性回归、逻辑回归的影响

    逻辑回归的梯度更新公式用代码表示为:

    weights = weights - alpha * dataMatrix.transpose()* error
    

    其中alpha为学习率,dataMatrix.transpose()为原始数据的矩阵,error=y_pred-y_true

    从这里可以看出,共线性问题对于逻辑回归损失函数的最优化没影响,参数都是一样更新,一样更新到收敛为止。所以对于预测来说没什么影响。

    那共线性会引发的问题

    1. 模型参数估计不准确,有时甚至会出现回归系数的符号与实际情况完全相反的情况,比如逻辑上应该系数为正的特征系数 算出来为负;
    2. 本应该显著的自变量不显著,本不显著的自变量却呈现出显著性(也就是说,无法从p-值的大小判断出变量是否显著——下面会给一个例子);
    3. 多重共线性使参数估计值的方差增大,模型参数不稳定,也就是每次训练得到的权重系数差异都比较大

    其实多重共线性这样理解会简单很多:

    > 假设原始的线性回归公式为:y=w1*x1+w2*x2+w3*x3
    > 训练完毕的线性回归公式为:y=5x1+7x2+10x3
    > 此时加入一个新特征x4,假设x4和x3高度相关,x4=2x3,则:
    > y=w1*x1+w2*x2+w3*x3+w4*x4=w1*x1+w2*x2+(w3+2w4)*x3
    > 因为我们之前拟合出来的最优的回归方程为:y=5x1+7x2+10x3
    > 显然w3+2w4可以合并成一个新的权重稀疏 w5,则:y=w1*x1+w2*x2+w5*x3
    > 显然:y=w1*x1+w2*x2+w3*x3和y=w1*x1+w2*x2+w5*x3是等价的。
    > 那么最终最优的模型应该也是 y=5x1+7x2+10x3
    > 但是考虑到引入了x4,所以w4和w3的权重是分开计算出来的,这就导致了w5=10=w3+2w4,
    > 显然这个方程有无穷多的解,比如w3=4,w4=3,或者w4=-1,w3=12等,
    > 因此导致了模型系数估计的不稳定并且可能会出现负系数的问题。
    

    10、statsmodel库

    statsmodels(http://www.statsmodels.org)是一个Python库,用于拟合多种统计模型,执行统计测试以及数据探索和可视化。statsmodels包含更多的“经典”频率学派统计方法。

    总结:https://blog.csdn.net/zm147451753/article/details/83107535

    statsmodel的检验项目比较全面,实际上逻辑回归与线性回归比我们想象的要复杂。

    DF Residuals:残差的自由度

    等于 观测数也就是样本数(No. Observations)-参数数目(Df Model+1(常量参数,权重加上偏置的数量))

    Df Model:模型参数个数(不包含常量参数)

    R-squared:可决系数

    R 2 = 1 − ∑ i ( y ^ i − y i ) 2 ∑ i ( y ^ i − y i ) 2 R^{2}=1-\frac{\sum_{i}\left(\hat{y}_{i}-y_{i}\right)^{2}}{\sum_{i}\left(\hat{y}_{i}-y_{i}\right)^{2}} R2=1i(y^iyi)2i(y^iyi)2

    上面分子就是我们训练出的模型预测的所有误差。
    下面分母就是不管什么我们猜的结果就是y的平均数。(瞎猜的误差)

    adj-R-squared:修正可决系数

    R a d j 2 = 1 − ( n − 1 ) ( 1 − R 2 ) n − p − 1 R_{a d j}^{2}=1-\frac{(n-1)\left(1-R^{2}\right)}{n-p-1} Radj2=1np1(n1)(1R2)

    右边式子的R就是原始的R-sqaure,n是样本数量,p是特征的数量。

    在这里插入图片描述

    展开全文
  • 解决多元线性回归中多重共线性问题的方法分析,谢小韦,印凡成,为了解决多元线性回归中自变量之间的多重共线性问题,常用的有三种方法: 岭回归、主成分回归和偏最小二乘回归。本文以考察职工平�
  • 多元线性回归—多重共线性

    千次阅读 2021-06-14 19:52:24
    文章目录多重共线性@[toc]1 什么是多重共线性1.1 多重共线性含义1.2 多重共线性产生原因2 多重共线性后果2.1 完全型2.2 不完全型3 多重共线性检验3.1 简单相关系数检验3.2 方差膨胀因子法3.3 经验法3.4 逐步回归检测...
  • 1 什么是多重共线性? 2 多重共线性的影响 3 共线性的判别指标(方差膨胀因子) 3.1 拟合优度 3.2方差膨胀因子VIF 4 多重共线性处理方法 4.1 手动移除出共线性的变量 4.2 逐步回归法 4.2.1向前法 4.2.2后退...
  • 多元线性回归多重共线性的危害

    千次阅读 2021-11-05 11:54:57
    多元线性回归多重共线性的危害 作者:居居 日期:2021-11-05 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif...
  • 如果违背这一假定,即线性回归模型中某一个解释变量与其他解释变量间存在线性关系,就称线性回归模型中存在多重共线性多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。这里,我们...
  • 多元线性回归中多重共线性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 ...
  • 上篇文章《简单而强大的线性回归详解》(点击跳转)详细介绍了线性回归分析方程、损失方程及求解、模型评估指标等内容,其中在推导多元...本文将详细介绍线性回归中多重共线性问题,以及一种线性回归的缩减(shrinkage...
  • 机器学习:多重共线性

    2021-03-08 10:52:05
    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 ...
  • Content线性回归的多重共线性1. 前提2. 由损失函数推导ω(基于最小二乘法OLS)3. 上述计算结果不成立3.1 多重共线性的机器学习解释3.2 多重共线性的解决4. Ridge & Lasso4.1 Ridge4.2 Lasso 线性回归的多重共线性...
  • 最后一步中需要左乘XTX的逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。什么是多重共线性,如何一步步从逆矩阵必须 存在推导到多重共线性不能存在? 逆矩阵存在的充要条件 逆矩阵存在与否的意义和...
  • 一个应用MATLAB对数据进行多重共线性检验的小程序。在进行多元线性回归前,通常需要进行多重共线性检验,以保证良好的回归效果。多重共线性的表征方法为VIF值,改程序用于自动计算VIF值。
  • 数据多重共线性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 ...
  • 多重共线性是如何影响回归模型的

    千次阅读 2021-10-11 08:54:13
    在机器学习面试中经常会被问到的一个问题是,特征如果存在多重共线性时为什么不能估计出最佳回归系数?本篇文章算是这个问题的标准答案 多重共线性是什么? 当回归模型中的自变量之间高度相关时,存在多重共线性。 ...
  • 多元线性回归是我们在数据分析中经常用到的一个方法,很多人在遇到多维数据时基本上无脑使用该方法,而在用多元线性回归之后所得到的结果又并不总是完美的,其问题实际上并不出在方法上,而是出在数据上。...
  • Multicolliearity多重共线性 而所谓的多重共线性,是指 predictor variable 之间的关系,当预测变量间有很高的相关度时,会造成信息冗余,影响回归模型的结果。 检测的方法是计算所有 predictor variable pairs 间...
  • Python 多重共线性检验

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,582
精华内容 13,032
关键字:

多重共线性