Scikit-learn 中的梯度下降算法

97 阅读1分钟

Scikit-learn 中的梯度下降算法


🧠 算法思想

梯度下降 是一种迭代优化算法,通过逐步调整模型参数以最小化损失函数。其核心思想是:

  1. 初始化参数:随机或零初始化模型参数(如线性回归中的权重 ww 和偏置 bb)。
  2. 计算梯度:根据当前参数计算损失函数的梯度(即损失函数对参数的偏导数)。
  3. 更新参数:沿梯度的反方向更新参数,公式为:
    θt+1=θtηθL(θt)\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta L(\theta_t)
    其中 η\eta 是学习率,θL\nabla_\theta L 是梯度。
  4. 迭代收敛:重复步骤 2-3 直到满足停止条件(如达到最大迭代次数或梯度接近零)。

🛠️ 主要参数

scikit-learnSGDClassifierSGDRegressor 中,梯度下降的核心参数如下:

参数名说明默认值/示例值值的含义
loss损失函数类型(如 squared_error, log_loss, hinge 等)。'squared_error'(回归)- squared_error:均方误差
- log_loss:对数损失
- hinge:合页损失(SVM)
- modified_huber:鲁棒分类损失
penalty正则化类型(l1, l2, elasticnet)。'l2'- l1:Lasso 正则化(特征选择)
- l2:Ridge 正则化(防止过拟合)
- elasticnet:L1 + L2 的混合(需设置 l1_ratio
alpha正则化强度(控制模型复杂度)。0.0001值越大,正则化越强(模型越简单);值越小,模型越复杂。
learning_rate学习率调整策略(constant, optimal, invscaling, adaptive)。'optimal'- constant:固定学习率(eta0
- optimal:动态调整学习率(默认)
- invscaling:学习率随迭代次数衰减(eta = eta0 / pow(t, power_t)
- adaptive:根据收敛情况自动调整学习率
eta0初始学习率(仅在 learning_rate='constant' 时生效)。0.01学习率的初始值,过大可能导致震荡,过小导致收敛慢。
max_iter最大迭代次数。1000迭代次数越多,模型训练越充分,但可能过拟合。
tol停止阈值(当损失变化小于该值时停止迭代)。1e-3阈值越小,模型越精确,但训练时间越长。
random_state随机种子(控制权重初始化和数据洗牌)。None固定随机种子可保证实验结果可复现。
batch_size每次迭代使用的样本数量(控制梯度下降类型)。1(默认)- 1:随机梯度下降(SGD)
- n_samples:批量梯度下降(BGD)
- 32~128:小批量梯度下降(Mini-batch GD)

🔍 补充说明

1. loss 参数详解
  • squared_error
    用于回归任务,最小化预测值与真实值的平方误差。
    示例:SGDRegressor(loss='squared_error')

  • log_loss
    用于二分类任务,通过最大化对数似然损失训练逻辑回归模型。
    示例:SGDClassifier(loss='log_loss')

  • hinge
    用于最大间隔分类(支持向量机),适用于线性 SVM。
    示例:SGDClassifier(loss='hinge')

  • modified_huber
    一种鲁棒损失函数,对异常值不敏感,适用于分类任务。
    示例:SGDClassifier(loss='modified_huber')


2. penalty 参数详解
  • l1(Lasso 正则化)
    对权重施加 L1 正则化,强制部分权重为零,实现特征选择。
    适用场景:高维稀疏数据(如文本分类)。

  • l2(Ridge 正则化)
    对权重施加 L2 正则化,防止模型过拟合,保留所有特征。
    适用场景:特征间相关性强的数据(如金融数据)。

  • elasticnet
    L1 和 L2 正则化的混合(需设置 l1_ratio 控制比例)。
    适用场景:特征冗余且需要稀疏解的问题。


📌 注意事项

  1. losspenalty 的兼容性

    • log_losshinge 通常与 l2elasticnet 配合使用。
    • squared_error 通常与 l2 配合使用。
  2. learning_rateeta0 的关系

    • eta0 仅在 learning_rate='constant' 时生效,其他策略会自动调整学习率。
  3. alpha 的选择

    • 通过交叉验证(CV) 选择最佳 alpha,避免过拟合或欠拟合。

⏱️ 时间复杂度

梯度下降的时间复杂度取决于样本数量 nn、特征维度 dd、迭代次数 TT 和批量大小 BB。以下是常见场景的复杂度分析:

方法时间复杂度说明
批量梯度下降O(ndT)O(n \cdot d \cdot T)每次迭代需遍历所有样本,适合小数据集。
随机梯度下降O(dT)O(d \cdot T)每次迭代仅更新一个样本,适合大数据集,但收敛可能不稳定。
小批量梯度下降O(BdT)O(B \cdot d \cdot T),其中 BnB \ll n平衡速度与稳定性,常用 B=32,64,128B=32, 64, 128
正则化优化O(ndT+正则化项计算)O(n \cdot d \cdot T + \text{正则化项计算})L1/L2 正则化会增加梯度计算复杂度,但通常可忽略。

✅ 示例代码(补充参数说明)

from sklearn.linear_model import SGDClassifier
from sklearn.preprocessing import StandardScaler

# 使用逻辑回归(log_loss)和 L2 正则化
clf = SGDClassifier(
    loss='log_loss',        # 逻辑回归损失
    penalty='l2',           # L2 正则化
    alpha=0.001,            # 正则化强度
    learning_rate='optimal', # 自动调整学习率
    max_iter=1000,          # 最大迭代次数
    random_state=42,         # 固定随机种子
    batch_size=n_samples,  # n_samples 是数据集总样本数
    shuffle=False          # 不打乱数据(BGD 需要固定顺序)
)

# 训练模型
clf.fit(X_train, y_train)