【线性回归】面向新手的基础知识

线性回归建模

首先考虑一个情景,假设我们希望用线性回归预测房屋的售价。一般网上公开的房价预测数据集都至少包含房屋的面积、厅室数量等特征以及房屋的售价:

面积(x1x_1) 厅室数量(x2x_2) 价格(万元)(y)
64 3 225
59 3 185
65 3 208
116 4 508
…… …… ……

对此数据,我们可以建立售价和特征属性之间的关系:
f(x)=w0+w1x1+w2x2 f(x)=w_0+w_1x_1+w_2x_2
更一般的,假如我们有数据集:
{(x(1),y(1),((x(2),y(2)),...,((x(n),y(n))}xi=(x1;x2;x3;...;xd),yiR \{(x^{(1)},y^{(1)},((x^{(2)},y^{(2)}),...,((x^{(n)},y^{(n)})\} \\ x_i = (x_{1};x_{2};x_{3};...;x_{d}),y_i\in R
其中,n 表示样本的个数,d表示特征的个数。则y与样本x的特征之间的关系为:
f(x)=w0+w1x1+w2x2+...+wdxd=i=0dwixi \begin{aligned} f(x) &= w_0 + w_1x_1 + w_2x_2 + ... + w_dx_d \\ &= \sum_{i=0}^{d}w_ix_i \\ \end{aligned}
其中,我们假设x0x_0=1,下文都作此假设。

线性回归损失函数、代价函数、目标函数

  1. 损失函数:度量单个样本的错误程度。常用的损失函数有:0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等。
  2. 代价函数:度量所有样本的平均错误程度,也就是所有样本损失函数的均值。常用的代价函数包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)等。
  3. 目标函数:代价函数与正则化函数的结合,也是最终要优化的函数。

我们的目标是找到一组合适的w,使得 f(x)yf(x)\approx y 。对于回归问题,有许多性能度量方法,其中常用的一个是均方误差(MSE),即:
J(w)=12j=1n(fw(x(j))y(j))2 J(w)=\frac{1}{2}\sum_{j=1}^{n}(f_{w}(x^{(j)})-y^{(j)})^2
我们称J(w)J(w)为代价函数。注意到式子的系数不是1/n而是1/2,数是因为求导后的 J(w)J'(w) 系数为1,方便后续计算。为什么均方误差可以作为性能度量?可以从极大似然估计(概率角度)入手。

为了能够能精确的表达特征和目标值y的关系,引入了误差项ϵ,表示模型受到的未观测到的因素的影响。于是我们可以假设:
y(i)=wTx(i)+ϵ(i) y^{(i)} = w^T x^{(i)}+\epsilon^{(i)}
使用回归模型需要满足许多前提假设,其中一个是要求ϵ独立同分布,且服从N(0,σ2)N(0, σ^2)的高斯分布(正态分布):
p(ϵ(i))=12πσexp((ϵ(i))22σ2) p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(\epsilon^{(i)})^2}{2\sigma^2}\right)
所以在给定w和x的前提下,y(i)y^{(i)} 服从N(wTx(i),σ2)N(w^T x^{(i)}, σ^2)的正态分布。
p(y(i)x(i);w)=12πσexp((y(i)wTx(i))22σ2) p(y^{(i)}|x^{(i)};w) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-w^T x^{(i)})^2}{2\sigma^2}\right)
现在我们已经知道$y^{(i)} $的分布,但是我们不知道他的参数 wTx(i),σ2w^T x^{(i)}, σ^2 ,极大似然估计法来正是用来解决此类问题的,假设样本独立同分布,最大化似然函数,来进行参数估计。最大化似然函数的原理说简单点就是在一次观测中,发生了的事件其概率应该大。概率大的事在观测中容易发生,所以我们希望让每一个p(y(i)x(i);w)p(y^{(i)}|x^{(i)};w)都最大化,这等效于他们的乘积最大化。于是不难得到似然函数:
L(w)=i=1n12πσexp((y(i)wTx(i))22σ2) L(w) = \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-w^T x^{(i)})^2}{2\sigma^2}\right)
现在,目标转换为找到最佳的w,使得L(w)最大化,这就是极大似然估计的思想。我们通常对L(w)取对数,转换成加法的形式来方便计算:
L(w)=logL(w)=logi=1n12πσexp((y(i)wTx(i))22σ2)=i=1nlog12πσexp((y(i)wTx(i))22σ2)=nlog12πσ1σ212i=1n((y(i)wTx(i))2 \begin{aligned} L(w) &= log L(w) \\ &= log \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-w^T x^{(i)})^2} {2\sigma^2}\right) \\ & = \sum^n_{i=1}log\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-w^T x^{(i)})^2}{2\sigma^2}\right) \\ & = nlog\frac{1}{{\sqrt{2\pi}\sigma}} - \frac{1}{\sigma^2} \cdot \frac{1}{2}\sum^n_{i=1}((y^{(i)}-w^T x^{(i)})^2 \end{aligned}
因此,要最大化L(w)L(w)只需要最小化:
12i=1n((y(i)wTx(i))2 \frac{1}{2}\sum^n_{i=1}((y^{(i)}-w^T x^{(i)})^2
这一结果即为均方误差的形式,因此使用J(w)J(w)作为代价函数是合理的。

线性回归模型的求解方法

1. 梯度下降法

随机初始化参数w,不端迭代,直到w达到收敛的状态,此时J(w)J(w)达到了最小值(有时候是局部最小值) :
wj=wjαJ(w)w w_j=w_j-\alpha\frac{\partial{J(w)}}{\partial w}
上式中α为学习率,其中,
J(w)wj=wj12i=1n(fw(x)(i)y(i))2=212i=1n(fw(x)(i)y(i))wj(fw(x)(i)y(i))=i=1n(fw(x)(i)y(i))wj(j=0dwjxj(i)y(i)))=i=1n(fw(x)(i)y(i))xj(i) \begin{aligned} \frac{\partial{J(w)}}{\partial w_j} &= \frac{\partial}{\partial w_j}\frac{1}{2}\sum_{i=1}^{n}(f_w(x)^{(i)}-y^{(i)})^2 \\ &= 2*\frac{1}{2}\sum_{i=1}^{n}(f_w(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial w_j}(f_w(x)^{(i)}-y^{(i)}) \\ &= \sum_{i=1}^{n}(f_w(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial w_j}(\sum_{j=0}^{d}w_jx_j^{(i)}-y^{(i)}))\\ &= \sum_{i=1}^{n}(f_w(x)^{(i)}-y^{(i)})x_j^{(i)} \\ \end{aligned}
于是有:
wj=wj+αi=1n(y(i)fw(x)(i))xj(i) w_j = w_j + \alpha\sum_{i=1}^{n}(y^{(i)}-f_w(x)^{(i)})x_j^{(i)}
将上式向量化后得到:
w=w+αi=1n(y(i)fw(x)(i))x(i) w = w + \alpha\sum_{i=1}^{n}(y^{(i)}-f_w(x)^{(i)})x^{(i)}
可以看到上面的式子每次都迭代所有的样本,完成w的梯度下降,迭代过程如下图所示(越靠近内部,代价函数的值越小):
【线性回归】面向新手的基础知识

有时候我们不能将所有数据一次性加载到内存中,那么可以每次只用部分样本(例如16,32,64等)进行梯度下降,此时的梯度下降法又叫做批梯度下降法。

极端情况下,我们每次只对一个样本进行梯度下降,此时的梯度下降法又叫做随机梯度下降法(SGD)。好处是相对于使用多个样本的梯度下降法,SGD每次迭代计算量都比较小,因此迭代速度很快。缺点是容易受到噪声点的干扰,导致梯度下降的方向不稳定,如下图所示:
【线性回归】面向新手的基础知识

因此要结合实际场景选择合适的梯度下降算法。

2. 最小二乘法

令:
x(i)=[x0(i)x1(i)x2(i)xd(i)] x^{(i)} = \left[ \begin{array} {cccc} x_0^{(i)}\\ x_1^{(i)}\\ x_2^{(i)}\\ \ldots \\ x_d^{(i)} \end{array} \right]
X=[(x(0))T(x(1))T(x(2))T(x(n))T] X = \left[ \begin{array} {cccc} (x^{(0)})^T\\ (x^{(1)})^T\\ (x^{(2)})^T\\ \ldots \\ (x^{(n)})^T \end{array} \right]
Y=[y(1)y(2)y(n)] Y = \left[ \begin{array} {cccc} y^{(1)}\\ y^{(2)}\\ \ldots \\ y^{(n)} \end{array} \right]
则有:
fw(x)=Xw f_w(x)=Xw
且每个样本的误差组成的矩阵为:
XwY Xw -Y
进而有:
J(w)=12(XwY)T(XwY) J(w)=\frac{1}{2}(Xw-Y)^T(Xw-Y)
由于这是个存在最小值的凸函数,故对w求导可得:
J(w)w=w12(XwY)T(XwY)=12w(wTXTXwYTXwwTXTYYTY)=12((Xw)TwXw+(Xw)TwXwXTYXTY0)=XTXwXTY \begin{aligned} \frac{\partial{J(w)}}{\partial w} &= \frac{\partial}{\partial w} \frac{1}{2}(Xw-Y)^T(Xw-Y) \\ &= \frac{1}{2}\frac{\partial}{\partial w} (w^TX^TXw - Y^TXw-w^T X^TY - Y^TY) \\ &= \frac{1}{2}(\frac{\partial (Xw)^T}{\partial w}Xw + \frac{\partial (Xw)^T}{\partial w}Xw-X^TY -X^TY - 0) \\ &= X^TXw - X^TY \end{aligned}\\

可能用到的向量和矩阵求导公式:
aTxx=xTax=axTAxx=(A+AT)x \cfrac{\partial\boldsymbol{a}^{\mathrm{T}}\boldsymbol{x}}{\partial\boldsymbol{x}}=\cfrac{\partial\boldsymbol{x}^{\mathrm{T}}\boldsymbol{a}}{\partial\boldsymbol{x}}=\boldsymbol{a} \\ \\ \cfrac{\partial\boldsymbol{x}^{\mathrm{T}}\mathbf{A}\boldsymbol{x}}{\partial\boldsymbol{x}}=(\mathbf{A}+\mathbf{A}^{\mathrm{T}})\boldsymbol{x}

令导数等于0,得到:
w=(XTX)1XTY w = (X^TX)^{-1}X^TY

注意到上式存在矩阵的逆运算,一般样本数量大于维度的时候矩阵可逆,利用最小二乘法可以得到目标函数的闭式解。但是,当数据维度大于样本数时,X 非满秩,则XTXX^TX的结果根据:
rank(AB)min(rankA,rankB) rank(AB)\le \min{(rankA, rankB)}
可知XTXX^TX也不是满秩的,故不可逆,此时会有无穷多个解。

带有正则化项的回归模型

为了简化模型复杂程度,缓解过拟合,可以引入正则化项。根据使用的正则项,回归模型又可以细分为:lasso回归、岭回归(ridge回归)、ElasticNet回归。

Lasso回归使用L1L_1范数(向量中各个元素绝对值之和)来约束模型:
J(w)=12i=1n((y(i)wTx(i))2+λw1(1) J(w) = \frac{1}{2}\sum^n_{i=1}((y^{(i)}-w^T x^{(i)})^2 + \lambda \|w\|_1 \tag 1
岭回归使用L2L_2范数(向量各元素平方和的平方根)的平方来约束模型:
J(w)=12i=1n((y(i)wTx(i))2+λw22(2) J(w) = \frac{1}{2}\sum^n_{i=1}((y^{(i)}-w^T x^{(i)})^2 + \lambda \|w\|^2_2 \tag 2

L1L_1L2L_2都有助于减缓过拟合,但是前者可以使得部分不重要的特征xjx_j对应的权重wjw_j变为0,可以起到特征选择的作用。

为了更好的理解,我们假设模型只有两个参数x1,x2x_1, x_2, 对应的权重为w1,w2w_1, w_2,将公式(1),(2)等号右边的两项分别绘制图像可以得到:

【线性回归】面向新手的基础知识
公式(1),(2)的最优解应该是均方误差项和正则化项的折中,即出现在均方误差项和正则化项的交点处。从上图可以看到,采用L1L_1范数时,交点出现在w2w_2等于0的坐标轴上,意味着对于此模型特征x2x_2并没有起到作用,可以舍去。而采用L2L_2范数的话,交点更容易落在某个象限中,即$w_1, w_2 0不等于0。总的来说,就是L_1范数比L_2$范数更容易得到稀疏的解。

ElasticNet回归则是同时使用了L1L_1L2L_2来约束模型:
J(w)=12i=1n((y(i)wTx(i))2+λ1w1+λ2w22 J(w) = \frac{1}{2}\sum^n_{i=1}((y^{(i)}-w^T x^{(i)})^2 + \lambda_1 \left \| {w} \right \|_1 + \lambda_2\left \| {w} \right \|_2^2
ElasticNet回归在具有多个特征,并且在特征之间具有一定关联的数据中比较有用。

回归任务的评价指标

1. 平均绝对误差(MAE)

平均绝对误差也叫L1L_1范数损失,公式为:
MAE=1ni=1n(y(i)y^(i) MAE = \frac{1}{n}\sum^{n}_{i=1} | (y^{(i)} - \hat y^{(i)} |
其中n为样本的个数,y^(i)\hat y^{(i)} 表示第i个样本的预测值。MAE能很好的刻画预测值和真实值的偏差,因为偏差有正有负,为了防止正负误差抵消,MAE计算的是误差绝对值的平均值。MAE 也可以作为损失函数,但是有些模型(如XGboost)必须要求损失函数有二阶导数,所以不能使用MAE进行优化。

加权平均绝对误差(WMAE)是MAE的变形,比如考虑时间因素,离当前时间越久的样本权重越低。公式为:
WMAE=1ni=1nw(i)(y(i)y^(i) WMAE = \frac{1}{n}\sum^{n}_{i=1} w^{(i)}| (y^{(i)} - \hat y^{(i)} |
其中,w(i)w^{(i)}为第i个样本的权重。

2. 均方误差(MSE)

MSE 计算的是误差平方和的均值,公式如下:
MSE=1ni=1n(y(i)y^(i))2 MSE = \frac{1}{n}\sum^{n}_{i=1} (y^{(i)} - \hat y^{(i)} )^2
MSE 它对误差有着更大的惩罚,但是他也对离群点敏感,健壮性可能不如MAE。

3. 均方根误差(RMSE)

MSE公式有一个问题是会改变量纲。因为公式平方了,比如说 y 值的单位是万元,MSE 计算出来的是万元的平方,对于这个值难以解释它的含义。RMSE 其实就是对MSE开平方根,公式如下:
RMSE=1ni=1n(y(i)y^(i))2 RMSE=\sqrt{\frac{1}{n}\sum^{n}_{i=1} (y^{(i)} - \hat y^{(i)} )^2}
可以看到 MSE 和 RMSE 二者是呈正相关的,MSE 值大,RMSE 值也大,所以在评价线性回归模型效果的时候,使用 RMSE 就可以了。

4. 决定系数(R2R^2)

当数据集不同时,或者说数据集预测目标的量纲不同时,上面三种评估方式的结果就不好比较了。R2R^2把预测目标的均值作为参照,例如房价数据集的房价均值,学生成绩的成绩均值。现在我们把这个均值当成一个基准参照模型,也叫 baseline model。这个均值模型对任何数据的预测值都是一样的,可以想象该模型效果自然很差。基于此我们才会想从数据集中寻找规律,建立更好的模型。

R2R^2公式如下:
R2=1i=1n(y(i)y^(i))2i=1n(yˉy^(i))2=11ni=1n(y(i)y^(i))21ni=1n(yˉy^(i))2=1MSEVAR R^2 = 1- \frac{\sum^{n}_{i=1} (y^{(i)} - \hat y^{(i)} )^2}{\sum^{n}_{i=1} (\bar y - \hat y^{(i)} )^2} = 1-\frac{\frac{1}{n}\sum^{n}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\frac{1}{n}\sum^{n}_{i=1}(\bar y - \hat y^{(i)})^2} = 1-\frac{MSE}{VAR}
R2R^2= 1,达到最大值。即分子为 0 ,意味着样本中预测值和真实值完全相等,没有任何误差。也就是说我们建立的模型完美拟合了所有真实数据,是效果最好的模型,R2R^2值也达到了最大。但通常模型不会这么完美,总会有误差存在,当误差很小的时候,分子小于分母,模型会趋近 1,仍然是好的模型,随着误差越来越大,$R^2 $也会离最大值 1 越来越远,直到出现下面的情况。

R2R^2= 0,此时分子等于分母,样本的每项预测值都等于均值。也就是说我们辛苦训练出来的模型和前面说的均值模型完全一样,还不如不训练,直接让模型的预测值全去均值。当误差越来越大的时候就出现了第三种情况。

R2R^2< 0 ,分子大于分母,训练模型产生的误差比使用均值产生的还要大,也就是训练模型反而不如直接去均值效果好。出现这种情况,通常是模型本身不是线性关系的,而我们误使用了线性模型,导致误差很大。

参考资料:

【机器学习12】线性回归算法评价指标:MSE、RMSE、R2_score
周志华 《机器学习》
李航 《统计学习方法 第二版》