04_线性回归
文章目录
- 1 概述
- 2 线性回归求解
- 2.1 损失函数
- 2.2 正规方程法
- 2.3 梯度下降法
- 2.3.1 梯度下降思想
- 2.3.2 学习率的选择
- 2.3.3 梯度下降常见分类
- 2.3.4 梯度下降常见问题
- 2.4 正规方程和梯度下降对比
- 3 API 使用
- 3.1 正规方程
- 3.2 梯度下降
- 3.3 Lasso 回归
- 3.4 Ridge 回归
1 概述
回归模型是机器学习和统计学中的一种基本模型,用于预测连续型输出变量。简单的说,给定一组输入变量(自变量)和对应的输出变量(因变量),回归模型旨在找到输入变量和输出变量之间的映射关系。
线性回归分类:
-
一元线性回归:建立一个因变量与单个自变量之间线性关系的模型,也就是只有一个特征。
y = w x + b y={w}\boldsymbol{x}+b y=wx+b
y \small{y} y 是目标变量(因变量), x \boldsymbol{x} x 是输入变量(自变量), b b b 是偏置(截距,intercept), w w w是权重(回归系数, regression coefficients) -
多元线性回归:建立一个因变量与多个自变量之间线性关系的模型,模型具有多个特征。
y = w 1 x 1 + w 2 x 2 + w 3 x 3 + ⋯ + w n x n + b y=w_1x_1+w_2x_2+w_3x_3+\cdots+w_nx_n+b y=w1x1+w2x2+w3x3+⋯+wnxn+b
可以用向量简化为: y = w T x + b y=\boldsymbol{w^Tx}+b y=wTx+b 或
y = w T x y=\boldsymbol{w^Tx} y=wTx
其中, x = [ 1 , x 1 , x 2 , … , x n ] \boldsymbol{\mathbf{x} = [1, x_{1}, x_{2}, \dots, x_{n}]} x=[1,x1,x2,…,xn] 是包含截距的输入向量, w = [ w 0 , w 1 , w 2 , … , w n ] T \boldsymbol{\mathbf{w} = [w_{0}, w_{1}, w_{2}, \dots, w_{n}]^{T}} w=[w0,w1,w2,…,wn]T 是模型参数(包括截距 b b b 和回归系数 w 1 , w 2 , ⋯ , w n \boldsymbol{w_{1}, w_{2}, \cdots, w_{n}} w1,w2,⋯,wn)
2 线性回归求解
2.1 损失函数
建立回归模型的目的是为了找到最佳的回归系数 w \boldsymbol{w} w 和截距 b b b ,能够使预测值 y i ^ {\hat{y_{i}}} yi^ 与实际观测值 y i {y_{i}} yi 之间差异最小化。
损失函数(Loss Function),也称为代价函数(Cost Function),定义损失函数为:
L ( w ) = ∑ i = 1 m ( y i ^ − y i ) 2 L(w)=\sum_{i=1}^{m}(\hat{y_i}-y_i)^2 L(w)=i=1∑m(yi^−yi)2
很多时候损失函数和代价函数两个术语存在混用,严谨来说:
- 损失函数:单个训练样本的误差,通常用 L ( w ) L(w) L(w), L ( w , b ) L(w, b) L(w,b)
- 代价函数:整个训练集的平均误差,损失函数的平均,通常用 J ( θ ) J(θ) J(θ)
损失函数 L ( w ) L(w) L(w) 最小化时便找到了最佳参数,这为优化参数指明了方向。
2.2 正规方程法
正规方程法(Normal Equation) 是一种直接计算线性回归模型参数(权重和偏置)的方法,它不需要像梯度下降那样的迭代过程。
整理后得出多元线性回归方程的解析解为:
w = ( X T X ) − 1 X T y \boldsymbol{w} = (\mathbf{X}^{T}\mathbf{X})^{-1}\mathbf{X}^{T}\mathbf{y} w=(XTX)−1XTy
X \mathbf{X} X 为特征值矩阵, y \boldsymbol{y} y 为目标值向量, w \boldsymbol{w} w 为参数向量, w 0 w_0 w0 为偏置。若 X T X X^TX XTX 不满秩,可以解出多个 w w w,此时需要设定归纳偏好,或引入正则化(regularization)。
X = [ 1 x 11 x 12 ⋯ x 1 n 1 x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 x m 1 x m 2 ⋯ x m n ] y = [ y 1 y 2 ⋮ y m ] w = [ w 0 w 1 ⋮ w n ] X = \begin{bmatrix} 1 & x_{11} & x_{12} & \cdots & x_{1n} \\ 1 & x_{21} & x_{22} & \cdots & x_{2n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{m1} & x_{m2} & \cdots & x_{mn} \end{bmatrix} \;\;\;\;\;\;\;\;\;\;\;\;\; y = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_m \end{bmatrix} \;\;\;\;\;\;\;\;\;\;\;\;\; w = \begin{bmatrix} w_0 \\ w_1 \\ \vdots \\ w_n \end{bmatrix} X= 11⋮1x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1nx2n⋮xmn y= y1y2⋮ym w= w0w1⋮wn
2.3 梯度下降法
2.3.1 梯度下降思想
梯度下降(Gradient Descent)是一种优化算法,广泛应用于机器学习和深度学习中,用于找到最小化模型损失函数的参数。
梯度下降是一个迭代过程,不断重复以下步骤直到模型收敛,即损失不再明显减少:
- 初始化参数: 随机设定模型的初始参数 w \boldsymbol{w} w(包含权重和偏置)。
- 计算损失: 使用当前的参数计算模型的损失函数 J ( w ) J(\boldsymbol{w}) J(w)。
- 计算梯度: 对损失函数 J ( w ) J(\boldsymbol{w}) J(w) 计算偏导数,得到当前位置的梯度 ∇ J ( w ) \nabla J(\boldsymbol{w}) ∇J(w),得到损失函数变化最快的方向。
∇ J ( w ) = [ ∂ J ∂ w 1 , ∂ J ∂ w 2 , ⋯ , ∂ J ∂ w n ] \nabla J(\mathbf{w}) = \left[ \frac{\partial{J}}{\partial{w_{1}}}, \frac{\partial{J}}{\partial{w_{2}}}, \cdots, \frac{\partial{J}}{\partial{w_{n}}} \right] ∇J(w)=[∂w1∂J,∂w2∂J,⋯,∂wn∂J] - 更新参数: 沿着梯度的反方向,根据学习率(learning rate) α \alpha α 更新参数。
θ = θ − α ⋅ ∇ J ( w ) θ=θ−α⋅\nabla J(\mathbf{w}) θ=θ−α⋅∇J(w) - 重复: 返回到第 2 步,用新的参数重复计算和更新,直到达到某一停止条件
- 达到最大迭代次数
- 损失变化小于某个阈值。
2.3.2 学习率的选择
- 学习率过小:收敛速度慢,易陷入局部最优解
- 学习率过大:可能导致跳过最优解,甚至发散
自适应学习率:高级优化器(如 Adam、Adagrad)动态调整学习率以提升性能
2.3.3 梯度下降常见分类
-
批量梯度下降(Batch Gradient Descent,BGD):每次迭代使用全部训练数据计算梯度。
- 优点:梯度方向稳定,更新平滑,收敛过程较稳定。
- 缺点:每次都计算整个训练集,计算量大,对大数据集效率低。
-
随机梯度下降(Stochastic Gradient Descent,SGD):每次迭代随机选取一个样本计算梯度。
- 优点:快速迭代,每次只用一个样本计算梯度;由于引入了随机性,有助于跳出局部最优解。
- 缺点:每次更新方向不确定,收敛过程波动很大,甚至难以收敛,在最小值附近震荡。
-
小批量梯度下降(Mini-batch Gradient Descent,MBGD):每次迭代使用一小批样本(如32、64个)计算梯度。
- 优点:计算成本相对 BGD 较低,又比 SGD 稳定,兼具 BGD 的稳定和 SGD 的速度。
- 缺点:合适的 batch size 需要实验。
梯度下降优化扩展内容
2.3.4 梯度下降常见问题
特征缩放:通常需要提前对特征进行缩放(如标准化或归一化),以加快收敛速度。
局部最优解、鞍点问题:可能陷入局部最优解,或遇到鞍点(梯度为零但非极值点)。
解决方案:使用动量(Momentum)、自适应优化器(如 Adam)或二阶方法(如牛顿法)。
2.4 正规方程和梯度下降对比
正规方程法:
- 一次运算得出
- 不需要学习率
- 计算量大、容易受到噪声、特征强相关性的影响;如果数据不是线性的,无法使用或效果不好
- 应用场景:小数据量场景
梯度下降法:
- 需要迭代求解
- 需要选择学习率
- 应用场景:更加普适,适合于嘈杂、大数据场景,在各种损失函数中大量使用。在深度学习中模型参数轻松过亿,只能通过迭代求解
3 API 使用
3.1 正规方程
LinearRegression
使用最小二乘法计算回归模型的参数。
from sklearn.linear_model import LinearRegressionmodel = LinearRegression(fit_intercept=True # 是否计算偏置
)model.fit(X_train, y_train)
# 查看权重
model.coef_
# 查看偏置
model.intercept_
3.2 梯度下降
SGDRegressor
使用随机梯度下降求解,随机梯度下降对特征的尺度非常敏感,通常需要在训练之前对特征进行标准化或归一化处理。
form sklearn.linear_model import SGDRegressormodel = SGDRegressor(loss="squared_error", # 损失函数,默认为均方误差penalty="l2", # 正则化项,默认为 L2 正则fit_intercept=True, # 是否计算偏置learning_rate="constant", # 学习率策略eta0=0.1, # 初始学习率max_iter=1000, # 最大迭代次数tol=1e-8, # 损失值变化量小于 tol 时停止迭代
)model.fit(X_train, y_train)
# 查看权重
model.coef_
# 查看偏置
model.intercept_
loss
:指定优化目标(损失函数),默认值为'squared_error'
(最小二乘法),其他可以选择的值有:'huber'
、'epsilon_insensitive'
和'squared_epsilon_insensitive'
,其中'huber'
适用于对异常值更鲁棒的回归模型。penalty
:指定正则化方法,用于防止过拟合,默认为'l2'
(L2 正则化),其他可以选择的值有:'l1'
(L1正则化)、'elasticnet'
(弹性网络,L1 和 L2 的组合)、None
(不使用正则化)。alpha
:正则化强度的系数,控制正则化项的权重,默认值为0.0001
。较大的alpha
值会加重正则化的影响,从而限制模型复杂度;较小的值会让模型更关注训练数据的拟合。l1_ratio
:当penalty='elasticnet'
时,控制 L1 和 L2 正则化之间的权重,默认值为0.15
,取值范围为[0, 1]
(0
表示完全使用 L2,1
表示完全使用 L1)。tol
:优化算法的容差,即判断收敛的阈值,默认值为1e-3
。当目标函数的改变量小于tol
时,训练会提前终止;如果希望训练更加精确,可以适当降低tol
。learning_rate
:指定学习率的调节策略,默认值为'constant'
,表示使用固定学习率,具体的值由eta0
指定;其他可选项包括:'optimal'
:基于公式eta = 1.0 / (alpha * (t + t0))
自动调整。'invscaling'
:按eta = eta0 / pow(t, power_t)
缩放学习率。'adaptive'
:动态调整,误差减少时保持当前学习率,否则减小学习率。
eta0
:初始学习率,默认值为0.01
,当learning_rate='constant'
或其他策略使用时,eta0
决定了初始更新步长。power_t
:当learning_rate='invscaling'
时,控制学习率衰减速度,默认值为0.25
。较小的值会让学习率下降得更慢,从而更长时间地关注全局优化。early_stopping
:是否启用早停机制,默认值为False
。如果设置为True
,模型会根据验证集性能自动停止训练,防止过拟合。validation_fraction
:指定用作验证集的训练数据比例,默认值为0.1
。当early_stopping=True
时,该参数会起作用。max_iter
:训练的最大迭代次数,默认值为1000
。当数据较大或学习率较小时,可能需要增加迭代次数以保证收敛。shuffle
:是否在每个迭代轮次开始时打乱训练数据,默认值为True
,表示打乱数据。打乱数据有助于提高模型的泛化能力。warm_start
:是否使用上次训练的参数继续训练,默认值为False
。当设置为True
时,可以在已有模型的基础上进一步优化。verbose
:控制训练过程的日志输出,默认值为0
,可以设置为更高值以观察训练进度。
3.3 Lasso 回归
拉索(Lasso)回归在线性回归基础上引入 L 1 \small{L1} L1 正则化项,不仅防止过拟合,还具有特征选择的功能,特别适用于高维数据。
from sklearn.linear_model import Lassomodel = Lasso()model.fit(X_train, y_train)
# 查看权重
model.coef_
# 查看偏置
model.intercept_
3.4 Ridge 回归
岭(Ridge)回归在线性回归的基础上引入 L 2 \small{L2} L2 正则化项,目的是防止模型过拟合,尤其是当特征数较多或特征之间存在共线性时。
from sklearn.linear_model import Ridgemodel = Ridge()model.fit(X_train, y_train)
# 查看权重
model.coef_
# 查看偏置
model.intercept_