文章

Kaggle 心脏病预测实战:AUC、特征工程与模型融合入门

Kaggle 心脏病预测实战:AUC、特征工程与模型融合入门

本文基于Kaggle Playground Series S6E2 - Heart Disease Prediction 心脏病预测项目,整理和记录AUC、特征工程与模型融合入门等细节。


一、指标:AUC 在优化什么

通俗理解:AUC 衡量的是:随机抽一个正样本和一个负样本,模型把正样本打分排在负样本前面的概率。排序越对,AUC 越高。

第一性原理:AUC 只关心相对排序,不关心概率是否「绝对正确」。两个模型的预测只要单调变换一致(例如都乘以 2),AUC 可以不变。

对建模的影响

  • 训练时直接把树模型的目标设为「优化 AUC」或与之相关的排序损失,和评测对齐,减少「练的东西」和「考的东西」不一致。
  • 后面会提到的 Rank Average(排名平均) 也是利用「AUC 看排序」这一点:把不同模型的输出换成「排名」再融合,减轻标度不一致带来的问题。

二、数据与标签:我们在学什么函数?

输入:多列表格特征(年龄、血压、胆固醇、心电图相关编码等)。
输出:患病概率 (P(y=1\mid x))。

第一性原理:监督学习是在用参数化模型去近似一个未知的从特征到标签的映射。特征越好、模型容量与正则越合适,近似误差在未见数据上越小(泛化越好)。

本项目里和效果相关的设定

  • 不把 id 当特征:避免模型死记硬背编号规律(极易伪造出虚假规律,在合成数据上尤其危险)。
  • 缺失值填充:用训练集的中位数/众数填,避免算法无法处理空值;同时要在训练集上统计再应用到测试集,避免穿越未来信息(下面 Target Encoding 会讲同一种原则)。

三、特征工程:人为帮模型「看见什么」?

特征工程本质是:把领域知识或统计规律显式写进输入,降低模型自己从原始列「悟出来」的难度。

1. 交互特征(乘除加减)

作用:原始列是「年龄」「胆固醇」,模型原则上也能自己分裂学到交互,但显式构造 年龄×胆固醇、心率/年龄比等,等于给树更短的决策路径。

第一性原理:真实风险往往不是单变量线性,而是「几个因素凑在一起」才陡增;交互项把联合效应摆到明面上。

对效果的影响:通常提升区分正负样本的能力(在固定模型下有更多有用信号),也可能带来噪声,需配合正则与验证。

2. 分箱(把连续值切成几段)

作用:把年龄、血压等切成若干区间,得到有序类别,树模型有时更容易捕捉「阈值两侧风险跳变」。

第一性原理:很多医学/风险场景存在分段效应;分箱是一种非线性变换。

对效果的影响:帮助模型稳定地吃到「高/中/低」结构;分箱边界若用训练集分位数,并复用到测试集,可避免泄露。

3. 频率编码

作用:对每个类别,用它在训练集中出现的比例当新特征。

第一性原理:罕见类别和常见类别在总体中的先验不同;频率是一种弱先验统计量,给树多一维信息。

对效果的影响:对高基数类别有时有用;在本赛题类别基数不高,属于补充信号

4. 分组统计特征(Group by 后的均值/标准差)

作用:例如按「性别」分组,算各组的年龄均值、胆固醇标准差,再映射回每一行。

第一性原理:同一群体内的参照水平不同:同样是某血压值,相对「同性别平均水平」偏高还是偏低,可能比绝对值更有信息量。

对效果的影响:增强上下文相关的表达,常提升泛化;必须用训练集统计量映射到测试集。

5. Target Encoding(目标编码)与 OOF

OOF 概念说明

OOFOut-of-Fold 的缩写,可理解为:「在这一折之外」「留出当前样本所在那一折」

把训练集用 K 折交叉验证 分成 K 份(像切蛋糕)。对某一条训练样本来说:

  • 训练一个只用到其余 K−1 份 的模型或统计时,得到的预测/编码,才叫这条样本的 OOF 结果(这条样本不在用来训练的那一份里)。
  • 直觉:编码这条样本时,用的「知识」全部来自别的样本,没有偷看这条样本自己的标签。

所以:OOF 预测 / OOF 编码 = 对训练集里每一行,用「不包含该行的那部分训练数据」算出来的值。整表拼起来,就得到一列与训练集行数相同的 OOF 列,可安全地当作特征或当作「模拟测试集上的表现」。

和「用全数据训练一次再预测训练集」的区别:后者每条样本的预测里混进了自己参与训练的信息,容易虚高;OOF 刻意避免这一点。


Target Encoding 在做什么?

是不是把类别变成「占比」?
可以这么理解:把离散类别(如胸痛类型 1、2、3、4)映射成一个连续数值,这个数通常取 训练集中该类样本里「患病=1」的比例(实现里常对分子分母加平滑,向全局患病率靠拢,避免某类样本极少时比例极端)。

转换前转换后(示意)
类别列 Chest pain type = 1, 2, 3, …新列 Chest pain type_te ≈ 0.35, 0.52, …(每个取值对应一个 0~1 附近的数)

树模型更容易在「连续轴」上切分;未做 OOF 时,同一类别往往先被填成同一个比例OOF 后,同一类别在不同行上也可能不同(见下例)。

为什么这对 XGBoost 往往更有帮助?

  • 原始类别(1/2/3/4)的问题:XGBoost 会按数值阈值切分(如 <2.5),但类别编号的大小关系未必有业务含义,容易引入「假顺序」。
  • TE 后(如 0.35/0.52/…)的好处:这个值带了目标信息,可理解为「该类别历史上更像阳性还是阴性」的风险强度。
  • 对 XGBoost 的直接影响
    • 更快找到有信息量的 split(分裂增益更高);
    • 可能减少树深度需求(信号更集中);
    • 常见结果是 AUC 提升(排序更好)。
  • 但不是必然提升:如果 TE 做错(比如直接用全训练集编码训练集)会泄露,线下分数可能变高但线上变差。

一句话总结:对 XGBoost 来说,TE 本质上把离散类别变成“可排序的风险强度”,让树按风险而不是按类别编号分裂。

第一性原理:用目标变量的统计信息压缩类别,让模型直接看到「历史上这类人大概多大概率阳性」。

最大陷阱——标签泄露:若用整条训练集(含当前行自己的 y)来算「某类的正例比例」,再作为当前行的特征,等价于把答案的摘要喂给模型,验证集虚高、测试集变差。

正确做法(OOF / 交叉 Target Encoding):只在不含当前样本的那几折上统计各类的正例比例;测试集对 K 折各算一遍编码再取平均。本质是:给某行算编码时,不能用到该行自己的标签

对效果的影响:做得对,常显著提升 AUC;做错,严重伤害泛化


数值小例:从原始表到编码列

下面用虚构的「胸痛类型」与二分类标签 y(0/1)说明逻辑;真实项目以代码与折划分为准

原始训练集(4 行):

idChest pain typey(是否患病)
1A1
2A0
3A1
4B0

(错误)全量统计——同一类别填同一数,且每行自己的 y 都参与了该类比例

  • 在全体 4 行上:类型 A 共 3 行,y 为 1,0,1 → 正例比例 = 2/3 ≈ 0.667;类型 B 仅 id=4 → 0
  • id=1,2,3 均填 0.667,id=4 填 0

问题:计算「A 类 = 2/3」时,id=1、2、3 的标签都进了分子分母,模型训练时等价于偷看了这些行的答案,泄露

(正确)两折 OOF——编码只来自「另一折」里同类样本的 y

第 1 折 = id 1,2第 2 折 = id 3,4(无平滑,仅示意):

id所在折规则:只用另一折里同类别行算正例比例OOF 编码 *_te
1第 1 折另一折为 id 3、4;其中类型 A 仅 id=3,y=1 → 1.01.0
2第 1 折同上1.0
3第 2 折另一折为 id 1、2;类型 A 的 y 为 1,0 → 0.50.5
4第 2 折另一折无类型 B → 实践中用全局均值或平滑(此处示意全局患病率 2/4)0.5

要点:

  • 同为类型 A,id=1 与 id=3 的编码可以是 1.00.5,因为统计用的子集不同,且都未把该行自己的 y 算进该类比例
  • 工程里普遍加 smoothing,并对「另一折里没有该类」的情况回退到全局均值,避免除零或极端值。

测试集:对测试样本用每一折上仅用该折训练子集学出的「类别→比例」映射分别编码,再对 K 个结果取平均,得到最终一列 TE 特征。


与「3 折、胸痛类型」叙述的对应

训练集分为 3 折时,对样本「甲」:只在另外两折中,收集与甲同类的所有行的 y,计算正例比例(或平滑后比例)作为甲的编码。样本「乙」所在折不同,统计子集不同,故即使与甲同类,编码也可不同

6. 临床风险二值特征(领域先验)

作用:例如「血压 ≥140」「胆固醇 ≥240」「ST 段压低 ≥0.5」等医学上常有意义的阈值,做成 0/1 特征。

第一性原理:表格赛虽为合成数据,但变量名对应真实医学概念;人类专家共识的切点是一种强归纳偏置,等于告诉模型「这些区域更值得注意」。

对效果的影响:提升可解释性信号方向性;有时比盲目加多项式更稳。


四、模型:梯度提升树家族在做什么?

LightGBM / XGBoost / CatBoost 以及 sklearn 的 HistGradientBoosting(HGB) 都属于梯度提升决策树(GBDT)一脉:串行地加很多棵浅树,每棵新树专门修正前面整体的残差(或梯度意义下的误差)。

第一性原理

  • :在特征空间里做轴平行的分区,非线性强、可解释性尚可。
  • 提升:加法模型 + 逐步减小损失,使复杂边界由许多简单部分组成。

为什么要多个库一起用?
同一「大类」里,分裂准则、类别处理、正则默认、数值稳定性略有不同 → 犯的错误不完全相关 → 融合后往往更稳。再配一个 HGB,是为了增加算法层面的多样性(不增加多少工程依赖)。

对效果的影响:主要影响拟合复杂边界的能力过拟合程度;通过 reg_alphamin_child_samples早停等控制偏差-方差权衡。


五、验证与早停

1. 分层 K 折(Stratified K-Fold)

作用:把训练集分成 K 份,每份里正负样本比例与全集相似。

第一性原理:若随机切分,某折可能偶然特别多/少正例,验证分数方差大;分层让每折难度接近同分布。

对效果的影响:更可靠地估计泛化;由此得到的 OOF(Out-of-Fold)预测 是后面 Stacking 的基石。

2. 早停(Early Stopping)与迭代轮次

迭代在梯度提升里指 一轮 boosting:每迭代一次,就往集成里多一棵树(或等价的一步更新)。训练是一个循环:第 1 轮 → 第 2 轮 → …,直到达到上限或触发早停。

迭代与早停的关系:二者在同一条训练主线上配合使用。

  • 最大迭代次数(如配置里的 n_estimators / iterations / max_iter):给循环设的上限,表示「最多加多少棵树」,防止无限算下去。
  • 早停:在每一轮结束后用验证折上的 AUC(或损失)判断「最近若干轮是否还在变好」;若连续 N 轮(如 early_stopping_rounds=150)没有提升,就提前跳出循环,不再跑到最大迭代。

因此:迭代是「加树的步数」;早停是「何时停止加树」的规则。实际训练往往在远未达到最大迭代时就因早停而结束,既省时间又抑制过拟合。

第一性原理:树加得无穷多会记忆训练噪声;早停是一种隐式正则,在「欠拟合」与「过拟合」之间找折中。

对效果的影响:直接作用于泛化与训练时间;最大迭代设太小可能欠拟合;不设早停、又一味加大迭代则容易过拟合。


六、多种子平均:对付「随机性」

6.1 随机种子的含义与作用

随机种子random_seed)是传给「伪随机数生成器」的一个整数,相当于随机数序列的起始编号

  • 作用:计算机的「随机」其实是按某个公式算出来的,种子决定了第一颗随机数,后面整串都跟着定了。
  • 固定种子:每次跑同一代码、同一数据,只要种子一样,训练过程完全一致,结果可复现。
  • 换一个种子:相当于换了一串随机数,训练过程中的各种「随机决策」会跟着变,最终模型和预测也会变。

6.2 换种子影响的环节

在 LightGBM、XGBoost、CatBoost 这类模型里,随机性主要出现在:

环节说明
样本抽样每棵树训练时可能只随机抽 65% 行(subsample),不同种子抽到的行不同。
特征抽样每个分裂点可能只从 65% 特征里选(feature_fraction),选到的特征组合不同。
分裂点选择在多个候选分裂中,若有评分接近的,随机性会介入先选谁。
初始顺序某些内部排序、初始化顺序可能受种子影响。

换种子 = 换一串随机数 = 上述决策都略有差异 = 同一算法、同一数据,却得到略有不同的模型

6.3 换种子对预测的影响

同一条样本,用 seed=42 训出的模型可能预测 0.82,用 seed=2024 可能 0.80,用 seed=2026 可能 0.84。

这些结果通常不会差很多(因为数据和大方向一致),但会有波动。

多种子平均:把 3 个种子各自的预测取平均,例如
(0.82 + 0.80 + 0.84)/3 \approx 0.82),
相当于把「单次随机」带来的起伏抹平,预测更

第一性原理:单次训练包含随机性 → 单次预测是随机变量的一个样本;平均降低方差(类似集成里「多个模型的平均」在方差上的作用)。

对效果的影响:提升稳定性可重复区间内的期望表现;代价是训练时间成倍增加(本项目中每模型 ×3 种子)。


七、Stacking 的两层结构

Stacking 来自英文 stack(堆叠):把多个模型的输出当作「上一层」,再叠一个模型去学习如何组合它们,因此也叫 Stacked Generalization(堆叠泛化)。它不是某一种基学习器(如单棵决策树),而是一种集成框架:第一层产出对样本的预测,第二层在预测向量上再学一次。

本节架构在做什么:第一层用多个异质模型(如 LGBM、XGBoost、CatBoost、HGB)各自对原始特征建模;第二层不再读原始表格,只读「每个基模型给该样本的概率」,由元学习器(本项目为浅层 LGBM)学习非线性组合。训练集上第一层必须用 OOF,第二层才有合法的训练目标,这一点与上文 Target Encoding 的防泄露逻辑同源。

是否业内常用:在 Kaggle 等表格竞赛以及风控、营销响应等结构化数据场景里,Stacking 与 Blending、加权融合一样,都是常见冲分手段;在工业落地中是否采用,往往还受训练成本、可解释性、线上延迟与维护约束——未必所有业务都会上多层 Stack,但「多模型 + 融合」本身非常普遍。

算算法还是算工程:两方面都有。算法侧,Stacking 属于经典集成学习思路(元学习器是一个可训练的模型);工程侧,需要交叉验证生成 OOF、多模型编排、与后处理(如 Rank Average)衔接,属于流水线与系统设计。可以把它理解成:理论上是集成方法,落地时高度依赖工程实现是否正确(尤其 OOF)。

其他常见组合方式(与 Stacking 并列,可单独用也可再与 Stacking 混用):

方式要点
Voting / 软投票多模型概率直接平均或加权,无第二层训练,实现最简单。
Blending留出集而非 K 折 OOF 训练元模型,与 Stacking 思想相近,数据划分方式不同。
Bagging如随机森林:同构基学习器 + 自助采样并行集成,与「异质模型 + 元学习器」的 Stacking 不同。
Boosting如 GBDT:串行修正残差,是单条集成链;Stacking 是两层模型结构,可叠在多个已训好的 Boosting 模型之上。
加权 / 线性融合固定或搜索权重,不做第二层学习,本项目中与 Stacking 输出再 Rank Average 即属此类延伸。

下文仍按「两层结构」展开,便于对照实现。

7.1 一句话类比

想象有 4 位医生(LightGBM、XGBoost、CatBoost、HistGradientBoosting)分别看同一份体检表,每人给出「患心脏病的概率」0~1 之间的一个数
第一层就是收集这 4 个数;第二层再请一位「主任」(元学习器,本项目里是浅层 LGBM)只看这 4 个数,综合出最终概率
第二层不再直接看年龄、血压等原始特征,只看「4 个模型分别怎么说」。


7.2 第一层产出内容与示例

训练集里的某一个病人(某一行),经过交叉验证后,我们会得到 4 个概率分数(这里用虚构数值举例,帮助建立直觉):

病人(示意)LightGBM 给的患病概率XGBoost 给的患病概率CatBoost 给的患病概率HGB 给的患病概率真实标签(训练集里有)
张三0.820.790.850.781(有病)
李四0.310.280.350.300(无病)

也就是说:第一层输出的不是「诊断结论」本身,而是「每个算法认为有多像阳性」的 4 个数字
对训练集每一行,都能凑出一组 (p_lgbm, p_xgb, p_cat, p_hgb),再配上已知的 0/1 标签,就形成一张新表——只有 4 列特征 + 1 列标签,行数仍是训练样本数。

测试集里的每个病人,第一层同样会给出 4 个概率(模型在测试集上的预测),只是没有真实标签。


7.3 第二层的输入、计算与输出

输入(第二层看到的)
对每个样本,只有 4 个数,例如 (0.82, 0.79, 0.85, 0.78),相当于把原来的高维表格压缩成了 4 维向量

第二层做的事
用浅层 LGBM 当元学习器,在训练集上学习一个函数:

最终概率 ≈ f(p_lgbm, p_xgb, p_cat, p_hgb)

  • 它可以是近似加权:例如某类样本上「更信 CatBoost」;
  • 也可以是非线性:例如「当 LGBM 和 XGB 差很大时,更看某一方」——这用树比用纯线性式更容易表达。

输出

  • 训练集:每个样本一个元模型预测概率(可和真实标签算 AUC,看第二层有没有真的学到组合规律)。
  • 测试集:每个样本同样输出一个 0~1 的最终概率。该输出将在提交前与「加权平均 + Rank Average」等融合方式进一步组合(详见第八节)。

7.4 两层结构的第一性原理

  • 不同算法(XGB、LGBM…)犯的错不完全一样:有的对某类边界更准,有的更稳。
  • 第二层只在「几个分数」上学,等价于在学:什么时候该信谁,这是层次化集成
  • LGBM 当元学习器而不是简单线性加权,是因为现实里「信谁」往往不是全局固定比例,而是随分数组合变化(非线性、分段)。

务必注意:第一层给训练集用的必须是 OOF(每条样本的分数来自「没用到该样本标签训练」的那部分模型),否则第二层会看到标签泄露,分数虚高。

对效果的影响:基模型已经较强时,Stacking 常带来小幅但稳定的 AUC 提升;实现上必须保证 Layer 1 用的是 OOF


八、凸组合权重搜索与 Rank Average

8.1 线性加权融合的定义

有 4 个基模型,对同一个人已经各给了一个概率(沿用上一节的思路):

模型该样本上的预测概率
LightGBM0.80
XGBoost0.75
CatBoost0.85
HGB0.78

线性融合就是:找 4 个非负数权重 (w_1,w_2,w_3,w_4),且 (w_1+w_2+w_3+w_4=1),然后算:

[ \text{融合分} = w_1\times 0.80 + w_2\times 0.75 + w_3\times 0.85 + w_4\times 0.78 ]

例如取 平均(各占 25%):
(0.25\times0.80 + 0.25\times0.75 + 0.25\times0.85 + 0.25\times0.78 \approx 0.795)。

问题变成:这 4 个 (w) 取多少最好? 这就是下面要说的「搜索权重」。


8.2 在 OOF 上优化权重的含义与示例

训练集里每一个样本,我们都有 4 个 OOF 概率 + 真实 0/1 标签。
把整表扫一遍,可以算:给定某一组权重 ((w_1,\dots,w_4)),融合后的预测和真实标签之间的 AUC

自动做法(本项目思路)
用计算机随机尝试很多组满足「非负且和为 1」的权重(实现里常用 Dirichlet 分布 抽样,例如抽 200 组),对每一组都算一遍 全训练集 OOF 上的 AUC保留 AUC 最高的那一组权重

这不是「猜」,而是:在验证目标(OOF AUC)上做一次小规模搜索,得到当前数据、当前基模型下相对更好的一组比例。

迷你数值直觉(虚构,仅说明逻辑):

尝试权重示意 (LGBM, XGB, Cat, HGB)OOF AUC
A(0.25, 0.25, 0.25, 0.25)0.9520
B(0.1, 0.1, 0.6, 0.2)0.9535
C(0.2, 0.15, 0.45, 0.2)0.9538 ← 假设本轮最好

搜索结束后,用 C 这组权重 去乘测试集上 4 个模型的预测,得到「线性融合这一路」的测试集概率。


8.3 自动搜索与人工设定权重的对比

  • 算一种「自动搜索出来的权重」:每次完整跑完训练,程序会根据当次的 OOF 结果算出一组较优权重;并不是人手工填表。
  • 一般不把它理解成「写死在配置文件里的常数」:除非你自己把某次跑出来的 (w1,…,w4) 抄进 config 里下次复用——那才变成「固定配置」。默认流程是:每次重训,权重可能随数据与模型略有变化

若不用自动搜索,人工常见做法有哪些?

方式做法特点
均等权重四个模型各占 25%最简单,往往不差,但很少是数学上的最优。
按单模型 OOF 高低给倾向例如 Cat 的 OOF 最高,就给 Cat 更大 (w)凭经验调几档,或试 2~3 组固定比例。
网格试几组只试 (0.4,0.3,0.2,0.1) 等少数组合比完全自动省算力,但容易漏掉更好的区域。
完全手动拍脑袋固定「我相信 XGB 占一半」快,但缺少数据支撑,容易和 AUC 最优解偏离。

对比小结:自动搜索 = 用 OOF AUC 当裁判,在大量候选权重里挑冠军;人工 = 靠经验或少量试错。自动通常更贴「分数最优」,但算力略多;人工适合想快速出一个「可解释的比例」时。


8.4 Rank Average 的原理与示例

两个模型对三个病人的预测如下(注意:标度差很多,但排序其实类似):

病人模型甲(偏「保守」)模型乙(偏「极端」)
A0.520.90
B0.480.10
C0.500.50

若直接对两列概率取算术平均,模型乙的 0.9 / 0.1 会拉得很开,可能过度主导;而 AUC 只关心谁比谁大,并不关心 0.52 和 0.90 的绝对差距。

Rank Average 的思路
先把每个模型内部变成名次(谁最大谁名次高),再把名次归一化到 0~1,最后对名次平均

  • 在模型甲里:A > C > B → 名次可变成 3, 1, 2(示意)。
  • 在模型乙里:A > C > B → 同样是 A 最高。

两路「谁更该排前面」一致时,融合后排序更稳;减轻「某一模型把概率撑得特别大/特别小」带来的扭曲

第一性原理:不同模型校准程度不同(有的概率整体偏中、有的爱给极端值),排序对 AUC 更直接;秩变换后再平均,让多路信号在「排序空间」里对齐。

对效果的影响:常改善融合后的排序质量(即 AUC),尤其在多模型尺度不一的时候。


8.5 与 Stacking 的配合关系

  • 一条路:元学习器(浅 LGBM)——非线性组合 4 个基模型分数。
  • 另一条路线性加权(上面搜出来的 (w))——显式凸组合。
  • 再一步:把这两路的最终预测做 Rank Average,得到更稳健的排序型融合(具体以项目代码为准)。

对效果的影响:线性融合段的上限被搜索抬高;与 Stacking 互补;Rank Average 再抹平标度差异。


九、整体流程

  1. 特征:原始列 → 交互/分箱/频率/分组统计/领域二值特征 → OOF Target Encoding 防泄露。
  2. 基模型:多种 GBDT,各做 分层 K 折,折内早停,多种子平均 → 得到可靠的 OOF 与测试预测。
  3. Stacking:OOF 进元学习器(浅 LGBM),测试集同理。
  4. 再融合OOF 优化的线性加权元学习器输出Rank Average
  5. 评测对齐:全程以 AUC 为指挥棒。

进一步冲分还可叠加伪标签、超参调优、概率校准等(见第十一节),默认流水线未必包含。


十、和「效果」的对应表

技术/方案主要影响的「效果面」
AUC 作目标 / 早停监控与榜单指标一致,减少优化错目标
分层 K 折 + OOF泛化估计可信;Stacking 无泄露
特征交互、分箱、分组统计模型可用的信息量;边界更细
OOF Target Encoding强力压缩类别信息;做错则伤害泛化
临床阈值特征归纳偏置、可解释性、稳健信号
多 GBDT + HGB集成多样性;降低「同一种错法」
多种子平均降低方差;预测更稳
Stacking(LGBM 元模型)非线性纠错;压榨基模型组合空间
OOF 权重搜索线性融合段上限更高
Rank Average缓解标度不一致;有利排序/AUC
伪标签(进阶)利用测试分布补充训练;可能抬 AUC,需严控权重与过拟合
超参调优(进阶)抬高单模型与集成上限;耗算力,需独立搜索流程
概率校准(进阶)主要改善概率质量;对 AUC 多为小幅、非主路径

十一、进阶:伪标签、超参调优与概率校准

需单独实现或调参脚本。

1. 伪标签(Pseudo-labeling)

含义:用当前已训好的模型对无标签的测试集给出预测,把其中一部分样本当作「伪标签」以较小权重并回训练集,再训一轮或若干轮。

直觉:测试集与训练集同分布时,高置信样本携带的边界信息能补充训练;但若伪标签噪声大,会放大过拟合

常见做法:只取预测落在中间区间(如 0.05~0.95)的样本作软标签,或对高置信样本降权(如 sample_weight);需与 OOF 上 的阈值与比例一起调,避免线下暴涨、线下跌落。

对效果的影响:表格赛常见 0.001~0.003 量级的 AUC 波动;风险是泄露与分布偏移,需严格验证。

2. 超参调优(如 Optuna)

含义:对 LightGBM / XGBoost / CatBoost 等的关键超参——如 num_leavesmax_depthlearning_ratereg_alpha / reg_lambda 等——在搜索空间内自动寻优(贝叶斯优化、TPE 等),以 OOF AUC 或某一折验证集为目标。

与手工改 config 的区别:手工调一两组依赖经验;系统搜索能在高维空间里找局部更优组合,往往再挤出 0.001~0.003 的收益,代价是算力与时间,通常要单独脚本、固定数据划分以免比较不公平。

对效果的影响:主要提升单模型上限与集成基线;不替代特征与防泄露流程。

3. 概率校准(Platt Scaling / Isotonic)

含义:树模型输出的「概率」未必与真实频率一致(校准度差)。在 OOF 预测 上拟合一个单调映射(逻辑回归作 Platt,或保序回归作 isotonic),再应用到测试集预测,使概率更「像频率」。

与 AUC 的关系:AUC 只依赖排序;校准主要改善 LogLoss、Brier 等。对 AUC 有时有小幅提升,不是冲分主手段,更多用于概率可解释与阈值决策。

对效果的影响:线上若看校准后的概率更稳;冲 AUC 时优先级通常低于特征、集成与伪标签。


小结:伪标签偏「多利用测试分布」,超参偏「把单模调到更优点」,校准偏「概率靠谱」;三者实现与验证成本更高,适合在基线已稳定后再上。

本文由作者按照 CC BY 4.0 进行授权