逻辑回归分步指南

Beginner

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

简介

在本实验中,我们将探讨当 L1、L2 和弹性网络惩罚项用于不同的 C 值时,解的稀疏性。我们将使用逻辑回归将 8x8 数字图像分类为两类:0 - 4 与 5 - 9。我们将可视化不同 C 值下模型的系数。

虚拟机使用提示

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

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

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

导入所需库

第一步是导入必要的库。我们将从sklearn.linear_model中导入numpymatplotlib.pyplotdatasetsStandardScalerLogisticRegression

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 值下模型的系数。我们还计算了每个模型的稀疏性和分数,并打印了结果。