机器学习-线性回归算法

1. 分类与回归

​ 回归问题和分类问题同属于有监督学习范畴,但实际上,回归问题要远比分类问题更加复杂。

  • 输出结果。
    • 分类模型最终输出结果为离散变量,而离散变量本身包含信息量较少,其本身并不具备代数运算性质,因此其评价指标体系也较为简单,最常用的就是混淆矩阵以及ROC曲线。
    • 回归问题最终输出的是连续变量,其本身不仅能够代数运算,且还具有更"精致"的方法,希望对事物运行的更底层原理进行挖掘。即回归问题的模型更加全面、完善的描绘了事物客观规律,从而能够得到更加细粒度的结论。 因此,回归问题的模型往往更加复杂,建模所需要数据所提供的信息量也越多,进
      而在建模过程中可能遇到的问题也越多。

2. 线性回归与机器学习

  • 一方面,线性回归蕴藏的机器学习思想非常值得借鉴和学习,并且随着时间发展,在线性回归的基础上还诞生了许多功能强大的非线性模型。
  • 因此,我们在进行机器学习算法学习过程中,仍然需要对线性回归这个统计分析算法进行系统深入的学习。
  • 但这里需要说明的是,线性回归的建模思想有很多理解的角度,此处我们并不需要从统计学的角度来理解、掌握和应用线性回归算法,很多时候,利用机器学习的思维来理解线性回归,会是一种更好的理解方法,这也是接下来一部分内容讲解线性回归的切入角度。

3. 线性回归的机器学习表示方法

1)核心逻辑
  • 在给定n个属性描绘的客观事物 x = ( x1, x2, x3,..., xn ) 中,每个都用于描绘某一次观测时事物在某个维度表现出来的数值属性值。

  • 当我们在建立机器学习模型捕捉事物运行的客观规律时,本质上是希望能够综合这些维度的属性值来描绘事物最终运行结果,而最简单的综合这些属性的方法就是对其进行加权求和汇总,这即是线性回归的方程式表达形式:

    \[\hat{y} =w_0 + w_1x_{i1} + w_2x_{i2} + ...+w_nx_{in} \]

    • w 被统称为模型的参数,其中 w0被称为截距(intercept), w1 ~ wn被称为回归系数(regression coeffiffifficient ),有时也是使用 β 或者 θ 来表示。
    • y 是我们的目标变量,也就是标签
    • xi1 是样本 i 上的特征不同特征
  • 线性回归的任务:就是构造⼀个预测函数来映射输入的特征矩阵 X 和标签值 y 的线性关系,这个预测函数在不同的教材上写法不同,可能写作 f(x),yw(x) ,或者 h(x) 等等形式,但无论如何,这个预测函数的本质就是我们需要构建的模型

2)优化目标
  • 模型/决策函数,只有 w 未知

    \[\hat{y}= Xw \]

  • 评估指标:损失函数

    • 衡量系数为 w 的模型拟合训练集时产生的信息损失的大小,并以此衡量参数的优劣
    • 如果用一组参数建模后,模型在训练集上表现良好,那我们就说模型拟合过程中的损失很小损失函数的值很小,这一组参数就优秀,反之亦然
    • 注意:对于非参数模型没有损失函数,比如KNN、决策树
  • SSE,残差/误差/离差平方和

    \[\underset{w}{min} =\sum_{i=1}^{m}(y_i-\hat{y} )^2=\underset{w}{min}\sum_{i=1}^{m}(y_i-X_iw )^2 \]

    • yi ,第 i 行数据的标签
    • xi ,第 i 行特征值组成的向量
  • 例子

    样本 特征1 特征2 真实标签
    0 1 0.5 3
    1 -1 0.5 2

    损失函数的值:

    \[(y_1-\hat{y_1})^2 + (y_2-\hat{y_2})^2 = (3-(1*1+2*0.5))^2+(2-(1*-1+2*0.5))^2 \]

3)最小二乘法

​ 通过最小化真实值和预测值之间的 SSE 来求解参数的方法叫做最小二乘法

  • 一元线性回归求解参数

    • 拟合直线

    \[\hat{y} = w_0+w_1x \]

    • 以均值为核心的「均值回归」,即散点的\(\overline{x}\)是和 \(\overline{y}\) 必经过这条直线

      \[\bar{y} = w_0+w_1\bar{x} \]

    • 残差平方和 SSE 为 ( ε 为残差)

      \[\sum_{}\varepsilon ^2=\sum_{}(y-w_0-w_1x)^2 \]

      • 微积分求偏导算其极值

        \[令 \frac{\mathrm{\varphi }}{\mathrm{\varphi }w_1}=2\sum (y-w_0-w_1x)(-x)=0 \]

        结合 \(\overline{y}​\) = w0+w1\(\overline{x}​\) ,替换 w0

        \[\sum (y-\bar{y}+w_1x-w_1x)(x)=0 \]

        解得

        \[{w_1 = \frac{\sum (xy-x\bar{y})}{\sum (x^2-\bar{x}x)}} \]

        \[\sum x\bar{y} = m \bar{x}\bar{y}=\sum \bar{x}y=\sum \bar{x}\bar{y} \\ \sum x\bar{x} = m\bar{x}\bar{x}=\sum \bar{x}^2 \]

        \[{w_1 = \frac{\sum (xy-x\bar{y}-\bar{x}y+\bar{x}\bar{y})}{\sum (x^2-\bar{x}x-\bar{x}x+\bar{x}^2)}} \]

        化简得:

        \[\boldsymbol{\hat{w_1} = \frac{\sum (y-\bar{y})(x-\bar{x})}{\sum (x-\bar{x})^2}} \]

        同理,可知

        \[\boldsymbol{\hat{w_0} =\bar{y}-\hat{w_1}\bar{x}} \]

        此时,使得 SSE 最小的量 \(\hat{w_0}\)\(\hat{w_1}\) 称为总体参数 \(w_0\)\(w_1\)最小⼆乘估计值,预测方程 \(\hat{y}\) =\(\hat{w_0}\) + \(\hat{w_1}x\) 称为最小⼆乘直线
  • 多元线性回归求解参数

    • 两列特征属性,损失函数为

    \[SSE = (y_1-\hat{y_1})^2 + (y_2-\hat{y_2})^2 \]

    • 矩阵表达

    \[(y_1-\hat{y_1}) (y_2-\hat{y_2})*\begin{bmatrix} (y_1-\hat{y_1}) \\ (y_2-\hat{y_2}) \end{bmatrix} =(y-Xw)^T(y-Xw) \]

    • \(w\) 求偏导

      \[\frac{\partial SSE}{\partial w} =\frac{\partial (y-Xw)^T(y-Xw)}{\partial w} \]

    • 又 $$( A - B)^T = A^T - B ^T 并且 (AB)T=BT * A^T$$ 原始化简为

      \[\frac{\partial (y-Xw)^T(y-Xw)}{\partial w}=\frac{\partial (y^Ty-w^TX^Ty-y^TXW+w^TXTXw)}{\partial w} \]

    • 又因为矩阵求导有如下规则(a为常数)

      \[\frac{\partial a}{\partial A}=0,\frac{\partial A^TB^TC}{\partial A}=B^TC,\frac{\partial C^TBA}{\partial A}=B^TC,\frac{\partial A^TBA}{\partial A}=(B+B^T)A \]

    • 则原始化简为

      \[=0 - X^Ty-X^Ty+2X^TXw=X^TXW-X^Ty \]

    • 令求导的一阶导数为0,可得

      \[X^TXw-X^Ty=0 \\=> \\ w = (X^TX)^{-1}X^Ty \]

4. 多元线性回归python实现

1)利用矩阵乘法编写回归算法
def standRegres(dataSet):
    xMat = np.mat(dataSet.iloc[:,:-1].values) # 提取特征
    yMat = np.mat(dataSet.iloc[:,-1].values).T # 提取标签
    xTx = xMat.T*xMat
    if np.linalg.det(xTx) == 0:
        print('This matrix is singular,cannot do inverse') #行列式为0,则该矩阵为奇异矩阵,无法求解逆矩阵
        return
    ws = xTx.I * (xMat.T * yMat)
    return ws # 求得 w
2)算法评估指标
  • SSE:残差平方和 ,是预测值和实际值之间的差值的平方和 $$ SSE = \sum_{i=1}^{m}(y_i-\hat{y} )^2$$

      def sseCal(dataSet,regres):
          n = dataSet.shape[0]
          y = dataSet.iloc[:,-1].values
          ws = regres(dataSet)
          yhat = dataSet.iloc[:,:-1].values*ws
          yhat = yhat.flatten()
          SSE = np.power(yhat-y,2).sum()
          return SSE
    
  • MSE:平均残差 $$MSE = \frac{1}{m} SSE ​$$

  • SSR:(Sum of squares of the regression) 是预测值和均值之间的差值的平方和

    \[SSR = \sum_{i=1}^{m}(\bar{y_i}-\hat{y_i})^2 \]

  • SST:(Total sum of squares)则是实际值和均值之间的差值的平方和

    \[SST =SSR = \sum_{i=1}^{m}(\bar{y_i}-y_i)^2 \]

  • R2:测度了回归直线对观测数据的拟合程度

    \[R^2 = \frac{SSR}{SST} = \frac{SST-SSE}{SST} =1-\frac{SSE}{SST} \]

    • 若所有观测点都落在直线上,残差平方和为 SSE=0 ,则 \(R^2=1\),拟合是完全的
    • 如果 y 的变化与 x 无关, 完全无助于解释 y 的变差,\(\hat{y}=\bar{y}\) ,则 \(R^2=0\)

    结论:

    • \(R^2\) 越接近1,表明回归平方和占总平方和的比例越大,回归直线与各观测点越接近,用 x 的变化来解释 y 值变差( 取值的波动称为变差)的部分就越多,回归直线的拟合程度就越好
    • 反之,\(R^2​\) 越接近0,回归直线的拟合程度就越
    def rSquare(dataSet,regres):
    	sse = sseCal(dataSet,regres)
    	y = dataSet.iloc[:,-1].values
    	sst = np.power(y-y.mean(),2).sum()
    	return 1-sse/sst
    

5. 线性回归的sklearn实现

  • 线性回归算法及其评价指标

    from sklearn.linear_model import LinearRegression
    
    reg = LinearRegression()
    reg.fit(data.iloc[:,:-1].values,data.iloc[:,-1].values)
    
    reg.coef_ # 查看方程系数 w
    
    reg.intercept_ # 查看截距,回归方程中的常数项
    
  • 模型MSE和判别系数 \(R^2\)

    from sklearn.metrics import mean_squared_error,r2_score
    
    yhat = reg.predict(data.iloc[:,:-1])
    mean_squared_error(y,yhat) #MSE
    r2_score(y,yhat)# R^2
    

6. 多重共线性

1)最小二乘法局限
  • XTX 为满矩阵才可以进行逆矩阵或者广义逆矩阵的求解
  • 在实际应用中经常会遇见矩阵不存在逆矩阵或广义逆矩阵的情况,
  • 当 X 的各列存在线性相关关系(即多重共线性)的时候,最小二乘法的求解结果不唯一
2)多重共线性
  • 逆矩阵存在的充分必要条件是:矩阵的行列式不能为0

  • 行列式不为0的充分必要条件:满秩矩阵

  • 精确相关关系,即完全相关:一行可使另一行为0

    • A中第一行和第三行

    \[A = \begin{bmatrix} 1 & 1 & 2\\ 0 & -2 & 1\\ 0 & 0 &0 \end{bmatrix},B= \begin{bmatrix} 1 & 1 & 2\\ 0 & -2 & 1\\ 0 & 0 &0.002 \end{bmatrix} \]

  • 高度相关关系:一行不能使另一行为0,但是⼀个非常接近0数

    • 矩阵B 的第一行和第三行
  • 精确相关关系和高度相关关系并称为"多重共线性"

3)解决共线性三种方法
  • 其⼀是在建模之前对各特征进行相关性检验,若存在多重共线性,则可考虑进⼀步对数据集进行SVD分解或PCA主成分分析,在SVD或PCA执行的过程中会对数据集进行正交变换,最终所得数据集各列将不存在任何相关性。当然此举会对数据集的结构进行改变,且各列特征变得不可解释
  • 其⼆则是采用逐步回归的方法,以此选取对因变量解释力度最强的自变量,同时对于存在相关性的自变量加上⼀个惩罚因子,削弱其对因变量的解释力度,当然该方法不能完全避免多重共线性的存在,但能够绕过最小二乘法对共线性较为敏感的缺陷,构建线性回归模型。
  • 其三则是在原有的算法基础上进行修改,放弃对线性方程参数无偏估计的苛刻条件,使其能够容忍特征列存在多重共线性的情况,并且能够顺利建模,且尽可能的保证取得最小值。(岭回归和Lasso算法)

7. 岭回归和Lasso

1)岭回归
  • 目的:对线性回归算法的改进,主要解决系数矩阵 XTX 不可逆的问题

  • 基本原理:在原方程系数计算公式中添加了⼀个扰动项 \(\lambda I\),原先无法求广义逆的情况变成可以求出其广义逆,使得问题稳定并得以求解,其中 \(\lambda\) 是自定义参数, \(I\) 则是单位矩阵

  • 损失函数

    \[\underset{w}{min} \left \| Xw-y \right \|_2^2 + \lambda\left \| w \right \|_2^2 \]

    最小二乘法求解可得:

    \[\hat{w}^*=(X^TX+\lambda I)^{-1}X^Ty \]

    作用

    • 其一是使得最终运算结果 $$(X^TX+\lambda I)​$$ 满秩,即降低了原数据集特征列的共线性影响
      • 除非 \(\lambda = 0\) ,或者原本的矩阵 \((X^TX)\) 中存在对角线上元素为 $-\lambda $ ,其他元素都为0的行或者列
    • 其二也相当于对所有的特征列的因变量解释程度进行了惩罚,且 \(\lambda​\) 越大惩罚作用越强。
  • 影响

    • \(\lambda​\) 挤占了 w 中由原始的特征矩阵贡献的空间,因此 如果太大,也会导致 的 w 估计出现较大的偏移,无法正确拟合数据的真实面貌。我们在使用中,需要找出 \(\lambda​\) 让模型效果变好的最佳取值。
2)Lasso

​ The Least Absolute Shrinkage and Selectionatoroperator

  • 目的

    • 岭回归中,对自变量系数进行平方和处理也被称作L2正则化,由于此原因,岭回归中自变量系数虽然会很快衰减,但很难归为零
    • 将岭回归的损失函数中的自变量系数L2正则化修改为L1正则化
  • 损失函数

    \[\underset{w}{min} \left \| Xw-y \right \|_2^2 + \lambda\left \| w \right \|_1 \]

    最小二乘法来求解

    \[w=(X^TX)^{-1}(X^Ty-\frac{\lambda I}{2}) \]

    作用

    • 通过增大 \(\lambda\) ,我们可以为 w 的计算增加⼀个负项,从而限制参数估计中 w 的大小,而防止多重共线性引起的参数 w 被估计过大导致模型失准的问题
    • Lasso不是从根本上解决多重共线性问题,是限制多重共线性带来的影响

8. 总结

  • 多元线性回归,岭回归,Lasso三个算法,它们都是围绕着原始的线性回归进行的拓展和改进
  • 其中岭回归和Lasso是为了解决多元线性回归中使用最小二乘法的各种限制,主要用途是消除多重共线性带来的影响并且做特征选择
posted @ 2023-06-03 22:21  爻一  阅读(26)  评论(0编辑  收藏  举报