共计 1680 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:当 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')

关键避坑指南
-
样本不均衡 :MNIST 虽然较均衡,但工业数据中可能出现某些数字样本极少,务必设置
class_weight参数 -
未收敛警告:
ConvergenceWarning: Maximum number of iteration reached...增加
max_iter或调整tol参数 -
特征尺度:像素值 0 -255 需先标准化,否则正则化会偏向大数值特征
进阶方向:EMNIST 字母识别
EMNIST 扩展了字母分类任务,迁移时需注意:
- 特征维度相同,可直接复用 PCA 模型
- 类别数增至 26(字母)+10(数字),需增大 PCA 组件数
- 字母存在大小写差异,建议先统一大小写
# 特征重要性可视化
plt.matshow(grid.best_estimator_.named_steps['clf'].coef_.reshape(10, 50))
plt.colorbar()
通过这个实战项目,我们不仅掌握了逻辑回归处理图像分类的核心技巧,更关键的是建立了标准的特征工程思维——好的模型始于好的特征处理。
正文完
发表至: 未分类
近两天内
