机器学习基础
机器学习 = 用数据调出「从输入到输出」的映射,而它的全部智慧浓缩成一句话:训练集上让损失最小,希望它在没见过的数据上也好用(泛化)。本文覆盖读论文、上手深度学习之前必须的地基:够用的数学、经典算法全景、评估方法论与特征工程,全部示例可用纯 Python/标准库复现。
一、数学速成:只有用得上的
| 工具 | 直觉(不是定义) | 出现场合 |
|---|---|---|
| 向量内积 | 两个向量的相似度(同向取大、正交为零) | 线性模型 w·x、注意力、检索打分 |
| 矩阵乘法 | 「按规律做批量加权求和」,可看作同时变换许多向量 | 全连接层、Embedding 查表后的混合 |
| 梯度 ∇ | 标量函数在某点上升最快的方向;反着走就是下降 | 一切梯度下降优化器 |
| 链式法则 | 复合函数的误差层层回传相乘 | 反向传播 |
| 条件概率/贝叶斯 | P(A | B) = P(B |
| 正态分布 | 大量独立小误差叠加的自然结果,「钟形」 | 误差假设、初始化 |
| 似然 | 「在这组参数下,看到这批数据的概率」 | 最大似然/交叉熵的统一来源 |
公式建议只记三种:
w·x(线性打分)、softmax(把分数变概率)、梯度下降 w ← w − η·∂L/∂w(一切优化)。其余的都能在网上现查。
二、三个范式,一套流程
| 范式 | 数据形态 | 目标 | 例子 |
|---|---|---|---|
| 监督学习 | (x, y) 对 | 学 x→y | 回归、分类 |
| 无监督学习 | 只有 x | 发现结构 | 聚类、降维 |
| 强化学习 | 环境反馈 r | 学策略使累计回报最大 | 游戏、机器人 |
训练的统一套路:定义损失 L(模型预测与真实差距)→ 用梯度下降最小化 → 在独立测试集上验证。监督学习的损失本质是「负对数似然」:回归用高斯假设得 MSE,分类用类别分布假设得交叉熵——选损失函数 = 选对 y 的分布假设,而不是拍脑袋。
三、经典算法图谱
3.1 线性回归与正则化
- 模型
ŷ = w·x + b,损失为均方误差(MSE);最优 w 要么有闭式解(正规方程),要么用梯度下降; - 数据量 < 特征量时过拟合:加正则化项——L2(岭回归) 把权重压向 0 但不为 0;L1(Lasso) 会把不重要的权重精确压到 0(自带特征选择);
- 直觉:L1 的等值面是「菱形」,角点在坐标轴上,所以容易碰到 0。
python
# 一维线性回归 + 梯度下降(python3.7 实测)
xs = [1.0, 2.0, 3.0, 4.0, 5.0]
ys = [3.1, 4.9, 7.2, 8.8, 11.3] # 真实约为 y = 2x + 1 + 噪声
w = b = 0.0
lr, n = 0.02, len(xs)
for _ in range(60):
dw = sum(2 * (w*x + b - y) * x for x, y in zip(xs, ys)) / n
db = sum(2 * (w*x + b - y) for x, y in zip(xs, ys)) / n
w -= lr*dw; b -= lr*db
print(f"y ≈ {w:.3f}*x + {b:.3f}") # 输出:y ≈ 2.100*x + 0.7183.2 逻辑回归:SVM 与贝叶斯的邻居
- 线性打分
z = w·x + b过 sigmoid 得 P(y=1|x);训练用交叉熵——分类别用 MSE:MSE 在预测已对时梯度仍大、收敛慢,且假设了「高斯噪声」这一错误分布; - SVM:找「间隔最大」的分界面,起作用的只有离边界最近的少数样本(支持向量);线性不可分时用核技巧把样本隐式映射到高维(K(x,z)=φ(x)·φ(z) 免算 φ),例如 RBF 核;
- 朴素贝叶斯:假设特征相互独立,P(y|x) ∝ P(y)∏P(x_i|y),训练是数频次——文本分类的极简强基线;
- KNN:不训练、预测时找 k 个最近邻投票;维度高时距离失真(需要特征缩放)。
3.3 决策树与集成学习
- 树 = 递归 if-else:每次选一个「最能降低不纯度」的特征与阈值切分(CART 用基尼不纯度);优点可解释、能处理混合特征,缺点单棵树易过拟合;
- Bagging(随机森林):并行训练多棵有差异的树(行采样 + 列采样),投票——降方差;
- Boosting(GBDT/XGBoost):串行训练,每棵树拟合前面所有树的残差/负梯度——降偏差;XGBoost 加了二阶导数、正则化与缺失值处理,是表格数据的默认王者;
- 经验法则:表格数据先上 XGBoost/LightGBM,再考虑深度模型——除非数据是文本/图像/时序这类有结构先验的。
3.4 无监督:聚类与降维
| 算法 | 思想 | 适合 | 关键超参 |
|---|---|---|---|
| KMeans | 距离平方和最小,迭代「指派-更新」 | 球形簇、先验知道 k | k(用肘部/轮廓系数选) |
| DBSCAN | 密度相连的点成簇,「没簇可入」的是噪声 | 任意形状 + 要离群点 | eps、minPts |
| PCA | 找方差最大的正交方向,投影降维 | 去相关、可视化、提速 | 主成分数 |
PCA 与 SVD/矩阵分解同源:方差最大的方向 ≈ 重构误差最小的方向。聚类前一定先做特征缩放,否则量纲大的特征主导距离。
四、评估方法论:别被一个数字骗了
4.1 数据划分与验证
- 训练 / 验证 / 测试三份:验证集用于调参选模型,测试集只在最终评估时碰一次(否则你就在「对着测试集过拟合」);
- 小数据用 k 折交叉验证(平均多次划分的分数);
- 时间序列不能用随机切分——必须按时间先后(否则未来信息泄漏进训练集)。
4.2 偏差-方差:欠拟合与过拟合的光谱
- 高偏差 = 模型太简单,训练误差都压不下去(欠拟合);高方差 = 模型太复杂,训练很好测试崩(过拟合);
- 调法对照:欠拟合 → 加特征/加深模型/少正则;过拟合 → 加数据/加正则/简化模型/早停。
4.3 指标速查表
| 指标 | 回答的问题 | 要点 |
|---|---|---|
| Accuracy | 总体判对比例 | 类别不平衡时骗人(99% 是负类时全猜负也有 99%) |
| Precision(精确率) | 判正例里多少是真 | 宁缺毋滥(垃圾邮件过滤) |
| Recall(召回率) | 真正例里逮住多少 | 宁错毋漏(癌症筛查) |
| F1 | P/R 的调和平均 | 平衡两者;macro 均值对少数类更敏感 |
| AUC-ROC | 随机正样本得分 > 随机负样本的概率 | 排序能力,与阈值无关;不平衡下也比 accuracy 稳 |
| MAE/MSE/R² | 回归误差 | R²=1 完美;MSE 放大离群点,MAE 更稳 |
4.4 类别不平衡
- 数据层:过采样少数类(SMOTE)、欠采样多数类;
- 算法层:类别加权损失、调整判定阈值(阈值移向 PR 曲线右上);
- 评估层:看 PR 曲线/PR-AUC 而不是 accuracy(正类极少时 PR 更能反映检索质量)。
五、特征工程与数据清洗
- 归一化 vs 标准化:归一化(min-max)压到 [0,1];标准化(减均值除标准差)让分布居中单位化——树模型对单调变换不敏感,但距离类(KNN/SVM/KMeans)与正则化线性模型强烈依赖缩放;
- 类别特征:低基数用 one-hot(注意哑变量陷阱可不删);有序用 ordinal;高基数用 embedding 或频次编码;
- 缺失值:机制决定策略——完全随机可用均值/中位数填补;能「解释缺失本身」时加 is_missing 标志;树模型自带处理;
- 文本粗特征:TF-IDF = 词频 × 逆文档频率(「常见于本文但别处很少」的词加权)——词袋时代的主力,现在了解概念即可(嵌入时代见 RAG 与 Agent);
- 数据泄漏高频来源:归一化统计量在全量数据上算再划分、去重前切分、用未来特征。
六、端到端工作流清单
- 明确目标与评估指标(与业务损失对齐);
- 探索数据:分布、缺失、离群、类别;定出训练/验证/测试与防泄漏方案;
- 定 baseline(规则/简单模型)→ 特征工程 → 复杂模型逐步升级,每次只改一个变量;
- 交叉验证选超参;记录每一次实验(数据版本、特征、超参、分数);
- 用测试集做一次性最终评估 → 汇报分数与失败样本分析。
七、踩坑清单
- 数据泄漏:标准化/填补在划分前做、测试信息进训练,最常见且最致命——分数虚高、上线崩;
- 用 accuracy 汇报不平衡任务:换 PR-AUC 或分层看 P/R;
- 只调模型不调数据:数据质量/标注错误往往贡献最大提升;
- 早停当摆设:过拟合要先看「验证集曲线」而不是只盯训练 loss;
- AUC 高不代表业务好:它衡量排序,A/B 与业务指标才是终审;
- KMeans 的 k 随便拍:用肘部法/轮廓系数/Gap Statistic 至少一个;
- 表格任务一上来就上深度模型:先跑 GBDT baseline,通常更快更好;
- 无视特征缩放就上距离模型:量纲大的特征会主导 KNN/SVM/KMeans 结果;
- 把随机种子当玄学:固定 seed、固定数据切分、固定初值,否则无法复现与归因;
- 测试集反复用:每碰一次测试集都在偷看答案,最终分数会虚高。
下一步:理解了「损失最小化 + 梯度下降」的骨架后,进入 深度学习 看它是如何被放大到上亿参数的网络中;实践工具从 PyTorch 起步。