04 聊聊线性回归多重共线性

感谢:1. 机器学习之线性回归:OLS 无偏估计及相关性python分析
2. 机器学习线性回归:谈谈多重共线性问题及相关算法

共线性


对于最小二乘线性回归,它本身是比较怕共线性的。请看下面公式:
θ = ( X T X ) 1 X T y \theta=(X^TX)^{-1}X^Ty 那么,如果 X T X X^TX 奇异矩阵(不满秩),则 X T X X^TX 不能求逆了。自然就无法求解。
但是在实际中 X T X X^TX 正好是奇异矩阵的情况很少,但是可以很接近奇异矩阵,比如:
[   0.999 1. 2. 2. ] \begin{bmatrix} \ 0.999&1. \\ 2. & 2. \end{bmatrix} ,俩个列向量之间相似性很高,对上面这个矩阵求逆时,它的逆矩阵就会是一个元素值很大的矩阵: [   10000000.00526356 5000000.00263178 10000000.00526356 4999999.50263178 ] \begin{bmatrix} \ -10000000.00526356&5000000.00263178 \\ 10000000.00526356 & -4999999.50263178 \end{bmatrix}

这种共线性矩阵最后导致的结果是得到一个元素取值很大的权重参数矩阵。因为线性回归的模型是 y = θ T X y=\theta^TX ,因为X的系数很大,所以一个很小的样本X的扰动,会导致y的取值波动很大,这就是我们所说的方差会很大,取值不聚集,取值很散,会造成不小的误差值估计,这就是一个bug。

2 如何判断共线性

多重共线性(Multicollinearity)是指线性回归模型中的自变量之间由于存在高度相关关系而使模型的权重参数估计失真或难以估计准确的一种特性,多重是指一个自变量可能与多个其他自变量之间存在相关关系。
就如上面所说的,俩个特征向量之间相似性太高。那么如何判断俩个特征之间相关程度?在概率与数理统计的书里都会提到一个东西:相关系数。,其定义如下:
r = C o v ( X , Y ) σ X σ Y r=\frac{Cov(X,Y)}{\sigma_X\sigma_Y} 分子式协方差矩阵,分母是标准差。将公示转为代码:

import numpy as np
import matplotlib.pyplot as plt
#2个特征的样本X
X=np.array([[20.5,19.8],[21.2,20.4],[22.8,21.1],
           [18.2,23.6],[20.3,24.9],[21.8,26.7],
           [25.2,28.9],[30.7,31.3],[36.1,35.8],
           [44.3,38.2]])
y=np.array([7.8,8.6,8.7,7.9,8.4,8.9,10.4,11.6,13.9,15.8])

#特征1和特征2的协方差
cov = np.cov(X[:,0],X[:,1])
#特征1的标准差
sigmaX1 = cov[0,0]**0.5
#特征2的标准差
sigmaX2 = cov[1,1]**0.5
#相关系数
r = cov[0,1]/(sigmaX1*sigmaX2)
print('特征1与特征2协方差:'+str(cov))
print('相关系数:'+str(r))

结果为:

特征1与特征2协方差:[[70.44544444 49.15144444]
                  [49.15144444 41.24455556]]
相关系数:0.9118565340789303

相关系数为0.912,说明特征1与特征2之间有高度的线性正相关关系。当相关系数为0时,表明没有关系,为负数时,表明特征1与特征2之间有负相关关系,即有一个这样的你增我减,你减我增的趋势。

如果忽略这个问题,还是要采取普通最小二乘法来进行回归,可能导致的问题简单来说是造成权重参数估计值的方差变大。特别是当特征之间存在多重共线性(比如特征1、特征2、特征3等都有共线性)时,后果更加严重。

正则化在机器学习中扮演者重要的角色,一方面它有可能解决经常出现的过拟合问题,另一方面能解决上文提到这种病态矩阵,也就是不适定问题。对于正则化的理解,将会是以后机器学习需要反复仔细体会的一项重要技术。

在普通最小二乘法的基础上,将代价函数加一个正则化项,就可以解决共线性问题,这个方法牺牲了权重参数的精度,带来的收益是解决了共线性带来的不稳定。如果添加一个L1正则项(L1正则化是指权重参数 w 中各个元素的绝对值之和),算法称为套索回归,如果添加一个L2正则化项(各个元素的平方和然后再求平方根),称为脊回归,公式分别表示为:
Lasso回归(也称为套索回归): J ( θ ) = i = 1 m ( y ( i ) θ T x ( i ) ) + α θ T 1 J(\theta)= \sum_{i=1}^m{(y^{(i)}-\theta^Tx^{(i)})+\alpha||\theta^T||_1}
Ridge 回归(也称为脊回归): J ( θ ) = i = 1 m ( y ( i ) θ T x ( i ) ) + α θ T 2 2 J(\theta)= \sum_{i=1}^m{(y^{(i)}-\theta^Tx^{(i)})+\alpha||\theta^T||^2_2}
下面直接调用klearn库中的回归分析的API,分析上面的共线性数据在使用普通最小二乘,L1最小二乘(套索),L2最小二乘(脊回归)下回归样本后,对新来的数据的预测精度。

import numpy as np
from sklearn import linear_model
#2个特征的样本X
X =np.array([[0.9999,2],[2,4],[4,8]])
y = np.array([1,2,3])

#OLS
reg = linear_model.LinearRegression()
reg.fit(X,y)
print('线性回归权重参数:',reg.coef_)
#脊回归
ridreg = linear_model.Ridge (alpha = .5)
ridreg.fit (X, y)
print('脊回归权重参数:',ridreg.coef_)
#套索回归
Lassoreg = linear_model.Lasso(alpha = 0.1)
Lassoreg.fit (X, y)
print('套索回归权重参数:',Lassoreg.coef_)

结果如下:

线性回归权重参数: [ 5000.00000002 -2499.75000001]
脊回归权重参数: [0.12589929 0.25173425]
套索回归权重参数: [0.         0.30535714]

可以看到脊回归和套索回归由于正则化项不同,最终导致的权重参数也一样,最令人印象深刻的是,套索回归由于使用了L1正则化,直接将特征1的权重参数置为0,也就是将强线性相关项中的某一个直接抛弃掉,只取其中一个特征项作为主特征项进行分析计算。

OLS算法得出的权重参数在上节已经验证过,稍微改变一下线性相关的强度,导致的权重参数改变巨大,也就是参数的方差很大,这说明它的不稳定性。

猜你喜欢

转载自blog.csdn.net/dz4543/article/details/85560942
今日推荐