zoukankan      html  css  js  c++  java
  • 转载:线性回归梳理

    线性回归算法梳理

     学习内容 :

    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. 减少参数 。

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

    $	riangleright$对于一些特定的模型采取剪枝或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{2pi}sigma}exp(-frac{(varepsilon^i)^2}{2sigma^2})$ ,$varepsilon$$y-widehat{y}$代换,得到对应条件概率:$P(y^imid x^i,w^i)=frac{1}{sqrt{2pi}sigma}exp(-frac{(y^i-widehat{y})^2}{2sigma^2})$

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

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

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

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

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

    $k_1=log frac{m}{sqrt{2pi}+sigma}$,$k_2=frac{1}{sigma^2}$,得到$L=k_1-k_2frac{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}-alphafrac{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回归):$lambdasum^n_{j=1}mid W_jmid$

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

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

     

    批量梯度下降

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

    $W^{i}=W^{i}-alphasum^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,即$midmid g^T_kmidmid midmid(x-x^{(k)})midmid cos(	heta)<0$,

    $cos(	heta)<0$,又有$cos(	heta)ge-1$,当$	heta=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_{lambdage0}f(x^{(k)}+lambda p_k)$,

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

    $midmid f(x^{(k+1)})-f(x^{(k)})midmid<epsilon$$midmid x^{(k+1)}-x^{(k)}midmid<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$

    $midmid f(x^{(k+1)})-f(x^{(k)})midmid<epsilon$$midmid x^{(k+1)}-x^{(k)}midmid<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_kdelta_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_kdelta_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+eta vv^t$,

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

    $alpha u^Ty_k=1,eta v^ty_k=-1$,

    $alpha=frac{1}{u^Ty_k},eta=-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},eta=-frac{1}{y^T_kG^T_{k}y_k}=-frac{1}{y^T_kG_{k}y_k}$

     

    $Delta G=frac{delta_kdelta^{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_kdelta^{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_{lambdage0}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_kdelta^{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_kdelta_k}-frac{B_{k}delta_kdelta^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_{lambdage0}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_kdelta_k}-frac{B_{k}delta_kdelta^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-fmid$ 误差越小,模型越好

    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

  • 相关阅读:
    堆和栈的区别
    MyKTV点歌系统
    KTV音乐播放的实现
    继承与多态之汽车租赁系统
    使用集合组织相关数据
    用户登陆及异常的处理
    oracle函数详解
    Java中的多线程
    JAVA Map集合框架的使用
    Java中迭代器初深
  • 原文地址:https://www.cnblogs.com/burton/p/10460963.html
Copyright © 2011-2022 走看看