Scikit-learn 中的梯度下降算法
🧠 算法思想
梯度下降 是一种迭代优化算法,通过逐步调整模型参数以最小化损失函数。其核心思想是:
- 初始化参数:随机或零初始化模型参数(如线性回归中的权重 和偏置 )。
- 计算梯度:根据当前参数计算损失函数的梯度(即损失函数对参数的偏导数)。
- 更新参数:沿梯度的反方向更新参数,公式为:
其中 是学习率, 是梯度。
- 迭代收敛:重复步骤 2-3 直到满足停止条件(如达到最大迭代次数或梯度接近零)。
🛠️ 主要参数
在 scikit-learn 的 SGDClassifier 和 SGDRegressor 中,梯度下降的核心参数如下:
| 参数名 | 说明 | 默认值/示例值 | 值的含义 |
|---|---|---|---|
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控制比例)。
适用场景:特征冗余且需要稀疏解的问题。
📌 注意事项
-
loss与penalty的兼容性log_loss和hinge通常与l2或elasticnet配合使用。squared_error通常与l2配合使用。
-
learning_rate与eta0的关系eta0仅在learning_rate='constant'时生效,其他策略会自动调整学习率。
-
alpha的选择- 通过交叉验证(
CV) 选择最佳alpha,避免过拟合或欠拟合。
- 通过交叉验证(
⏱️ 时间复杂度
梯度下降的时间复杂度取决于样本数量 、特征维度 、迭代次数 和批量大小 。以下是常见场景的复杂度分析:
| 方法 | 时间复杂度 | 说明 |
|---|---|---|
| 批量梯度下降 | 每次迭代需遍历所有样本,适合小数据集。 | |
| 随机梯度下降 | 每次迭代仅更新一个样本,适合大数据集,但收敛可能不稳定。 | |
| 小批量梯度下降 | ,其中 | 平衡速度与稳定性,常用 。 |
| 正则化优化 | 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)