导致出现变量间共线性的原因可能包括: ·数据样本不够,导致共线性存在偶然性,这其实反映了缺少数据对于数据建模的影响,共线性仅仅是影响的一部分。 ·多个变量都基于时间有共同或相反的演变趋势,例如春节期间的网络销售量和销售额都相对于正常时间有下降趋势。 ·多个变量间存在一定的推移关系,但总体上变量间的趋势一致,只是发生的时间点不一致,例如品牌广告费用和销售额之间,通常是品牌广告先进行大范围的曝光和信息推送,经过一定时间传播之后,销售额才能爆发出来。 ·多个变量间存在近似线性的关系。例如,如果用y代表访客数,用x代表展示广告费用,那么二者的关系很可能是y=2*x+b,即每投放1元钱,可以带来大概2~3个访客。
共线性一般通过容忍度、方差膨胀因子、特征值这几个特征数据来做判断:
·容忍度(Tolerance):容忍度是每个自变量作为因变量对其他自变量进行回归建模时得到的残差比例,大小用1减得到的决定系数来表示。容忍度的值介于0.1和1之间,如果值越小,说明这个自变量与其他自变量间越可能存在共线性问题。
·方差膨胀因子(Variance Inflation Factor,VIF):VIF是容忍度的倒数,值越大则共线性问题越明显,通常以10作为判断边界。当VIF<10,不存在多重共线性;当10≤VIF<100,存在较强的多重共线性;当VIF≥100,存在严重多重共线性。
·特征值(Eigenvalue):该方法实际上就是对自变量进行主成分分析,如果多个维度的特征值等于0,则可能有比较严重的共线性。
除此以外,还可以使用相关系数辅助判断,当相关系数R>0.8时就表示可能存在较强的相关性
增大样本量 : 消除由于数据量不足而出现的偶然共线性现象,在可行的前提下这种方法是需要优先考虑的;但即使增加了样本量,也可能无法解决共线性问题,原因是很可能变量间确实存在这个问题。
岭回归法(Ridge Regression): 一种专用于共线性问题的有偏估计回归方法,实质上 是一种改良的最小二乘估计法。它通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价来获得更实际和可靠性更强的回归系数。因此岭回归在存在较强共线性的回归应用中较为常用。
逐步回归法(Stepwise Regression): 逐步回归法是每次引入一个自变量并进行统计检验,然后逐步引入其他变量,同时对所有变量的回归系数进行检验。如果原来引入的变量由于后面变量的引入而变得不再显著,那么就将其剔除,逐步得到最优回归方程。
主成分回归(Principal Components Regression):将原始参与建模的变量转换为少数几个主成分,每个主成分是原变量的线性组合,然后基于主成分做回归分析,这样也 可以在不丢失重要数据特征的前提下避开共线性问题
人工去除: 直接结合人工经验,对参与回归模型计算的自变量进行删减,也是一个较为常用的方法,但这种方法需要操作者对于业务、模型和数据都有相对深入的理解,这样才有可能做出正确的操作。从专业角度分析,如果缺少上述三点中的任何一点,那么人工去除的方式都有可能产生偏差,导致结果不准确。
提示:完全解决共线性问题是不可能的
通过sklearn进行共线性处理。源文件data5.txt位于“附件-chapter3”中(如需数据文件可以参考以前文章,有下载的链接)
在自动化工作中(尤其是以Python为代表的智能化数据工作),通常不会通过人工的方法参与算法结果观察、调优、选择等。同样,在解决共线性的方法中,通过程序的方式自动选择或规避是最佳解决方法。在本示例中,将主要使用岭回归和主成分回归实现共线性问题。
import numpy as np from sklearn.linear_model import Ridge from sklearn.decomposition import PCA from sklearn.linear_model import LinearRegression #读取数据 data = np.loadtxt('D:/jupter_workspace/chapter3/data5.txt', delimiter='\t') # 读取数据文件 x = data[:, :-1] # 切分自变量 y = data[:, -1] # 切分预测变量 # 使用岭回归算法进行回归分析 model_ridge = Ridge(alpha=1.0) #建立岭回归模型对象 model_ridge.fit(x, y) # 输入x/y训练模型 print(model_ridge.coef_) # 打印输出自变量的系数 print(model_ridge.intercept_) # 打印输出截距 # 使用主成分回归进行回归分析 model_pca = PCA() # 建立PCA模型对象 data_pca = model_pca.fit_transform(x) # 将x进行主成分分析 ratio_cumsm = np.cumsum(model_pca.explained_variance_ratio_) # 得到所有主成分方差占比的累积数据 print (ratio_cumsm) # 打印输出所有主成分方差占比累积 rule_index = np.where(ratio_cumsm > 0.8) # 获取方差占比超过0.8的所有索引值 min_index = rule_index[0][0] # 获取最小索引值 data_pca_result = data_pca[:,:min_index + 1] # 根据最小索引值提取主成分 model_liner = LinearRegression() # 建立回归模型对象 model_liner.fit(data_pca_result, y) # 输入主成分数据和预测变量y并训练模型 print (model_liner.coef_) # 打印输出自变量的系数 print (model_liner.intercept_) # 打印输出截距 --------------------- 输出的结果: [ 8.50164360e+01 -1.18330186e-03 9.80792921e-04 -8.54201056e-04 2.10489064e-05 2.20180449e-04 -3.00990875e-06 -9.30084240e-06 -2.84498824e-08] -7443.98652868089 [0.9028 0.98570494 0.99957412 0.99995908 0.99999562 0.99999939 0.99999999 1. 1. ] [1.26262171e-05] 1058.52726