Day 3: 传统机器学习算法(下)—— 集成学习与聚类算法

写在前面:如果说 Day 2 的算法是"单兵作战"的特种兵,那么今天的主角就是"集团军作战"。在 Kaggle 等数据竞赛和工业界实战中,集成学习(尤其是 XGBoost/LightGBM)几乎统治了表格数据(Tabular Data)的半壁江山。同时,我们将目光转向无监督学习,看看如何在没有标签的情况下发现数据背后的结构。


目录

  1. 集成学习:三个臭皮匠,顶个诸葛亮
  2. 梯度提升树 (GBDT) 三巨头:XGBoost, LightGBM, CatBoost
  3. 聚类算法:K-means 与 DBSCAN
  4. 算法大比拼与总结

1. 集成学习:三个臭皮匠,顶个诸葛亮

1.1 核心思想与偏差-方差权衡

集成学习 (Ensemble Learning) 的核心思想很简单:结合多个弱学习器 (Weak Learners) 来构建一个强学习器

这背后隐含着机器学习中的核心难题 —— 偏差-方差权衡 (Bias-Variance Tradeoff)

  • 偏差 (Bias):模型不够复杂,学不到真实规律(欠拟合)。
  • 方差 (Variance):模型太复杂,对训练数据的微小波动太敏感(过拟合)。

集成学习通过不同的策略来解决这个问题:

策略 代表算法 核心机制 作用
Bagging 随机森林 并行训练,投票/平均 降低方差 (防止过拟合)
Boosting XGBoost, AdaBoost 串行训练,后一个模型修补前一个的错误 降低偏差 (提升准确率)
Stacking - 训练一个"元模型"来组合基模型的预测 综合提升

1.2 Bagging 回顾

Day 2 讲过的随机森林就是 Bagging 的典型代表。它通过自助采样 (Bootstrap) 制造数据的多样性,让每棵树都"略有不同",最后取平均值,从而平滑了预测结果。


2. 梯度提升树 (GBDT) 三巨头

Boosting 家族是目前工业界处理表格数据(Tabular Data)的王者。

2.1 Boosting 的直觉

想象你在教学生(模型)做题:

  1. 让学生做一套题。
  2. 找出学生做错的题(残差)。
  3. 重点教他怎么做这些错题(训练下一个模型拟合残差)。
  4. 重复这个过程,最后把所有学到的知识加起来。

这就是 Gradient Boosting 的本质:利用梯度下降的思想,每一步都在减少上一步的残差

Fm(x)=Fm−1(x)+η⋅hm(x)F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)Fm(x)=Fm1(x)+ηhm(x)

  • Fm−1(x)F_{m-1}(x)Fm1(x):当前的强模型
  • hm(x)h_m(x)hm(x):新的弱模型(拟合负梯度/残差)
  • η\etaη:学习率(步长)

2.2 XGBoost (eXtreme Gradient Boosting)

陈天奇博士开发的 XGBoost 是机器学习史上的里程碑。它对 GBDT 做了极致的工程优化和数学改进。

核心改进

  1. 二阶泰勒展开:传统 GBDT 只利用一阶导数,XGBoost 利用了二阶导数(Hessian),下降更快更准。
  2. 正则化:在损失函数中显式加入了树的复杂度惩罚(叶子节点数、权重L2范数),防过拟合。
  3. 近似算法:对于大规模数据,通过分位数(Quantile Sketch)寻找最佳分裂点,而不是遍历所有值。
  4. 系统优化:列块存储、并行计算、缺失值自动处理。

实战代码

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 1. 准备数据
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# 2. 转换数据格式 (DMatrix是XGBoost特有的高效数据结构)
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# 3. 设置参数
params = {
    'max_depth': 3,          # 树深
    'eta': 0.1,              # 学习率
    'objective': 'binary:logistic', # 二分类任务
    'eval_metric': 'logloss' # 评估指标
}

# 4. 训练
num_round = 100
bst = xgb.train(params, dtrain, num_round)

# 5. 预测
preds = bst.predict(dtest)
predictions = [round(value) for value in preds]
print(f"Accuracy: {accuracy_score(y_test, predictions):.4f}")

2.3 LightGBM (Light Gradient Boosting Machine)

微软推出的 LightGBM 旨在解决 XGBoost 在海量数据下内存消耗大、训练慢的问题。

核心黑科技

  1. GOSS (单边梯度采样):保留梯度大的样本(误差大,需要重点学),随机丢弃梯度小的样本。用更少的数据达到差不多的精度。
  2. EFB (互斥特征绑定):将互斥的稀疏特征(如 One-hot 后的不同列)捆绑在一起,降低特征维度。
  3. Histogram 算法:将连续特征离散化为直方图(分桶),极大降低了寻找分裂点的时间复杂度 O(N)→O(bins)O(N) \to O(\text{bins})O(N)O(bins)

结论:在处理大数据集时,LightGBM 通常比 XGBoost 快几倍到十几倍,且精度几乎不掉。

2.4 CatBoost

Yandex 开源的 CatBoost 专为处理类别特征 (Categorical Features) 而生。

痛点:XGB/LGB 通常需要先对类别特征做 One-hot 或 Label Encoding,这可能导致维度爆炸或信息丢失。

核心优势

  1. 自动处理类别特征:使用了 Ordered Target Statistics,有效地解决了 Target Encoding 中的数据泄露(Prediction Shift)问题。
  2. 对称树结构:预测速度极快,且不易过拟合。

3. 聚类算法:K-means 与 DBSCAN

前面讲的都是监督学习(有标签 y)。现在我们进入无监督学习(只有特征 X),目标是发现数据的内在结构。

3.1 K-means 聚类

直觉:把数据分成 K 堆,每一堆有一个中心(质心),每个点都找离自己最近的那个中心。

算法流程

  1. 随机初始化 K 个质心。
  2. E步 (Assignment):计算每个点到 K 个质心的距离,将其分配给最近的簇。
  3. M步 (Update):重新计算每个簇的质心(取平均值)。
  4. 重复 2-3 直到质心不再移动。

缺点

  • K 值难定:必须预先指定分几类(常用手肘法 Elbow Method 辅助判断)。
  • 对离群点敏感:一个噪声点可能会拉偏质心。
  • 只能分球形簇:对于圆环形、月牙形数据束手无策。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# K-means 简单易用
kmeans = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans.fit_predict(X)

# 质心
centroids = kmeans.cluster_centers_

3.2 DBSCAN (基于密度的聚类)

直觉:聚类就是"人口稠密区"。如果在某个半径 ϵ\epsilonϵ 内有足够多 (min_samplesmin\_samplesmin_samples) 的邻居,这就形成了一个核心区域。

优势

  1. 不需要指定 K:它能自动发现簇的数量。
  2. 能发现任意形状的簇:只要密度连通即可(比如环形)。
  3. 抗噪声:低密度区域的点会被标记为噪声(Outliers,也就是 -1 类)。

参数敏感

  • eps (半径) 和 min_samples 对结果影响很大,调参需要技巧。
from sklearn.cluster import DBSCAN

# eps: 邻域半径, min_samples: 成为核心对象所需的最小邻居数
dbscan = DBSCAN(eps=0.5, min_samples=5)
y_pred = dbscan.fit_predict(X)

# 结果中 -1 代表噪声点
n_noise = list(y_pred).count(-1)
print(f"发现噪声点数量: {n_noise}")

3.3 层次聚类 (Hierarchical Clustering)

直觉:像生物分类学一样,建立一棵树状结构(谱系图)。

  • 凝聚式 (Agglomerative):开始时每个点都是一类,然后两两合并最近的类,直到变成一大类。
  • 优点:不需要指定 K,可以通过剪枝得到任意数量的聚类;树状图(Dendrogram)可视化效果极佳。

4. 算法大比拼与总结

4.1 传统 ML 算法全景图

任务 首选算法 备选/特色 备注
表格分类/回归 XGBoost / LightGBM CatBoost (类别特征多时) 工业界最强战力
简单基线 逻辑回归 / 随机森林 快速验证,可解释性好
稀疏文本 SVM (Linear) Naive Bayes 高维数据表现佳
简单聚类 K-means 速度快,需指定K
复杂/噪声聚类 DBSCAN 谱聚类 抗噪,形状不限

4.2 深度学习 vs 传统机器学习

既然现在是深度学习 (DL) 的时代,为什么还要学这些?

  1. 表格数据上,DL 并不占优:在结构化数据(CSV/Excel表)上,精心调参的 GBDT 往往能击败复杂的 Transformer,且训练快得多。
  2. 小样本场景:DL 需要海量数据,而 SVM、随机森林在几百几千条数据上就能工作得很好。
  3. 可解释性:逻辑回归的权重、树模型的特征重要性,比神经网络的"黑盒"更容易被业务方接受。

📚 参考资源

  • XGBoost 论文: “XGBoost: A Scalable Tree Boosting System” (KDD 2016)
  • LightGBM 论文: “LightGBM: A Highly Efficient Gradient Boosting Decision Tree” (NeurIPS 2017)
  • Scikit-learn Clustering 文档: 包含各种聚类算法在不同形状数据上的对比图,非常直观。

明日预告:Day 4 我们将深入 特征工程 (Feature Engineering)。俗话说"数据和特征决定了机器学习的上限,而模型只是在逼近这个上限"。如何清洗数据?如何构造神仙特征?这是算法工程师最值钱的经验。

更多推荐