本文是《LLM 时代的经典机器学习:只讲它在哪里重现》系列的第 3 篇(共六篇)。上一篇:线性回归与逻辑回归——奖励模型的骨架;下一篇:无监督——K-Means、PCA 与 embedding 聚类

预训练数据工程是用分类器决定哪些文本进训练集:质量分类器、语言识别、安全分类器、领域分类——每一个都是经典的文本分类任务。而做这些分类的模型不是 LLM,是 fastText、逻辑回归、梯度提升树。原因不是它们效果更好,而是一道算力题:用 8B 模型给 15T token 打分,要花掉训练这个模型三分之一的算力。这一篇把六个经典分类器放在同一份数据上比一比、各用一句话说清它们的假设与失效方式,然后算这笔账。

全篇的核心问题是:

预训练数据过滤为什么用 fastText 与线性模型而不是 LLM?表格数据为什么至今是 GBDT 的天下?

一、总览

1. 六个分类器

线性边界     逻辑回归 · 朴素贝叶斯(特征独立)· 感知机 / 线性 SVM
弯的边界     KNN(找邻居投票)· SVM + 核 · 决策树(逐特征切分)
树的集成     随机森林(bagging 降方差)· 梯度提升(逐棵树拟合残差)—— 表格数据的默认最强

2. 本文的章节安排

主题 内容
同一份数据上比 七个模型的训练 / 测试准确率与耗时;各一句话
树与树的集成 决策树怎么切、为什么过拟合;随机森林与梯度提升;特征重要性
KNN 与相似度 不训练的分类器;它在 LLM 上以”检索”的形式无处不在
数据质量分类器的算力账 15T token 打分:8B 是 1/3、1 亿参数是 0.4%;两级做法
小分类器带回来的老问题 分布偏移、系统性误杀、阈值
自测 五道题
本文小结  

配套脚本:03_classifiers.py

二、同一份数据上比

1. 数据

5000 个样本、20 个特征,其中 8 个真的有用、4 个是有用特征的线性组合(冗余)、其余是噪声,两类的边界带非线性,5% 的标签随机翻转。这是一份典型的”表格数据”——每行一个样本、每列一个数值特征——也是数据质量打分里”长度、困惑度、符号比例、重复率”那种特征表的抽象。

2. 结果

模型            训练准确率   测试准确率   训练耗时   一句话
逻辑回归           0.832      0.853     0.00s   线性边界:有非线性就吃亏
朴素贝叶斯         0.824      0.837     0.00s   假设特征独立:冗余特征让它更差
KNN (k=15)        0.910      0.889     0.00s   不训练;预测时找 15 个邻居投票
SVM (RBF)         0.937      0.918     0.05s   核把线性边界变弯
决策树             1.000      0.826     0.04s   训练 100%、测试掉一截:过拟合的教科书样子
随机森林           1.000      0.919     0.31s   很多棵树的 bagging:降方差
梯度提升           0.975      0.913     2.93s   逐棵树拟合残差:表格数据的默认最强

逐行读:

  • 逻辑回归(上一篇):线性边界,数据有非线性就到 85% 为止。但它最快、最稳、最可解释——是所有比较的 baseline。
  • 朴素贝叶斯:比逻辑回归还差一点,因为数据里有 4 个冗余特征——它们与其他特征高度相关,违反了”特征条件独立”的假设,同一份证据被重复计算。
  • KNN:不训练(fit 只是把数据存下来),预测时找最近的 15 个训练样本投票;能表达任意形状的边界,89%。代价在预测端:每次预测要与全部训练样本算距离。
  • SVM + RBF 核:把线性边界变弯,92%。中等数据量上很强;样本到几十万以上训练变慢。
  • 决策树:训练 100%、测试 83%——过拟合的教科书样子:一棵不限深度的树会一直切到每个叶子只剩一个样本,把训练数据(包括那 5% 翻转的标签)全背下来。
  • 随机森林:300 棵树各用重采样的数据与随机的特征子集训,投票。训练仍是 100%,但测试 92%——上一篇讲的 bagging 降方差,单棵树的过拟合被平均掉了。
  • 梯度提升:92%,与随机森林持平,训练最慢(顺序地一棵棵训)。在真实的表格数据上它通常比随机森林再高一点,是表格数据的默认最强

这张表的教训不是”梯度提升最好”,而是:没有一个模型在所有数据上最好(no free lunch);线性模型是 baseline,树的集成是表格数据的默认,选择要看数据的形状、规模与预测端的成本。

三、树与树的集成

1. 决策树怎么切

决策树按特征逐个切分空间:”特征 3 > 0.5?是 → 左子树,否 → 右子树”,递归下去,叶子给出类别。每次选让两边最纯的那个特征与阈值切(纯度用基尼系数或信息熵度量——L0 第六篇的熵在这里有个小出场;分裂准则的推导不在最小集里)。

优点:不需要标准化、能处理类别特征、边界可以任意弯、可解释(能画出来)。缺点:单棵树方差极大——训练数据换几个点,树的结构完全不同——所以过拟合严重。

2. 两种集成

随机森林:bagging(上一篇)+ 每棵树只看随机的特征子集,让树之间更不相关,平均后方差降得更多。几乎不需要调参,是”先跑一个看看”的默认。

梯度提升(GBDT:XGBoost、LightGBM、CatBoost):不是并行训很多棵独立的树再平均,而是顺序地训——第 \(t\) 棵树拟合前 \(t - 1\) 棵树的残差(预测与真实的差,更准确说是 loss 的负梯度——L0 第七篇的梯度下降在”函数空间”里做)。每棵树很浅(深度 3–8),几百上千棵。它比随机森林更准也更容易过拟合,要调三个超参数:树的数量、深度、学习率(每棵树的贡献乘一个小系数)。

3. 特征重要性

树模型附带一个很有用的副产品:每个特征在所有分裂里贡献了多少纯度提升,归一化后就是特征重要性。乳腺癌数据上:

测试准确率 0.942
  worst perimeter            0.506
  worst concave points       0.161
  mean concave points        0.134
  worst radius               0.050
  worst texture              0.029
  mean texture               0.026
前 6 个特征占重要性 91%

30 个特征里 6 个占了 91%。数据质量打分里这张表告诉你”困惑度、长度、符号比例、重复率”哪个在起作用——这是数据工程师调过滤器时最常看的东西。

4. 表格数据为什么是树的天下

表格数据上——特征是数值与类别、样本几万到几千万、特征之间没有图像 / 文本那种局部结构——GBDT 至今是最强的默认选择,深度学习没有稳定优势。原因大致是:树对特征的单调变换不敏感(不需要标准化)、天然处理缺失值与类别特征、对无关特征鲁棒、在小数据上不容易过拟合(相对深度网络)。LLM 工作里表格数据出现在:数据质量打分(特征是几十个统计量)、实验结果分析(哪些超参数组合好)、线上 A/B 的归因。会用 LightGBM 训一个模型、看特征重要性、调三个超参数即可。

四、KNN 与相似度

1. 不训练的分类器

K 近邻不训练,预测时找最近的 \(k\) 个训练样本投票。它的三个要点:距离度量(欧氏还是余弦——L0 第二篇,对 embedding 用余弦)、\(k\) 的选择(小了方差大、大了偏差大——又是上一篇的权衡)、维度灾难(高维空间里所有点的距离都差不多,原始高维特征上 KNN 会失效,所以要先学出好的低维表示——embedding)。

2. 它在 LLM 上以”检索”的形式无处不在

KNN 的本质是”找最相似的几个”,这件事在 LLM 工作里到处都是:

  • embedding 检索 / RAG:查询 embedding 找最近的 \(k\) 段文本(应用地图 L3);
  • few-shot 示例选择:挑与当前问题最相似的几个示例放进 prompt;
  • 去重的候选召回(第五篇):先用相似度找出可能重复的对;
  • 训练数据的影响分析:哪些训练样本离这个测试样本最近——污染检测的一种做法。

暴力 KNN 要与全部 \(n\) 个样本算距离,\(O(n)\);近似最近邻(FAISS、HNSW、ScaNN 一类索引)把它降到近似 \(O(\log n)\),代价是偶尔漏掉真正最近的。向量数据库做的就是这件事。

五、数据质量分类器的算力账

1. 问题

预训练要从几十 T 原始文本里挑出高质量的部分。”高质量”由一个分类器判断——”这段像不像百科 / 教科书”。用什么模型?直觉是”用 LLM 自己判断最准”。算一笔账。

2. 账

给 15T token 打分。一个 token 过一个 \(N\) 参数的模型约 \(2N\) FLOP(L0 第一篇);训练一个 8B 模型的算力约 \(6ND = 6 \times 8 \times 10^9 \times 15 \times 10^{12} = 7.2 \times 10^{23}\):

打分模型                 打分 FLOP        占训练 8B 模型算力的
8B LLM 逐段打分          2.4e23           33.3%     ← 不可接受
1B 小 LLM                3.0e22            4.2%
BERT 级 1 亿参数         3.0e21            0.42%
fastText / 线性模型 ~1M  3.0e19            0.004%

用 8B 模型打分要花训练算力的三分之一。 换成 1 亿参数的模型是 0.4%,换成线性模型几乎为零。

3. 两级做法

所以实际做法是两级:用大模型给一小部分样本打标(几十万段),拿这些标签训一个小分类器,再用小分类器过全部语料。FineWeb-Edu 用 Llama-3-70B 给 45 万段打”教育价值”分(0–5),训一个小 embedding 模型加线性回归头,再过全部 15T;DCLM 用 fastText 做质量过滤。不是小模型效果更好,是只有它跑得起——这就是总纲重现表里”梯度提升树与线性模型仍是数据质量打分的首选”那一句的算术依据。

脚本里还有一个真实的文本分类器例子(20newsgroups 四个类别、TF-IDF 特征 + 朴素贝叶斯 / 逻辑回归,需要联网下载数据):几万个 n-gram 特征的线性模型,训练一秒钟,准确率 80–90%。这就是 fastText 一类模型的形态——词袋特征 + 线性分类器,在”判断这段文本属于哪一类”这件事上,它离 LLM 的差距远小于算力上的差距。

六、小分类器带回来的老问题

用小分类器过滤万亿 token,经典监督学习的每个问题也一并回来,只是规模大了一万倍:

  • 分布偏移:训练标签是在几十万段样本上打的,这些样本是否代表全部语料?如果标注样本里没有代码、没有非英语,分类器对它们的判断是随机的。
  • 系统性误杀(类别不平衡与偏见):分类器可能把某种语体——非英语、口语、诗歌、低资源领域——系统性判为低质量。每滤掉一类文本,模型就失去一种能力,而且这个损失在 benchmark 上不一定看得见。
  • 阈值:分数切在哪里、滤掉多少——精确率与召回率的权衡(第六篇)。FineWeb-Edu 切在 3 分留下约 1.3T token,切在 2 分留下几倍多;这个决定没有标准答案,取决于你有多少数据、模型多大(Chinchilla 的 \(D / N \approx 20\) 告诉你至少要多少 token)。

数据工程师每天在做的,是经典监督学习在万亿 token 上的工程化——同样的模型、同样的失效方式、同样的评估工具。

七、自测

  1. 决策树训练准确率 100%、测试 83%,随机森林训练也 100%、测试 92%。为什么训练准确率一样测试差这么多?
  2. 朴素贝叶斯在有冗余特征的数据上为什么变差?
  3. 一个数据集特征全是数值、样本 50 万、特征 40 个,先跑什么模型?为什么不是神经网络?
  4. 用 1B 模型给 30T token 打分,占训练一个 70B 模型(\(D = 15\text{T}\))算力的百分之几?
  5. 质量分类器的训练标签来自 40 万段英文百科风格的样本。用它过滤一个含 30% 代码与 20% 中文的语料,会发生什么?

答案要点:(1)两者都能背下训练集,但随机森林平均了 300 棵树,方差被压掉,泛化更好。(2)冗余特征高度相关,”条件独立”假设不成立,同一份证据被重复计数、概率过度自信。(3)LightGBM / XGBoost:表格数据上 GBDT 是默认最强,不需要标准化、可解释、小数据不易过拟合。(4)\(2 \times 10^9 \times 30 \times 10^{12} = 6 \times 10^{22}\),训练 \(6 \times 70 \times 10^9 \times 15 \times 10^{12} = 6.3 \times 10^{24}\),约 1%。(5)分布偏移:代码与中文在训练标签里没有,分类器对它们的判断接近随机或系统性偏低,很可能把它们大量滤掉——模型失去这两种能力。

八、本文小结

  • 同一份 5000 样本的表格数据上:逻辑回归 85%(线性边界)、朴素贝叶斯 84%(冗余特征违反独立假设)、KNN 89%(不训练、预测贵)、SVM 92%(核变弯边界)、决策树 83%(训练 100%——过拟合的教科书样子)、随机森林 92%(bagging 降方差)、梯度提升 91%(逐棵拟合残差,表格数据默认最强)。没有一个模型在所有数据上最好
  • 决策树逐特征切分、可解释、单棵方差极大;随机森林并行 + 随机特征子集;梯度提升顺序拟合残差、浅树、调三个超参数;特征重要性是调过滤器时最常看的表(乳腺癌 6/30 个特征占 91%)。表格数据至今是 GBDT 的天下。
  • KNN 不训练、找邻居投票;距离度量、\(k\)、维度灾难;它在 LLM 上以检索的形式无处不在(RAG、few-shot 选择、去重召回、污染检测),近似最近邻把 \(O(n)\) 降到 \(O(\log n)\)。
  • 数据质量分类器的算力账:给 15T token 打分,8B 模型是训练算力的 1/3、1 亿参数 0.4%、线性模型几乎为零 → 两级做法:大模型标几十万段、小分类器过全部(FineWeb-Edu、DCLM)。不是效果更好,是只有它跑得起。
  • 小分类器带回来的老问题:分布偏移、对少数语体的系统性误杀、阈值的精确率 / 召回率权衡。

下一篇讲不需要标签的两件事——聚类与降维:怎么知道一个语料里有什么主题、4096 维的 embedding 怎么”看”。

本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/a-family-of-classifiers-from-naive-bayes-to-gradient-boosting.html)的前提下,欢迎各种形式的转载、翻译或商业引用。


COMMENTS

评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。

×