当前位置: 首页 > article >正文

【机器学习chp5】线性回归

推荐文章1,三种角度详细分析了L1,L2正则化的本质。

【王木头 · L1、L2正则化】三个角度理解L1、L2正则化的本质-CSDN博客

推荐文章2,其中有各种梯度下降的优化算法分析。

【王木头·梯度下降法优化】随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam-CSDN博客

前言

本文遗留问题:

        (1)第七部分案例分析未完成。

        (2)回归任务的性能指标评价还只是很简单的理解,自我还没能力高效地得到回归任务进行性能指标。

        (3)线性回归优化算法中的坐标轴下降理解不够深入

目录

前言

一、回归任务简介

二、线性回归模型

三、回归任务的损失函数

1、L2损失函数

(1)定义

(2)L2损失函数的概率解释

(3)残差分布

2、胡伯(Huber)损失函数

(1)Huber损失函数的定义

(2)Huber损失的优缺点

(3)与L1和L2损失的对比

(4)Huber损失的图示理解

(5)sklearn中Huber损失的实现与使用

四、线性回归模型的正则化

1、正则化的前提——数据标准化

2、三种角度分析L1、L2正则化本质

3、弹性网络——L1正则+L2正则

五、线性回归的优化算法

1、方程组直接求解

(1)直接求伪逆

(2)伪逆矩阵的SVD分解

(3)岭回归的直接求解并SVD分解

(4)岭回归的权重衰减(L2正则化使得权重衰减)

(5)Lasso的权重衰减(L1正则化使得大权重衰减小权重剔除)

2、梯度下降

3、坐标轴下降

(1)次梯度法

(2)坐标轴下降法

六、回归任务的模型性能评价

1、评价指标

2、sklearn中的评价方法

3、线性回归模型的超参数调优

4、Scikit-Learn实现的超参数调优工具

七、线性回归案例分析(还未整理)

1、广告费用与产品销量(还未整理)

2、共享单车骑行量预测(还未整理)

八、⭐⭐全文总结⭐⭐


一、回归任务简介

回归任务本质是通过学习数据的规律建立输入与输出的映射关系,其中线性回归是最经典的回归模型之一。要构建高质量的回归模型,需要:

  1. 数据分析:理解特征与目标变量的关系,选择重要特征。(例如通过散点图/相关系数热力图初步检查目标与特征之间的相关性,优先考虑与目标变量强相关的特征)
  2. 模型选择:根据问题复杂度选择合适的回归模型(如线性回归、非线性回归或其他算法)。
  3. 模型评估:通过指标(如MSE、R方值等)评估模型效果,避免过拟合和欠拟合。

二、线性回归模型

核心思想

  • 假设输入特征与输出目标之间的关系可以用一个线性方程表示:                                                      \hat{y} = f(x) = w_0 + \sum_{j=1}^D w_j x_j = w_0 + w_1 x_1 + w_2 x_2 + \dots + w_D x_D
    • w_0​:截距项。
    • w_j​:每个特征的权重或回归系数。
    • D:输入特征的维数。

矩阵形式

  • 通过引入常数项 1 ,公式可以简化为矩阵形式: \hat{y} = w^T x , 其中 w = [w_0, w_1, \dots, w_D]^Tx = [1, x_1, x_2, \dots, x_D]^T 。

优化目标

  • 目标函数:最小化预测值与真实值之间的误差(通常为均方误差,MSE):                                                                 J(w) = \frac{1}{N} \sum_{i=1}^N (\hat{y}_i - y_i)^2
  • 优化方法:通过梯度下降等算法找到使 J(w) 最小的参数 w

线性回归模型的优缺点:

优点

  • 简单易实现,计算效率高。
  • 可解释性强:可以清楚地解释每个特征对输出的贡献。
  • 对线性关系的数据表现优秀。

缺点

  • 只能捕捉线性关系,无法拟合非线性数据。
  • 对异常值敏感:极端值会显著影响模型效果。
  • 假设特征之间相互独立,但现实数据常常存在多重共线性。

三、回归任务的损失函数

1、L2损失函数

(1)定义

  • L2损失(也称为均方误差损失)是回归任务中最常用的损失函数。
  • 它衡量预测值 \hat{y} 和真实值 y之间的平方差:

                                                        L(\hat{y}, y) = (\hat{y} - y)^2

  • 预测残差 r 定义为:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        r = y - \hat{y}

  • 所以L2损失实际上是残差的平方:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        L(\hat{y}, y) = r^2

  • 将L2损失累加,可以得到残差平方和(RSS, Residual Sum of Squares) :

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        RSS(f) = \sum_{i=1}^N r_i^2 = \sum_{i=1}^N (\hat{y}_i - y_i)^2

性质:L2损失函数是平滑的、可微的,因此非常适合基于梯度优化的方法(如梯度下降)。

(2)L2损失函数的概率解释

        当我们假设数据中的误差项服从独立同分布的高斯(正态)分布时,极大似然估计就等价于最小化残差的平方和,也就是最小二乘法。

i、极大似然估计的基本定义

        极大似然估计的目标是最大化样本数据的联合概率(似然函数):

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        p(\mathcal{D}) = \prod_{i=1}^N p(y_i | x_i)

        其中:

  • y_i​ 是第 i 个样本的真实输出值;
  • x_i​ 是输入特征;
  • p(y_i | x_i) 是 y_i​ 的条件概率分布,通常由我们假设的噪声分布决定。

ii、噪声假设:误差服从高斯分布

        假设模型预测值和真实值之间的误差服从高斯分布 N(0, \sigma^2),即:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​           ​​​​​​​  y_i = f(x_i) + \epsilon_i, \quad \epsilon_i \sim N(0, \sigma^2)

  • 这里 f(x_i) 是模型的预测值,\epsilon_i​ 是误差。
  • 条件概率密度函数为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​              p(y_i | x_i) = \frac{1}{\sqrt{2\pi\sigma}} \exp\left(-\frac{(y_i - f(x_i))^2}{2\sigma^2}\right)

iii、构造似然函数

        假设每个样本的条件概率 p(y_i | x_i) 相互独立,则数据集的联合概率(似然函数)为:

        ​​​​​​​        ​​​​​​​        p(\mathcal{D}) = \prod_{i=1}^N p(y_i | x_i) = \prod_{i=1}^N \frac{1}{\sqrt{2\pi\sigma}} \exp\left(-\frac{(y_i - f(x_i))^2}{2\sigma^2}\right)

iv、取对数:对数似然函数

        为了简化计算,通常对似然函数取对数,得到对数似然函数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \ell(f) = \ln p(\mathcal{D}) = \sum_{i=1}^N \ln p(y_i | x_i)

        将 p(y_i | x_i) 的具体形式代入,得到:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \ell(f) = \sum_{i=1}^N (\ln \frac{1}{\sqrt{2\pi\sigma}} - \frac{(y_i - f(x_i))^2}{2\sigma^2})

        进一步简化为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \ell(f) = -\frac{N}{2}\ln(2\pi\sigma^2) - \frac{1}{2\sigma^2} \sum_{i=1}^N (y_i - f(x_i))^2

v、极大化对数似然

        极大化对数似然等价于最小化以下目标函数:

                                                        目标  = \sum_{i=1}^N (y_i - f(x_i))^2

        这实际上就是最小二乘法的目标函数。

vi、总结

  • 条件假设:当误差服从正态分布 N(0, \sigma^2) 时,最大化对数似然等价于最小化误差的平方和。
  • 结论:极大似然估计在高斯噪声假设下,就等价于最小二乘法。

vii、推广

        如果噪声分布不是正态分布(例如Laplace分布),则极大似然估计与最小二乘法不再等价。对于Laplace分布(对称的指数分布),极大似然估计对应的是L1损失

(3)残差分布

        我们也可以通过残差的分布来检验回归模型是否足够正确,如果模型预测合理,残差应为0均值的正态分布。

        上图为残差分布的直方图 ,可见残差的分布并不符合0均值的正态分布该模型(最小二乘回归模型)预测效果并不好。

        上图为真实值和残差的散点图,可见,真实值较大时,预测残差大多<0。模型还没有完全建模y与x之间的关系,还有一部分关系残留在残差中。

2、胡伯(Huber)损失函数

        Huber损失函数是一种结合了L1损失和L2损失优点的损失函数,在模型拟合时对异常值的鲁棒性更强。

(1)Huber损失函数的定义

        Huber损失函数在残差较小时采用L2损失(平方误差),在残差较大时采用L1损失(绝对值误差),其数学表达式为:

L_\delta(\hat{y}, y) = \begin{cases} \frac{1}{2}(\hat{y} - y)^2 & \text{if } |\hat{y} - y| \leq \delta \\ \delta |\hat{y} - y| - \frac{1}{2} \delta^2 & \text{if } |\hat{y} - y| > \delta \end{cases}

其中:

  • \delta 是一个超参数,决定了切换L1和L2损失的阈值。
  • 当残差 |\hat{y} - y| 小于 \delta 时,Huber损失与L2损失一致,具有平滑性和可微性;
  • 当残差 |\hat{y} - y| 大于 \delta 时,Huber损失切换为L1损失,对异常值的影响更小。

(2)Huber损失的优缺点

优点

  1. 对异常值鲁棒
    • 当残差较大时,Huber损失切换为L1形式,从而减小了异常值对模型的影响。
    • 与纯L2损失相比,Huber损失对噪声敏感性更低。
  2. 连续可微
    • 与L1损失相比,Huber损失在切换点(\hat{y} - y| = \delta)处连续可微,因此可以通过梯度下降等优化算法进行高效优化。
  3. 灵活性
    • 可以通过调整 \delta 参数,在鲁棒性和误差灵敏度之间找到平衡。

缺点

  1. 参数敏感性
    • \delta 的选取对模型性能有较大影响,需要通过交叉验证等方法进行调优。
  2. 计算复杂度稍高
    • 相较于简单的L1或L2损失,Huber损失的实现稍微复杂。

(3)与L1和L2损失的对比

L2损失

  • 优点:平滑、可微,适合大部分梯度优化方法。
  • 缺点:对异常值敏感,大残差会导致误差平方过大

L1损失

  • 优点:对异常值鲁棒,不会被大残差放大。
  • 缺点:r = 0 处不可导,优化算法可能不稳定。

Huber损失

  • 综合了两者的优点,在 |\hat{y} - y| \leq \delta 时采用L2损失的平滑性,在 |\hat{y} - y| > \delta 时采用L1损失的鲁棒性。

(4)Huber损失的图示理解

  • 当残差较小时,Huber损失与L2损失重合,损失呈二次函数增长;
  • 当残差较大时,Huber损失转变为线性增长,与L1损失类似;
  • 损失曲线在切换点处连续且可导,具有较好的平滑性。

(5)sklearn中Huber损失的实现与使用

i、sklearn 提供了直接实现Huber损失的回归模型 HuberRegressor

from sklearn.linear_model import HuberRegressor

# 使用Huber损失进行回归
huber = HuberRegressor()
huber.fit(X_train, y_train)
y_pred = huber.predict(X_test)

ii、SGDRegressor 也可以通过设置 loss='huber' 来使用Huber损失:

from sklearn.linear_model import SGDRegressor

# 随机梯度下降中指定Huber损失
sgd = SGDRegressor(loss='huber')
sgd.fit(X_train, y_train)
y_pred = sgd.predict(X_test)

四、线性回归模型的正则化

1、正则化的前提——数据标准化

        在正则项中,各特征的参数地位相同,这就要求各特征的单位相同,这可以对特征进行缩放(去量纲)实现。最常用的特征缩放为特征标准化。sklearn中的实现:StandardScaler。实现目标是使得特征均值为0,方差为1,即 数据标准化公式

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        x'_{ij} = \frac{x_{ij} - \mu_j}{\sigma_j}

其中:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \mu_j = \frac{1}{N} \sum_{i=0}^{N} x_{ij}

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            \sigma_j = \sqrt{\frac{1}{N-1} \sum_{i=0}^{N} \left(x_{ij} - \mu_j\right)^2}

2、三种角度分析L1、L2正则化本质

更详细的内容在推荐文章1,这里仅给出结论。

L2正则的线性回归:岭回归 Ridge

L1正则的线性回归:Lasso

L1正则可视为参数先验分布为拉普拉斯分布的贝叶斯估计

L2正则可视为参数先验分布为正态分布的贝叶斯估计。

3、弹性网络——L1正则+L2正则

        弹性网络(Elastic Net)是一种结合了L1正则化(Lasso)和L2正则化(Ridge)的线性回归方法,通过引入线性组合的正则化项来同时控制特征选择和模型复杂度。

弹性网络的目标函数是:

        ​​​​​​​        ​​​​​​​        J(w, \lambda, \rho) = \frac{1}{2N} \| Xw - y \|_2^2 + \lambda \left( \rho \| w \|_1 + \frac{1 - \rho}{2} \| w \|_2^2 \right)

其中:

  • \| Xw - y \|_2^2:表示模型的残差平方和,是最小二乘部分;
  • \| w \|_1:L1正则化项,用于稀疏化权重向量 w
  • \| w \|_2^2​:L2正则化项,用于防止过拟合;
  • \lambda:正则化强度的权重,控制正则项对目标函数的影响;
  • \rho:L1和L2正则化的权重系数,范围是 [0, 1]
    • \rho = 1:弹性网络退化为L1正则化(Lasso);
    • \rho = 0:弹性网络退化为L2正则化(Ridge)。

五、线性回归的优化算法

给定超参数 \lambda  的情况下,目标函数最优解为:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         \hat{w} =\underset{w}{\arg\min} J(w)
根据优化理论,函数极值点只能在边界点、不可导点、临界点(导数为0的点)。

1、方程组直接求解

(1)直接求伪逆

若二阶海森(Hessian)矩阵:

        ​​​​​​​        ​​​​​​​        H = \frac{\partial^2 J(w)}{\partial w \partial w^T} = \begin{bmatrix} \frac{\partial^2 J}{\partial w_1^2} & \frac{\partial^2 J}{\partial w_1 \partial w_2} & \cdots & \frac{\partial^2 J}{\partial w_1 \partial w_D} \\ \frac{\partial^2 J}{\partial w_2 \partial w_1} & \frac{\partial^2 J}{\partial w_2^2} & \cdots & \frac{\partial^2 J}{\partial w_2 \partial w_D} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 J}{\partial w_D \partial w_1} & \frac{\partial^2 J}{\partial w_D \partial w_2} & \cdots & \frac{\partial^2 J}{\partial w_D^2} \\ \end{bmatrix}

正定矩阵,则在临界点目标函数取最小值。

即取最小值的点是一阶偏导为0的点,即

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \frac{\partial J(w)}{\partial w} = 0

最小二乘回归的目标函数定义为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​      J(w) = \| Xw - y \|_2^2 = (Xw - y)^T (Xw - y)

计算目标函数对 w 的梯度:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \nabla J(w) = \frac{\partial J(w)}{\partial w} = 2X^T (Xw - y)

令梯度为零:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       ​​​​​​​          \nabla J(w) = 2X^T (Xw - y) = 0

上述方程组 X^T Xw = X^T y 称为正则方程组(Normal Equations)。在 X^T X 可逆的情况下,可以求出解析解:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            \hat{w}_{OLS} = (X^T X)^{-1} X^T y

其中 (X^T X)^{-1} X^T 称为 X 的伪逆,写作 X^{\ddagger }

(2)伪逆矩阵的SVD分解

        上面的求解过程需要求 X^T X 的逆矩阵,可采用数值更稳定的奇异值分解实现,对 X 进行SVD分解得 X=U\Sigma V^{T},那么 X 得伪逆的奇异值分解为 X^{\ddagger }=V\Sigma ^{\ddagger }U^{T}

其中 \Sigma ^{\ddagger } 是通过取 \Sigma 中非零奇异值的倒数得到的矩阵;

证明如下:

前提

        X 的奇异值分解(SVD)为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        X = U \Sigma V^T

      其中:

  • U 是一个 m \times m 的正交矩阵,因为对称矩阵XX^{T}的特征向量组成的矩阵。
  • \Sigma 是一个 m \times n  的对角矩阵,其对角元素是矩阵 X 的奇异值。
  • V 是一个 n \times n 的正交矩阵,因为对称矩阵X^{T}X的特征向量组成的矩阵。

目标

        我们要求矩阵 (X^T X)^{-1} X^T 的 SVD 分解。

步骤 1:分析 X^T X

        首先计算矩阵 X^T X

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        X^T X = (V \Sigma^T U^T)(U \Sigma V^T) = V \Sigma^T \Sigma V^T

        由于 U 和 V 都是正交矩阵,满足 U^T U = IV^T V = I,所以得到:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        X^T X = V \Sigma^T \Sigma V^T

        注意到,\Sigma^T \Sigma 是一个 n \times n 的对角矩阵,且对角元素是 X的奇异值的平方,即 \sigma_i^2i = 1, 2, \dots, \min(m, n)。因此:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          X^T X = V \Sigma^2 V^T

步骤 2:计算 (X^T X)^{-1}

        由于 X^T X = V \Sigma^2 V^T,且 V是正交矩阵(即 V^T V = I),我们可以得到:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​     (X^T X)^{-1} = V (\Sigma^2)^{-1} V^T

        其中,(\Sigma^2)^{-1}\Sigma^2 的逆,且由于 \Sigma^2 是对角矩阵,它的逆矩阵也是对角矩阵,且每个对角元素是原来对角元素的倒数。因此:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (\Sigma^2)^{-1} = \text{diag}\left(\frac{1}{\sigma_1^2}, \frac{1}{\sigma_2^2}, \dots, \frac{1}{\sigma_r^2}\right)

        其中 r = \min(m, n) 是矩阵 X 的秩。

步骤 3:计算 (X^T X)^{-1} X^T

        现在我们计算 (X^T X)^{-1} X^T

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (X^T X)^{-1} X^T = V (\Sigma^2)^{-1} V^T X^T

        我们将 X^T = V \Sigma U^T 代入,得到:

        ​​​​​​​        ​​​​​​​        (X^T X)^{-1} X^T = V (\Sigma^2)^{-1} V^T V \Sigma U^T = V (\Sigma^2)^{-1} \Sigma U^T

        因此,矩阵 (X^T X)^{-1} X^T 可以表示为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (X^T X)^{-1} X^T = V (\Sigma^2)^{-1} \Sigma U^T

步骤 4:SVD 分解

        最后,我们要对 (X^T X)^{-1} X^T = V (\Sigma^2)^{-1} \Sigma U^T 进行 SVD 分解。由于 V 和 U 都是正交矩阵,矩阵 (\Sigma^2)^{-1} \Sigma 的 SVD 结构是:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (\Sigma^2)^{-1} \Sigma = \Sigma^{-1}

        因此,我们可以得到 (X^T X)^{-1} X^T 的 SVD 分解为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (X^T X)^{-1} X^T = V \Sigma^{-1} U^T

        所以,矩阵 (X^T X)^{-1} X^T 的 SVD 分解是:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (X^T X)^{-1} X^T = V \Sigma^{-1} U^T

(3)岭回归的直接求解并SVD分解

岭回归目标函数

岭回归目标函数为误差平方和+L2 正则化项,为

        ​​​​​​​        ​​​​​​​        ​​​​​​​           J(w, \lambda) = (Xw - y)^T (Xw - y) + \lambda w^T w

梯度推导

目标函数对 w求梯度,得到:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \frac{\partial J(w, \lambda)}{\partial w} = -2X^T y + 2(X^T X)w + 2\lambda w

令梯度为零:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        -2X^T y + 2(X^T X)w + 2\lambda w = 0

即得

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          \hat{w}_{Ridge} = (X^T X + \lambda I)^{-1} X^T y

结合 SVD 分解

利用 SVD 的性质,计算:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        X^T X = V \Sigma^T \Sigma V^T

从而有:

        ​​​​​​​                \hat{w}_{Ridge} = (X^T X + \lambda I)^{-1} X^T y = (V \Sigma^T \Sigma V^T + \lambda I)^{-1} V \Sigma^T U^T y

进一步化简:

        ​​​​​​​        ​​​​​​​        ​​​​​​​                ​​​​​​​        X^T X + \lambda I = V (\Sigma^T \Sigma + \lambda I) V^T

因此:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (X^T X + \lambda I)^{-1} = V (\Sigma^T \Sigma + \lambda I)^{-1} V^T

将结果代入:

        ​​​​​​​           \hat{w}_{Ridge} = V (\Sigma^T \Sigma + \lambda I)^{-1} V^T V \Sigma^T U^T y = V (\Sigma^T \Sigma + \lambda I)^{-1} \Sigma^T U^T y

如果用对角奇异值矩阵 D 表示 \Sigma^T \Sigma,则:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \hat{w}_{Ridge} = V (D + \lambda I)^{-1} \Sigma^T U^T y

(4)岭回归的权重衰减(L2正则化使得权重衰减)

这部分在推荐文章1中有详细分析。

(5)Lasso的权重衰减(L1正则化使得大权重衰减小权重剔除)

这部分在推荐文章1中有详细分析。

2、梯度下降

推荐文章2中有关于梯度下降的各种优化算法。

        方程组直接求解中,当矩阵 X 非常大时,SVD的计算量大,甚至不能载入内存。此时可用迭代方式求解。梯度下降法是求解无约束优化问题最常采用的方法之一。

        最小二乘回归和岭回归可采用梯度下降法求解,Lasso由于目标函数中有L1正则函数不可导,不能采用梯度下降法求解。

损失函数对梯度的影响

L2损失:梯度的绝对值为 |y-\hat{y}|  。随损失增大而增大,损失趋于0时梯度也减小。这使得在训练结束时,使用采用L2损失的模型的 结果会更精确。即使固定学习率,函数也能较快取得最小值。
L1损失:梯度的绝对值始终为1。即使对于小的损失值,梯度也大。这不利于函数的收敛和模型的学习,可能导致在快要结束时错过了最小点 à 使用变化的学习率,在损失接近最小值时降低学习率

3、坐标轴下降

(1)次梯度法

        在优化问题中,经典的梯度下降法要求目标函数可微。然而在某些实际场景下,比如 L1 正则化(如 Lasso 回归)中的目标函数,包含非光滑点(例如 |x|x = 0 处不可导)。为了解决这一问题,引入了次梯度法(Subgradient Method),扩展了梯度下降法的适用范围。

次梯度的定义

对于一个凸函数 f(x),如果在点 x_0​ 处不可导,定义次梯度 g 满足以下关系:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        f(x) \geq f(x_0) + g^T (x - x_0), \quad \forall x \in \text{dom}(f)

  • g 是 f(x) 在 x_0​ 的一个次梯度;
  • 所有次梯度的集合称为次梯度集合,记为 \partial f(x_0) 。

几何意义

  • 次梯度对应的直线(或超平面)是目标函数 f(x) 在点 x_0​ 处的下方支持平面;
  • 即使函数不可微,仍可以找到一个线性近似,描述函数的局部行为。

L1 范数的次梯度

对于 f(x) = |x|,次梯度集合如下:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \partial |x| = \begin{cases} \{-1\}, & x < 0 \\ [-1, 1], & x = 0 \\ \{1\}, & x > 0 \end{cases}

在 Lasso 回归中,目标函数 J(w) = \|Xw - y\|_2^2 + \lambda \|w\|_1​ 的次梯度为:

        ​​​​​​​        \frac{\partial J(w)}{\partial w_j} = \begin{cases} \frac{\partial}{\partial w_j} \|Xw - y\|_2^2 + \lambda \cdot \text{sign}(w_j), & w_j \neq 0 \\ \frac{\partial}{\partial w_j} \|Xw - y\|_2^2 + \lambda g, & w_j = 0, \, g \in [-1, 1] \end{cases}

将梯度下降法中的梯度换成次梯度,就得到次梯度法。
        与梯度下降算法不同,次梯度算法并不是下降算法(每次对参数的更新,并不能保证目标函数单调递减)。因此一般情况下我们选择:J(w^{*})=\underset{1,\cdots ,t}{min}J(w^{(t)}) 虽然不能保证次梯度法中目标函数单调下降,可以证明对满足一定条 件的凸函数,次梯度法是收敛的,只是收敛速度比梯度下降法慢。
次梯度法收敛速度慢,Lasso求解推荐使用坐标轴下降法。

(2)坐标轴下降法

坐标轴下降法的定义

坐标轴下降法(Coordinate Descent)是一种迭代优化算法,适用于目标函数分解为各个变量的单独优化问题的场景。其核心思想是:

  • 在每次迭代中,仅优化目标函数中一个变量,固定其余变量;
  • 每次优化沿着当前变量所在的坐标轴方向进行单变量优化。

在高维优化问题中,坐标轴下降法具有计算效率高和实现简单的优势。

坐标轴下降法的应用

在 Lasso 中,坐标轴下降法可以很好地解决上述问题。每次优化时:

  • 选取一个维度 w_j​,其他变量 w_{-j} 固定不变;
  • 优化目标函数对 w_j​ 的次梯度或次微分。

坐标轴下降法的具体步骤

     步骤 1:初始化

  • 设定初始参数 w = 0 或随机初始化;
  • 计算每个维度的初始值。

     步骤 2:更新某一维度的参数

        对目标函数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        J(w) = \|Xw - y\|_2^2 + \lambda \|w\|_1

  • 选择第 j个变量 w_j​,计算该维度对应的次微分;
  • 更新规则:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        w_j = \begin{cases} \frac{-c_j + \lambda}{a_j}, & \text{if } c_j < -\lambda \\ 0, & \text{if } c_j \in [-\lambda, \lambda] \\ \frac{-c_j - \lambda}{a_j}, & \text{if } c_j > \lambda \end{cases}

        这里:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                ​​​​​​​        a_j = 2\sum_{i=1}^N x_{i,j}^2

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                c_j = 2\sum_{i=1}^N \left( w_{-j}^T x_{i, -j} - y_i \right)x_{i,j}

  • a_j​ 是目标函数在第 j维的平方系数;
  • c_j​ 是当前维度与残差的相关性。

    步骤 3:循环更新直到收敛

  • 更新所有维度 w_j​;
  • 判断收敛条件(如参数更新量或目标函数值的变化足够小),否则返回步骤 2。
  • 最优解条件:0\in \partial J_{w,j}(w,\lambda )

Lasso的坐标轴下降求解

六、回归任务的模型性能评价

1、评价指标

评价指标是用于衡量回归模型预测性能的关键工具。这部分提到的指标包括:

  • 开方均方误差RMSE (Rooted Mean Squared Error): 计算预测值和实际值之间误差的平方和的平均值,然后取平方根。它能够较大程度地放大大的预测误差。

            ​​​​​​​        ​​​​​​​        ​​​​​​​         \text{RMSE}(\hat{y}, y) = \sqrt{\frac{1}{N} \sum_{i=1}^N (\hat{y}_i - y_i)^2}
  • 平均绝对误差MAE (Mean Absolute Error): 计算预测值和实际值之间绝对误差的平均值。相比于RMSE,它对异常值的敏感性较低。

                                     \text{MAE}(\hat{y}, y) = \frac{1}{N} \sum_{i=1}^N |\hat{y}_i - y_i|​​​​​​​
  • 绝对误差中值MedAE (Median Absolute Error): 计算预测值和实际值之间绝对误差的中位数,进一步降低了异常值对评价的影响。

                                     \text{MedAE}(\hat{y}, y) = \text{median}(|\hat{y}_i - y_i|) 
  • 平均平方log误差MSLE (Mean Squared Logarithmic Error): 适用于目标变量增长幅度较大的场景(如指数增长数据)。

                             \text{MSLE}(\hat{y}, y) = \frac{1}{N} \sum_{i=1}^N (\log(1 + \hat{y}_i) - \log(1 + y_i))^2
  • R^2 分数: 衡量模型解释变量之间变化的比例,值越接近1,模型越好。它基于两部分:残差平方和(SS_{res}​)和总平方和(SS_{tot}​)。

                                                 R^2(\hat{y}, y) = 1 - \frac{\text{SS}_{res}}{\text{SS}_{tot}}

        SS_{\text{res}} 是残差平方和: SS_{\text{res}} = \frac{1}{N} \sum_{i=1}^N \left( y_i - \hat{y}_i \right)^2

        SS_{\text{tot}} 是目标变量的总平方和: SS_{\text{tot}} = \frac{1}{N} \sum_{i=1}^N \left( y_i - \bar{y} \right)^2

  • 已解释的方差分数(Explained Variance Score)是回归模型的另一个重要评价指标,用于衡量模型对目标变量的方差解释能力。它定义为:

    \text{explained\_variance}(\hat{y}, y) = 1 - \frac{\text{Var}(y - \hat{y})}{\text{Var}(y)}

    其中:

        \text{Var}(y - \hat{y}):残差的方差,表示预测值与真实值的误差的变异程度。

        \text{Var}(y): 真实目标变量的方差,表示目标变量本身的变异程度。

        如果模型能够完美预测目标变量,则\text{Var}(y - \hat{y}) = 0,从而\text{explained\_variance} = 1。这是最理想的情况。

        如果模型完全没有预测能力,导致预测值与真实值之间的差异方差等于目标变量本身的方差,则\text{explained\_variance} = 0

        值可以小于0,表示模型预测能力比一个简单的平均值预测(即使用均值作为预测值)还要差。

        当残差的均值为0时,R^2 分数和已解释的方差分数相同。

2、sklearn中的评价方法

sklearn提供了多种方法用于计算上述指标:

  • Estimator的.score()方法: 通常默认返回 R^2 分数。
  • Metric模块: 提供了单独计算上述指标的API。
  • Scoring参数: 用于交叉验证时指定模型性能的评价指标。

例如,metrics.mean_absolute_error计算MAE,metrics.r2_score计算R2R^2R2。

3、线性回归模型的超参数调优

回归模型的超参数调优(如正则化系数\lambda)可以通过以下方法实现:

  • 交叉验证:

    • RidgeCV、LassoCV和ElasticNetCV分别实现岭回归、Lasso和弹性网络的交叉验证。
  • AIC/BIC准则:

    • 基于信息准则,用于正则化模型的选择:
      • AIC =N \ln(\text{RSS}) + 2 \, df(\lambda)
      • BIC =N \ln(\text{RSS}) + \ln(N) \, df(\lambda)
  • 留一交叉验证 (LOOCV):

    • 特殊形式的交叉验证,每次使用一个样本作为验证集,剩余样本作为训练集。
  • 广义交叉验证 (GCV):

    • 对LOOCV的近似,用于减少计算量。

4、Scikit-Learn实现的超参数调优工具

  • RidgeCV:

    • 自动搜索一组正则化参数α\alphaα中的最佳值。
    • 支持多种交叉验证方法,如GCV、LOOCV。
  • LassoCV:

    • 提供自动选择正则化参数 \alpha 的方法,支持用户设置 \alpha 范围和数量。

七、线性回归案例分析(还未整理)

两个案例:

1、广告费用与产品销量(还未整理)

2、共享单车骑行量预测(还未整理)

八、⭐⭐全文总结⭐⭐

        本文首先介绍了回归任务简介和线性回归模型,然后介绍了损失函数,有L2损失和L1损失,L2损失的梯度是和偏离程度有关,受特异值影响大,L1损失的梯度恒定-1或1,受特异值影响小,但在0处不可微。其次,当误差项服从高斯分布时,极大似然估计等价于最小化残差平方和(用L2损失最小)。当误差服从拉普拉斯分布时,极大似然估计等等价于最小化L1损失。结合最小化L1损失鲁棒性强和L2损失处处可微的优点,给出了胡伯损失函数。

        在第四部分,介绍了回归模型的正则化,正则化由于对每个特征的参数都是等地位的,所以要对特征进行数据标准化,L1正则化相当于先验服从拉普拉斯分布的贝叶斯估计;L2正则化相当于先验服从高斯分布的贝叶斯估计。还从权重衰减角度介绍了正则化,最后又结合了L1正则化和L2正则化的优点,介绍了弹性正则化。

        在第五部分,介绍了线性回归模型的优化算法,在直接接方程组中,参数w可以直接利用X的伪逆解出,但X维度高时计算复杂,不稳定,所以采用SVD分解,对X伪逆进行了SVD分解。其次,还介绍了正则化后的线性回归方程组的直接求解和SVD分解求出的解。然后,介绍了梯度下降,各种梯度下降的优化方法,梯度下降时可采用L2损失的梯度下降还可以采用L1损失的梯度下降,但更好的还是结合他们的优点,损失的绝对值值大时,采用L1损失,损失的绝对值小时,采用L2损失的梯度下降。随后介绍了坐标轴下降,主要用在Lasso回归的梯度下降,首先介绍了次梯度下降,即用次梯度代替梯度进行梯度下降,对于介绍坐标轴下降,主要采用单个维度的次梯度下降,即对参数w的单个维度进行次梯度下降,优化目标是0属于该维的次梯度集。

        在第六部分介绍了各种回归任务性能的评价指标。


http://www.kler.cn/a/402755.html

相关文章:

  • C++ std::unique_ptr的使用及源码分析
  • MariaDB面试题及参考答案
  • 文件的处理(c语言)
  • docker镜像源配置、换源、dockerhub国内镜像最新可用加速源(仓库)
  • 跟《经济学人》学英文:2024年11月23日这期 Why British MPs should vote for assisted dying
  • HashMap源码详解
  • 【Python】30个Python爬虫的实战项目!!!(附源码)
  • 蓝牙电话-如何自动切换手机SIM卡(预研方向)
  • 985研一学习日记 - 2024.11.17
  • Map接口的特点
  • 使用 Postman 设置 Bearer Token 进行身份验证
  • 优化算法:粒子群算法
  • AI编程入门指南002:API、数据库和应用部署
  • 02向量与矩阵方程
  • Python学习30天
  • spring为何要用三级缓存
  • elasticsearch7.10.2集群部署带认证
  • 查找redis数据库的路径
  • 百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
  • K8S资源限制之ResourceQuota
  • 【qt】控件QLabel
  • Spring事务——针对实习面试
  • 如何使用 PyTorch 实现图像分类数据集的加载和处理
  • ArkTS---空安全、模块、并发
  • 【C++】踏上C++学习之旅(九):深入“类和对象“世界,掌握编程的黄金法则(四)(包含四大默认成员函数的练习以及const对象)
  • React 中使用 Axios 进行 HTTP 请求