随机梯度下降(SGD) 是一种简单但又非常高效的方法,主要用于凸损失函数下线性分类器的判别式学习,例如(线性) 支持向量机 和 Logistic 回归 。 尽管 SGD 在机器学习社区已经存在了很长时间, 但是最近在 large-scale learning (大规模学习)方面 SGD 获得了相当大的关注。
Stochastic Gradient Descent (随机梯度下降法)的优势:
- 高效。
- 易于实现 (有大量优化代码的机会)。
Stochastic Gradient Descent (随机梯度下降法)的劣势:
- SGD 需要一些超参数,例如 regularization (正则化)参数和 number of iterations (迭代次数)。
- SGD 对 feature scaling (特征缩放)敏感。
在拟合模型前,确保你重新排列了(打乱))你的训练数据,或者在每次迭代后用 shuffle=True
来打乱。
SGDClassifier
类实现了一个简单的随机梯度下降学习例程, 支持不同的 loss functions(损失函数)和 penalties for classification(分类处罚)。
>>> 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', max_iter=5, n_iter=None,
n_jobs=1, penalty='l2', power_t=0.5, random_state=None,
shuffle=True, tol=None, verbose=0, warm_start=False)
使用 SGDClassifier.decision_function
来获得到此超平面的 signed distance (符号距离)
>>> clf.decision_function([[2., 2.]])
array([ 29.6...])
具体的 loss function(损失函数) 可以通过 loss
参数来设置。 SGDClassifier
支持以下的 loss functions(损失函数):
loss="hinge"
: (soft-margin) linear Support Vector Machine ((软-间隔)线性支持向量机),loss="modified_huber"
: smoothed hinge loss (平滑的 hinge 损失),loss="log"
: logistic regression (logistic 回归),- and all regression losses below(以及所有的回归损失)。
前两个 loss functions(损失函数)是懒惰的,如果一个例子违反了 margin constraint(边界约束),它们仅更新模型的参数, 这使得训练非常有效率,即使使用了 L2 penalty(惩罚)我们仍然可能得到稀疏的模型结果。
使用 loss="log"
或者 loss="modified_huber"
来启用 predict_proba
方法, 其给出每个样本 的概率估计 的一个向量:
>>> clf = SGDClassifier(loss="log").fit(X, y)
>>> clf.predict_proba([[1., 1.]])
array([[ 0.00..., 0.99...]])
具体的惩罚方法可以通过 penalty
参数来设定。 SGD 支持以下 penalties(惩罚):
penalty="l2"
: L2 norm penalty oncoef_
.penalty="l1"
: L1 norm penalty oncoef_
.penalty="elasticnet"
: Convex combination of L2 and L1(L2 型和 L1 型的凸组合);(1 - l1_ratio) * L2 + l1_ratio * L1
.
默认设置为 penalty="l2"
。 L1 penalty (惩罚)导致稀疏解,使得大多数系数为零。 Elastic Net(弹性网)解决了在特征高相关时 L1 penalty(惩罚)的一些不足。参数 l1_ratio
控制了 L1 和 L2 penalty(惩罚)的 convex combination (凸组合)。
在 multi-class classification (多类分类)的情况下, coef_
是 shape=[n_classes, n_features]
的一个二维数组, intercept_
是 shape=[n_classes]
的一个一维数组。 coef_
的第 i 行保存了第 i 类的 OVA 分类器的权重向量;类以升序索引 (参照属性 classes_
)。 注意,原则上,由于它们允许创建一个概率模型,所以 loss="log"
和 loss="modified_huber"
更适合于 one-vs-all 分类。
SGDClassifier
通过拟合参数 class_weight
和 sample_weight
来支持 weighted classes (加权类)和 weighted instances(加权实例)。
例子:
- SGD:分离超平面的最大边距,
- 在虹膜数据集上绘制多类SGD
- SGD:加权样本
- 比较各种在线求解器
- SVM:为不平衡类分离超平面(参见参考资料
Note
)
SGDClassifier
支持平均SGD(ASGD)。可以通过设置启用平均`average=True`
。ASGD通过在样本上每次迭代平均普通SGD的系数来工作。当使用ASGD时,学习速率可以更大,甚至不变,导致某些数据集在训练时间内加速。
对于具有逻辑损失的分类,具有平均策略的SGD的另一种变体可用于随机平均梯度(SAG)算法,其可用作解算器LogisticRegression
。
SGDRegressor
实现了一个简单的随机梯度下降学习程序,它支持不同的损失函数和惩罚以拟合线性回归模型。SGDRegressor
非常适合回归问题具有大量训练样本(> 10.000),对于其他的问题,我们建议的Ridge
, Lasso
或ElasticNet
。
具体的损失功能可以通过loss
参数设置。SGDRegressor
支持以下丢失功能:
loss="squared_loss"
: 普通最小二乘,loss="huber"
:Huber损失的稳健回归,loss="epsilon_insensitive"
:线性支持向量回归。
Huber 和 epsilon-insensitive 损失函数可用于 robust regression(鲁棒回归)。不敏感区域的宽度必须通过参数 epsilon
来设定。这个参数取决于目标变量的规模。
SGDRegressor
支持 ASGD(平均随机梯度下降) 作为SGDClassifier
。均值化可以通过设置 average=True
来启用。
对于利用了 squared loss(平方损失)和 l2 penalty(l2惩罚)的回归,在 Ridge
中提供了另一个采取 averaging strategy(平均策略)的 SGD 变体,其使用了随机平均梯度 (SAG) 算法。
StandardScaler
: 很容易做到这一点:GridSearchCV
找到一个合理的 regularization term (正则化项) , 它的范围通常在 10.0**-np.arange(1,7)
。n_iter = np.ceil(10**6 / n)
,其中 n
是训练集的大小