页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

目录

Stochastic Gradient Descent ( 随机梯度下降 )

Stochastic Gradient Descent (SGD) ( 随机梯度下降( SGD ) ) 是一种简单但非常有效的方法,用于在诸如(线性)支持向量机和 逻辑回归 之类的凸损失函数下的线性分类器的辨别学习。即使 SGD 已经在机器学习社区中长期存在,但最近在大规模学习的背景下已经受到了相当多的关注。
SGD 已成功应用于文本分类和自然语言处理中经常遇到的大规模和稀疏机器学习问题。

SGD 已成功应用于文本分类和自然语言处理中经常遇到的 large-scale and sparse ( 大规模和稀疏 ) 机器学习问题。鉴于数据稀疏,本模块中的分类器容易扩展到具有 10^5 个以上训练样本和超过10^5个特征的问题。

随机梯度下降的优点是:

  • 效率。
  • 易于实施(很多机会进行代码调优)。

随机梯度下降的缺点包括:

  • SGD 需要一些 hyperparameters  ( 超参数 ) ,如 regularization parameter ( 正则化参数 ) 和迭代次数。
  • SGD 对特征缩放敏感。

Classification ( 分类 )

警告
title警告

确保您在安装模型之前 permute (shuffle) ( 排列( 洗牌 ) ) 您的训练数据,或者使用 shuffle = True 在每次迭代后 shuffle ( 洗牌 )。

SGDClassifier 类实现了一个简单的随机梯度下降学习程序,支持不同的 loss functions ( 损失函数 ) penalties for classification ( 分类处罚 )

作为其他分类器,SGD 必须拟合两个 array :保存训练样本的 size[n_samples,n_features]array X 以及保存训练样本的目标值(类标签)的 size [n_samples] 的阵列 Y

代码块
languagebash
>>> from sklearn.linear_model import SGDClassifier
>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = SGDClassifier(loss="hinge", penalty="l2")
>>> clf.fit(X, y)
SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,
       eta0=0.0, fit_intercept=True, l1_ratio=0.15,
       learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1,
       penalty='l2', power_t=0.5, random_state=None, shuffle=True,
       verbose=0, warm_start=False)

拟合之后,该模型可用于预测新值:

代码块
languagebash
>>> clf.predict([[2., 2.]])
array([1])

SGD 拟合训练数据的线性模型。成员 coef_ 保存模型参数:

代码块
languagebash
>>> clf.coef_                                         
array([[ 9.9...,  9.9...]])

成员 intercept_ 保持 intercept ( 截距 )(aka offsetbias ):

代码块
languagebash
>>> clf.intercept_                                    
array([-9.9...])

模型是否应该使用 intercept ( 截距 ) ,即 biased hyperplane ( 偏置的超平面 ) ,由参数 fit_intercept 控制。
要获得与超平面的 signed distance ,请使用 SGDClassifier.decision_function

代码块
languagebash
>>> clf.decision_function([[2., 2.]])                 
array([ 29.6...])

具体的 loss function ( 损耗函数 损失函数 ) 可以通过  loss parameter ( 损耗参数 损失参数 ) 设置。 SGDClassifier 支持以下损失函数:

  • loss="hinge": (soft-margin) linear Support Vector Machine, ( 线性支持向量机 )
  • loss="modified_huber": smoothed hinge loss, ( 平滑的 hinge 损失 )
  • loss="log": logistic regression, ( 逻辑回归 )
  • and all regression losses below. ( 所有回归损失 )

前两个 loss functions ( 丢失函数 损失函数 ) 是 lazy (  懒惰 )的,如果一个例子违反了 margin constraint ( 边界约束 ) ,则它们仅更新模型参数,这使得训练非常有效,并且即使使用了 L2 penalty ( L2 惩罚  惩罚 ) ,也可能导致较差的模型。

使用 loss =“log”loss =“modified_huber” 启用 predict_proba 方法,其给出每个样本 x 的概率估计  向量 x

代码块
languagebash
>>> clf = SGDClassifier(loss="log").fit(X, y)
>>> clf.predict_proba([[1., 1.]])                      
array([[ 0.00...,  0.99...]])

concrete penalty ( 具体惩罚 具体惩罚 ) 可以通过 penalty parameter ( 惩罚参数 ) 来设定。 SGD 支持以下处罚:

  • penalty="l2": L2 norm penalty on coef_.
  • penalty="l1": L1 norm penalty on coef_.
  • penalty="elasticnet": Convex combination of L2 and L1; (1 - l1_ratio) * L2 + l1_ratio * L1.

默认设置为 penalty =“l2” L1 惩罚获得 sparse solutions ( 稀疏解 ) ,将大多数系数推到零。在存在高度相关的属性的情况下,Elastic Net ( 弹性网 ) 解决了 L1 惩罚的一些缺陷。参数 l1_ratio 控制 L1L2 惩罚的凸组合。
SGDClassifier 通过在 “one versus all”(OVA) 方案中组合多个二进制分类器来支持多类分类。对于 K 类中的每一个,学习了二进制分类器,以区别于所有其他 K-1 类。在测试时,我们计算每个分类器的置信度分数(即与超平面的有符号距离),并选择具有最高置信度的类。下图显示了虹膜数据集的 OVA 方法。虚线代表三个 OVA 分类器;背景颜色显示由三个分类器引起的决策表面。

在多类分类的情况下, coef_ shape = [n_classes, n_features] 的二维数组,intercept_ shape = [n_classes] 的一维数组。 coef_ 的第 i 行保存第 i 类的 OVA 分类器的权重向量;类按升序编入索引(请参阅 attribute classes_ )。注意,原则上,由于它们允许创建概率模型,所以 loss =“log”loss =“modified_huber” 更适合于 one-vs-all 分类。
SGDClassifier 通过拟合参数 class_weightsample_weight 支持加权类和加权实例。有关更多信息,请参阅下面的示例和 SGDClassifier.fit 的文档字符串。

信息

示例:

SGDClassifier 支持 averaged SGD ( 平均 SGD  ( ASGD )。可以通过设置 “average = True” 来启用平均。 ASGD 通过在样本上的每次迭代中平均平均 SGD 的系数来工作。当使用 ASGD 时,学习率可以更大,甚至是恒定,导致一些数据集在训练时间内加快。
对于具有 logistic loss 的分类,具有 averaging strategy ( 平均策略 ) SGD 的另一变体可用于随机平均梯度(SAG)算法,作为 Logistic 回归中的求解器。

 

Regression ( 回归 )

SGDRegressor 类实现了一个简单的随机梯度下降学习程序,它支持不同的损失函数和惩罚,以适应线性回归模型。 SGDRegressor 非常适合大量培训样本(> 10.000)的回归问题,对于其他问题,我们建议使用 Ridge Lasso ElasticNet
具体的损耗函数可以通过损耗参数设置。 具体的损失函数可以通过损失参数设置。 SGDRegressor 支持以下损失函数:

  • loss="squared_loss": Ordinary least squares,
  • loss="huber": Huber loss for robust regression,
  • loss="epsilon_insensitive": linear Support Vector Regression.

Huberepsilon-insensitive 不敏感损失函数可用于 robust regression (  鲁棒回归 )。不敏感区域的宽度必须通过参数 epsilon 来指定。该参数取决于目标变量的比例。
SGDRegressor 支持平均 SGD 作为 SGDClassifier 。可以通过设置 “average = True” 来启用平均。

对于具有 squared loss ( 平方损失 ) l2 penalty (  l2 惩罚 )的回归,具有平均策略的 SGD 的另一变体可用于随机平均梯度( SAG )算法,作为 Ridge 中的求解器。

Stochastic Gradient Descent for sparse data ( 稀疏数据随机梯度下降 )

信息

注意:

由于截距的缩小学习率,稀疏实现会产生与密集实现相比略有不同的结果。
内置支持以 scipy.sparse 支持的格式在任何矩阵中给出的稀疏数据。但是,为了最大限度地提高效率,请使用 scipy.sparse.csr_matrix 中定义的 CSR 矩阵格式。

信息

示例:

Complexity ( 复杂度 )

SGD 的主要优点在于其效率,在训练实例的数量基本上是线性的。如果 X size(n,p) 的矩阵,训练的成本为 ,其中 k 是迭代次数(历元),并且  是每个样本的非零属性的平均数。
然而,最近的理论结果表明,随着训练集大小的增加,获得一些所需的优化精度的运行时间不会增加。

Tips on Practical Use ( 实用技巧 )

  • 随机梯度下降对特征缩放很敏感,因此强烈建议您扩展数据。例如,将输入向量 X 上的每个属性缩放到 [0,1] [-1,+ 1] ,或将其标准化为平均值 0 和方差 1 . 注意,必须将相同的缩放应用于测试向量获得有意义的结果。这可以使用 StandardScaler 轻松完成:

    代码块
    languagebash
    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 ,通常在 10.0 ** - np.arange(1,7) 范围内。

  • 经验性地,我们发现 SGD 在观察大约后收敛。  10^6 训练样本。因此,对于迭代次数的合理的第一猜测是 n_iter = np.ceil(10 ** 6/n) ,其中 n 是训练集的大小。
  • 如果将 SGD 应用于使用 PCA 提取的特征,我们发现将特征值扩展为常数 c 通常是明智的,以使训练数据的平均 L2 范数等于 1
  • 我们发现平均 SGD 最适合于更多的功能和更高的 eta0 
信息

参考:

Mathematical formulation ( 数学表达 )

给定一组训练示例  其中  和  中,我们的目标是学习线性评分函数 ,其中模型参数 并且在 。为了做出预测,我们只是看一下 f(x) 的符号。找到模型参数的常见选择是通过最小化给出的正则化训练误差

其中L 是衡量模型(mis)拟合的损失函数, R是惩罚模型复杂度的正则化项(又称惩罚) 是非负的超参数。

L 的不同选择需要不同的分类器,例如

  • Hinge: (soft-margin) Support Vector Machines.
  • Log: Logistic Regression.
  • Least-Squares: Ridge Regression.
  • Epsilon-Insensitive: (soft-margin) Support Vector Regression.

所有上述损失函数都可以视为错误分类错误(零一损失)的上限,如下图所示。

正则化术语 R 的常见选择包括:

  • L2 norm: ,
  • L1 norm: , which leads to sparse solutions.
  • Elastic Net: , a convex combination of L2 and L1, where  is given by 1 - l1_ratio.

下图显示当  时,参数空间中不同正则项的轮廓。

 SGD

随机梯度下降是无约束优化问题的优化方法。与(批次)梯度下降相反,SGD 通过一次考虑单个训练示例来近似 E(w,b) 的真实梯度。
SGDClassifier 类实现了一阶 SGD 学习程序。该算法迭代训练示例,并且每个示例根据由给出的更新规则来更新模型参数

其中  是控制参数空间中的步长的学习速率。截距 b 的更新类似但没有正则化。
学习率  可以是常数或逐渐衰减。对于分类,默认学习率调度( learning_rate =“optimal” )由下式给出

其中 t 是时间步长(总共有 n_samples * n_iter 时间步长), t_0 基于 LéonBottou 提出的启发式来确定,使得预期的初始更新与权重的预期大小相当(这假定培训样本的规范约为 1 )。在 BaseSGD 中的 _init_t 中可以找到确切的定义。
对于回归,默认的学习率调度是  inverse scaling ( 反向缩放 )  learning_rate ='invscaling' ),由给出

其中 eta_0 和 是用户通过 eta0power_t 分别选择的超参数。
对于恒定的学习率,使用 learning_rate =“constant” ,并使用 eta0 来指定学习率。
可以通过成员 coef_intercept_ 访问模型参数:

  • Member coef_ holds the weights w
  • Member intercept_ holds b
信息

参考:

Implementation details ( 实施细节 )

SGD 的实现受 LéonBottouStochastic Gradient SVM ( 随机梯度 SVM ) 的影响。 与 SvmSGD 类似,weight vector ( 权重向量 ) 被表示为在 L2 正则化的情况下允许有效的权重更新的标量和向量的乘积。 在 sparse feature vectors ( 稀疏特征向量 ) 的情况下,以更小的学习率(乘以 0.01 )来更新 intercept  ( 截距 ),以考虑更频繁地更新的事实。每个 observed example ( 观察例子 ) 之后依次 picked up ( 拿起 ) Training examples ( 训练样本 ),学习率降低。 我们采用 Shalev-Shwartz 等人的  learning rate schedule ( 学习速度表 )。 对于 multi-class classification ( 多类分类 ),使用 “one versus all” 方法。 我们使用 Tsuruoka 等人提出的 truncated gradient algorithm ( 截断梯度算法 )  2009 L1 regularization(和 Elastic Net )。 代码用 Cython 编写。

信息

参考: