简介
在本实验中,我们将探讨当 L1、L2 和弹性网络惩罚项用于不同的 C 值时,解的稀疏性。我们将使用逻辑回归将 8x8 数字图像分类为两类:0 - 4 与 5 - 9。我们将可视化不同 C 值下模型的系数。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入所需库
第一步是导入必要的库。我们将从sklearn.linear_model中导入numpy、matplotlib.pyplot、datasets、StandardScaler和LogisticRegression。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
加载数据集
我们将使用datasets.load_digits(return_X_y=True)加载数字数据集。我们还将使用StandardScaler().fit_transform(X)对数据进行标准化。目标变量将是二元的,其中 0 - 4 将被分类为 0,5 - 9 将被分类为 1。
X, y = datasets.load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = (y > 4).astype(int)
定义正则化参数和 L1 比率
我们将为弹性网络惩罚定义正则化参数C和 L1 比率l1_ratio。我们将把l1_ratio设置为 0.5。
l1_ratio = 0.5
创建用于可视化的子图
我们将创建子图,以可视化不同C值下模型的系数。我们将创建 3 行 3 列的子图。
fig, axes = plt.subplots(3, 3)
使用不同惩罚项和正则化参数训练逻辑回归模型
我们将使用 L1、L2 和弹性网络惩罚以及不同的C值来训练逻辑回归模型。为了缩短训练时间,我们将增大容忍度。
for i, (C, axes_row) in enumerate(zip((1, 0.1, 0.01), axes)):
clf_l1_LR = LogisticRegression(C=C, penalty="l1", tol=0.01, solver="saga")
clf_l2_LR = LogisticRegression(C=C, penalty="l2", tol=0.01, solver="saga")
clf_en_LR = LogisticRegression(C=C, penalty="elasticnet", solver="saga", l1_ratio=l1_ratio, tol=0.01)
clf_l1_LR.fit(X, y)
clf_l2_LR.fit(X, y)
clf_en_LR.fit(X, y)
计算稀疏性和分数
我们将计算每个模型的稀疏性(零系数的百分比)和分数。
coef_l1_LR = clf_l1_LR.coef_.ravel()
coef_l2_LR = clf_l2_LR.coef_.ravel()
coef_en_LR = clf_en_LR.coef_.ravel()
sparsity_l1_LR = np.mean(coef_l1_LR == 0) * 100
sparsity_l2_LR = np.mean(coef_l2_LR == 0) * 100
sparsity_en_LR = np.mean(coef_en_LR == 0) * 100
score_l1_LR = clf_l1_LR.score(X, y)
score_l2_LR = clf_l2_LR.score(X, y)
score_en_LR = clf_en_LR.score(X, y)
可视化系数
我们将针对每种惩罚项和C值,可视化模型的系数。
for ax, coefs in zip(axes_row, [coef_l1_LR, coef_en_LR, coef_l2_LR]):
ax.imshow(np.abs(coefs.reshape(8, 8)), interpolation='nearest', cmap='binary', vmax=1, vmin=0)
ax.set_xticks(())
ax.set_yticks(())
设置标题和标签
我们将为子图设置标题和标签。
if i == 0:
axes_row[0].set_title("L1 惩罚")
axes_row[1].set_title("弹性网络\nl1_ratio = %s" % l1_ratio)
axes_row[2].set_title("L2 惩罚")
axes_row[0].set_ylabel("C = %s" % C)
打印结果
我们将打印每个模型的稀疏性和分数。
print("C=%.2f" % C)
print("{:<40} {:.2f}%".format("L1 惩罚的稀疏性:", sparsity_l1_LR))
print("{:<40} {:.2f}%".format("弹性网络惩罚的稀疏性:", sparsity_en_LR))
print("{:<40} {:.2f}%".format("L2 惩罚的稀疏性:", sparsity_l2_LR))
print("{:<40} {:.2f}".format("L1 惩罚的分数:", score_l1_LR))
print("{:<40} {:.2f}".format("弹性网络惩罚的分数:", score_en_LR))
print("{:<40} {:.2f}".format("L2 惩罚的分数:", score_l2_LR))
显示可视化结果
我们将显示这些子图。
plt.show()
总结
在这个实验中,我们探究了在不同的 C 值下,使用 L1、L2 和弹性网络惩罚时解的稀疏性。我们使用逻辑回归将 8x8 的数字图像分为两类:0 - 4 与 5 - 9。我们可视化了不同 C 值下模型的系数。我们还计算了每个模型的稀疏性和分数,并打印了结果。