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) −
-
保存训练样本的数组 X。它的尺寸为 [n_samples, n_features]。
-
保存目标值的数组 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 模块的损失参数,正值如下:
-
squared_loss − 它指的是普通的最小二乘拟合。
-
huber: SGDRegressor − 通过从均方差损失切换到线性损失来纠正距离超过 epsilon 值的异常值。“huber” 的作用是修改“squared_loss”,以便算法较少关注纠正异常值。
-
epsilon_insensitive − 实际上,它忽略了小于 epsilon 的误差。
-
squared_epsilon_insensitive − 它与 epsilon_insensitive 相同。唯一的区别是它在线性损失超过 epsilon 容差时变成平方损失。
另一个区别是,名为“power_t”的参数的默认值是 0.25,而不是如 SGDClassifier 中的 0.5。此外,它没有“class_weight”和“n_jobs”参数。
Attributes
SGDRegressor 的属性也与 SGDClassifier 模块的属性相同。相反,它具有三个额外的属性,如下所示:
-
average_coef_ − array, shape(n_features,)
顾名思义,它提供了分配给特征的平均权重。
-
average_intercept_ − array, shape(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