sklearn逻辑回归实战:手写数字识别中的特征工程与模型调优

1次阅读
没有评论

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

image.webp

背景痛点:当 784 维特征遇上逻辑回归

MNIST 的每个 28×28 像素图像展开后形成 784 维特征向量,直接输入逻辑回归会导致:

  • 维度灾难 :样本数(6 万) 远小于特征数(784),模型容易记住噪声而非规律
  • 计算成本高:稠密矩阵运算消耗内存,训练时间随特征数平方增长
  • 特征冗余:相邻像素高度相关,存在大量无效特征

通过 PCA 降维后可视化显示,前 30 个主成分已保留 90% 以上信息量,这暗示我们完全可以精简特征。

特征选择方法论:PCA vs LDA vs 方差阈值

PCA(主成分分析)

  • 原理:通过正交变换将特征映射到低维空间
  • 优势
  • 无监督方法,适用所有分类任务
  • sklearn 的 PCA 支持稀疏矩阵运算
  • 缺陷:可能丢失类别判别信息

LDA(线性判别分析)

  • 原理:最大化类间方差与类内方差的比值
  • 优势
  • 监督方法,对分类任务更友好
  • 降维后最多保留『类别数 -1』维特征
  • 缺陷:要求样本数 > 特征数,需先做预降维

方差阈值法

  • 原理:剔除方差低于阈值的特征
  • 优势
  • 计算成本最低
  • 可解释性强
  • 缺陷
  • 需要手动设置阈值
  • 可能误删有用低频特征

选择建议:对 MNIST 这种清晰可分的数据,优先用 PCA;若各类别差异小(如医学图像),考虑 LDA。

完整实现 Pipeline

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression

# 构造处理流水线
pipe = Pipeline([('scaler', StandardScaler()),  # 标准化消除量纲影响
    ('pca', PCA(n_components=50)),  # 保留前 50 个主成分
    ('clf', LogisticRegression(
        penalty='l1',        # 产生稀疏解,相当于自动特征选择
        solver='saga',       # 唯一支持 l1+l2 正则的求解器
        max_iter=500,        # 默认 100 次可能不够
        class_weight='balanced',  # 处理类别不均衡
        random_state=42
    ))
])

超参数调优实战

使用 GridSearchCV 搜索最佳正则化强度:

from sklearn.model_selection import GridSearchCV

param_grid = {'clf__C': np.logspace(-3, 3, 7)}  # 对数空间采样
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train, y_train)

# 绘制 C 值影响曲线
plt.semilogx(param_grid['clf__C'], grid.cv_results_['mean_test_score'])
plt.xlabel('Regularization Strength (C)')
plt.ylabel('Accuracy')

sklearn 逻辑回归实战:手写数字识别中的特征工程与模型调优

关键避坑指南

  1. 样本不均衡 :MNIST 虽然较均衡,但工业数据中可能出现某些数字样本极少,务必设置class_weight 参数

  2. 未收敛警告

    ConvergenceWarning: Maximum number of iteration reached...

    增加 max_iter 或调整 tol 参数

  3. 特征尺度:像素值 0 -255 需先标准化,否则正则化会偏向大数值特征

进阶方向:EMNIST 字母识别

EMNIST 扩展了字母分类任务,迁移时需注意:

  • 特征维度相同,可直接复用 PCA 模型
  • 类别数增至 26(字母)+10(数字),需增大 PCA 组件数
  • 字母存在大小写差异,建议先统一大小写
# 特征重要性可视化
plt.matshow(grid.best_estimator_.named_steps['clf'].coef_.reshape(10, 50))
plt.colorbar()

通过这个实战项目,我们不仅掌握了逻辑回归处理图像分类的核心技巧,更关键的是建立了标准的特征工程思维——好的模型始于好的特征处理。

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