算法详解系列(一):线性回归

回归是监督学习的一个重要问题,回归用于预测输入变量和输出变量之间的关系,特别是当输入变量的值发生变化时,输出变量的值也随之发生变化。回归模型正是表示从输入变量到输出变量之间映射的函数。

一、算法的推导

1.1 符号规定

$x_{j}^{(i)}$表示数据集第$i$个数据的第$j$个属性取值,数据集$X$一共有$m$个数据,$n$个属性(特征)。

1.2 线性回归模型

模型定义为:$f(x)=w_0 + w_1 x_1 + w_2 x_2 + … + w_n x_n$。

使用矩阵来表示就是$f(x)=XW$,其中:$W=\begin{bmatrix}w_0\\w_1...\\w_n\end{bmatrix}$是所要求得一系列参数,$X=\begin{bmatrix}1 &x_{1}^{(1)} &… &x_{m}^{(1)} \\ 1 &x_{1}^{(2)} &… &x_{m}^{(2)} \\ … &… &… &… \\ 1 &x_{1}^{(m)} &… &x_{n}^{(m)} \end{bmatrix}$是输入的数据矩阵,因为考虑$w_0$所以在$X$第一列加上了一列1。$X$的一行可以看做一个完整的输入数据,$n$代表一个数据有$n$个属性(特征),$m$行代表一共是$m$个数据。数据集标签为$y=\begin{bmatrix}y^{(1)}\\ y^{(2)}\\ …\\ y^{(m)}\end{bmatrix}$。

线性回归模型的目标就是找到一系列参数$w$来使得$f(x)=XW$尽可能地贴近$y$。

具体目标如图找到一条直线使得尽可能符合数据的分布,从而有一个新的样本点时,可利用学习得到的这条直线进行预测。

lr

1.3 损失函数

使用均方误差作为损失函数,使用均方误差最小化目标函数的方法称为最小二乘法。

使用均方误差的原因:有十分好的几何意义,对应了常用的欧式距离。在线性回归中,就是找到一个直线,使得所有样本到直线的欧式距离最小。

损失代价函数定义为:$J(w)=\frac{1}{m} \sum_{i=1}^{m} (f(x^{(i)})-y^{(i)}) ^2=\frac { 1 } { m } ( X W - y ) ^ { T } ( X W - y )$。

展开后得到:$J ( w ) = \frac { 1 } { m } \left( W ^ { T } X ^ { T } X W - W ^ { T } X ^ { T } y - y ^ { T } X W + y ^ { T } y \right)=\frac { 1 } { m } \left( W ^ { T } X ^ { T } X W - 2 W ^ { T } X ^ { T } y + y ^ { T } y \right)$

1.4 损失函数求解

当$X^{T}X$为满秩矩阵或者正定矩阵时,可使用正规方程法,直接求得闭式解。

令$\frac { \partial J ( w ) } { \partial w }=0$,即:$\frac { \partial J ( w ) } { \partial w } = \frac { 2 X ^ { T } ( X W - y ) } { m }= 0$,可得:$W ^ { * } = \left(X ^ { T } X \right) ^ { - 1 } X ^ { T } y$。

但一般$X^{T}X$不能满足满秩矩阵或者正定矩阵的条件,此时可使用梯度下降法。

梯度下降的迭代更新:

$W \leftarrow W - \alpha \frac { \partial J ( W ) } { \partial W }$,其中$\alpha$是学习率,是一个梯度下降需要的超参数。

可得到梯度下降迭代过程,即:$W \leftarrow W - \frac { 2 } { m } \alpha X ^ { T } ( X W - y )$。

二、使用均方误差的解释

先提出两个假设:

  • 假设一:每一个样例$\left( x ^ { (i) } , y ^ { (i) } \right)$,$x$和目标值$y$的关系:$y ^ { (i) } = \theta ^ { T } x ^ { ( i ) } + \varepsilon ^ { ( i ) }$,其中$\boldsymbol { \varepsilon } ^ { (i) }$表示$ \theta ^ { T } x ^ { ( i ) }$与目标值的误差。
  • 假设二:$\boldsymbol { \varepsilon } ^ { (i) }$服从正态分布:$\varepsilon \sim N \left( 0,\sigma ^ { 2 } \right)$。

解释:根据中心极限定理——许多独立随机变量的和趋向于正态分布,因为影响误差的因素有很多,而这些因素都是独立且随机分布的,所得根据此可得假设二。

由此可得:$P \left( \varepsilon ^ { (i) } \right) = \frac { 1 } { \sqrt { 2 \pi } \sigma } \exp \left( - \frac { \left( \varepsilon ^ { (i) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)$,从而也表示,当给定参数$\theta$和$x$时,目标值$y$也服从正态分布,所以有:$P \left( y ^ { (i) } | x ^ { ( i ) } ; \theta \right)=\frac { 1 } { \sqrt { 2 \pi } \sigma } e x p \left( - \frac { \left( \theta ^ { T } x ^ { ( i ) } - y ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)$。

  • 假设三:对于误差$\boldsymbol { \varepsilon } ^ { (i) }$,是IID(独立同分布)的随机变量。

根据这些假设,利用极大似然估计,来求解:

似然函数:$l ( \theta ) = P ( Y | x ; \theta )=\prod_{i=1}^{m} P \left( y ^ { (i) } | x ^ { ( i ) } ; \theta \right)=\prod_{i=1}^{m}\frac { 1 } { \sqrt { 2 \pi } \sigma }e x p \left( - \frac { \left( \theta ^ { T } x ^ { ( i ) } - y ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)$,

对似然函数取对数得:$L(\theta)=logl(\theta)=log\prod_{i=1}^{m}\frac { 1 } { \sqrt { 2 \pi } \sigma }e x p \left( - \frac { \left( \theta ^ { T } x ^ { ( i ) } - y ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)=\sum_{i=1}^{m}log[e x p \left( - \frac { \left( \theta ^ { T } x ^ { ( i ) } - y ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } } \right)]=mlog\frac { 1 } { \sqrt { 2 \pi } \sigma } + \sum_{i=1}^{m}-\frac { \left( y ^ { ( i ) } - \theta ^ { T } x ^ { ( i ) } \right) ^ { 2 } } { 2 \sigma ^ { 2 } }$所以,最大化$L(\theta)$等价于最小化$\sum_{i=1}^{m}\frac { \left( y ^ { (i) } - \theta ^ { T } x ^ { (i) } \right) ^ { 2 } } { 2 } = J ( \theta )$,即证得最小二乘法实际上是在假设误差项满足高斯分布且独立同分布情况下,使似然性最大化

三、线性回归的过拟合和欠拟合

解决线性回归过拟合的方法:

  • 分析数据,重新做数据清冼,将征工程。
  • 扩充数据集,收集更多数据。
  • 减少特征数量 。
  • 采用正则化方法
    • L1正则化(Lasso回归):稀疏化模型参数。
    • L2正则化(Rideg/岭回归):缩小模型参数。
    • L1+L2正则化(弹性网络/ElasticNet):$\lambda(p\sum_{j=1}^{m}|\theta_j|+(1-p)\sum_{j=1}^{m}|\theta^{2}_j|),p\in [0,1]$。

解决线性回归欠拟合的方法:

  • 分析数据,增加特征淮度。
  • 增加多项式特征阶数。
  • 减小正则项的超参系数值。
  • 局部加权回归(详情见第7节)。

四、线性回归计算复杂度

  • 采用批量梯度下降时复杂度:$O(mn)$(每次迭代)。

  • 采用随机梯度下降时复杂度:$O(n)$(1个样本迭代)。

  • 采用批量梯度下降时复杂度:$O(tn)$(t个样本迭代)。

五、线性回归的应用场景

  • 自变量和因变量之间是线性关系时
  • 适应于低维数据,而且每一维之间没有共线性(共线性是指变量之间由于存在精确相关关系或高度相关关系使模型准确率失真)

多重共线性影响模型的原因:

设模型为:$Y=\beta_0+\beta_0 x_1 + … + \beta_p x_p + \varepsilon $,矩阵形式为$Y=\beta_0I+X\beta+\varepsilon $,其中$I=(1, 1, …, 1)^T,\varepsilon \sim N \left( 0 , \sigma ^ { 2 } I_n \right)$。

设矩阵$X$为$m\times p$形式的,且秩为$p$。

$\beta_0$的最小二乘估计为$\hat { \beta } _ { 0 } = \tilde { Y } = \frac { 1 } { m }\sum_{j=1}^{m}y^{(i)}$,回归系数LS估计为$\hat { \beta } = \hat { \beta_1, …, \beta_p }=\left( X ^ { T } Y \right) ^ { - 1 } X ^ { T } Y$,因此获得的LS估计是无偏的。

于是$\hat { \beta } $均方误差为$\operatorname { MSE } ( \hat { \beta } ) = E ( \hat { \beta } - \beta ) ^ { T } ( \hat { \beta } - \beta )=\sigma^2\sum_{i=1}^{p}\frac { 1 } { \lambda_i }$,其中$\lambda _ { 1 } \geq\lambda _ { 2 } \geq…\geq\lambda _ { p } \geq0$是$X^TX$的特征根。如果$X^TX$至少有一个特征根非常接近零,则 $MSE ( \hat { \beta } )$就会很大,$\hat { \beta } $就不是$\beta$的一个好的估计。

并且,若$X^TX$的某个特征根接近零,就说明矩阵$X$列向量之间(特征间)存在近似的线性关系。

六、线性回归的优缺点

优点

  • 直接。
  • 快速。
  • 可解释性好。

缺点

  • 需要严格的假设。
  • 需处理异常值,对异常值很敏感,对输入数据差异也很敏感。

  • 线性回归存在共线性,自相关,异方差等问题。

七、局部加权线性回归

回归预测模型中,预测模型的准确度特别依赖于特征选择,局部加权线性回归解决了这个问题,预测性能不太依赖于特征选择,又很好避免过拟合,欠拟合风险。

局部加权线性回归是通过引入偏差来降低预测的均方误差,针对不同点能够对误差进行调整便可以一定程度上避免线性回归带来的欠拟合现象。

7.1 局部加权回归的损失函数

$J ( \theta ) =\sum_{j=1}^{m}w ^ { ( i ) } ( y ^ { (i) } - \theta ^ { T } x ^ { ( i ) } ) ^ { 2 }$,其中$w ^ { ( i ) }$采用高斯核时,$w ^ { ( i ) } = \exp \left( - \frac { \left( x ^ { (i) } - x \right) } { 2 k ^ { 2 } } \right)$。

7.2 局部加权回归的参数解释

$k$:波长参数,控制了权值随距离下降速率。
$k \rightarrow \infty$时,所有权重趋于1,变为标准线性回归;
$k \rightarrow 0$时,距离较大样本点无法参与回归参数的求取过程,避免造成过拟合。
$x$:要预测的点。
$x^{(i)}$:数据集中点。
当两点越近时,权重w越大,对回归系数贡献越大。该函数形似高斯分布,但没有任何高斯分布意义,是一个非参数学习方法。

7.3 局部加权回归相比线性回归的优缺点

优点:不过分依赖特征选择。
缺点:计算量增大。

八、线性回归的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn import linear_model
# mse为目标函数的线性回归
reg = linear_model.LinearRegression()
reg.fit(X, y)
print(reg.coef_)
print(reg.intercept_)
# 岭回归, alpha为正则化系数
reg = linear_model.Ridge(alpha=.5)
reg.fit(X, y)
print(reg.coef_)
print(reg.intercept_)
# Lasso回归
reg = linear_model.Lasso(alpha=0.1)
reg.fit(X, y)