Machine Learning 简明教程

Machine Learning - Stochastic Gradient Descent

梯度下降是一种流行的优化算法,用于最小化机器学习模型的成本函数。它的工作原理是对模型参数进行迭代调整,以最小化预测输出和实际输出之间的差异。该算法通过计算成本函数关于模型参数的梯度,然后按照梯度的相反方向调整参数来工作。

随机梯度下降是梯度下降的一种变体,它会为每个训练示例更新参数,而不是在评估整个数据集后更新参数。这意味着 SGD 不会使用整个数据集来计算成本函数的梯度,而是只使用单个训练示例。这种方法允许算法更快地收敛,并且只需要更少的内存来存储数据。

Working of Stochastic Gradient Descent Algorithm

随机梯度下降的工作原理是从数据集中随机选择单个训练示例并使用它更新模型参数。这个过程会重复进行一定次数的 epoch,或者直到模型收敛到成本函数的最小值为止。

以下是随机梯度下降算法的工作方式:

  1. 将模型参数初始化为随机值。

  2. 对每个 epoch,随机混洗训练数据。

  3. 对每个训练示例,计算成本函数关于模型参数的梯度。按照梯度的相反方向更新模型参数。

  4. Repeat until convergence

随机梯度下降和常规梯度下降之间的主要区别是计算梯度的方式和更新模型参数的方式。在随机梯度下降中,使用单个训练示例计算梯度,而在梯度下降中,使用整个数据集计算梯度。

Implementation of Stochastic Gradient Descent in Python

我们来看一个如何在 Python 中实现随机梯度下降的示例。我们将使用 scikit-learn 库在 Iris 数据集上实现该算法,Iris 数据集是一个用于分类任务的流行数据集。在此示例中,我们将使用萼片宽度和萼片长度这两个特征来预测鸢尾花属花卉种类:

Example

# Import required libraries
import sklearn

import numpy as np
from sklearn import datasets
from sklearn.linear_model import SGDClassifier

# Loading Iris flower dataset
iris = datasets.load_iris()
X_data, y_data = iris.data, iris.target

# Dividing the dataset into training and testing dataset
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Getting the Iris dataset with only the first two attributes
X, y = X_data[:,:2], y_data

# Split the dataset into a training and a testing set(20 percent)
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.20, random_state=1)

# Standarize the features
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# create the linear model SGDclassifier
clfmodel_SGD = SGDClassifier(alpha=0.001, max_iter=200)

# Train the classifier using fit() function
clfmodel_SGD.fit(X_train, y_train)

# Evaluate the result
from sklearn import metrics
y_train_pred = clfmodel_SGD.predict(X_train)
print ("\nThe Accuracy of SGD classifier is:",
metrics.accuracy_score(y_train, y_train_pred)*100)

当你运行这段代码时,它将产生以下输出:

The Accuracy of SGD classifier is: 77.5