随机梯度下降是一种用于解决使用凸损失函数的线性分类器的方法,如,支持向量机和逻辑回归。它在大规模学习的背景下,吸引了大量的注意。
随机梯度下降的优点:
随机梯度下降的缺点:
在拟合模型时,确保在每次迭代后,打乱训练数据。
SGDClassifier
实现了一个基本的随机梯度学习函数,支持不同的损失函数和惩罚。
损失函数包括:
loss='hinge
:(soft-margin) linear Support Vector Machineloss='modified_huber'
:smoothed hinge lossloss='log'
:logistic regression惩罚包括:
penalty='l2'
:L2范数penalty='l1'
:L1范数penalty='elasticnet'
:L2和L1范数的凸组合;(1 - l1_ratio) * L2 + l1_ratio * L1
SGDClassifier
以one versus all (OVA)
方式组合多个二元分类器来支持多类别分类。对 K K K个类别中的每一类,学习这个类和其它 K − 1 K-1 K−1个类的差别得到一个二元分类器。在测试时,计算每类距超平面的带符号的距离,选择具有最大距离的类。
# coding: utf-8
# SGD: Maximum margin separating hyperplane
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier
from sklearn.datasets import make_blobs
X, Y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)
clf = SGDClassifier(loss='hinge', alpha=0.01, max_iter=2000)
clf.fit(X, Y)
xx = np.linspace(-1, 5, 10)
yy = np.linspace(-1, 5, 10)
X1, X2 = np.meshgrid(xx, yy)
Z = np.empty(X1.shape)
# np.ndenumerate: Return an iterator yielding pairs of array coordinates and values
for (i, j), val in np.ndenumerate(X1):
x1 = val
x2 = X2[i, j]
p = clf.decision_function([[x1, x2]])
Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = ['dashed', 'solid', 'dashed']
colors = 'k'
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolor='black', s=20)
plt.axis('tight')
plt.show()
类SGDRegressor
实现了一种随机梯度下降的函数,支撑不同的惩罚函数和惩罚来拟合线性回归模型。SGDRegressor
适用超过10000以上训练样本的回归问题,对于其它问题,推荐使用Ridge
、Lasso
和ElasticNet
。
通过loss
参数,可设置的损失函数包括:
loss = 'squared_loss'
:Ordinary least squaresloss = 'huber'
:Huber loss for robust regressonloss='epsilon_insensitive'
:linear support vector regressionHuber
和epsilon-insensitive
损失函数能够被用于鲁棒回归。不敏感区域的宽度可通过参数epsilon
参数设置。这个参数依赖于目标变量的尺度。
SGDRegressor
支持平均的SGD
作为SGDClassifier
。通过设置参数average=True
。
由于对截距的收缩学习率,稀疏实现得到的结果与密集的稍有不同。一般使用scipy.sparse
和scipy.sparse.csr_matrix
格式的矩阵。
SGDClassifier
和SGDRegression
提供了两种终止准则:
early_stopping = True
,输入数据被划分为一个训练集和一个验证集,模型拟合到训练集,终止规则基于在验证集上的预测分数。验证集的大小能够按照参数validation_fraction
的值变化。early_stopping = False
,模型拟合在整个数据集上,终止规则基于输入数据上计算的目标函数。StandardScaler
类完成GridSearchCV
找到合理的正则化参数alpha
10^6
个训练样本时,SGD趋于收敛。因此,一个合理的迭代次数设置为max_iter = np.ceil(10**6/n)
,n
是训练集的大小l2
范数等于1的c
值eta0
的情况下,表现最好给定一个训练集 ( x 1 , y 1 ) , . . . ( x n , y n ) (x_1, y_1), ... (x_n, y_n) (x1,y1),...(xn,yn),其中, x i ∈ R m x_i \in R^m xi∈Rm和 y i ∈ − 1 , 1 y_i \in {-1, 1} yi∈−1,1,目标是学习一个线性打分函数 f ( x ) = w T x + b f(x) = w^Tx + b f(x)=wTx+b,其中,模型参数 w ∈ R m w \in R^m w∈Rm和截距 b ∈ R b \in R b∈R。为了做预测,需看 f ( x ) f(x) f(x)的符号。一个常用的选择是找到模型参数,以最小化正则训练误差:
E ( w , b ) = 1 n ∑ i = 1 n L ( y i , f ( x i ) ) + α 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)=n1i=1∑nL(yi,f(xi))+αR(w)
其中, L L L是一个损失函数和 R R R是一个正则项惩罚模型的复杂度; α > 0 \alpha > 0 α>0是一个非负的超参。
不同的损失函数对应不同的分类器
常用的正则项如下