线性回归算法梳理

 学习内容 :

1. 机器学习的一些概念 有监督、无监督、泛化能力、过拟合欠拟合(方差和偏差以及各自解决办法)、交叉验证

2. 线性回归的原理

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

4. 优化方法(梯度下降法、牛顿法、拟牛顿法等)

5、线性回归的评估指标

6、sklearn参数详解


转自:https://github.com/trembous/homework_summary/blob/master/29-%E9%87%8E%E6%AF%94%E5%A4%A7%E9%9B%84-20190227-20190301_01.ipynb

 

机器学习的概念

有监督和无监督

有监督:数据有标签,过程通常是:在已知的训练数据(输入和对应的输出下),训练得到模型;核心是分类,选择不同的分类器,分类后会被直接打上标签,适合独立同分布数据。

无监督:不存在老师即数据没有标签,直接拿数据进行建模;存在一个度量描述,学习结果的质量,基于这个度量优化模型参数。核心是聚类,计算密度相似度,先聚类后定性,对训练样本偏移的鲁棒性强,适合非独立同分布数据,可解释性优于有监督模型,扩展性更好。

泛化能力

泛化能力:机器学习算法对未知数据的识别能力,举一反三的能力。 在训练开始时,训练集误差和验证集误差都很大,处于欠拟合状态,高偏差低方差。训练不断进行,训练集误差不断减小,验证集先减小后增大。验证集误差变大即进入过拟合状态,此时低偏差高方差。

过拟合和欠拟合及解决

过拟合:模型的复杂度要高于实际的问题,训练过头。机器只是记住了训练数据:在训练数据上表现好,在未知数据上表现差。

解决方法:

  1. 重新清洗数据,过拟合可能是数据不纯导致的。
  2. 增加训练数据量,两者是相对的。
  3. 减少参数 。

$\triangleright$损失函数引入正则项。参数过多,惩罚越重,对应损失函数就会变大,而我们的目标是最小化loss 。

$\triangleright$对于一些特定的模型采取剪枝或dropout,BN。

  1. 重采样方法和验证集方法 常用K折交叉检验:在训练数据的子集上训练和测试模型k次,基于指标优化。
  2. 换个模型,模型不适合这个任务。

欠拟合:模型的复杂度较低,训练不够。没有学习到数据背后的规律。在训练数据和未知数据上表现都很差。 解决方法:不断训练至过拟合,增加模型复杂度(增加特征,减少正则项)。

交叉验证

交叉验证: 对样本数据进行切分为k个大小相似的互斥子集,每个子集尽可能保持数据分布的一致性,然后每次用k-1个子集的并集做为训练集,余下的子集做为测试集样本.打乱可以得到多组不同的训练集和测试集;某次训练集中的样本在下次可能成为测试集中的样本,即所谓“交叉”。常用方法:留出法,k折交叉检验,bootstrapping 。对应的python库有sklearn。

线性回归的原理

 

定义

定义线性方程组 $y=\sum_{i=1}^{m} x_i  w_i$,写成向量的形式 $Y=XW$;

其中X为样本数据,W为线性回归模型参数,Y是期望数据,m表示样本数量,其中X,Y已知;

问题:寻找合适的W,合适的尺度。

尺度即损失函数,用于衡量训练过程中模型产生和期望产出的差距,并根据该目标找到合适的优化方法接近该目标。

损失函数

损失函数的别称,代价函数,目标函数

 

$y=xw+ \varepsilon $,即$y=\widehat{y}+ \varepsilon $

y是期望输出,$\widehat{y}$是模型输出,$\varepsilon $是误差;在数据量足够大的情况下,误差$\varepsilon $满足$(\mu,\sigma)$的高斯分布。方程有截距,此时$\mu=0$

单个样本的误差即 $P(\varepsilon^i)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(\varepsilon^i)^2}{2\sigma^2})$ ,$\varepsilon$$y-\widehat{y}$代换,得到对应条件概率:$P(y^i\mid x^i,w^i)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(y^i-\widehat{y})^2}{2\sigma^2})$

由于样本是独立同分布,此时计算对数似然估计$L(W)=log \prod^m_{i=1}P(y^i\mid x^i,w^i)$

$L=\sum^m_{i=1}log \frac{1}{\sqrt{2\pi}\sigma}exp({-\frac{(y^i-\widehat{y})^2}{2\sigma^2}})$引入log累乘成累加

$L=log \frac{m}{\sqrt{2\pi}+\sigma}+\sum^m_{i=1}log[exp({-\frac{(y^i-\widehat{y})^2}{2\sigma^2}})]$进一步化简

$L=log \frac{m}{\sqrt{2\pi}+\sigma}-\frac{1}{2\sigma^2}\sum^m_{i=1}log[exp((y^i-\widehat{y})^2)]$

$L=log \frac{m}{\sqrt{2\pi}+\sigma}-\frac{1}{2\sigma^2}\sum^m_{i=1}(y^i-\widehat{y})^2$

$k_1=log \frac{m}{\sqrt{2\pi}+\sigma}$,$k_2=\frac{1}{\sigma^2}$,得到$L=k_1-k_2\frac{1}{2}\sum^m_{i=1}(y^i-\widehat{y})^2$

可以得出以下结论:$k_1$,$k_2$是正常数,训练目标是最大化对数似然估计,即$\max L$,换句话说就是最小化$\frac{1}{2}\sum^m_{i=1}(y^i-\widehat{y})^2$,

得到损失函数$L=\frac{1}{2}\sum^m_{i=1}(y^i-\widehat{y})^2$=$\frac{1}{2}\sum^m_{i=1}(y^i- x_i  w_i)^2$

小节:根据中心极限定理估计误差分布,$\varepsilon$$y-\widehat{y}$代换,计算对数似然估计

 

优化方法

两类:最小二乘法和梯度下降法

 

最小二乘法

 

损失函数写成向量形式$L=\frac{1}{2}(Y-XW)^T(Y-XW)$

$L=\frac{1}{2}(Y^T-W^TX^T)(Y-XW)$,

$L=\frac{1}{2}(Y^TY-Y^TXW-W^TX^TY+W^TX^TXW)$

$L=\frac{1}{2}[Y^TY-Y^TXW-(Y^TXW)^T+(XW)^TXW]$

$L$最小值,$L'(w)=0$即可,此时$L'=-Y^TX-(Y^TX)^T+X^T(XW)+(XW)^TX=0$

$Y^TX=X^T(XW)$,$W=(X^TX)^{-1}YTX$ 右边$X,Y$是已知的,可以直接计算的前提是$X^TX$可逆,引入参数$\lambda$,可以保证$(X^TX+\lambda I)^{-1}$一直存在,这种方法叫岭回归

 

梯度下降法

 

梯度方向是函数增长最快的方向,可知梯度反方向下降最快

$L(W)$,通过更新$W$值,损失函数沿梯度反向降低。$W^{i}=W^{i}-\alpha\frac{\partial L}{\partial W}$,$\alpha$是学习率,控制步长。

怎么求梯度?求导 这里损失函数记为L,回归方程记为f,样本数量为m,参数数量为n

 
随机梯度下降法

一个样本更新一次参数,$L=\frac{1}{2}[f(W)-y]^2$,由于W是向量,计算偏导,即

$\frac{\partial f(W)}{\partial W_i}=[f(W)-y]\frac{\partial f(W)}{\partial W_i}=[f(W)-y]\frac{\partial (W_0X_0+...+W_nX_n)}{\partial W_i}=[f(W)-y]X_i$

$W^{i}=W^{i}-\alpha[f(W)-y]X_i$

同样为了减少过拟合,引入不同的正则项

L1正则(Lasso回归):$\lambda\sum^n_{j=1}\mid W_j\mid$

L2正则(Ridge回归):$\lambda\sum^n_{i=j}W_j^2$

结合以上(Elastic Net 回归):$\rho\sum^n_{j=1}\mid W_j\mid+(1-\rho)\sum^n_{i=j}W_j^2$

 
批量梯度下降

遍历所有样本后再更新参数$L=\frac{1}{2}\sum^m_{i=1}[f(W)-y]^2$

$W^{i}=W^{i}-\alpha\sum^m_{i=1}[f(W)-y]X_i$

 

损失函数(见2)

 

梯度下降法,牛顿法和拟牛顿法

梯度下降法

问题:求解最优化问题$min_xf(x)$,其中x是优化变量,f是目标函数

梯度下降法原理:从初始点$x_0$开始,利用规则移动点,最终梯度值为0。

根据泰勒展开公式,忽略二次项$f(x)=f(x^{(k)})+g^T_k(x-x^{(k)})$,

移项$f(x)-f(x^{(k)})=g^T_k(x-x^{(k)})<0$,保证每次迭代$f(x)$值都在减小,保证右边项小于0,即$\mid\mid g^T_k\mid\mid \mid\mid(x-x^{(k)})\mid\mid cos(\theta)<0$,

$cos(\theta)<0$,又有$cos(\theta)\ge-1$,当$\theta=180$度时,变化最大,$x^{(k+1)}-x^{(k)}=-\lambda_k g^T_k$,

训练过程:

目标函数$f(x)$,梯度函数$g(x)$,计算精度$\epsilon$,极小点$x^*$

1.初始化$x^{(0)}$,k=0

2.计算$f(x^{(0)})$

3.计算梯度$g_k=g(x^{(k)})$,判断当$g_k<\epsilon$时停止迭代,令$x^*=x^{(k)}$;否则令$p_k=-g(x^{(k)})$,求$\lambda_k$

$f(x^{(k)}+\lambda_k p_k)=min_{\lambda\ge0}f(x^{(k)}+\lambda p_k)$,

4.$x^{(k+1)}=x^{(k)}+\lambda_k p_k$,计算$f(x^{(k+1)})$

$\mid\mid f(x^{(k+1)})-f(x^{(k)})\mid\mid<\epsilon$$\mid\mid x^{(k+1)}-x^{(k)}\mid\mid<\epsilon$,停止迭代,令$x^*=x^{(k)}$

5.否则,令$k=k+1$,跳回3

牛顿法

梯度下降法:$x^{(k+1)}=x^{(k)}-\lambda_k g^T_k$,$\lambda_k$要经过一维搜索

牛顿法:$x^{(k+1)}=x^{(k)}-H^{-1}_{k} g^T_k$,这里直接用Hessian矩阵的逆替代$\lambda_k$

梯度下降法原理:根据泰勒展开公式,忽略三次项$f(x)=f(x^{(k)})+g^T_k(x-x^{(k)})+\frac{1}{2!}(x-x^{(k)})^TH(x^{(k)})(x-x^{(k)})$,,其中

$H(x^{(k)})=[\frac{\partial^2 f}{\partial_{x_i}\partial_{y_j}}]_{nxn}$

$ g^T_{k+1}=0$$g^T_k+H(x^{(k)})(x-x^{(k)})=0$,++++++++++++++++++++++++(0)

$x^{(k+1)}=x^{(k)}-H^{-1}_{k} g^T_k$

训练过程: 目标函数$f(x)$,梯度函数$g(x)$,Hessian矩阵$H(x)$,计算精度$\epsilon$,极小点$x^*$

1.初始化$x^{(0)}$,k=0

2.计算梯度$g_k=g(x^{(k)})$,判断当$g_k<\epsilon$时停止迭代,令$x^*=x^{(k)}$;

3.计算$H_k=H(x^{(k)})$,计算$p_k$

$p_k=-H^{-1}_kg_k$+++++++++++++++++++++++++++(1)

4.$x^{(k+1)}=x^{(k)}+ p_k$

$\mid\mid f(x^{(k+1)})-f(x^{(k)})\mid\mid<\epsilon$$\mid\mid x^{(k+1)}-x^{(k)}\mid\mid<\epsilon$,停止迭代,令$x^*=x^{(k)}$

5.否则,令$k=k+1$,跳回3

拟牛顿法

 

核心:$H^{-1}$不好求,用新的n阶矩阵$G_k=G(x^{(k)})$去近似

 

牛顿法中H矩阵的限制条件,用于近似的G矩阵也应满足。

4.2节+++++(0)区域变换得到$ g_{k+1}-g_k=H(x^{(k)})(x-x^{(k)})=0$,方便表示令$y_k=g_{k+1}-g_k$,$\delta_k=x^{(k+1)}-x^{(k)}$

$y_k=H_k\delta_k$,如果$H_k$是正定,随迭代进行值总在下降,此时$x^{(k+1)}-x^{(k)}= \lambda p_k$

带入泰勒公式$f(x)=f(x^k)+g^{T}_k(\lambda p_k)=f(x^k)-\lambda g^{T}_kH^{-1}_kg_k$

 

H矩阵的限制条件:

1.正定

2.$y_k=H_k\delta_k$$H^{-1}y_k=\delta_k$

复习下牛顿法:计算梯度$g_k=g(x^{(k)})$$H_k=H(x^{(k)})$,计算$p_k$$p_k=-H^{-1}_kg_k$$x^{(k+1)}=x^{(k)}+ p_k$

$G_k$近似$H^{-1}$,满足以上条件;当然也可以用$B_k$拟合$H_k$

 

DFP算法

$G_k$近似$H^{-1}$,

假设$G_{k+1}=G_{k}+\Delta G$,

构造$\Delta G=\alpha uu^T+\beta vv^t$,

$\delta_k=G_{k+1}y_k=G_{k}y_k+\Delta Gy_k=G_{k}y_k+\alpha uu^Ty_k+\beta vv^ty_k=G_{k}y_k+u(\alpha u^Ty_k)+v(\beta v^ty_k)$

$\alpha u^Ty_k=1,\beta v^ty_k=-1$,

$\alpha=\frac{1}{u^Ty_k},\beta=-\frac{1}{v^Ty_k} $,

此时$\delta_k-G_{k}y_k=u-v$,令$u=\delta_k,v=G_{k}y_k$,

$\alpha=\frac{1}{\delta^T_ky_k},\beta=-\frac{1}{y^T_kG^T_{k}y_k}=-\frac{1}{y^T_kG_{k}y_k}$

 

$\Delta G=\frac{\delta_k\delta^{T}_k}{\delta^T_ky_k}-\frac{G_{k}y_ky^T_kG^T_{k}}{y^T_kG_{k}y_k}$

$G_{k+1}=G_{k}+\frac{\delta_k\delta^{T}_k}{\delta^T_ky_k}-\frac{G_{k}y_ky^T_kG^T_{k}}{y^T_kG_{k}y_k}$,

$y_k=g_{k+1}-g_k$,$\delta_k=x^{(k+1)}-x^{(k)}$

训练过程:

目标函数$f(x)$,梯度函数$g(x)$,Hessian矩阵$H(x)$,计算精度$\epsilon$,极小点$x^*$

1.初始化$x^{(0)}$,k=0,取$G_0$为正定对称矩阵

2.计算梯度$g_k=g(x^{(k)})$,判断当$g_k<\epsilon$时停止迭代,令$x^*=x^{(k)}$;否则3

3.计算$p_k$$p_k=-G_kg_k$,求$\lambda_k$

$f(x^{(k)}+\lambda_k p_k)=min_{\lambda\ge0}f(x^{(k)}+\lambda p_k)$,

4.$x^{(k+1)}=x^{(k)}+\lambda_k p_k$

5.计算梯度$g_{k+1}=g(x^{(k+1)})$,判断当$g_{k+1}<\epsilon$时停止迭代,令$x^*=x^{(k+1)}$;

否则,$G_{k+1}=G_{k}+\frac{\delta_k\delta^{T}_k}{\delta^T_ky_k}-\frac{G_{k}y_ky^T_kG^T_{k}}{y^T_kG_{k}y_k}$,

$y_k=g_{k+1}-g_k$,$\delta_k=x^{(k+1)}-x^{(k)}$

6.令$k=k+1$,跳回3

 

BFGS算法

$B_k$拟合$H_k$ 证明方法同上结果是$\delta_k$$y_k$互换位置,不证明直接给出解果 $B_{k+1}=B_{k}+\frac{y_ky^{T}_k}{y^T_k\delta_k}-\frac{B_{k}\delta_k\delta^T_kB^T_{k}}{\delta^T_kB_{k}\delta_k}$,

$y_k=g_{k+1}-g_k$,$\delta_k=x^{(k+1)}-x^{(k)}$

训练过程:

目标函数$f(x)$,梯度函数$g(x)$,Hessian矩阵$H(x)$,计算精度$\epsilon$,极小点$x^*$

1.初始化$x^{(0)}$,k=0,取$B_0$为正定对称矩阵

2.计算梯度$g_k=g(x^{(k)})$,判断当$g_k<\epsilon$时停止迭代,令$x^*=x^{(k)}$;否则3

3.计算$p_k$$B_kp_k=-g_k$,求$\lambda_k$

$f(x^{(k)}+\lambda_k p_k)=min_{\lambda\ge0}f(x^{(k)}+\lambda p_k)$,

4.$x^{(k+1)}=x^{(k)}+\lambda_k p_k$

5.计算梯度$g_{k+1}=g(x^{(k+1)})$,判断当$g_{k+1}<\epsilon$时停止迭代,令$x^*=x^{(k+1)}$;

否则,$B_{k+1}=B_{k}+\frac{y_ky^{T}_k}{y^T_k\delta_k}-\frac{B_{k}\delta_k\delta^T_kB^T_{k}}{\delta^T_kB_{k}\delta_k}$,

$y_k=g_{k+1}-g_k$,$\delta_k=x^{(k+1)}-x^{(k)}$

6.令$k=k+1$,跳回3

其他算法

Broyden算法:$G_k+1=\alpha G^{DFP}+(1-\alpha)G^{BFGS}$,各取上面算法一部分

B.31 不会推2333

L-BFGS 就是存储过程如果碰到内存不过根据小稚数据量,丢弃最早生成的$y_k,\delta_k$

 

线性回归的评估指标

统一使用预测值f,期望值y

MAE(平均绝对误差)

$MAE=\frac{1}{m}\sum^m_{i=1}\mid y-f\mid$ 误差越小,模型越好

MSE(均方误差)

$MSE=\frac{1}{m}\sum^m_{i=1}(y-f)^2$ 就是之前定义的损失函数

RMSE(均方根误差)

$RMSE=\sqrt{\frac{1}{m}\sum^m_{i=1}(y-f)^2}$均方误差加个根号

R平方

$R^2=1-\frac{(y-f)^2}{(y-\overline{y})^2}$

分子表示模型预测误差,分母表示原始数据的离散程度,相除是为了消除原始离散的影响

$R^2$越接近1,模型越好,当$y=f$时全部预测正确,$R^2=1$;当$f=\overline{y}$时模型胡乱预测,结果为0;当$R^2<0$时,表示x,y没有线性关系。但是随样本量增加,$R^2$也会增加

Adjusted R平方

$R_{adjusted}=1-\frac{(1-R^2)(n-1)}{n-p-1}$ n,p分别表示样本量,特征量;放在分母就是为了消除两者的影响

MAPE

$MAPE=\frac{100}{n}\sum^n_{i=1}\mid \frac{y_i-f_i}{y_i}\mid$ 考虑了误差与期望值的距离

RMSPE

$RMSPE=\sqrt{\frac{1}{n}\sum^n_{i=1}(\frac{y_i-f_i}{y_i})^2}$ kaggle使用的一套指标

 

SKLEARN参数详解

 

1.model = LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1) -----fit_intercept:是否计算截距。 -----normalize: 当fit_intercept=True时,回归前的回归系数X减去平均值并除以l2-范数进行归一化。 -----copy_X:是否对X数组进行复制,默认为True -----n_jobs:指定线程数

2.fit(X,y,sample_weight=None)#用于训练模型,返回值:实例 -----X:形如[样本数,特征数]的训练数据 -----y:形如[样本数,标签数]的训练标签 -----样本权重:每个样本有独立的权重形如[样本数]

3.get_param(deep=True):获取当前模型及子项目的参数 -----deep布尔值:True,返回参数 -----返回值:参数名到对应值的映射字符串

4.predict(X) -----X:形如[样本数,特征数]的数据 -----返回预测值

5.score(X, y, sample_weight=None) -----X:形如[样本数,特征数]的测试数据 -----y:形如[样本数,标签数]的数据的真实值 -----样本权重:每个样本有独立的权重形如[样本数] -----返回评价指标R^2

R^2=1-U/V,其中u=((y_true - y_pred) 2).sum(),v=((y_true - y_true.mean()) 2).sum()

R^2的最优值是1;如果模型表现力很差,R^2可以是负值。常量模型在预测过程中,忽视输入特征,此时R^2=0

6.set_params(** params) -----设置参数 -----返回实例

 

 

 

其他写的不错的博客

 

本次入选评优共五位人员,以下为其他四位的链接,可对照学习完善:1.https://github.com/JRXGUGI/PrimaryAlgorithm_DataWhale_201903/blob/master/day1%EF%BC%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E7%AE%97%E6%B3%95%E6%A2%B3%E7%90%86.md

2.https://blog.csdn.net/baidu_22225919/article/details/88019207

3.https://github.com/yaojunguo123/ml/blob/master/firstday/first.py

4.https://blog.csdn.net/Smile_Smilling/article/details/88044978

 

转载于:https://www.cnblogs.com/burton/p/10460963.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐