文章

Kaggle泰坦尼克号幸存者预测项目实践

Kaggle泰坦尼克号幸存者预测项目实践

Kaggle泰坦尼克号幸存者预测项目实践

Kaggle Titanic: Machine Learning from Disaster 是典型的小规模表格二分类 + Accuracy 评测:样本少、特征混有类别与数值,却足够覆盖特征工程、验证方式、泄漏、集成与调参等通用课题。下文从「该怎么做」的角度整理套路,便于照搬到同类竞赛或工作中的表格建模。


一、推荐的建模迭代顺序

这一类题目里,比较稳定的做法是分层推进,而不是一上来就叠复杂流水线。

1
2
3
4
5
梯度提升单模型(如 LightGBM)打通全流程
    → 丰富特征 + Stacking(多基学习器 + 元模型)
    → 若出现「离线 CV 高、公榜低」:删减高泄漏风险特征 + 正则 + CV 内目标编码 + 多模型概率融合
    → 再在「信息量」与「泛化」之间做一次显式取舍(哪些特征宁可不用)
    → 模型结构固定后,用贝叶斯优化(如 Optuna TPE)在搜索空间内补最后一程精度

每一阶段在确认什么:第一步确保分层交叉验证、预测维度与提交 CSV 格式正确;再在基线上加特征与集成;若公榜长期对不起 CV,再进入「减法」——删高基数或过拟合特征、加强正则、折内编码;最后才在长耗时上调参——否则搜到的往往是「更会记训练集」的参数。

预处理建议始终落在 Pipeline / ColumnTransformer 一类机制里,保证训练与推理时对类别、缺失的处理一致;基线阶段即可把 StratifiedKFold 与标签分布对齐想清楚。


二、为什么 CV 分数常常「好于」公榜

直观原因:交叉验证只在训练集的划分上估计误差;真正的测试集可能有分布漂移,某些在训练上出现频繁、在测试上稀缺的类别也会让树模型误判。更别提任何隐性泄漏(例如用全集标签做了编码)都会把 CV 抬得太乐观。

可以主动做的:对高基数枚举(票务前缀、自定义家庭簇 id 等)保持警惕——往往在 CV 上看到收益,却在公榜上吃亏。目标编码必须在当前折的训练折内估计统计量,并用平滑(smoothing)压稀有类噪声。适当加大 num_leavesmin_child_samplesreg_alpha / lambda、限制树深,可以接受 CV 略降以换取榜单更稳。对测试集的预测可做多折模型预测的平均(Blending),减轻单次划分的偶然性。

养成习惯:同时记录分层 CV 的均值(与方差)和公榜成绩,用两者的差距判断是否该进入「减负、防泄漏、加正则」阶段,而不是只盯本地最高分。


三、Titanic 场景下的特征思路(举一反三)

以下是该赛题里常见、且容易抽象到别的表格任务的写法。

主题典型做法
乘客 ID仅用于拼提交文件,不要当特征,避免人造顺序噪声。
姓名字段解析称谓(Mr/Mrs/Master…),长尾称谓合并为「其他」,控制基数。
家庭规模由兄弟姐妹/父母子女数构造 FamilySizeIsAlone低基数、可解释项。
票价长尾log1p(Fare)、按家庭人均票价等,减弱极值对分裂的主导。
船舱字符串取首字母作甲板档位;整块缺失可当独立类别而非乱填均值。
高基数衍生票号前缀、粗粒度家庭 id 有时很「吸」CV,却对测试分布敏感——实战中常要在** leaderboard 取向**的版本里砍掉或慎用。

目标编码把类别映射成与标签相关的数值,便于树模型切分:务必 折内拟合,并对全局罕见类做平滑,否则会构成对标签的泄漏。


四、Stacking、概率平均与 Blending 怎么用

方式要点适用直觉
Stacking多差异明显的基模型 + 上层元学习器;上层训练用基模型在各折上的 OOF 预测,避免二层直接「看见」本应折外才有的信息。学的是「几种模型如何加权组合」,结构相对重。
概率平均LightGBM、XGBoost、CatBoost 等对同一特征矩阵各自输出正类概率,再算术平均(或稍后学权重)。落地简单,常能降低方差;树族之间略有分工时效果好。
多折 Blending每一折在全训练数据的一个划分上训练,对测试集各出一版预测,再对测试预测跨折平均压住某一折抽样运气,常与单一「全量训练再预测」的版本对照提交。

注意:ensemble 解决不了特征侧的泄漏。若在编码或统计特征上用了未来信息或未按折隔离的标签,STACK 只会让错误结构更顺滑地过拟合到 CV。折内编码 + Stacking 的 OOF 协议要解决的是两件不同层级的事。


五、用 Optuna 做结构化调参

特征集合与模型族已经定型以后,可把调参收成一套固定范式:

  1. 目标:分层 K 折上与赛题一致的指标(此处为 Accuracy)的均值(可选外加方差惩罚)。
  2. 采样:TPE 等贝叶斯方法,在空间内探索 num_leaves、学习率、n_estimators、正则项、元模型系数等。
  3. 记录:把每次 trial 的参数与得分落盘(数据库或 JSON),便于复现最优一次试验、对比敏感性。
  4. 预算:trial 次数 × 折数 直接决定墙钟时间,可先小规模试探再放大 n_trials

Optuna 不提高特征与模型的理论上限,但能在「最后一公里」替代大量手工试错;务必固定 随机种子、写清环境与依赖版本,否则「最高分那次」很难再跑出来。


六、小结:自检清单

阶段建议自检项
数据训练 / 测试字段是否一致?测试集独有大类或小样本特征是否有预案?ID 是否误进模型?
验证分层折是否贴近标签分布?优化目标是否比赛题 / 业务指标一致?
特征高基数衍生是否出现过「CV 升、公榜不动或反跌」?目标编码是否严格折内?平滑是否考虑过?
模型是否走完「单模型 → 集成 → 防过拟合 / 减法」的路线,而非一步跳到最复杂?
产出提交文件是否符合官方格式?多端预测融合版本是否与单模型版本对照过?
可追溯随机种子、环境、关键参数与分数能否在数月后仍复述出来?

参考

  1. Titanic: Machine Learning from Disaster — 赛题与数据说明
  2. scikit-learn — StackingClassifier
  3. Optuna — 贝叶斯优化试验框架
本文由作者按照 CC BY 4.0 进行授权