如何在sklearn中实现带动量的随机梯度下降(SGD)线性回归模型
基于sklearn实现带动量的SGD线性回归入门指引
sklearn内置的SGDRegressor已经原生支持普通动量与Nesterov动量变体,不需要手动从0实现,仅需在初始化时配置对应参数即可。你给出的基础代码未配置动量相关参数,修改方法如下:
核心动量参数说明
momentum:动量权重参数,取值范围0~1,行业通用最优默认值为0.9,设置为0时等价于无动量的普通SGDnesterov:布尔值参数,设置为True时启用Nesterov加速动量,相比普通动量收敛速度更快、稳定性更高,一般建议开启learning_rate:学习率调度策略,动量模式下不要使用默认的optimal选项,建议选择constant(固定学习率)、invscaling(学习率随迭代反比衰减)或adaptive(收敛停滞时自动下调学习率)eta0:初始学习率,使用动量时必须手动指定该参数,可优先尝试0.01、0.001等常见值调试
调整后可运行代码
from sklearn import linear_model from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler # 加载数据集 X,y = load_boston().data,load_boston().target # SGD类优化器对特征尺度极其敏感,必须先做标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 初始化带动量的SGD线性回归模型 clf = linear_model.SGDRegressor( loss='squared_loss', penalty='l2', alpha=0.01, max_iter=1000, # 动量相关配置 learning_rate='invscaling', eta0=0.01, momentum=0.9, nesterov=True, random_state=42 ) clf.fit(X_scaled, y) print('Score:',clf.score(X_scaled,y)) print('Regression coefficients:',clf.coef_) print('deviation:',clf.intercept_ )
额外注意事项
- 特征标准化是SGD类模型生效的前提,缺失这一步会导致动量更新方向被大尺度特征主导,出现收敛慢、精度低甚至不收敛的问题
- 调参时可先固定
momentum=0.9、nesterov=True,再调整初始学习率eta0与学习率调度策略,最后调整正则化系数alpha即可得到最优效果 - 如果需要自定义动量逻辑,sklearn的
SGDRegressor不支持自定义优化器扩展,可改用PyTorch、TensorFlow等深度学习框架的底层优化器接口实现,仅需少量代码即可完成带动量的线性回归训练
内容的提问来源于stack exchange,提问作者Steven Oh
相关产品推荐
相关产品推荐

