从CS229课程项目看机器学习实战:2016年斯坦福学生Gary Thung和Mindy Yang的技术探索

1次阅读
没有评论

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

image.webp

项目背景

CS229 是斯坦福大学经典的机器学习课程,由 Andrew Ng 教授主讲,以理论严谨和项目实践并重著称。2016 年秋季学期,Gary Thung 和 Mindy Yang 选择了一个基于真实数据集的分类任务作为课程项目,目标是通过机器学习模型实现高精度的预测。

技术选型

他们尝试了多种算法后,最终选择逻辑回归作为基线模型,并采用支持向量机 (SVM) 和随机森林进行对比实验。选择这些算法的考虑包括:

  • 逻辑回归:模型简单、训练速度快,适合作为基准
  • SVM:在小样本高维数据上表现优异
  • 随机森林:能自动处理特征交互,对异常值不敏感

当时 TensorFlow 刚发布不久,但考虑到课程要求和对传统算法的掌握,他们主要使用 scikit-learn 库实现。

核心实现

数据处理

原始数据包含约 10,000 条记录和 20+ 个特征,需要进行以下预处理:

  1. 处理缺失值:对数值型特征用中位数填充,类别型特征用众数填充
  2. 特征编码:对类别变量采用 one-hot 编码
  3. 特征缩放:使用 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

从 CS229 课程项目看机器学习实战:2016 年斯坦福学生 Gary Thung 和 Mindy Yang 的技术探索

避坑指南

  1. 数据泄露问题:最初在全部数据上做特征缩放,导致交叉验证结果虚高。解决方案:在交叉验证的每个 fold 内单独进行缩放。

  2. 类别不平衡:某些类别样本极少。通过 class_weight 参数调整模型权重,并尝试过采样方法。

  3. 计算效率:SVM 在大数据量下训练缓慢。采用特征选择和减小训练集规模来优化。

实践建议

  1. 从简单模型开始建立基准,逐步尝试复杂模型
  2. 可视化特征分布和模型错误案例,获得改进方向
  3. 记录所有实验参数和结果,便于复现和分析

思考题

  1. 如果数据集扩大 10 倍,应该如何调整技术方案?
  2. 如何设计自动化流程来比较不同特征工程策略的效果?
  3. 在模型部署到生产环境时,需要考虑哪些额外因素?
正文完
 0
评论(没有评论)