随机梯度下降

随机梯度下降

随机梯度下降是一种用于解决使用凸损失函数的线性分类器的方法,如,支持向量机和逻辑回归。它在大规模学习的背景下,吸引了大量的注意。

随机梯度下降的优点:

  • 快速
  • 易实现

随机梯度下降的缺点:

  • 需要大量的超参,如,正则化参数和迭代次数
  • 对特征缩放敏感

分类

在拟合模型时,确保在每次迭代后,打乱训练数据。

SGDClassifier实现了一个基本的随机梯度学习函数,支持不同的损失函数和惩罚。

损失函数包括:

  • loss='hinge:(soft-margin) linear Support Vector Machine
  • loss='modified_huber':smoothed hinge loss
  • loss='log':logistic regression
  • and all regression losses below

惩罚包括:

  • penalty='l2':L2范数
  • penalty='l1':L1范数
  • penalty='elasticnet':L2和L1范数的凸组合;(1 - l1_ratio) * L2 + l1_ratio * L1

SGDClassifierone versus all (OVA)方式组合多个二元分类器来支持多类别分类。对 K K K个类别中的每一类,学习这个类和其它 K − 1 K-1 K1个类的差别得到一个二元分类器。在测试时,计算每类距超平面的带符号的距离,选择具有最大距离的类。

# 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以上训练样本的回归问题,对于其它问题,推荐使用RidgeLassoElasticNet

通过loss参数,可设置的损失函数包括:

  • loss = 'squared_loss':Ordinary least squares
  • loss = 'huber':Huber loss for robust regresson
  • loss='epsilon_insensitive':linear support vector regression

Huberepsilon-insensitive损失函数能够被用于鲁棒回归。不敏感区域的宽度可通过参数epsilon参数设置。这个参数依赖于目标变量的尺度。

SGDRegressor支持平均的SGD作为SGDClassifier。通过设置参数average=True

对稀疏数据的随机梯度下降

由于对截距的收缩学习率,稀疏实现得到的结果与密集的稍有不同。一般使用scipy.sparsescipy.sparse.csr_matrix格式的矩阵。

终止条件

SGDClassifierSGDRegression提供了两种终止准则:

  • early_stopping = True,输入数据被划分为一个训练集和一个验证集,模型拟合到训练集,终止规则基于在验证集上的预测分数。验证集的大小能够按照参数validation_fraction的值变化。
  • early_stopping = False,模型拟合在整个数据集上,终止规则基于输入数据上计算的目标函数。

使用提醒

  • 随机梯度下降对特征尺度比较敏感,因此要对数据做缩放。例如,将每个输入数据的属性值缩放到[0, 1]或[-1, +1],或者是标准化到均值为0,方差为1。注意,同样的缩放需应用到测试集上,已获得有意义的结果。这些可使用 StandardScaler类完成
  • 使用GridSearchCV找到合理的正则化参数alpha
  • 经验上,在观察近10^6个训练样本时,SGD趋于收敛。因此,一个合理的迭代次数设置为max_iter = np.ceil(10**6/n)n是训练集的大小
  • 如果将SGD应用于使用PCA提取的特征,将特征值缩放一个使训练数据平均l2范数等于1的c
  • ASGD在有大量特征和较大值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 xiRm y i ∈ − 1 , 1 y_i \in {-1, 1} yi1,1,目标是学习一个线性打分函数 f ( x ) = w T x + b f(x) = w^Tx + b f(x)=wTx+b,其中,模型参数 w ∈ R m w \in R^m wRm和截距 b ∈ R b \in R bR。为了做预测,需看 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=1nL(yi,f(xi))+αR(w)
其中, L L L是一个损失函数和 R R R是一个正则项惩罚模型的复杂度; α > 0 \alpha > 0 α>0是一个非负的超参。

不同的损失函数对应不同的分类器

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

常用的正则项如下

  • L2 范数: R ( w ) = 1 2 ∑ i = 1 n w i 2 R(w) = \frac{1}{2}\sum\limits_{i=1}^{n}w_{i}^{2} R(w)=21i=1nwi2
  • L1范数: R ( w ) = ∑ i = 1 n ∣ w i ∣ R(w) = \sum\limits_{i=1}^{n}|w_i| R(w)=i=1nwi,会产生稀疏的解
  • Elastic Net: R ( w ) = ρ 2 ∑ i = 1 n w i 2 + ( 1 − ρ ) ∑ i = 1 n ∣ w i ∣ R(w) = \frac{\rho}{2}\sum\limits_{i=1}^{n}w_{i}^{2}+(1-\rho)\sum\limits_{i=1}^{n}|w_i| R(w)=2ρi=1nwi2+(1ρ)i=1nwi,一个L2和L1范数的凸组合。

你可能感兴趣的:(scikit-learn,机器学习,python,随机梯度下降)