Scikit Learn 简明教程

Scikit Learn - Stochastic Gradient Descent

在这里,我们将了解 Sklearn 中的一种优化算法,称为随机梯度下降 (SGD)。

随机梯度下降 (SGD) 是一种简单而有效的优化算法,用于查找最小化成本函数的函数参数/系数的值。换句话说,它用于在凸损失函数(如 SVM 和逻辑回归)下对线性分类器进行判别学习。它已成功应用于大型数据集,因为对系数的更新对每个训练实例执行,而不是在实例结束时执行。

SGD Classifier

随机梯度下降 (SGD) 分类器基本上实现了支持各种损失函数和分类惩罚的普通 SGD 学习例程。Scikit-learn 提供 ` SGDClassifier ` 模块来实现 SGD 分类。

Parameters

下表包含 ` SGDClassifier ` 模块使用的参数 -

Sr.No

Parameter & Description

1

` loss ` - str,默认值 = 'hinge’它表示在实现时要使用的损失函数。默认值为 'hinge',它将为我们提供线性 SVM。可使用的其他选项为 - ` log ` - 此损失将为我们提供逻辑回归,即概率分类器。` modified_huber ` - 一个平滑损失,它使容忍离群点与概率估计一起。` squared_hinge ` - 类似于“hinge”损失,但它是二次惩罚的。 ` perceptron ` - 如名称所示,它是一个线性损失,它被感知器算法使用。

2

` penalty ` - str,'none','l2','l1','elasticnet’它是模型中使用的正则化项。默认情况下,它是 L2。我们可以使用 L1 或 'elasticnet',但两者都可能使模型稀疏,因此无法用 L2 实现。

3

` alpha ` - float,默认值为 0.0001Alpha,乘以正则化项的常数,是调整参数,它决定了我们想要对模型进行多少惩罚。默认值为 0.0001。

4

` l1_ratio ` - float,默认值为 0.15这称为 ElasticNet 混合参数。它的范围是 0 < = l1_ratio < = 1。如果 l1_ratio = 1,则惩罚将是 L1 惩罚。如果 l1_ratio = 0,则惩罚将是 L2 惩罚。

5

` fit_intercept ` - 布尔值,默认值为 True此参数指定应将常数(偏差或截距)添加到决策函数中。如果没有截距将在计算中使用,并且假设数据已经居中,如果设置为 false。

6

` tol ` - 浮点数或无,可选,默认值为 1.e-3此参数表示迭代的停止标准。其默认值为 False,但如果设置为 None,则在 n_iter_no_change 个连续历元中达到 𝒍loss > *best_loss - tol 时,迭代将停止。

7

` shuffle ` - 布尔值,可选,默认值为 True此参数表示我们是否希望在每个历元后对我们的训练数据进行洗牌。

8

` verbose ` - 整数,默认值为 0它表示冗余级别。它的默认值为 0。

9

` epsilon ` - 浮点数,默认值为 0.1此参数指定不敏感区域的宽度。如果 loss = 'epsilon-insensitive',则当前预测与正确标签之间的任何差异小于阈值将被忽略。

10

max_iter - int,可选,默认 = 1000 顾名思义,它表示通过 epoch(即训练数据)的最大传递次数。

11

warm_start − 布尔值,可选,默认 = false如果将此参数设置为 True,我们可以重用先前调用 fit 作为初始化的解。如果我们选择默认值(即 false),它将清除先前的解。

12

random_state − int、随机状态实例或 None,可选,默认 = none该参数表示伪随机数的种子,该种子在洗牌数据时使用。以下是选项。 int − 在这种情况下, random_state 是随机数生成器使用的种子。 RandomState instance − 在这种情况下, random_state 是随机数生成器。 None − 在这种情况下,随机数生成器是由 np.random 使用的 RandonState 实例。

13

n_jobs − int 或 none,可选,默认 = None它表示在 OVA(一对多)计算中用于多类问题的 CPU 数量。默认值是 none,即 1。

14

learning_rate − 字符串,可选,默认 = ‘optimal’如果学习率为“constant”,则 eta = eta0;如果学习率为“optimal”,则 eta = 1.0/(alpha*(t+t0)),其中 t0 由 Leon Bottou 选择;如果学习率 = ‘invscalling’,则 eta = eta0/pow(t, power_t)。如果学习率 = ‘adaptive’,则 eta = eta0。

15

eta0 − 双精度浮点数,默认 = 0.0它表示上述学习率选项(即“constant”、“invscalling”或“adaptive”)的初始学习率。

16

power_t − 双精度浮点数,默认 =0.5它是“incscalling”学习率的指数。

17

early_stopping − 布尔值,默认 = False此参数表示在验证分数未提高时使用早期停止来终止训练。其默认值为 false,但当设置为 true 时,它会自动将训练数据的分层分数留作验证,并在验证分数未提高时停止训练。

18

validation_fraction − 浮点数,默认 = 0.1仅在 early_stopping 为 true 时使用。它代表了保留为验证集以提前终止训练数据的训练数据比例。

19

n_iter_no_change − int,默认 = 5它表示在早期停止之前算法应运行的,没有改进的迭代次数。

20

classs_weight − 字典,{class_label: weight} 或“balanced”或 None,可选此参数表示与类关联的权重。如果没有提供,则假设类的权重为 1。

20

warm_start − 布尔值,可选,默认 = false如果将此参数设置为 True,我们可以重用先前调用 fit 作为初始化的解。如果我们选择默认值(即 false),它将清除先前的解。

21

average − 布尔值或 int,可选,默认 = false它表示在 OVA(一对多)计算中用于多类问题的 CPU 数量。默认值是 none,即 1。

Attributes

下表包含 SGDClassifier 模块使用的属性 −

Sr.No

Attributes & Description

1

coef_ − 数组,形状 (1, n_features)(如果 n_classes==2),否则为 (n_classes, n_features)此属性提供了分配给特征的权重。

2

intercept_ − 数组,形状 (1,)(如果 n_classes==2),否则为 (n_classes,)它表示决策函数中的独立项。

3

n_iter_ − int它给出达到停止标准的迭代次数。

Implementation Example

与其他分类器类似,必须使用以下两个数组拟合随机梯度下降 (SGD) −

  1. 保存训练样本的数组 X。它的尺寸为 [n_samples, n_features]。

  2. 保存目标值的数组 Y,即训练样本的类标签。它的尺寸为 [n_samples]。

Example

使用 SGDClassifier 线性模型 − 的 Python 脚本如下:

import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
SGDClf = linear_model.SGDClassifier(max_iter = 1000, tol=1e-3,penalty = "elasticnet")
SGDClf.fit(X, Y)

Output

SGDClassifier(
   alpha = 0.0001, average = False, class_weight = None,
   early_stopping = False, epsilon = 0.1, eta0 = 0.0, fit_intercept = True,
   l1_ratio = 0.15, learning_rate = 'optimal', loss = 'hinge', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, n_jobs = None, penalty = 'elasticnet',
   power_t = 0.5, random_state = None, shuffle = True, tol = 0.001,
   validation_fraction = 0.1, verbose = 0, warm_start = False
)

Example

现在,在拟合模型后,可以预测新值如下所示:

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

Output

array([2])

Example

对于上述示例,我们可以借助以下 Python 脚本获取权重向量:

SGDClf.coef_

Output

array([[19.54811198, 9.77200712]])

Example

同样,我们可以借助以下 Python 脚本获取截距值:

SGDClf.intercept_

Output

array([10.])

Example

我们可以使用以下 Python 脚本中使用的 SGDClassifier.decision_function 来获取到超平面的有符号距离:

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

Output

array([68.6402382])

SGD Regressor

随机梯度下降 (SGD) 回归器基本执行一个朴素的 SGD 学习例程,支持各种损失函数和惩罚项来拟合线性回归模型。Scikit-learn 提供了 SGDRegressor 模块来实现 SGD 回归。

Parameters

SGDRegressor 所使用的参数与 SGDClassifier 模块中使用的参数几乎相同。不同之处在于“损失”参数。对于 SGDRegressor 模块的损失参数,正值如下:

  1. squared_loss − 它指的是普通的最小二乘拟合。

  2. huber: SGDRegressor − 通过从均方差损失切换到线性损失来纠正距离超过 epsilon 值的异常值。“huber” 的作用是修改“squared_loss”,以便算法较少关注纠正异常值。

  3. epsilon_insensitive − 实际上,它忽略了小于 epsilon 的误差。

  4. squared_epsilon_insensitive − 它与 epsilon_insensitive 相同。唯一的区别是它在线性损失超过 epsilon 容差时变成平方损失。

另一个区别是,名为“power_t”的参数的默认值是 0.25,而不是如 SGDClassifier 中的 0.5。此外,它没有“class_weight”和“n_jobs”参数。

Attributes

SGDRegressor 的属性也与 SGDClassifier 模块的属性相同。相反,它具有三个额外的属性,如下所示:

  1. average_coef_ − array, shape(n_features,)

顾名思义,它提供了分配给特征的平均权重。

  1. average_intercept_ − array, shape(1,)

顾名思义,它提供了平均截距项。

  1. t_ − int

它提供了在训练阶段执行的权重更新次数。

Note − 在将参数“average”启用为 True 后,属性 average_coef_ 和 average_intercept_ 将生效。

Implementation Example

使用 SGDRegressor 线性模型的 Python 脚本如下:

import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
rng = np.random.RandomState(0)
y = rng.randn(n_samples)
X = rng.randn(n_samples, n_features)
SGDReg =linear_model.SGDRegressor(
   max_iter = 1000,penalty = "elasticnet",loss = 'huber',tol = 1e-3, average = True
)
SGDReg.fit(X, y)

Output

SGDRegressor(
   alpha = 0.0001, average = True, early_stopping = False, epsilon = 0.1,
   eta0 = 0.01, fit_intercept = True, l1_ratio = 0.15,
   learning_rate = 'invscaling', loss = 'huber', max_iter = 1000,
   n_iter = None, n_iter_no_change = 5, penalty = 'elasticnet', power_t = 0.25,
   random_state = None, shuffle = True, tol = 0.001, validation_fraction = 0.1,
   verbose = 0, warm_start = False
)

Example

现在,一旦拟合,我们可以借助以下 Python 脚本获取权重向量:

SGDReg.coef_

Output

array([-0.00423314, 0.00362922, -0.00380136, 0.00585455, 0.00396787])

Example

同样,我们可以借助以下 Python 脚本获取截距值:

SGReg.intercept_

Output

SGReg.intercept_

Example

我们可以在训练阶段借助以下 Python 脚本获取权重更新次数−

SGDReg.t_

Output

61.0

Pros and Cons of SGD

ESG 的优点如下 −

  1. 随机梯度下降 (SGD) 非常高效。

  2. 由于可以对代码进行调整,因此非常容易实现。

SGD 的缺点如下 −

  1. 随机梯度下降 (SGD) 需要多个超参数,如正则化参数。

  2. 它对特征缩放很敏感。