L1正则化与稀疏性在MNIST数字分类中的应用

机器学习领域,正则化是一种防止模型过拟合的技术。L1正则化是其中一种方法,它通过在损失函数中添加一个L1范数的惩罚项来实现。这种方法不仅能够减少模型的复杂度,还能促使模型的权重向量变得稀疏,即许多权重变为零,从而提高模型的可解释性。本文将介绍如何使用SAGA算法在MNIST数字分类任务中应用L1正则化,并展示其效果。

MNIST是一个广泛使用的手写数字识别数据集,包含了大量的手写数字图片。目标是训练一个模型,能够准确地识别这些图片中的数字。为了实现这一目标,采用了SAGA算法,这是一种在样本数量远大于特征数量时表现出色的求解器。SAGA算法能够有效地优化非光滑的目标函数,这在L1正则化的情况下尤为重要。

在实验中,首先从OpenML网站下载了MNIST数据集。然后,使用train_test_split函数将数据集分为训练集和测试集。为了提高模型的性能,还对数据进行了标准化处理。接下来,使用LogisticRegression类创建了一个逻辑回归模型,并设置了L1正则化参数。通过调整正则化强度C的值,找到了一个在训练集上收敛速度较快的模型。

import time import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import fetch_openml from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.utils import check_random_state # 设置随机种子以确保结果的可重复性 t0 = time.time() train_samples = 5000 # 从OpenML网站下载MNIST数据集 X, y = fetch_openml('mnist_784', version=1, return_X_y=True, as_frame=False) random_state = check_random_state(0) permutation = random_state.permutation(X.shape[0]) X = X[permutation] y = y[permutation] X = X.reshape((X.shape[0], -1)) X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=train_samples, test_size=10000) # 数据标准化处理 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 创建逻辑回归模型并设置L1正则化参数 clf = LogisticRegression(C=50.0/train_samples, penalty='l1', solver='saga', tol=0.1) clf.fit(X_train, y_train) # 计算模型的稀疏性和测试集上的准确率 sparsity = np.mean(clf.coef_ == 0) * 100 score = clf.score(X_test, y_test) print("Sparsity with L1 penalty: %.2f%%" % sparsity) print("Test score with L1 penalty: %.4f" % score) # 绘制分类向量 coef = clf.coef_.copy() plt.figure(figsize=(10, 5)) scale = np.abs(coef).max() for i in range(10): l1_plot = plt.subplot(2, 5, i + 1) l1_plot.imshow(coef[i].reshape(28, 28), interpolation='nearest', cmap=plt.cm.RdBu, vmin=-scale, vmax=scale) l1_plot.set_xticks(()) l1_plot.set_yticks(()) l1_plot.set_xlabel("Class %i" % i) plt.suptitle("Classification vector for...") run_time = time.time() - t0 print("Example run in %.3f s" % run_time) plt.show()

实验结果表明,使用L1正则化的逻辑回归模型在MNIST数据集上的测试准确率达到了0.8253,同时模型的稀疏性为74.57%。这意味着模型的权重向量中有74.57%的元素为零,这大大提高了模型的可解释性。然而,需要注意的是,这种L1正则化的线性模型的准确率显著低于使用L2正则化的线性模型或非线性的多层感知器模型。

总的来说,L1正则化是一种有效的技术,可以在保持模型性能的同时提高模型的可解释性。通过在MNIST数字分类任务中的应用,可以看到SAGA算法在处理大规模数据集时的优势。尽管L1正则化模型的准确率可能低于其他模型,但其稀疏性使得模型更容易理解和解释,这在某些应用场景中可能更为重要。

本文的代码示例展示了如何使用Python的scikit-learn库来实现L1正则化的逻辑回归模型。通过调整正则化参数C的值,可以在模型的复杂度和准确率之间找到一个平衡点。此外,代码中还包含了数据预处理、模型训练和评估等步骤,为读者提供了一个完整的机器学习项目示例。

在实际应用中,可以根据具体问题的需求来选择使用L1正则化还是L2正则化。如果模型的可解释性更为重要,那么L1正则化可能是一个更好的选择。然而,如果需要更高的准确率,那么L2正则化或非线性模型可能更为合适。此外,还可以尝试其他正则化方法,如弹性网(Elastic Net)正则化,它结合了L1和L2正则化的优点,可以在不同的场景下取得更好的效果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485