机器学习全流程
掌握从数据到部署的完整机器学习流程。
---
Day 25:AI对齐
昨天我们讨论了对齐问题:
- 规范指定、鲁棒性、可扩展监督
- Constitutional AI、Debate 等前沿方向
今天进入模块3,系统学习机器学习的工程实践。
---
一、ML 全流程概览
1. 问题定义 → 2. 数据收集 → 3. 数据探索(EDA)
↓
4. 特征工程 → 5. 模型选择 → 6. 训练
↓
7. 评估 → 8. 调优 → 9. 部署 → 10. 监控
二、每个阶段的关键产出
| 阶段 | 关键产出 |
|---|---|
| 问题定义 | 明确业务目标和评估指标 |
| 数据收集 | 高质量、有代表性的数据集 |
| EDA | 数据分布、异常值、相关性分析 |
| 特征工程 | 有效的特征表示 |
| 模型训练 | 收敛且不过拟合的模型 |
| 评估 | 在测试集上的性能报告 |
| 部署 | 可服务的模型和监控方案 |
三、常见陷阱
- 数据泄露:测试信息混入训练
- 目标泄露:用了未来的信息预测过去
- 采样偏差:训练数据不代表真实分布
- 过度调优:在验证集上反复调参导致过拟合
---
📌 课程进度:Day 26 / 90 | 模块3:机器学习基础
🎓 明天预告:Day 27 数据预处理 —— 数据质量决定模型上限!
---
数据预处理
掌握数据清洗、缺失值处理、特征缩放等预处理技术。
---
一、为什么预处理很重要?
💡 名言:"Garbage in, garbage out"(垃圾进,垃圾出)
数据质量决定模型上限,算法只是逼近这个上限。
二、常见预处理操作
| 问题 | 处理方法 |
|---|---|
| 缺失值 | 删除、填充(均值/中位数/众数)、插值 |
| 异常值 | 删除、截断、对数变换 |
| 重复数据 | 去重 |
| 不一致格式 | 标准化(日期格式、编码等) |
| 类别不平衡 | 过采样(SMOTE)、欠采样、权重调整 |
三、特征缩放
# 标准化(Standardization)
x_scaled = (x - mean) / std
# 归一化(Normalization)
x_scaled = (x - min) / (max - min)
为什么需要缩放?
- 梯度下降收敛更快
- 防止大数值特征主导
- 距离计算更合理
---
📌 课程进度:Day 27 / 90
🎓 明天预告:Day 28 线性回归 —— 最简单的预测模型!
---
线性回归
理解线性回归的原理、损失函数和梯度下降优化。
---
一、模型形式
y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b
💡 直观理解:试图找到一条直线(或超平面),让数据点尽可能靠近这条线。
二、损失函数:均方误差(MSE)
MSE = (1/n) Σ(yᵢ - ŷᵢ)²
目标:找到 w 和 b,使得 MSE 最小。
三、梯度下降
# 参数更新
w = w - learning_rate * gradient
学习率的选择:
- 太大:震荡不收敛
- 太小:收敛太慢
- 合适:稳定收敛
---
📌 课程进度:Day 28 / 90
🎓 明天预告:Day 29 逻辑回归 —— 解决分类问题!
---
逻辑回归
理解逻辑回归如何将线性输出转换为概率。
---
一、Sigmoid 函数
σ(z) = 1 / (1 + e^(-z))
将任意实数映射到 (0, 1) 区间,可解释为概率。
二、决策边界
如果 σ(w·x + b) > 0.5,预测为类别 1
如果 σ(w·x + b) ≤ 0.5,预测为类别 0
三、损失函数:交叉熵
L = -[y·log(ŷ) + (1-y)·log(1-ŷ)]
💡 为什么不用 MSE? 交叉熵对错误预测惩罚更大,梯度更明显。
---
📌 课程进度:Day 29 / 90
🎓 明天预告:Day 30 损失函数 —— 模型优化的指南针!
---
损失函数
掌握常见损失函数的特点和适用场景。
---
一、损失函数的作用
损失函数衡量模型预测与真实值之间的差距。优化目标:最小化损失函数。
二、常见损失函数
| 损失函数 | 适用场景 | 公式 | ||
|---|---|---|---|---|
| MSE | 回归 | (y - ŷ)² | ||
| MAE | 回归(对异常值鲁棒) | \ | y - ŷ\ | |
| 交叉熵 | 分类 | -Σ y·log(ŷ) | ||
| Hinge Loss | SVM | max(0, 1 - y·ŷ) |
三、选择原则
- 回归任务 → MSE/MAE
- 分类任务 → 交叉熵
- 需要鲁棒性 → MAE/Huber
---
📌 课程进度:Day 30 / 90
🎓 明天预告:Day 31 梯度下降 —— 模型训练的发动机!
---
梯度下降
深入理解梯度下降及其变种:SGD、Momentum、Adam。
---
一、梯度下降核心思想
沿着损失函数下降最快的方向(负梯度)更新参数。
w = w - α · ∂L/∂w
二、三种梯度下降
| 类型 | 更新方式 | 特点 |
|---|---|---|
| 批量 GD | 用全部数据计算梯度 | 稳定但慢 |
| 随机 GD(SGD) | 每次用一个样本 | 快但噪声大 |
| 小批量 GD | 每次用一批样本 | 平衡速度和稳定性 |
三、优化器进阶
| 优化器 | 核心改进 |
|---|---|
| Momentum | 积累速度,加速收敛 |
| AdaGrad | 自适应学习率 |
| RMSprop | 改进 AdaGrad 的衰减问题 |
| Adam | Momentum + RMSprop,最常用 |
💡 实践建议:除非有特殊需求,默认用 Adam。
---
📌 课程进度:Day 31 / 90
🎓 明天预告:Day 32 过拟合与欠拟合 —— 模型的两大敌人!
---
过拟合与欠拟合
理解偏差-方差权衡,掌握识别和解决过拟合/欠拟合的方法。
---
一、核心概念
| 问题 | 表现 | 原因 |
|---|---|---|
| 欠拟合(Underfitting) | 训练集和测试集都差 | 模型太简单 |
| 过拟合(Overfitting) | 训练集好,测试集差 | 模型太复杂 |
| 刚刚好(Just Right) | 两者都好 | 合适的复杂度 |
二、偏差 vs 方差
总误差 = 偏差² + 方差 + 不可约误差
- 偏差(Bias):模型假设带来的系统性误差
- 方差(Variance):对训练数据波动的敏感度
三、解决方案
| 问题 | 解决方法 |
|---|---|
| 欠拟合 | 增加模型复杂度、增加特征、减少正则化 |
| 过拟合 | 增加数据、正则化、Dropout、早停 |
---
📌 课程进度:Day 32 / 90
🎓 明天预告:Day 33 正则化 —— 防止模型"死记硬背"!
---
正则化
掌握 L1/L2 正则化、Dropout 等防止过拟合的技术。
---
一、L2 正则化(Ridge)
损失 = MSE + λ · Σw²
💡 效果:惩罚大的权重,让权重趋向于小值。模型更简单,泛化更好。
二、L1 正则化(Lasso)
损失 = MSE + λ · Σ\|w\|
💡 效果:产生稀疏权重,自动特征选择。
三、L1 vs L2
| 特性 | L1 | L2 |
|---|---|---|
| 惩罚方式 | 绝对值 | 平方 |
| 权重分布 | 稀疏(很多0) | 均匀小值 |
| 用途 | 特征选择 | 防止过拟合 |
四、Dropout
训练时随机"关闭"一部分神经元,防止共适应。
# PyTorch
nn.Dropout(p=0.5) # 50% 的神经元被关闭
💡 类比:就像让学生随机缺课,强迫每个学生都能独立完成任务。
---
📌 课程进度:Day 33 / 90
🎓 明天预告:Day 34 决策树 —— 像人类一样做决策!
---
决策树
理解决策树的构建原理、信息增益和剪枝策略。
---
一、决策树的直觉
💡 类比:就像玩"20个问题"游戏——通过一系列"是/否"问题缩小范围。
示例:判断是否批准贷款 `` 收入 > 5000? ├─ 是 → 信用评分 > 700? │ ├─ 是 → 批准 │ └─ 否 → 人工审核 └─ 否 → 有抵押? ├─ 是 → 批准 └─ 否 → 拒绝 ``
二、信息增益
选择"最有区分度"的特征作为分裂点:
信息增益 = 父节点熵 - 加权子节点熵
熵衡量不确定性,信息增益越大,不确定性减少越多。
三、剪枝
- 预剪枝:限制树的深度、叶子节点数
- 后剪枝:先长完整树,再剪掉不重要的分支
---
📌 课程进度:Day 34 / 90
🎓 明天预告:Day 35 集成学习 —— 三个臭皮匠,顶个诸葛亮!
---
集成学习
理解 Bagging、Boosting、随机森林和 XGBoost 的原理。
---
一、核心思想
💡 "三个臭皮匠,顶个诸葛亮"
通过组合多个弱学习器,获得更强的预测能力。
二、Bagging(并行)
1. 从训练集有放回抽样,生成多个子集
2. 每个子集训练一个模型
3. 预测时:分类投票,回归平均
代表:随机森林(Random Forest)
三、Boosting(串行)
1. 训练第一个模型
2. 增加前一个模型错分样本的权重
3. 训练下一个模型
4. 重复直到满足条件
代表:AdaBoost、XGBoost、LightGBM
四、Bagging vs Boosting
| 特性 | Bagging | Boosting |
|---|---|---|
| 训练方式 | 并行 | 串行 |
| 降低什么 | 方差 | 偏差 |
| 代表 | 随机森林 | XGBoost |
| 过拟合风险 | 低 | 相对较高(需调参) |
---
📌 课程进度:Day 35 / 90
🎓 明天预告:Day 36 支持向量机(SVM) —— 最大间隔分类器!
---
支持向量机(SVM)
理解 SVM 如何通过"最大化间隔"找到最优分类边界。
---
Day 35:集成学习
昨天我们学了集成学习:
- Bagging:并行训练,降低方差(随机森林)
- Boosting:串行训练,降低偏差(XGBoost)
- 核心思想:组合多个弱学习器
今天我们将转向另一个经典算法——SVM。
---
一、SVM 的直觉理解
想象你是一个裁判,要在两群打架的人中间画一条分界线。
SVM 的想法:不仅要分开,还要让这条线离两边的人都越远越好。
这就是 SVM 的核心思想——最大间隔分类。
二、支持向量
支持向量是距离分类边界最近的数据点。它们"支撑"着整个分类边界。
💡 关键:只有支持向量影响分类边界,其他数据点可以忽略。
三、核技巧(Kernel Trick)
当数据不是线性可分时,SVM 使用核函数将数据映射到高维空间。
| 核函数 | 适用场景 |
|---|---|
| 线性核 | 线性可分 |
| 多项式核 | 多项式边界 |
| RBF(高斯核) | 复杂非线性边界 |
| Sigmoid 核 | 神经网络类似 |
---
📌 课程进度:Day 36 / 90
🎓 明天预告:Day 37 K近邻与聚类 —— 基于实例的学习!
---
K近邻与聚类
理解 KNN 和 K-Means 的原理与应用。
---
一、KNN(K-Nearest Neighbors)
核心思想:"物以类聚"——找 K 个最近的邻居,看它们属于哪一类。
# KNN 算法
1. 计算待预测点与所有训练点的距离
2. 找出距离最近的 K 个点
3. 投票决定类别(分类)或取平均(回归)
💡 特点:没有训练过程,预测时才计算。是"惰性学习"。
二、K-Means 聚类
核心思想:把数据分成 K 个组,每组内的点尽量靠近。
# K-Means 算法
1. 随机选择 K 个中心点
2. 每个点分配到最近的中心点
3. 重新计算每个组的中心
4. 重复 2-3 直到收敛
如何选择 K?
- 肘部法则:画图找拐点
- 轮廓系数:衡量聚类质量
---
📌 课程进度:Day 37 / 90
🎓 明天预告:Day 38 降维 —— PCA 与 t-SNE!
---
降维
理解 PCA 和 t-SNE 的原理,掌握数据可视化和特征压缩。
---
一、为什么需要降维?
- 可视化:高维数据无法直接画图
- 去噪:去除不重要的维度
- 效率:减少计算和存储
- 避免维度灾难:高维空间数据稀疏
二、PCA(主成分分析)
核心思想:找到数据方差最大的方向,投影到这些方向上。
1. 数据标准化
2. 计算协方差矩阵
3. 特征值分解
4. 选择前 k 个最大特征值对应的特征向量
5. 数据投影到这些特征向量上
三、t-SNE
核心思想:在高维空间中相似的数据点,在低维空间中也应该靠近。
💡 用途:主要用于可视化,不用于特征工程(因为不保持全局结构)。
---
📌 课程进度:Day 38 / 90
🎓 明天预告:Day 39 模型评估指标 —— 准确率够吗?
---
模型评估指标
掌握分类和回归任务的评估指标,理解准确率陷阱。
---
一、分类指标
| 指标 | 公式 | 适用场景 |
|---|---|---|
| 准确率 | (TP+TN)/总数 | 类别平衡 |
| 精确率 | TP/(TP+FP) | 重视"不要错杀" |
| 召回率 | TP/(TP+FN) | 重视"不要漏掉" |
| F1 | 2·精确率·召回率/(精确率+召回率) | 综合指标 |
| AUC-ROC | ROC 曲线下面积 | 排序能力 |
二、混淆矩阵
预测正例 预测负例
实际正例 TP FN
实际负例 FP TN
三、准确率陷阱
问题:如果 99% 的数据都是负例,模型全部预测负例,准确率也是 99%!
解决:用 F1、AUC 等指标,或调整类别权重。
---
📌 课程进度:Day 39 / 90
🎓 明天预告:Day 40 交叉验证与调优 —— 科学评估模型性能!
---
交叉验证与调优
掌握 K 折交叉验证和超参数调优方法。
---
一、交叉验证
问题:随机划分训练/测试集,结果可能不稳定。
K 折交叉验证: ```
- 将数据分成 K 份
- 每次用 K-1 份训练,1 份测试
- 重复 K 次,确保每份都做过测试
- 取 K 次结果的平均