线性回归
1.算法概述
开始之前,先大概说一下有监督机器学习的本质是什么?简单点来说,我们经常解决的一类问题就是给定一个函数 f(x) 和输入数据集 X,然后求解输入数据集的各个样本数据在经过函数的映射计算后的输出数据集 Y,而机器学习大部分解决的问题就是在给定输入数据集 X 和输出数据集 Y,来获知函数 f(x),以方便我们利用计算好的 f(x) 去对其他输入数据进行映射计算。然而现实是由于受限于函数本身的复杂度、数据的噪声影响、数据集的规模、计算 f(x) 所需代价等一系列因素,我们往往不会获得完全正确的 f(x),所以很多情况下,我们只是在不断求解一个最接近真实 f(x) 的最优解,并且让它具备一定的泛化能力,即在真正拿来用的其他数据集上也具备一样好的特性。
线性回归(Linear Regression)试图学得一个通过 n 个属性的线性组合来进行预测的函数。简单来说,线性模型就是用线性方程拟合样本点,根据样本点数据,得出一条直线或一个超平面能够尽可能的代表这些数据的总体情况,这个直线或者超平面就是我们要求解的 f(x)。即:
$$ f(x)={\theta_1}{x_1}+{\theta_2}{x_2}+…+{\theta_n}{x_n}+b $$
通常用向量形式写成:$$ f(x)=\theta^Tx+b $$
其中,$\theta^T=(\theta_1, \theta_2, \theta_3,\cdots,\theta_n),\quad x\in R^n $(x 是 n 维向量)。
更简洁的,我们把截距项 b 也吸收入向量形式,我们还是用θ表示,表示为:
$$ f(x)=\theta^Tx $$
注意,因为加了一项,这个时候 $x \in R^{n+1} $ (x 是 n+1 维向量,有时候为了表达方便,也会直接说是 n 维),最后一个元素恒置为 1。
如果此时的数据集有 m 个样本,n 个属性值,则此时的数据集可以用矩阵的形式表示为:
$$X_{m\times{(n+1})}= \begin{bmatrix} x_{11} & x_{12} & \dots & x_{1n} \\ x_{21} & x_{22} & \dots & x_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ x_{m1} & x_{m2} & \dots & x_{mn} \end{bmatrix}$$
再把标记值也记为向量形式,$y = \begin{pmatrix} y_1 \\ y_2 \\ \vdots \\ y_m \end{pmatrix}$,我们的目的是求出合适的 $\theta$。
2.算法推导
我们分别通过最小二乘法和极大似然估计两种意义角度来推导线性回归损失函数。
2.1.最小二乘法意义下的损失函数
刚才说到我们尝试学得一个 f(x) 使得它能够尽量接近真实情况,但是如何度量呢?线性回归中最常用的性能度量就是均方误差,均方误差有非常好的几何意义,它对应了常用的欧式距离,我们的目的是让均方误差最小化,因此损失函数为:
$$ J(\theta)=\frac{1}{2}\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})^2} $$
其中,$h_\theta(x^{(i)}) $表示样本的估计值,$y^{(i)} $表示样本的观测值,前面的 $\frac{1}{2} $是故意构造出来的,因为不会对整体产生影响,但可以使后面的求导过程中约去平方项,这样做只是为了数学上的便利。
直观理解上面的目标函数,均方误差最小化就是试图找到一条直线或者超平面使所有样本到直线上的欧式距离之和最小。这种基于均方误差最小化来进行模型求解的方法称为最小二乘法( Ordinary Least Square,OLS,一般指普通最小二乘法)。
2.2.极大似然估计意义下的损失函数
假设每一个样本的估计值和观测值之间都存在误差,存在着下面的关系:
$$ y^{(i)}={\theta^T}x^{(i)}+\epsilon^{(i)} $$
这个误差可能是多个不同的原因共同造成的,可能有建模的时候没有考虑到比较细的特征,可能有观测设备或者仪器产生的误差等,各种不同的细小随机分布综合叠加,最后反应出来的就是 $\epsilon^{(i)} $。依据中心极限定理,假设误差 $ \epsilon^{(i)}(1\le i \le m) $是独立同分布 (i.i.d.) 的,服从均值为为 0,方差为某定值 $\sigma^{2} $的高斯分布。
@中心极限定理
定义:在客观实际中有一些随机变量,它们是由大量的独立随机因素的综合影响所形成的,而其中每一个别因素在总的影响中所起的作用都是微小的,这种随机变量往往近似地服从正态分布。
举例:
城市耗电量:大量用户的耗电量总和
测量误差:许多观察不到的、微小误差的总和
注:应用前提是多个随机变量的和,有些问题是乘性误差,则需要鉴别或者取对数后再使用。
我们先来整体梳理一下思路,假设某一个 $x^{(i)} $在没有任何误差的情况下对应的真值是 10,它是唯一的定值(标量),但实际情况中的观测值 $y^{(i)} $并不是真值,它会受到误差的影响,所以观测值有可能是 10,也有可能是在 10 附近的一些值,这个范围取决于误差的影响大小,所以观测值 $y^{(i)} $其实是一个随机变量。我们假设观测值受到影响的误差服从均值为 0,方差为 4 的正态分布,那么某一个样本 $x^{(i)} $对应的观测值 $y^{(i)} $的可能取值及其概率分布如下图所示:
从上图可以看出,其实观测值在正态分布的误差影响下,其可能取值也服从正态分布(图中是均值为 10,方差为 4 的正态分布),这就意味着:误差值概率最大的位置,其对应观测值被采样(观测)到的概率也最大,如果估计值也取这个概率最大位置的话,那么估计值与观测值就最接近。换句换说,因为估计值也是一个定值,在观测值可能取值的范围内选择一个点当做估计值,要想使得这个值与可能出现的观测值最接近,我们当然会把这个点选在观测值概率最高的地方,因为这个点的观测值最容易出现。也就是说,我们的目标是使观测值的概率最大。
线性回归的训练数据是由众多这样的样本点构成的,因此我们需要兼顾所有的样本点,又因为误差是相互独立同分布的,所以每一个样本点的观测值概率取最大,就是所有样本观测值的联合概率取最大,即我们要找到一个参数θ,使得所有样本的观测值联合概率最大,这便是我们要使用的方法——极大似然估计(Maximum Likelihood Estimate,MLE,也称最大似然估计),其思想简单来说就是要选什么样的参数才能使我们观测到目前这组数据的概率是最大的。
接下来我们来看公式,$\epsilon^{(i)} $服从正态分布,那么它的概率密度函数为:
$$ p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}\exp{(-\frac{(\epsilon^{(i)})^2}{2\sigma^2})} $$
根据 $y^{(i)}=\theta^Tx^{(i)}+\epsilon^{(i)} $可知 $\epsilon^{(i)}=y^{(i)}−\theta^Tx^{(i)} $,将概率密度函数中的 $\epsilon^{(i)} $换成 $y^{(i)}−\theta^Tx^{(i)} $,而此时公式中已经没有 $\epsilon^{(i)} $,我们将它转换成了观测值 $ y^{(i)} $的概率密度函数,即确定参数 $\theta $下,如果给定了 $x^{(i)} $这个样本,$y^{(i)} $的概率密度函数为:
$$ p(y^{(i)}|x{^{(i)};\theta})= \frac{1}{\sqrt{2\pi}\sigma}\exp{(-\frac{(y^{(i)}-\theta^Tx{^{(i)}})^2}{2\sigma^2})} $$
我们的目的是求所有样本的观测值联合概率最大,又因为样本之间相互独立,所以可直接写出 $\theta$ 的目标函数:
$$ \begin{equation}\begin{split} L(\theta) &= \prod_{i=1}^m p(y^{(i)}|x{^{(i)};\theta}) \\ &=\prod_{i=1}^m \frac{1}{\sqrt{2\pi}\sigma}\exp{(-\frac{(y^{(i)}-\theta^Tx{^{(i)}})^2}{2\sigma^2})} \end{split}\end{equation} $$
然后对上面的似然函数取对数得到对数似然 $\ell(\theta) $:
$$ \begin{equation}\begin{split} \ell(\theta) &= \log L(\theta) \\ &= \log\prod_{i=1}^m \frac{1}{\sqrt{2\pi}\sigma}\exp{(-\frac{(y^{(i)}-\theta^Tx{^{(i)}})^2}{2\sigma^2})} \\ &= \sum_{i=1}^m \frac{1}{\sqrt{2\pi}\sigma}\exp{(-\frac{(y^{(i)}-\theta^Tx{^{(i)}})^2}{2\sigma^2})} \\ &=m\log\frac{1}{\sqrt{2\pi}\sigma} – \frac{1}{\sigma^2}\cdot\frac{1}{2} \sum_{i=1}^m (h_\theta(x^{(i)}) – y^{(i)})^2 \end{split}\end{equation} \ $$
要想使得上式最大,$\frac{1}{\sigma^2} $又是定值,就必须使 $\frac{1}{2} \sum_{i=1}^m (h_\theta(x^{(i)}) – y^{(i)})^2 $最小,因此最终的目标函数是:
$$ J(\theta)=\frac{1}{2}\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})^2} $$
发现它就是最小二乘法的损失函数,所以线性回归中,极大似然估计可以解释最小二乘法,这也一定程度从理论上解释了为什么最小二乘法的损失函数要用平方和,而且还得是最小的原因。
回顾上面两种方法,最小二乘法是从损失函数的角度去考虑的,极大似然估计是从概率角度去考虑的,但最终的结论相同,二者的损失函数是一致的。
3.参数优化
已经知道了算法的损失函数,我们接下来要进行的就是 $\theta$ 解析式求解过程,下面将介绍两种方法。
3.1.最小二乘法直接求解
将损失函数写成向量的形式:
$$J(\theta)=\frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)}) – y^{(i)})^2=\frac{1}{2}(X\theta-y)^T(X\theta-y)$$
对 $\theta$ 求一阶导得到梯度:
上式求导用到了矩阵求偏导的公式,参考下面的公式,可将其他无关的矩阵项看成是 A,$\theta$ 看成是公式中的 $x$。
@常用的矩阵向量求导公式:
$$\frac { \partial Ax }{ \partial x } =A^T$$
$$\frac { \partial x^TA }{ \partial x } =A$$
$$\frac { \partial x^TA x}{ \partial x } =(A^T+A)x$$
$$\frac { \partial x^T x}{ \partial x } =2x$$
因为 $J(\theta)$是存在极小值的凸函数,当然梯度为 0 的时候可取得最小值:
令 $X^TX\theta-X^Ty = 0$,得:
$$X^TX\theta=X^Ty$$
若 $X^TX$可逆,则得到参数的解析式:
$$\theta = (X^TX)^{-1}X^Ty$$
注意,上式有个问题,就是必须要求 $X^TX$可逆,才能解出唯一 $\theta$,也就是说要求 $X^TX$必须满秩。然而现实任务中 $X^TX$往往不是满秩矩阵,例如在许多任务中我们会遇到大量的变量其数目甚至超过样例数,导致 $X$的列数多于行数,如基因和文本分类问题。此时可解出多个解,它们都能使均方误差最小化,究竟选择哪一个解作为输出呢?一种办法是由学习算法的归纳偏好决定。
归纳偏好可看作学习算法自身在一个可能很庞大的假设空间中对假设进行选择的启发式或 “价值观”,然后在训练集上 “等效” 的几个模型中识别出 “泛化能力更强的” 还是 “更独特的”,然后根据需要选择更好的模型。按照 “奥卡姆剃刀”(Occam’s razor)原则虽然可以选择一个最简单的模型,以使得泛化能力更强,但是有时候效果并不理想,第一,“简单” 的模型很多时候并不能够直观确定,第二,有时候需解决的问题场景复杂,必须按照实际情况具体讨论,奥卡姆剃刀有可能并不适用,所以,归纳偏好不足以解决我们的问题。
那如何解决这个问题呢?更常用的办法是引入正则化(regularization)项。
3.2.正则化
关于正则化的类型、原理、优点等请参看 《正则化详细总结》。
正则化可以理解为模型的复杂度惩罚因子,在原有损失函数中加入对参数的限制项,组成新的目标函数,使得参数的值不会太大,从而降低模型的复杂度。
我们将线性回归的损失函数增加参数的平方和损失:
$$J(\theta)=\frac{ 1 }{ 2 } \sum_{ i=1 }^{ m }{ (h_{ \theta }(x^{ (i) })-y^{ (i) })^{ 2 } } +\lambda \sum_{ j=1 }^{ n }{ \theta_j^2 }$$
写成向量形式:
$$J(\theta)=\frac{1}{2}(X\theta-y)^T(X\theta-y)+\lambda \theta^T\theta$$
对 $\theta$求偏导,$ \lambda\theta^T\theta $求偏导后为 $2\lambda\theta$,加到原损失函数求导结果的后面:
$$\nabla_{\theta} J(\theta)=\frac{1}{2}(2X^TX\theta-X^Ty-(y^TX)^T+2\lambda\theta)$$
同样令 $J(\theta)$等于 0,化简得到 $\theta$的解析式:
$$\theta = (X^TX+\lambda I)^{-1}X^Ty$$
通过证明 $X^TX+\lambda I$正定,可证明 $X^TX+\lambda I$是可逆的,证明过程略。
上面的参数平方和损失项,就是正则化的一种方式,称为 L2 范数(norm)或岭回归(Ridge Regression)。正则化还有其他的方式,如下对比:
L1-norm,Lasso:
$$J(\theta )=\frac { 1 }{ 2 } \sum_{ i=1 }^{ m }{ (h_{ \theta }(x^{ (i) })-y^{ (i) })^{ 2 } } +\lambda \sum_{ j=1 }^{ n }{ |\theta_{ j }|}$$
L2-norm,Ridge:
$$J(\theta )=\frac { 1 }{ 2 } \sum_{ i=1 }^{ m }{ (h_{ \theta }(x^{ (i) })-y^{ (i) })^{ 2 } } +\lambda \sum_{ j=1 }^{ n }{ \theta_{ j }^{ 2 } }$$
Elastic Net,弹性网络:
$$J(\theta )=\frac { 1 }{ 2 } \sum_{ i=1 }^{ m }{ (h_{ \theta }(x^{ (i) })-y^{ (i) })^{ 2 } } +\lambda \left( \rho \cdot \sum_{ j=1 }^{ n }{ |\theta_{ j }|+(1-\rho ) } \cdot \sum_{ j=1 }^{ n }{ \theta_j^2} \right) $$
注:上式中,$\lambda$ 是调节因子,用来控制正则项的惩罚力度,要求 $\lambda{\gt} 0$ 。第三种方式弹性网络是上面两种方式的结合,通过权重因子 $\rho$ 来调节配置两种正则化方式的权重,要求 $\rho \in [0, 1]$。
如何求超参数 $\lambda$:
$\lambda$ 是参数的参数,称为超参数,一般会先验地给定一个范围,然后使用交叉验证法(Cross-validation)得出,超参数无法通过样本直接算出,而是通过验证数据来选一个使得模型性能最好的拿来用。
对三种正则化作一个小小对比:
英文名 | 中文翻译 | 范数 | 约束方式 | 优点 |
LASSO | 套索正则化(最小绝对衰减和选择子) | L1 | 绝对值和 | 特征选择 |
Ridge | 岭回归 | L2 | 平方和 | 性能稍好,方便计算 |
Elastic Net | 弹性网络 | L1、L2 | 绝对值和、平方和 | 结合 LASSO 和 Ridge 的优点 |
线性回归中加入正则项的好处:
- 解决不可逆的情况,使得可直接求得参数解析式
- 防止参数值太高导致模型不稳定,降低模型复杂度
- 通过限制条件,防止过拟合
3.3.梯度下降
求最优参数解析式的另外一种办法是不直接求出 $\theta$,而是通过梯度下降(Gradient Descent)的方法不断学习 $\theta$。关于梯度下降的原理、类型、优点,请参看 《梯度下降算法总结》。
虽然通过最小二乘法加正则项可以解除非常理想的 $\theta$的解析式,但在实际场景更多还是会用梯度下降法来求参数解析式,原因有以下几方面:
- 如果 X 特征维度特别大,比如是上千上万维的,那最小二乘法的计算量是非常大的,因为涉及矩阵求逆,其算法复杂度是 O(N^3),N 为特征数目。还有就是如果特征数目大于样本数目,没有正则项会出现不可逆的情况,而梯度下降则不会;
- 我们没有办法直接离线的拿到足够的数据,我们可以不断输入新的数据不断提高性能,而不用一次性拿到所有的数据;
- 直接求逆,然后带公式,或者 SVD 来求伪逆这些传统的办法已经不现实了,同时,机器学习也是一门计算机科学,不是纯粹的数学,我们更希望 $\theta$是不断迭代学习来的,而不是直接算出来的。
- 在机器学习中,梯度下降算法随处可见,几乎所有的优化算法都可以用梯度下降算法来实现,包括简单线性回归以及复杂的深度学习。
梯度下降又称最速下降法,思路很简单,对任意一个目标函数,先给定一个初始 $\theta$,比如随机初始化,然后沿着梯度的负方向下降一点得到新的 $\theta$,通过这种方式不断迭代,最终得到 $\theta$使目标函数最小。表达式如下:
$$\theta=\theta-\alpha \cdot \frac{\partial J(\theta)} {\partial \theta}$$
其中 $\alpha$是学习率、步长,需要人为设置,往往给一个稍小的值,比 0.01,0.001。
利用梯度下降求解 $\theta$,因为求梯度只和当前 $\theta_j$有关系,所以先把 Σ 忽略点,求梯度方向过程如下:
$$\begin{equation} \begin{split} \frac { \partial J(\theta ) }{ \partial \theta_{ j } } & =\frac { \partial }{ \partial \theta_{ j } } \frac{ 1 }{ 2 } (h_{ \theta }(x)-y)^{ 2 } \\ & = 2 \cdot \frac { 1 }{ 2 } (h_{ \theta }(x)-y) \cdot \frac { \partial }{ \partial \theta_{ j } } (h_{ \theta }(x)-y) \\ & =(h_{ \theta }(x)-y) \cdot \frac { \partial }{ \partial \theta_{ j } } (\sum _{ i=0 }^{ n }{ \theta_{ i }x_{ i } } -y) \\ & =(h_{ \theta }(x)-y)x_j \end{split} \end{equation}$$
有了梯度方向,接下来就是沿着梯度方向不断更新θ:
$$\theta _{ j }:=\theta _{ j }-\alpha \frac { \partial J(\theta ) }{ \partial \theta _{ j } } =\theta _{ j }-\alpha (h_{ \theta }(x)-y)x_{ j }$$
整个更新过程可以理解成:$\theta_j$沿着梯度下降最快的方向进行递减的过程。左边的 $\theta_j$表示更新之前的值,等式右边表示沿着梯度方向减少的量,不断更新 $\theta_j$的值直到 $J(\theta )$收敛,可以通过比较 $J(\theta )$的前后两个值是否有发生变化(继续下降),当没有发生变化时表示已经达到了最小值(可能是局部最小值)。
参数设置问题:
初始值和学习速度都是是人工设置的,而梯度下降法对这些参数又是敏感的。
初始值的设置会影响到最终 $J(\theta )$的最小值,它可能是局部最小值,也可能是全局最小值。
学习速度的设置也会影响到梯度下降的性能和结果:
- 当设置过小时,由于沿着最陡峭方向每次迈进的步伐太小,而导致收敛时间过长;
- 当设置过大时,很有可能会直接越过最小值,而无法得到 $J(\theta )$的最小值。
如何设置学习速率呢?
- 如果训练数据规模很大,开始学习率可以稍微大点,经过 100 次迭代或者 1000 次迭代,学习率降一点,比如降十分之一,再经过 100 次迭代或者 1000 次迭代,学习率再降十分之一,如此重复。变更学习率的迭代次数按照实际数据的规模来考虑。
- 对于不是很复杂的模型,固定一个比较小的学习率。
- 更复杂的模型,可参考 《梯度下降学习率的设定策略》。
4.算法延伸
线性回归虽然简单,但拟合过程往往有些 “耿直”,对于一些非线性关系的数据可能出现欠拟合现象,因为他求的是具有最小均方误差的无偏估计。如何才能够让线性回归也能拟合非线性关系的数据呢?下面提供三种思路。
4.1.多项式回归
本小节开始之前,必须了解一个事情,就是所谓线性模型,只是针对参数而言的线性关系,但样本关系可以是非线性的。多项式回归(Polynomial Regression)主要通过特征的多项式映射来实现的,特征的多项式映射属于训练模型前特征工程中的特征预处理工作,一个非常简单的步骤,不过它可以在输入数据中增加非线性特征从而有效的提高模型的复杂度。
上图中,左边是没有经过多项式映射处理的,模型为 $y=\theta_0+\theta_1 x$拟合出一条直线,稍微有些欠拟合。右边是经过二阶多项式映射处理的,将(1,X,Y)映射成为(1,X,X2,Y)(1 是截距项 $\theta_0$对应的 $x$值),构成新的模型 $y=\theta_0+\theta_1 x+\theta_2 x^2$,可以看出,右边的拟合效果更好,一般而言,多项式映射的阶数越大,模型越复杂,在训练集的效果会更好,但是也更容易出现过拟合的情况,所以阶数的选择要根据事情的情况具体来定,当然,也可以增加正则项来防止过拟合。
多项式特征的生成计算可以使用 scikit-learn 中的 preprocessing 模块快速实现,下面是一个简单的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | In [1]: import numpy as np In [2]: from sklearn import preprocessing In [3]: X = np.arange(16).reshape(4,4) In [4]: poly = preprocessing.PolynomialFeatures(3) # degree=3 In [5]: poly.fit_transform(X) Out[5]: array([[ 1., 0., 1., 2., 3., 0., 0., 0., 0., 1., 2., 3., 4., 6., 9., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 3., 4., 6., 9., 8., 12., 18., 27.], [ 1., 4., 5., 6., 7., 16., 20., 24., 28., 25., 30., 35., 36., 42., 49., 64., 80., 96., 112., 100., 120., 140., 144., 168., 196., 125., 150., 175., 180., 210., 245., 216., 252., 294., 343.], [ 1., 8., 9., 10., 11., 64., 72., 80., 88., 81., 90., 99., 100., 110., 121., 512., 576., 640., 704., 648., 720., 792., 800., 880., 968., 729., 810., 891., 900., 990., 1089., 1000., 1100., 1210., 1331.], [ 1., 12., 13., 14., 15., 144., 156., 168., 180., 169., 182., 195., 196., 210., 225., 1728., 1872., 2016., 2160., 2028., 2184., 2340., 2352., 2520., 2700., 2197., 2366., 2535., 2548., 2730., 2925., 2744., 2940., 3150., 3375.]]) |
4.2.局部加权线性回归
既然传统线性回归是最小均方误差的无偏估计,也就是预测模型是系统误差为零的估计,所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。
其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在该算法中,我们给待预测点附近的每个点赋予一定的权重,与 KNN 一样,这种算法每次预测均需要事先选取出对应的数据子集,然后在这个子集上基于最小均方差来进行普通的回归。
局部加权线性回归的损失函数为:
$$J(\theta)=\frac{1}{2}\sum_{i=1}^m w^{(i)}(y^{(i)}-\theta^Tx^{(i)})^2$$
从上式可以看出,与普通的线性回归相比,LWLR 仅是在每个数据点加了一个权值 $w^{(i)}$,当 $w^{(i)}$很大时,很难使得 $(y^{(i)}-\theta^Tx^{(i)})^2$小,而 $w^{(i)}$很小,则它所产生的的影响也就很小。
损失函数解出回归系数 $\theta$ 的形式如下:
$$\theta=(X^TWX)^{-1}X^TWy$$
其中,$W$是由各个样本点权值构成的矩阵。
LWLR 使用 “核”(与 SVM 中的核函数类似)来对附近的点赋予更高的权重(与 KNN 一样,该加权模型认为样本点距离越近,越可能符合同一个线性模型)。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
$$w{(i,i)}=\exp(-\frac{(x^{(i)}-x)^2}{2k^2})$$
这样就构建了一个只含对角元素的权重矩阵,并且点 $x$与 $x^{(i)}$越近,$w(i,i)$将会越大。上述公式包含一个需要用户指定的参数 $k$,$k$称为带宽,它控制着训练样本随着与 $x^{(i)}$距离的衰减速率,决定了对附近的点赋予多大的权重,这也是使用 LWLR 时唯一需要考虑的参数,下图可以看到参数 $k$与权重的关系:
上图假定我们正在预测的点是 x=0.5,最上面的图是原始数据集,第二张显示了当 k = 0.5 时,大部分的数据都用于训练回归模型;而最下面的图显示当 k = 0.01 时,仅有很少的局部点被用于训练回归模型。
补充:
- $w^{(i)}$的形式跟高斯函数很像,但是它和高斯函数一点关系都没有,参数也不一样。k 是带宽参数,k 越小,表示控制的样本窗口范围越小(近);k 越大,表示控制的样本窗口范围越大(远)。
- 局部加权回归在每一次预测新样本时都会重新的确定参数,从而达到更好的预测效果当数据规模比较大的时候计算量很大,学习效率很低。并且局部加权回归也不是一定就是避免欠拟合(underfitting)。
- 对于线性回归算法,一旦拟合出适合训练数据的参数θ,保存这些参数θ,对于之后的预测,不需要再使用原始训练数据集,所以是参数学习算法。
- 对于局部加权线性回归算法,每次进行预测都需要全部的训练数据(每次进行的预测得到不同的参数θ),没有固定的参数θ,所以是非参数算法。
一个简单的代码实现局部加权线性回归:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def lwlr(testPoint,xArr,yArr,k=1.0): xMat = mat(xArr); yMat = mat(yArr).T m = shape(xMat)[0] weights = mat(eye((m))) for j in range(m): #next 2 lines create weights matrix diffMat = testPoint - xMat[j,:] # weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) xTx = xMat.T * (weights * xMat) if linalg.det(xTx) == 0.0: print "This matrix is singular, cannot do inverse" return ws = xTx.I * (xMat.T * (weights * yMat)) return testPoint * ws def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one m = shape(testArr)[0] yHat = zeros(m) for i in range(m): yHat[i] = lwlr(testArr[i],xArr,yArr,k) return yHat |
使用局部加权线性回归的效果对比:
- 上图(标准线性回归):当 k = 1.0,权重很大,如同将所有的数据视为等权重,得出的最佳拟合直线与标准的回归一致,模型欠拟合。
- 中图:使用 k = 0.01,得到了非常好的效果,抓住了数据的潜在模式。
- 下图:使用 k = 0.003,纳入了太多的噪声点,拟合的直线与数据点过于贴近,模型过拟合。
4.3.广义线性模型
广义线性模型(Generalize Llinear Model,GLM)是线性模型的扩展,通过连接函数(Link Function)建立响应变量的数学期望值与线性组合的预测变量之间的关系。上面讲过的标准线性回归假设误差和因变量 y 服从正态分布的,而广义线性模型实质上是将正态分布拓展到了指数族分布中,可以根据实际问题选择适合的分布然后选择相应的连接函数以建立相应的广义线性模型。
广义线性模型的其他分布和相应的连接函数(来自 Wiki):
广义线性模型将以非常重要的 Logistic 回归模型为重点展开介绍,具体请参看 《Logistic 回归》一文。
5.算法优缺点
5.1.线性回归(OLS)
优点:
- 模型简单,建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。
- 根据系数可知道各个属性在预测中的重要程度,具备很好的可解释性,一定程度可用来辅助做特征选择
缺点:
- 对异常值很敏感
- 对非线性关系的数据性能稍差,容易欠拟合
5.2.岭回归
优点:
- 性能比 LASSO 回归稍好,也方便求导计算得到解析解
- 岭回归的平方偏差因子向模型中引入了少量偏差,但大大减少了方差,使得模型更稳定
- 领回归的假设和最小平方回归相同,但是在最小平方回归的时候我们假设数据服从高斯分布使用的是极大似然估计 (MLE),在领回归的时候由于添加了偏差因子,即θ的先验信息,使用的是极大后验估计 (MAP) 来得到最终的参数
缺点:
- 岭回归没有特征选择功能
5.3.LASSO 回归
优点:
- 具有特征选择能力,这是 L2 范数没有的特点,L1 范数的解具有稀疏性,可产生稀疏稀疏,达到特征选择的结果。
缺点:
- L1 范数没有解析解,因此计算效率上比 L2 差。
5.4.弹性网络回归
优点:
- 弹性网络回归是 Lesso 回归和岭回归技术的混合体,它使用了 L1 和 L2 正则化,也具备了两种技术各自的优点。
- 在进行特征选择过程中出现一些高度相关的变量时,弹性网络更容易考虑到特征的群体效应,而不像 Lasso 那样将其中一些置为 0。所以当某个特征和另一个特征高度相关的时候弹性网络非常有用。Lasso 倾向于随机选择其中一个,而弹性网络倾向于选择两个。 所以弹性网络对所选变量的数量没有限制(多重共线性变量可以是多个)。
4.1.多项式回归
优点:
- 能够拟合非线性可分的数据,更加灵活的处理复杂的关系
- 因为需要设置变量的指数,所以它是完全控制变量的建模
缺点:
- 需要一些数据的先验知识才能选择最佳指数
- 如果指数选择不当容易出现过拟合
5.6.局部加权回归
优点:
- 可以拟合非线性关系的数据
缺点:
- 局部加权回归在每一次预测新样本时都会重新的确定参数,从而达到更好的预测效果。当数据规模比较大的时候计算量很大,学习效率很低。
- 如果带宽参数选择不当容易出现欠拟合或者过拟合
4.3.广义线性模型
优点:
- 广义线性的响应变量 Y 可以是不服从正态分布的
- 广义线性模型是线性模型的拓展,可以做很多线性回归不太好实现的东西,比如可以利用广义线性模型更好的实现分类
- 拥有众多可选择的连接函数,根据具体的问题选择合适的连接函数,能够灵活构造各种各样的模型
- 通过极大似然估计计算最优解
缺点:
- 要求响应变量 Y 必须是相互独立的
- 系统组件中仅能存在一个线性预测器
6.应用场景
线性回归算法虽然简单,但灵活多变,能够衍生出一些算法来解决一些复杂问题,所以应用场景广泛,无论是回归问题还是分类问题,都可以找到对应的算法。线性回归几乎是业界使用最多的模型,因为简单容易实现,也因为它的可解释性。在模型开发的早起阶段,如特征工程阶段,很多时候会用线性模型进行训练。这给数据科学家提供一个基本的判断:哪些变量(特征)是有用的、重要的,同时提供了一个后续与其他算法性能比较上的基线。
写的非常棒,学习了,受益匪浅~ 谢谢~