05 基于sklearn的机器学习-梯度下降(下)

目录

sklearn梯度下降

[批量梯度下降(BGD, Batch Gradient Descent)](#批量梯度下降(BGD, Batch Gradient Descent))

[随机梯度下降(SGD, Stochastic Gradient Descent)](#随机梯度下降(SGD, Stochastic Gradient Descent))

[小批量梯度下降(MBGD, Mini-Batch Gradient Descent)](#小批量梯度下降(MBGD, Mini-Batch Gradient Descent))


sklearn梯度下降

梯度下降是机器学习中常用的优化算法,用于最小化损失函数。根据每次迭代使用的样本数量,可分为三种常见变体:批量梯度下降(BGD)、小批量梯度下降(MBGD)和随机梯度下降(SGD)。

批量梯度下降BGD(Batch Gradient Descent)

小批量梯度下降MBGD(Mini-BatchGradient Descent)

随机梯度下降SGD(Stochastic Gradient Descent)。

批量梯度下降(BGD, Batch Gradient Descent)
  • 原理 :每次迭代使用全部训练样本计算梯度并更新参数。

  • 优点:梯度估计准确,收敛稳定,可得到全局最优解。

  • 缺点:计算成本高,尤其在大数据集上训练速度慢,无法在线学习(实时更新)。

假设我们有一个包含 ( m ) 个训练样本的数据集 ,其中 是输入特征, 是对应的标签。我们的目标是最小化损失函数 相对于模型参数的值。

损失函数可以定义为:

其中 是模型对第 i 个样本的预测输出。

批量梯度下降的更新规则为: 对于 j = 0, 1, n (其中 n 是特征的数量),并且 是学习率。

随机梯度下降(SGD, Stochastic Gradient Descent)
  • 原理 :每次迭代随机 选择单个样本计算梯度并更新参数。

  • 优点:训练速度快,适合大数据集,支持在线学习。

  • 缺点:梯度波动大,收敛路径曲折,可能在最优解附近震荡。

基本步骤

  1. 初始化参数 :

    • 选择一个初始点作为参数向量 \theta的初始值。
  2. 选择样本:

    • 随机选取一个训练样本 (,
  3. 计算梯度:

    • 使用所选样本 ()来近似计算损失函数 的梯度
  4. 更新参数:

    • 根据梯度的方向来更新参数。更新公式为:

    • 其中 是学习率,决定了每次迭代时参数更新的步长。

  5. 重复步骤 2 到 4:

    • 对所有的训练样本重复此过程,直到完成一个完整的 epoch(即所有样本都被访问过一次)。
  6. 重复多个 epoch:

    • 重复上述过程,直到满足某个停止条件,比如达到最大迭代次数或者梯度足够小。
  7. 输出结果:

    • 输出最小化损失函数后的最优参数

假设我们有一个包含 (m) 个样本的数据集,其中 是第 i 个样本的特征向量, 是对应的标签。对于线性回归问题,损失函数 可以定义为均方误差 (Mean Squared Error, MSE):

其中是模型对第 i个样本的预测值。

梯度 对于每个参数 \theta_j 的偏导数可以表示为:

更新规则

参数的更新规则为:

优点

  • 训练速度快:每次迭代仅处理 1 个样本,适合超大规模数据集。

  • 支持在线学习 :新样本可随时加入训练,实时更新模型。

  • 有机会跳出局部最优(梯度随机性带来的 "抖动")。

缺点

  • 梯度波动大:单个样本的梯度可能与真实梯度偏差大,导致收敛路径曲折

  • 难以稳定收敛:可能在最优解附近震荡,而非精确收敛到最小值。

适用场景

  • 大规模数据集(如百万级样本)。

  • 在线学习场景(如实时推荐、动态数据流)。

API

sklearn.linear_model.SGDRegressor()

复制代码
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(
    loss='squared_error',      # 损失函数(默认MSE)
    penalty='l2',              # 正则化类型:'l1', 'l2', 'elasticnet'
    alpha=0.0001,              # 正则化强度(默认较弱)
    l1_ratio=0.15,            # ElasticNet混合比例(仅penalty='elasticnet'时生效)
    max_iter=1000,             # 最大迭代次数(实际是epoch数)
    tol=1e-3,                  # 早停阈值(损失变化<tol时停止)
    learning_rate='invscaling', # 学习率调度策略:'constant', 'optimal', 'invscaling'
    eta0=0.01,                 # 初始学习率(learning_rate非'optimal'时生效)
    power_t=0.25,              # invscaling调度指数:η = η0 / t^power_t
    early_stopping=False,      # 是否用验证集早停
    validation_fraction=0.1,   # 早停验证集比例
    random_state=None,         # 随机种子
    warm_start=False           # 是否热启动(复用上次训练结果)
)
​
属性:  
coef_ 回归后的权重系数
intercept_ 偏置
python 复制代码
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor,LinearRegression
from sklearn.metrics import mean_squared_error
​
# 加载数据集
housing = fetch_california_housing()
x,y = fetch_california_housing(return_X_y=True,data_home='../src')
print(x.shape)
print(housing.feature_names)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)
​
# 数据预处理
scaler = StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
​
# 创建模型
model = SGDRegressor(loss='squared_error',
                     learning_rate='constant',
                     eta0=0.01,
                     fit_intercept=True, 
                     max_iter=1000,
                     shuffle=True)
# 训练模型
model.fit(x_train,y_train)
'''
1. 初始化w
2. 构建损失函数,计算导函数
3. 计算当前梯度
4. 更新w
'''
print('w:',model.coef_)
print('b:',model.intercept_)
​
# 模型评估
y_hat = model.predict(x_test)
print('预测值:',y_hat)
print('真实值:',y_test)
print('均方误差:',mean_squared_error(y_test,y_hat))
小批量梯度下降(MBGD, Mini-Batch Gradient Descent)
  • 原理 :每次迭代使用一小部分样本(批量) 计算梯度并更新参数(通常批量大小为 16~256)。

  • 优点:平衡了 BGD 和 SGD 的优缺点,梯度估计较稳定,训练效率高。

  • 缺点:需要额外选择批量大小超参数。

假设我们有一个包含 ( m ) 个训练样本的数据集 ,其中 是输入特征, 是对应的标签。我们将数据集划分为多个小批量,每个小批量包含 ( b ) 个样本,其中 ( b ) 称为批量大小(batch size),通常 ( b ) 远小于 ( m )。

损失函数可以定义为:

其中是模型对第 i 个样本的预测输出。

小批量梯度下降的更新规则为: 对于 j = 0, 1, ... n (其中 n 是特征的数量),并且 是学习率, B 表示当前小批量中的样本索引集合。

过程拆解

  1. 将训练集划分为多个批量(每个批量含 k 个样本)。

  2. 每次迭代选择 1 个批量,计算批量内所有样本的梯度平均值。

  3. 用批量平均梯度更新参数: = - η⋅批量平均梯度

  4. 遍历所有批量完成 1 个 epoch,重复多个 epoch 直到收敛。

优点

  • 效率高:批量样本可利用矩阵运算加速,计算成本低于 BGD。

  • 梯度稳定:批量平均梯度比单个样本梯度更接近真实梯度,收敛路径较平滑。

  • 灵活性:可通过调整批量大小 k 平衡效率和稳定性。

缺点

  • 需额外调参:批量大小 k 是超参数,需通过实验选择(常用 16、32、64、128)。

适用场景

  • 绝大多数实际机器学习任务(是工业界的默认选择)。

  • 中等或大规模数据集,需要平衡训练速度和收敛稳定性。