使用 SGD 应用正则化技术

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将了解 scikit-learn 中的 SGDClassifier 和 SGDRegressor,以及如何使用它们对数据应用 L1、L2 和弹性网络惩罚。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

第一步是导入必要的库。我们将使用 numpy、matplotlib 和 scikit-learn。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier, SGDRegressor

生成数据

我们将生成一些示例数据,以便对其应用惩罚。在这个例子中,我们将生成两类数据,每类有 100 个样本。

np.random.seed(42)

## 生成两类数据
X = np.random.randn(200, 2)
y = np.repeat([1, -1], 100)

应用 L1 惩罚

现在我们将使用 SGDClassifier 对数据应用 L1 惩罚。

## 创建一个带有 L1 惩罚的分类器
clf = SGDClassifier(loss='hinge', penalty='l1', alpha=0.05, max_iter=1000, tol=1e-3)

## 拟合模型
clf.fit(X, y)

## 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('L1 惩罚')
plt.show()

应用 L2 惩罚

现在我们将使用 SGDClassifier 对我们的数据应用 L2 惩罚。

## 创建一个带有 L2 惩罚的分类器
clf = SGDClassifier(loss='hinge', penalty='l2', alpha=0.05, max_iter=1000, tol=1e-3)

## 拟合模型
clf.fit(X, y)

## 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('L2 惩罚')
plt.show()

应用弹性网络惩罚

现在我们将使用 SGDClassifier 对我们的数据应用弹性网络惩罚。

## 创建一个带有弹性网络惩罚的分类器
clf = SGDClassifier(loss='hinge', penalty='elasticnet', alpha=0.05, l1_ratio=0.15, max_iter=1000, tol=1e-3)

## 拟合模型
clf.fit(X, y)

## 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('弹性网络惩罚')
plt.show()

总结

在这个实验中,我们学习了如何使用 scikit-learn 中的 SGDClassifier 对数据应用 L1、L2 和弹性网络惩罚。我们生成了样本数据,应用了惩罚,并绘制了决策边界。这是机器学习模型中用于正则化的一个有用工具,特别是用于防止过拟合。