楼层: 首页/ 算法与AI/ 模块五 · 机器学习进阶
进

模块五 · 机器学习进阶

Advanced ML · 从"会调包"到"知道包里装了什么"

模块四只讲了回归、逻辑回归、决策树三个"网红入门款"。这一模块把经典 ML 的主力梯队补齐:朴素贝叶斯、kNN、SVM、集成学习、聚类、降维。它们在深度学习崛起之前统治了表格数据十几年,今天在风控、推荐、搜广推里依然是一线选手。

上一模块摸到了大模型,但别忘了在表格数据上,经典 ML 至今还是主力。这一模块把朴素贝叶斯、kNN、SVM、集成学习、聚类、降维补齐。为什么需要?风控、推荐、搜广推里它们天天在跑,而且它们的思想是理解深度学习的台阶。学完你能对着一个表格数据集选对算法。下一模块进深度学习的"炼丹手册"。

本模块要学什么(按这个顺序学)
朴素贝叶斯 → kNN → SVM → 集成Bagging/Boosting → K-Means/DBSCAN → PCA/t-SNE降维

5.1 朴素贝叶斯分类器

Naive Bayes · 用贝叶斯定理+特征独立假设做分类

想核心思想

贝叶斯定理:P(类别|特征) = P(特征|类别)·P(类别) / P(特征)。我们要算的是"给了这堆特征,它属于哪个类别的概率最大"。

"朴素"在哪:假设所有特征之间互相独立——现实中这假设几乎不成立("出现"和"账户"经常一起出现),但即使这么粗,效果居然出奇地好。于是:

ŷ = argmaxy P(y) · ∏i P(xi | y)

工程要点:连乘一大堆小数会下溢,所以实际算对数概率:log P(y) + ∑ log P(xi|y)。再用拉普拉斯平滑(分子加 1、分母加类别数)防止某个词没出现过就把概率乘成 0。

例:垃圾邮件判定——三封训练邮件统计
垃圾邮件里"中奖"出现 3/4 次、"发票"出现 2/4 次;正常邮件里"中奖" 0/4、"发票" 1/4。垃圾邮件先验 P(垃圾)=0.5。新邮件含"中奖""发票",判啥?
解:
P(垃圾|中奖,发票) ∝ P(垃圾)·P(中奖|垃圾)·P(发票|垃圾) = 0.5 × (3/4) × (2/4) = 0.1875
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=3 判断新点 (6,6) 类别
红类点:(1,1)、(2,2)、(3,3);蓝类点:(8,8)、(7,9)、(6,8)。
解:算距离平方(省开方):到 (3,3) = 9+9=18;到 (6,8) = 0+4=4;到 (7,9) = 1+9=10;到 (8,8) = 4+4=8;到 (2,2)=32;到 (1,1)=50。最近 3 个:(6,8)蓝、(8,8)蓝、(7,9)蓝 → 三票全蓝,判蓝。
防坑

坑: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'‖²)。

例:为什么"最胖"的线更稳?
平面上两类点,两条线都能分开:一条贴紧红类点,一条居中。
解:贴紧的线离最近点距离只有 0.1,新来一个稍微偏一点的点就越界。居中的线距离 2,容错空间大。SVM 最大化间隔 = 最大容错。这就是它在小样本上比逻辑回归更稳的原因。
表 5-1 常用核函数
核公式适用场景
线性核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 能降方差?
单棵决策树对训练集极敏感(方差大)。100 棵独立树平均。
解:若 100 个模型误差独立,方差 = σ²/100,标准差直接砍到 1/10。但前提是模型"独立"——所以随机森林要随机采样+随机选特征,故意让树之间不一样。如果所有树都一样,平均等于没平均。
例:Boosting 为什么怕噪声?
AdaBoost 会把分错的样本权重越提越高。
解:如果错的那个样本其实是标注噪声(标错了),Boosting 会拼命去拟合这个噪声,最后被噪声带偏。这是 Boosting 与 Bagging 的本质区别:Bagging 抗噪,Boosting 怕噪。XGBoost 用 shrinkage(学习率)+ 采样缓解。
表 5-2 Bagging vs Boosting
Bagging(如随机森林)Boosting(如 XGBoost)
训练方式并行独立训练串行,后一个纠前一个
主要作用降方差降偏差
对噪声鲁棒敏感
代表Random ForestAdaBoost / 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 迭代一步
初始质心 c₁=(0,0), c₂=(10,0)。点 (1,1)、(2,2)、(8,0)、(9,1)。
解:分配:(1,1)、(2,2) 离 c₁ 近 → 簇1;(8,0)、(9,1) 离 c₂ 近 → 簇2。更新质心:c₁' = ((1+2)/2, (1+2)/2) = (1.5, 1.5);c₂' = ((8+9)/2, (0+1)/2) = (8.5, 0.5)。重复直到质心不再变。目标函数(惯性/簇内平方和)单调下降。
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)。它把高维距离转成概率相似度,让高维相似的点在低维也相似。不做特征提取,只做可视化——别拿它训模型。

例:数据主要沿哪个方向变化?
2D 数据点几乎在 y=x 直线附近分布,x 和 y 方差都大但强相关。
解:协方差矩阵特征向量一个沿 (1,1) 方向(方差大),一个沿 (1,−1) 方向(方差小)。PCA 把数据投影到 (1,1) 方向就够了——一维就保住了绝大部分变化。这就是降维:扔掉"几乎不变"的方向。
防坑

坑:不标准化就 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 稀疏化、树模型特征重要性)。降维去冗余,防过拟合、提速度。

例:身高 170~180、体重 50~100 喂给 KNN,要先干嘛?
量纲不同。
解:不缩放的话,体重差 50 的距离 >> 身高差 10,距离全被体重主导。先 StandardScaler 各列变均值 0 方差 1,身高和体重才"平等"地参与距离计算。树模型(XGBoost)不缩放——它按阈值分裂,量纲无所谓。
防坑

坑一:数据泄露(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% 还会买牛奶"——购物篮分析。两步:先找出所有频繁项集(支持度≥阈值),再从频繁项集提规则(置信度≥阈值)。经典规则:先验性质——频繁项集的子集必频繁,反过来说不频繁的项集超集一定不频繁,逐层剪枝。超市货架摆放、推荐系统老祖宗。

例:1000 笔交易,买面包的 500 笔里有 400 笔也买牛奶,规则{面包}→{牛奶}置信度?
置信度 = P(牛奶|面包)。
解:支持度({面包,牛奶}) = 400/1000 = 40%;置信度 = 400/500 = 80%;提升度 = P(牛奶|面包)/P(牛奶) = 0.8/0.5 = 1.6 > 1,说明买面包确实提升买牛奶的概率,规则有意义。提升度=1 就是独立,<1 是负相关。
选型

中小数据+稳妥→XGBoost;大数据/高维快→LightGBM;类别特征多/懒得编码→CatBoost。三家都是 GBDT 家族,会一个其余手到擒来。

Apriori

购物篮分析、货架摆放、"买了还买"推荐。FP-Growth 是它的升级版(不产生候选集,更快)。

记
小结

① LightGBM=直方图+leaf-wise,快省内存;CatBoost 原生吃类别特征。② Apriori 用先验性质剪枝找频繁项集。③ 支持度/置信度/提升度三把尺子,提升度>1 才算真关联。

费曼学习法:讲给别人听

① 用自己的话解释:用"投票"和"接力"区分 Bagging 和 Boosting。

② 举个反例 / 生活例子:反例——为什么不标准化就直接 PCA,结果会被方差大的维度带偏?

③ 哪里还说不清:SVM 的核函数到底把数据"搬到"哪去了、为什么能分线性不可分,你能讲清吗?