大模型教我成为大模型算法工程师之day3:传统机器学习算法(下)
Day 3: 传统机器学习算法(下)—— 集成学习与聚类算法
写在前面:如果说 Day 2 的算法是"单兵作战"的特种兵,那么今天的主角就是"集团军作战"。在 Kaggle 等数据竞赛和工业界实战中,集成学习(尤其是 XGBoost/LightGBM)几乎统治了表格数据(Tabular Data)的半壁江山。同时,我们将目光转向无监督学习,看看如何在没有标签的情况下发现数据背后的结构。
目录
- 集成学习:三个臭皮匠,顶个诸葛亮
- 梯度提升树 (GBDT) 三巨头:XGBoost, LightGBM, CatBoost
- 聚类算法:K-means 与 DBSCAN
- 算法大比拼与总结
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 的直觉
想象你在教学生(模型)做题:
- 让学生做一套题。
- 找出学生做错的题(残差)。
- 重点教他怎么做这些错题(训练下一个模型拟合残差)。
- 重复这个过程,最后把所有学到的知识加起来。
这就是 Gradient Boosting 的本质:利用梯度下降的思想,每一步都在减少上一步的残差。
Fm(x)=Fm−1(x)+η⋅hm(x)F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)Fm(x)=Fm−1(x)+η⋅hm(x)
- Fm−1(x)F_{m-1}(x)Fm−1(x):当前的强模型
- hm(x)h_m(x)hm(x):新的弱模型(拟合负梯度/残差)
- η\etaη:学习率(步长)
2.2 XGBoost (eXtreme Gradient Boosting)
陈天奇博士开发的 XGBoost 是机器学习史上的里程碑。它对 GBDT 做了极致的工程优化和数学改进。
核心改进:
- 二阶泰勒展开:传统 GBDT 只利用一阶导数,XGBoost 利用了二阶导数(Hessian),下降更快更准。
- 正则化:在损失函数中显式加入了树的复杂度惩罚(叶子节点数、权重L2范数),防过拟合。
- 近似算法:对于大规模数据,通过分位数(Quantile Sketch)寻找最佳分裂点,而不是遍历所有值。
- 系统优化:列块存储、并行计算、缺失值自动处理。
实战代码:
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 在海量数据下内存消耗大、训练慢的问题。
核心黑科技:
- GOSS (单边梯度采样):保留梯度大的样本(误差大,需要重点学),随机丢弃梯度小的样本。用更少的数据达到差不多的精度。
- EFB (互斥特征绑定):将互斥的稀疏特征(如 One-hot 后的不同列)捆绑在一起,降低特征维度。
- 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,这可能导致维度爆炸或信息丢失。
核心优势:
- 自动处理类别特征:使用了 Ordered Target Statistics,有效地解决了 Target Encoding 中的数据泄露(Prediction Shift)问题。
- 对称树结构:预测速度极快,且不易过拟合。
3. 聚类算法:K-means 与 DBSCAN
前面讲的都是监督学习(有标签 y)。现在我们进入无监督学习(只有特征 X),目标是发现数据的内在结构。
3.1 K-means 聚类
直觉:把数据分成 K 堆,每一堆有一个中心(质心),每个点都找离自己最近的那个中心。
算法流程:
- 随机初始化 K 个质心。
- E步 (Assignment):计算每个点到 K 个质心的距离,将其分配给最近的簇。
- M步 (Update):重新计算每个簇的质心(取平均值)。
- 重复 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) 的邻居,这就形成了一个核心区域。
优势:
- 不需要指定 K:它能自动发现簇的数量。
- 能发现任意形状的簇:只要密度连通即可(比如环形)。
- 抗噪声:低密度区域的点会被标记为噪声(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) 的时代,为什么还要学这些?
- 表格数据上,DL 并不占优:在结构化数据(CSV/Excel表)上,精心调参的 GBDT 往往能击败复杂的 Transformer,且训练快得多。
- 小样本场景:DL 需要海量数据,而 SVM、随机森林在几百几千条数据上就能工作得很好。
- 可解释性:逻辑回归的权重、树模型的特征重要性,比神经网络的"黑盒"更容易被业务方接受。
📚 参考资源
- 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)。俗话说"数据和特征决定了机器学习的上限,而模型只是在逼近这个上限"。如何清洗数据?如何构造神仙特征?这是算法工程师最值钱的经验。
更多推荐
所有评论(0)