机器学习训练营——机器学习爱好者的自由交流空间(入群联系qq:2279055353)

随机梯度下降(Stochastic Gradient Descent, SGD)是一种简单高效的线性分类器判别学习方法。该方法针对的是凸损失函数,例如,(线性)支持向量机、Logistic回归。虽然SGD在机器学习领域已经提出了很久,但随着近年来的大规模学习它才受到重视。

SGD已经成功地应用到文本分类、自然语言处理这样的大规模和稀疏的机器学习问题里。假设数据是稀疏的,分类器很容易遭遇超过 10510^5105 个训练样本、 10510^5105 个特征这类问题。随机梯度下降的优势主要体现在:

  • 高效率

  • 易执行

它的不足包括:

  • SGD需要很多超参数,例如正则参数、迭代次数。

  • SGD对于特征变换是敏感的。

分类

SGDClassifier执行一个普通的随机梯度下降程序,它支持不同的损失函数和分类惩罚。SGD必须拟合两个数组:[n_samples, n_features]数组X, 装载训练样本; [n_samples]数组Y, 装载训练样本的目标值(即,类标签)。

from sklearn.linear_model import SGDClassifier
X = [[0., 0.], [1., 1.]]
y = [0, 1]
clf = SGDClassifier(loss="hinge", penalty="l2")
clf.fit(X, y)

拟合后的模型可以用来预测新值。

clf.predict([[2., 2.]])

SGD拟合一个线性模型到训练数据上,成员coef_装载模型参数,成员intercept_装载常数项。

clf.coef_
clf.intercept_

至于模型是否应该有常数项,即,一个有偏超平面,由参数fit_intercept控制。
使用SGDClassifier.decision_function得到带符号的超平面距离。

clf.decision_function([[2., 2.]])

损失函数由参数loss设置,SGDClassifier支持下面的几种损失函数:

  • loss=“hinge”: 灵活边界的线性支持向量机

  • loss=“modified_huber”: 平滑的hinge损失

  • loss=“log”: logistic回归

  • 下面所列的所有回归损失

其中,前两个损失函数是lazy的,只有当一个例子样本违反了边界约束,它才升级模型参数。这使得训练非常有效,即使使用L2惩罚也可能导致更稀疏的模型。

使用loss=“log” or loss="modified_huber"时, 能够使用predict_proba方法,它给每一个样本 xxx 一个概率估计 P(y∣x)\mathcal{P}(y | x)P(y∣x) 的向量。

clf = SGDClassifier(loss="log").fit(X, y)
clf.predict_proba([[1., 1.]])

参数penalty设置惩罚项。SGD支持以下惩罚形式:

  • penalty=“l2”: 惩罚在coef_上的L2范数

  • penalty=“l1”: 惩罚在coef_上的L1范数

  • penalty=“elasticnet”: L1, L2的凸组合,(1 - l1_ratio) ×\times× L2 + l1_ratio ×\times× L1

默认设置是penalty=“l2”. L1惩罚导致稀疏解,这使得很多系数被迫为0. 弹性网格解决了L1惩罚在属性高度相关情况下的不足,参数l1_ratio控制L1, L2惩罚的凸组合形式。

SGDClassifier支持多类别分类,这是通过组合多个二值分类器在一个“one versus all” (OVA)方案里实现的。对于K个类的每一个类,学习一个二值分类器,判别属于该类还是其余K-1个类。在检验时,我们计算每一个类的置信分数,即,该类边界与超平面的带符号距离,选择具有最高分数的类。下图解释了iris数据集的OVA方法,其中的虚线代表三个OVA分类器,背景颜色代表了决策面。

在多类的分类里,coef_是一个[n_classes, n_features]二维数组,intercept_是一个[n_classes]一维数组。coef_的第i行装载第i类的权向量,类标号按升序排列。请注意,原则上,由于允许产生一个概率模型,所以loss=“log” and loss="modified_huber"更适合one-vs-all分类。

回归

SGDRegressor执行一个普通的随机梯度下降学习程序,支持不同的损失函数和惩罚拟合线性回归模型。SGDRegressor也很适合大训练样本(>10,000)的回归问题。对于其它问题,我们推荐使用类Ridge, Lasso, ElasticNet.

损失函数由参数loss设置,SGDRegressor支持以下几种损失函数:

  • loss=“squared_loss”: 普通最小二乘

  • loss=“huber”: 稳健回归的huber损失

  • loss=“epsilon_insensitive”: 线性支持向量回归

huber and epsilon_insensitive损失用于稳健回归。非敏感区域的宽度由参数epsilon指定。

实际应用提示

  • 随机梯度下降对于特征scaling是敏感的,因此强烈建议scale数据。例如,scale输入向量X的每个属性到[0, 1]或[-1, 1], 或者标准化为0均值、1标准差。请注意,相同的scaling必须被应用到检验向量,这样才能获得有意义的结果。使用StandardScaler很容易完成。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)  # Don't cheat - fit only on training data
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)  # apply same transformation to test data
  • 使用GridSearchCV找到一个合理的正则项 α\alphaα, 范围通常在10.0**-np.arange(1,7).

  • 经验地,我们发现SGD收敛于观测大概 10610^6106 个训练样本之后。那么,一个合理的迭代数猜想是n_iter = np.ceil(10**6 / n), 这里的n是训练集样本数。

  • 如果你应用SGD到使用主成分提取的特征上,你会发现按下面的办法scale特征是明智的:通过某常数c, 使得训练数据的平均的L2范数等于1.

数学原理

给定一个训练样本集 (x1,y1),…,(xn,yn)(x_1, y_1), \dots, (x_n, y_n)(x1​,y1​),…,(xn​,yn​), xi∈Rm, yi∈{−1,1}x_i\in\mathbb{R}^m,\,y_i\in\{-1, 1\}xi​∈Rm,yi​∈{−1,1}, 我们的目标是学习一个线性打分函数 f(x)=wTx+bf(x)=w^{\mathrm{T}}x+bf(x)=wTx+b, 其中模型参数 w∈Rmw\in\mathbb{R}^mw∈Rm, 截距项 b∈Rb\in\mathbb{R}b∈R. 为了作预测,我们只考虑 f(x)f(x)f(x) 的符号。估计模型参数的一个普遍的方法是最小化正则的训练误差
E(w,b)=1n∑i=1nL(yi,f(xi))+αR(w)E(w, b)=\frac{1}{n}\sum\limits_{i=1}^n L(y_i, f(x_i))+\alpha R(w)E(w,b)=n1​i=1∑n​L(yi​,f(xi​))+αR(w)

这里, LLL 是测量模型拟合的损失函数, RRR 是正则项,或称惩罚项,惩罚模型的复杂度。α\alphaα 是一个非负超参数。选择不同的损失函数对应不同的分类器:

  • Hinge: 灵活边界的支持向量机

  • Log: Logistic回归

  • Least-Squares: 岭回归

  • Epsilon-Insensitive: 灵活边界的支持向量回归

以上所有损失函数都被当作错分误差的上界,如下图所示

对于正则项 RRR 的主流选择包括:

  • L2范数: R(w)=12∑i=1nwi2R(w)=\frac{1}{2}\sum\limits_{i=1}^n w_i^2R(w)=21​i=1∑n​wi2​

  • L1范数: R(w)=∑i=1n∣wi∣R(w)=\sum\limits_{i=1}^n |w_i|R(w)=i=1∑n​∣wi​∣, 导致稀疏解

  • 弹性网格: R(w)=ρ2∑i=1nwi2+(1−ρ)∑i=1n∣wi∣R(w)=\frac{\rho}{2}\sum\limits_{i=1}^n w_i^2+(1-\rho)\sum\limits_{i=1}^n |w_i|R(w)=2ρ​i=1∑n​wi2​+(1−ρ)i=1∑n​∣wi​∣, L1, L2的凸组合, ρ\rhoρ 由1 - l1_ratio指定。

SGD

随机梯度下降(SGD)是一个优化方法,主要用于无约束的优化问题。与传统的梯度下降比较,SGD近似 E(w,b)E(w, b)E(w,b) 的真实梯度,一次考虑一个训练样本。类SGDClassifier执行一个一阶的SGD学习程序,该算法在训练样本上迭代。对于每一个样本,根据以下公式升级参数
w←w−η(α∂R(w)∂w+∂L(wTxi+b,yi)∂w)w\leftarrow w- \eta(\alpha\frac{\partial R(w)}{\partial w}+\frac{\partial L(w^{\mathrm{T}}x_i+b, y_i)}{\partial w})w←w−η(α∂w∂R(w)​+∂w∂L(wTxi​+b,yi​)​)

这里, η\etaη 是学习率,用来控制参数空间的搜索步长,或者为常数,或者逐渐减小。对于分类问题,默认的学习率learning_rate=‘optimal’, 由下式给出
η(t)=1α(t0+t)\eta^{(t)}=\frac{1}{\alpha(t_0+t)}η(t)=α(t0​+t)1​

这里, ttt 是时间步长,总共有n_samples * n_iter 次步, t0t_0t0​ 由一个heuristic方法确定,它的精确定义可以在BaseSGD的_init_t里找到。

对于回归,默认的学习率learning_rate=‘invscaling’, 由下式给出

η(t)=eta0tpower_t\eta^{(t)}=\frac{eta_0}{t^{power\_t}}η(t)=tpower_teta0​​
这里,eta0eta_0eta0​, tpower_tt^{power\_t}tpower_t 是超参数,由用户在eta0, power_t里选择。

对于一个常数学习率,使用learning_rate=‘constant’, 由eta0指定学习率。

模型参数可以由成员coef_, intercept_访问。

  • 成员coef_装载权向量 www

  • 成员intercept_装载 bbb

精彩内容,请关注微信公众号:统计学习与大数据

【sklearn第十一讲】随机梯度下降相关推荐

  1. sklearn自学指南(part24)--随机梯度下降

    学习笔记,仅供参考,有错必纠 文章目录 随机梯度下降 分类 回归 稀疏数据的随机梯度下降 复杂性 停止准则 使用贴士 数学原理 随机梯度下降 随机梯度下降(SGD)是一种简单但非常有效的方法来拟合凸损 ...

  2. 大白话5分钟带你走进人工智能-第十一节梯度下降之手动实现梯度下降和随机梯度下降的代码(6)...

                                第十一节梯度下降之手动实现梯度下降和随机梯度下降的代码(6) 我们回忆一下,之前咱们讲什么了?梯度下降,那么梯度下降是一种什么算法呢?函数最优化 ...

  3. 深度学习(33)随机梯度下降十一: TensorBoard可视化

    深度学习(33)随机梯度下降十一: TensorBoard可视化 Step1. run listener Step2. build summary Step3.1 fed scalar(监听标量) S ...

  4. Sklearn官方文档中文整理4——随机梯度下降和最近邻篇

    Sklearn官方文档中文整理4--随机梯度下降和最近邻篇 1. 监督学习 1.5. 随机梯度下降 1.5.1. 分类[linear_model.SGDClassifier] 1.5.2. 回归[li ...

  5. 深度学习与计算机视觉系列(4)_最优化与随机梯度下降\数据预处理,正则化与损失函数

    1. 引言 上一节深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器中提到两个对图像识别至关重要的概念: 用于把原始像素信息映射到不同类别得分的得分函数/score function 用 ...

  6. Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降

    Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现 在上一小节中,我们已经成功的构建了逻辑回归的损失函数,但由于逻辑回归模型本身的特殊性,我们在构造损失函数时无法采用 ...

  7. Python统计分析--- 5.统计法与随机梯度下降(SGD)

    #导入包 import numpy as np import pandas as pd import matplotlib as plt import statsmodels.formula.api ...

  8. 深度学习(32)随机梯度下降十: 手写数字识别问题(层)

    深度学习(32)随机梯度下降十: 手写数字识别问题(层) 1. 数据集 2. 网络层 3. 网络模型 4. 网络训练 本节将利用前面介绍的多层全连接网络的梯度推导结果,直接利用Python循环计算每一 ...

  9. 深度学习_07_2_随机梯度下降_激活函数及梯度损失函数及梯度

    07_2_随机梯度下降_激活函数及梯度&损失函数及梯度 激活函数及其梯度 Activation Functions(激活函数) 研究青蛙的神经元有多个输入,比如x0,x1,x2x_0,x_1, ...

  10. excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...

    文章目录 1.梯度 2.多元线性回归参数求解 3.梯度下降 4.梯度下降法求解多元线性回归 梯度下降算法在机器学习中出现频率特别高,是非常常用的优化算法. 本文借多元线性回归,用人话解释清楚梯度下降的 ...

最新文章

  1. delete与delete[]
  2. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注
  3. Codeforces Round #499 (Div. 2) Problem-A-Stages(水题纠错)
  4. 【TensorFlow】笔记2:深层神经网络
  5. 人工智能教程007:创建一个卷积神经网络(2)
  6. 使用NetBeans Lambda支持在Java 8中使用Lambda表达式对列表进行排序
  7. 西固哪家计算机学校好,兰州市西固区有什么技术学校和大学
  8. oracle序列的描述,Oracle同义词和序列的基本使用方法
  9. 读书笔记《React:引领未来的用户界面开发框架》
  10. DatabaseMetaData information is not known for server DB2/xxx by this version of JDBC driver
  11. 冻库正常低压力是多少_弹涂鱼上市卖不动,还有8万斤要进冻库,市场低迷,不值钱了...
  12. JQuery之拖拽插件
  13. Ubuntu 20.04美化及QQ、微信、ssh客户端安装
  14. 内网入口——代理搭建端口转发
  15. 有关获取并保存微信头像到本地服务器
  16. Ashampoo WinOptimizer 2021
  17. 你用过的论文写作神工具有哪些?
  18. QGraphicsView放大和缩小下鼠标位置使用鼠标滚轮
  19. sm4 的s盒_sm4 - zJanly - 博客园
  20. 十一长假宅到底,Wi-Fi可能伤不起

热门文章

  1. JavaScript的Forms验证-Parsley.js
  2. ld 命令看内存布局 汇编级调试
  3. web安全day26:今天,算是把linux的用户管理弄明白了
  4. 游戏筑基开发之一级指针、二级指针的使用情形(C语言)
  5. NetDevOps常用数据库安装与基本操作--SQL数据库
  6. 华为QoS中CBQ队列详解
  7. Kubernetes之实战入门
  8. php---遍历一个数组获得一个新的数据结构
  9. 金融冬天 IT产业如何应对危险与机遇
  10. 高通似乎成了台积电和三星在先进工艺上暗战主角