共计 1534 个字符,预计需要花费 4 分钟才能阅读完成。
项目背景
CS229 是斯坦福大学经典的机器学习课程,由 Andrew Ng 教授主讲,以理论严谨和项目实践并重著称。2016 年秋季学期,Gary Thung 和 Mindy Yang 选择了一个基于真实数据集的分类任务作为课程项目,目标是通过机器学习模型实现高精度的预测。
技术选型
他们尝试了多种算法后,最终选择逻辑回归作为基线模型,并采用支持向量机 (SVM) 和随机森林进行对比实验。选择这些算法的考虑包括:
- 逻辑回归:模型简单、训练速度快,适合作为基准
- SVM:在小样本高维数据上表现优异
- 随机森林:能自动处理特征交互,对异常值不敏感
当时 TensorFlow 刚发布不久,但考虑到课程要求和对传统算法的掌握,他们主要使用 scikit-learn 库实现。
核心实现
数据处理
原始数据包含约 10,000 条记录和 20+ 个特征,需要进行以下预处理:
- 处理缺失值:对数值型特征用中位数填充,类别型特征用众数填充
- 特征编码:对类别变量采用 one-hot 编码
- 特征缩放:使用 StandardScaler 对数值特征标准化
特征工程
通过分析特征重要性,他们发现:
- 某些特征之间存在高度相关性(相关系数 >0.8)
- 通过 PCA 降维后,前 5 个主成分保留了 90% 的方差
- 创造的新特征(如特征比值)提升了模型表现
模型训练
采用 5 折交叉验证评估模型性能,关键参数设置:
- 逻辑回归:L2 正则化,C=1.0
- SVM:RBF 核,gamma=’scale’
- 随机森林:n_estimators=100,max_depth=5
代码示例
# 数据预处理示例
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
# 处理缺失值
num_imputer = SimpleImputer(strategy='median')
X_train_num = num_imputer.fit_transform(X_train[num_cols])
# 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train_num)
# 模型训练示例
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
model = LogisticRegression(penalty='l2', C=1.0, random_state=42)
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print(f"交叉验证准确率: {scores.mean():.3f} ± {scores.std():.3f}")
性能考量
通过对比实验得到以下结果(测试集准确率):
| 模型 | 准确率 | 训练时间(s) |
|---|---|---|
| 逻辑回归 | 0.852 | 1.2 |
| SVM | 0.873 | 8.7 |
| 随机森林 | 0.891 | 3.5 |

避坑指南
-
数据泄露问题:最初在全部数据上做特征缩放,导致交叉验证结果虚高。解决方案:在交叉验证的每个 fold 内单独进行缩放。
-
类别不平衡:某些类别样本极少。通过 class_weight 参数调整模型权重,并尝试过采样方法。
-
计算效率:SVM 在大数据量下训练缓慢。采用特征选择和减小训练集规模来优化。
实践建议
- 从简单模型开始建立基准,逐步尝试复杂模型
- 可视化特征分布和模型错误案例,获得改进方向
- 记录所有实验参数和结果,便于复现和分析
思考题
- 如果数据集扩大 10 倍,应该如何调整技术方案?
- 如何设计自动化流程来比较不同特征工程策略的效果?
- 在模型部署到生产环境时,需要考虑哪些额外因素?
正文完
发表至: 未分类
近两天内
