简介
在本实验中,我们将了解 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 和弹性网络惩罚。我们生成了样本数据,应用了惩罚,并绘制了决策边界。这是机器学习模型中用于正则化的一个有用工具,特别是用于防止过拟合。