模块五 · 机器学习进阶
模块四只讲了回归、逻辑回归、决策树三个"网红入门款"。这一模块把经典 ML 的主力梯队补齐:朴素贝叶斯、kNN、SVM、集成学习、聚类、降维。它们在深度学习崛起之前统治了表格数据十几年,今天在风控、推荐、搜广推里依然是一线选手。
上一模块摸到了大模型,但别忘了在表格数据上,经典 ML 至今还是主力。这一模块把朴素贝叶斯、kNN、SVM、集成学习、聚类、降维补齐。为什么需要?风控、推荐、搜广推里它们天天在跑,而且它们的思想是理解深度学习的台阶。学完你能对着一个表格数据集选对算法。下一模块进深度学习的"炼丹手册"。
5.1 朴素贝叶斯分类器
Naive Bayes · 用贝叶斯定理+特征独立假设做分类想核心思想
贝叶斯定理:P(类别|特征) = P(特征|类别)·P(类别) / P(特征)。我们要算的是"给了这堆特征,它属于哪个类别的概率最大"。
"朴素"在哪:假设所有特征之间互相独立——现实中这假设几乎不成立("出现"和"账户"经常一起出现),但即使这么粗,效果居然出奇地好。于是:
ŷ = argmaxy P(y) · ∏i P(xi | y)
工程要点:连乘一大堆小数会下溢,所以实际算对数概率:log P(y) + ∑ log P(xi|y)。再用拉普拉斯平滑(分子加 1、分母加类别数)防止某个词没出现过就把概率乘成 0。
P(正常|中奖,发票) ∝ P(正常)·P(中奖|正常)·P(发票|正常) = 0.5 × (0+1)/(4+2) × (1+1)/(4+2) = 0.5 × 1/6 × 2/6 ≈ 0.0278
0.1875 > 0.0278,判为垃圾邮件。注意"中奖"在正常邮件里 0 次,不平滑直接乘 0,就变成 0 了——这就是拉普拉斯平滑的意义。
强项
训练预测极快、小数据也稳、可解释。
弱项
独立假设太天真,特征强相关时掉点;不适合图像。
① 贝叶斯+独立假设=朴素贝叶斯。② 算对数概率防下溢,拉普拉斯平滑防零。③ 垃圾邮件、文本分类的老炮 baseline。
5.2 k 近邻 kNN
k-Nearest Neighbors · 物以类聚,人以群分想核心思想
不训练,只记数据。新来一个点,在训练集里找离它最近的 k 个邻居,让这 k 个邻居投票,多数类就是答案。回归任务则取邻居平均值。
距离度量:欧氏距离 d = √(∑(xi−x'i)²);特征量纲差太大(身高 170 vs 体重 65)要先标准化,否则大数值维度会主导距离。
复杂度:训练 O(1)(就是存数据),预测 O(n·d)——每次都要跟所有点算距离。数据大了用 KD-Tree / Ball Tree / 向量索引加速。
坑:k 选太小或太大。k=1 容易被噪声带跑(过拟合);k=全数据集等于无脑猜最多类(欠拟合)。通常 k 取奇数避免平票,用交叉验证选。
① kNN=惰性学习,预测时才干活。② 必须先标准化特征。③ 小数据可解释 baseline,大数据要靠向量索引加速。
5.3 支持向量机 SVM 与核技巧
Support Vector Machine · 找一条"最胖的分界线"想核心思想
分类目标:不只是把两类分开,而是找一条分界线,让它离两边最近的点都尽可能远。这个距离叫"间隔(margin)"。SVM 要最大化间隔。
数学形式(硬间隔):
min ½‖w‖² s.t. yi(w·xi + b) ≥ 1 for all i
约束 yi(w·xi+b) ≥ 1 的意思是:每个点不仅要分对,还要"站在至少 1 的安全距离外"。½‖w‖² 是间隔宽度的倒数,最小化它 = 把线推胖。
支持向量:真正决定分界线的,只有离边界最近的那几个点(支持向量),其他点删了都不影响结果。
核技巧(Kernel Trick):线性分不开怎么办?把数据映射到高维空间,在高维里就线性可分了。但显式映射太贵,核函数直接算高维空间的点积:K(x, x') = φ(x)·φ(x')。常用 RBF 核:K(x,x') = exp(−γ‖x−x'‖²)。
| 核 | 公式 | 适用场景 |
|---|---|---|
| 线性核 | K(x,x') = x·x' | 高维稀疏文本(如 TF-IDF) |
| 多项式核 | K = (γ x·x' + r)^d | 中等维、交互特征 |
| RBF 高斯核 | K = exp(−γ‖x−x'‖²) | 通用、最常用、默认 |
① SVM=最大化间隔的线性分类器。② 只有支持向量决定边界。③ 核技巧免显式升维,RBF 核最常用。④ 大数据慢,小数据强。
5.4 集成学习:Bagging / Boosting / Random Forest / XGBoost
Ensemble · 三个臭皮匠,顶个诸葛亮想两大流派
Bagging(并行):训练多个独立模型(通常是树),各自投票/平均。每个模型用有放回采样的不同数据子集,随机森林还随机选特征子集。核心思想:独立的错误会互相抵消,方差降低。
Boosting(串行):一个一个训练,后一个专门纠正前一个犯的错。前一个分错的样本权重加大,下一个重点学它们。AdaBoost、GBDT、XGBoost 都属此类。核心思想:把弱学习器逐步加成强学习器,偏差降低。
Random Forest:Bagging + 决策树。上百棵树投票,抗过拟合,表格数据王者。
XGBoost / LightGBM:GBDT 的工程化极致。用二阶泰勒展开近似损失,加正则项控复杂度,预排序+直方图加速。Kaggle 表格赛常年霸榜,工业界搜广推主力。
| Bagging(如随机森林) | Boosting(如 XGBoost) | |
|---|---|---|
| 训练方式 | 并行独立训练 | 串行,后一个纠前一个 |
| 主要作用 | 降方差 | 降偏差 |
| 对噪声 | 鲁棒 | 敏感 |
| 代表 | Random Forest | AdaBoost / GBDT / XGBoost |
① Bagging 并行降方差,Boosting 串行降偏差。② 随机森林=Bagging+随机特征。③ XGBoost 是 GBDT 的二阶泰勒+工程优化版,表格数据真神。
5.5 聚类算法:K-Means / DBSCAN / 层次聚类
Clustering · 没有标准答案,自己把相似的凑一堆想三大流派
K-Means(划分式):给定 k,迭代两步——① 把每个点分给最近的质心;② 重新算每个簇的质心(均值)。直到质心不动。快、简单,但要预先知道 k,且假设簇是凸形球状。
DBSCAN(密度式):不需要 k。规定半径 ε 和最小点数 MinPts,密度够就连通成簇,稀疏点算噪声。能发现任意形状簇、能识别异常点,但对 ε 和 MinPts 敏感。
层次聚类:从每个点自己一簇开始,反复合并最近的两簇,画成一棵树状图(树状图/dendrogram)。不需要预设 k,砍树状图哪里就是几个簇,但 O(n²) 太慢。
K-Means 适用
球状簇、数据量大、想快。用户分群、图像压缩。
DBSCAN 适用
任意形状、有异常点、不知道 k。地理热点、异常检测。
① K-Means:分-合迭代,要预设 k,快。② DBSCAN:密度连通,自动识簇+异常。③ 层次聚类:树状合并,直观但慢。
5.6 降维:PCA 与 t-SNE
Dimensionality Reduction · 把 1000 维压成 2 维还不丢东西想PCA 推导思路
目标:找一组正交方向,让数据投影到这些方向后方差最大(信息保留最多)。
四步走:
① 中心化:每个特征减去均值,X ← X − μ。
② 算协方差矩阵:C = (1/(n−1)) XTX(d×d 矩阵,Cij 是第 i、j 维的协方差)。
③ 特征值分解:求 C 的特征值 λ₁ ≥ λ₂ ≥ … 和对应特征向量 v₁, v₂, …。
④ 投影:取前 k 个特征向量组成投影矩阵 W = [v₁, …, vₖ],Z = XW。
直觉:特征值 λi = 数据在 vi 方向上的方差。保留最大的 k 个特征值方向 = 保留最大方差,即保留最多信息。方差占比 = ∑前k λi / ∑所有 λi。
t-SNE:非线性降维,专门用于可视化(压到 2D/3D)。它把高维距离转成概率相似度,让高维相似的点在低维也相似。不做特征提取,只做可视化——别拿它训模型。
坑:不标准化就 PCA。身高 170~180、体重 60~90,体数量纲不同,方差大的维度会主导。必须先标准化(z-score)再 PCA。
① PCA=协方差矩阵特征分解,取最大方差方向。② 必须先中心化+标准化。③ t-SNE 只做可视化不做训练。
5.7 特征工程:让模型吃对饭的脏活累活
Feature Engineering · 数据和特征决定上限,模型只是逼近它想引子与大白话
引子:吴恩达那句"数据和特征决定了机器学习的上限,模型只是逼近这个上限"。同样一份表格,特征做得好,XGBoost 随便跑就 95 分;特征烂,换 Transformer 也白搭。
① 缺失值处理:数值列用均值/中位数填(中位数抗异常);类别列单独填一个"未知"类;时间序列不能用未来信息填(数据泄露)。
② 异常值处理:箱线图法(超出 Q1−1.5IQR / Q3+1.5IQR)或 Z-score。决策树抗异常,线性模型/神经网络对异常极敏感,必须截尾(winsorize)。
③ 特征缩放:StandardScaler=(x−μ)/σ;MinMaxScaler 压到 [0,1]。KNN/SVM/神经网络/PCA 必须缩放(距离敏感);树模型不用。
④ 类别编码:低基数 One-Hot;高基数(几百个城市)用 Target Encoding / Embedding(神经网络直接学)。别给序数类别乱编号("北京=1,上海=2"会让模型误以为上海比北京"大")。
⑤ 特征选择:过滤法(相关系数/互信息)、包装法(递归消除 RFE)、嵌入法(L1 稀疏化、树模型特征重要性)。降维去冗余,防过拟合、提速度。
坑一:数据泄露(Leakage)。用全数据集的均值填缺失值——等于测试集信息溜进训练。正确做法:在训练集上 fit scaler/imputer,再 transform 测试集。坑二:高基数类别直接 One-Hot——1000 个城市变出 1000 列稀疏特征,模型学不动。换 Target Encoding 或 Embedding。
练一练
基础KNN 和决策树,哪个必须做特征缩放?
看答案
KNN 必须(距离对量纲敏感);决策树不必(按阈值分裂,单调变换不改变分裂结果)。进阶为什么用训练集的均值填缺失值、而不是用全表均值?
看答案
用全表均值=测试集统计量泄露进训练流程,线上你根本拿不到未来数据。必须在 train 上 fit、test 上 transform,模拟真实部署。自评反馈:答对了继续;数据泄露和缩放的边界,回看这一节。
① 缺失/异常/缩放/编码/选择五件套。② 距离型模型要缩放,树模型不要。③ 铁律:train 上 fit,test 上 transform,防泄露。
5.8 LightGBM / CatBoost 与关联规则 Apriori
LightGBM / CatBoost / Apriori · 表格赛的新王与购物篮分析想引子与大白话
引子:5.4 提了 XGBoost 一句,这里把表格数据三家和经典购物篮算法补全。Kaggle 表格赛现在的冠军,十有八九是 LightGBM 或 CatBoost。
① LightGBM(微软):GBDT 的 GPU/大数据优化版。两大杀招:直方图算法(连续值分 bin 再找分裂点,快)+ GOSS(按梯度大小采样,保留大梯度样本)+ EFB(把稀疏特征捆绑)。leaf-wise 生长(从损失最大的叶子长,而不是 level-wise),比 XGBoost 快几倍,内存省一半。
② CatBoost(Yandex):原生支持类别特征(不用你 One-Hot),用有序目标统计处理类别;还提出有序提升(解决预测偏移)。类别特征多的场景(如用户画像)它比 XGBoost/LightGBM 省心。
③ Apriori 关联规则:"买了面包的人 80% 还会买牛奶"——购物篮分析。两步:先找出所有频繁项集(支持度≥阈值),再从频繁项集提规则(置信度≥阈值)。经典规则:先验性质——频繁项集的子集必频繁,反过来说不频繁的项集超集一定不频繁,逐层剪枝。超市货架摆放、推荐系统老祖宗。
选型
中小数据+稳妥→XGBoost;大数据/高维快→LightGBM;类别特征多/懒得编码→CatBoost。三家都是 GBDT 家族,会一个其余手到擒来。
Apriori
购物篮分析、货架摆放、"买了还买"推荐。FP-Growth 是它的升级版(不产生候选集,更快)。
① LightGBM=直方图+leaf-wise,快省内存;CatBoost 原生吃类别特征。② Apriori 用先验性质剪枝找频繁项集。③ 支持度/置信度/提升度三把尺子,提升度>1 才算真关联。
① 用自己的话解释:用"投票"和"接力"区分 Bagging 和 Boosting。
② 举个反例 / 生活例子:反例——为什么不标准化就直接 PCA,结果会被方差大的维度带偏?
③ 哪里还说不清:SVM 的核函数到底把数据"搬到"哪去了、为什么能分线性不可分,你能讲清吗?