sklearn逻辑回归实战:手写数字识别从原理到调优

1次阅读
没有评论

共计 2014 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

逻辑回归在手写数字识别中的应用与实践

手写数字识别是机器学习入门的经典问题,逻辑回归虽然简单,但在特定场景下仍有其优势。本文将系统性地介绍如何使用 sklearn 的逻辑回归实现 MNIST 分类,并分享调优过程中的经验。

sklearn 逻辑回归实战:手写数字识别从原理到调优

背景与挑战

  1. 传统逻辑回归的局限性
  2. MNIST 数据集每张图片为 28×28 像素,展开后就是 784 维特征向量
  3. 高维特征导致计算复杂度增加,且存在大量冗余信息
  4. 数字间存在非线性可分关系,纯线性模型难以完美分离

  5. 与深度方法的对比

  6. CNN 能自动提取局部特征,适合图像数据
  7. 逻辑回归参数少、训练快,在小数据量时表现稳定
  8. 作为基线模型,逻辑回归的 acc 往往能达到 90% 左右

技术实现流程

数据预处理

from sklearn.datasets import fetch_openml
from sklearn.preprocessing import StandardScaler

# 加载 MNIST 数据
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist['data'], mnist['target']

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练测试集
X_train, X_test = X_scaled[:60000], X_scaled[60000:]
y_train, y_test = y[:60000], y[60000:]

特征降维

  1. 原始 784 维特征可以直接输入,但计算量大
  2. 使用 PCA 保留 95% 方差,可将维度降至约 150 维
from sklearn.decomposition import PCA

pca = PCA(0.95)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)

模型训练

关键参数说明:
multi_class='multinomial':启用 softmax 回归
solver='saga':支持多分类和 L1 正则
max_iter=1000:确保充分收敛

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(
    multi_class='multinomial',
    solver='saga',
    penalty='l2',
    max_iter=1000,
    random_state=42
)
model.fit(X_train_pca, y_train)

性能优化策略

超参数调优

使用网格搜索寻找最优正则化强度 C:

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}
grid = GridSearchCV(model, param_grid, cv=3)
grid.fit(X_train_pca[:10000], y_train[:10000])  # 子集加速搜索

print(f"Best C: {grid.best_params_}")

正则化对比

  1. L1 正则化(lasso)会产生稀疏权重
  2. L2 正则化(ridge)使权重均匀衰减
  3. 实际测试中 L2 通常表现更好

学习曲线分析

from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt

train_sizes, train_scores, test_scores = learning_curve(model, X_train_pca, y_train, cv=3)

plt.plot(train_sizes, train_scores.mean(1), label='train')
plt.plot(train_sizes, test_scores.mean(1), label='test')
plt.legend()

常见问题解决方法

  1. 多分类设置
  2. 必须显式设置multi_class='multinomial'
  3. 否则 sklearn 默认使用 OvR 策略

  4. 类别不平衡

  5. 设置 class_weight='balanced' 自动调整
  6. 或手动指定各类别权重

  7. 大数据量优化

  8. 样本数 >10 万时建议使用solver='saga'
  9. 可配合 n_jobs=-1 启用多核并行

延伸思考与改进方向

  1. 特征工程优化
  2. 尝试 HOG 特征替代原始像素
  3. 加入数字的几何特征(笔画数、对称性等)

  4. 模型融合

  5. 将逻辑回归作为基模型集成
  6. 与简单 CNN 进行 stacking

  7. 扩展挑战

  8. 在 CIFAR-10 上测试效果
  9. 尝试处理彩色 MNIST 变种

总结

通过本文实践可以看到,经过适当优化的逻辑回归在 MNIST 上能达到约 92% 的准确率。虽然不及深度网络,但其训练速度快、可解释性强的特点,使其成为验证特征有效性的理想基线模型。建议初学者先掌握这类基础方法,再逐步过渡到更复杂的模型。

正文完
 0
评论(没有评论)