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_leaves、min_child_samples、reg_alpha / lambda、限制树深,可以接受 CV 略降以换取榜单更稳。对测试集的预测可做多折模型预测的平均(Blending),减轻单次划分的偶然性。
养成习惯:同时记录分层 CV 的均值(与方差)和公榜成绩,用两者的差距判断是否该进入「减负、防泄漏、加正则」阶段,而不是只盯本地最高分。
三、Titanic 场景下的特征思路(举一反三)
以下是该赛题里常见、且容易抽象到别的表格任务的写法。
| 主题 | 典型做法 |
|---|---|
| 乘客 ID | 仅用于拼提交文件,不要当特征,避免人造顺序噪声。 |
| 姓名字段 | 解析称谓(Mr/Mrs/Master…),长尾称谓合并为「其他」,控制基数。 |
| 家庭规模 | 由兄弟姐妹/父母子女数构造 FamilySize、IsAlone 等低基数、可解释项。 |
| 票价长尾 | log1p(Fare)、按家庭人均票价等,减弱极值对分裂的主导。 |
| 船舱字符串 | 取首字母作甲板档位;整块缺失可当独立类别而非乱填均值。 |
| 高基数衍生 | 票号前缀、粗粒度家庭 id 有时很「吸」CV,却对测试分布敏感——实战中常要在** leaderboard 取向**的版本里砍掉或慎用。 |
目标编码把类别映射成与标签相关的数值,便于树模型切分:务必 折内拟合,并对全局罕见类做平滑,否则会构成对标签的泄漏。
四、Stacking、概率平均与 Blending 怎么用
| 方式 | 要点 | 适用直觉 |
|---|---|---|
| Stacking | 多差异明显的基模型 + 上层元学习器;上层训练用基模型在各折上的 OOF 预测,避免二层直接「看见」本应折外才有的信息。 | 学的是「几种模型如何加权组合」,结构相对重。 |
| 概率平均 | LightGBM、XGBoost、CatBoost 等对同一特征矩阵各自输出正类概率,再算术平均(或稍后学权重)。 | 落地简单,常能降低方差;树族之间略有分工时效果好。 |
| 多折 Blending | 每一折在全训练数据的一个划分上训练,对测试集各出一版预测,再对测试预测跨折平均。 | 压住某一折抽样运气,常与单一「全量训练再预测」的版本对照提交。 |
注意:ensemble 解决不了特征侧的泄漏。若在编码或统计特征上用了未来信息或未按折隔离的标签,STACK 只会让错误结构更顺滑地过拟合到 CV。折内编码 + Stacking 的 OOF 协议要解决的是两件不同层级的事。
五、用 Optuna 做结构化调参
在特征集合与模型族已经定型以后,可把调参收成一套固定范式:
- 目标:分层 K 折上与赛题一致的指标(此处为 Accuracy)的均值(可选外加方差惩罚)。
- 采样:TPE 等贝叶斯方法,在空间内探索
num_leaves、学习率、n_estimators、正则项、元模型系数等。 - 记录:把每次 trial 的参数与得分落盘(数据库或 JSON),便于复现最优一次试验、对比敏感性。
- 预算:trial 次数 × 折数 直接决定墙钟时间,可先小规模试探再放大
n_trials。
Optuna 不提高特征与模型的理论上限,但能在「最后一公里」替代大量手工试错;务必固定 随机种子、写清环境与依赖版本,否则「最高分那次」很难再跑出来。
六、小结:自检清单
| 阶段 | 建议自检项 |
|---|---|
| 数据 | 训练 / 测试字段是否一致?测试集独有大类或小样本特征是否有预案?ID 是否误进模型? |
| 验证 | 分层折是否贴近标签分布?优化目标是否比赛题 / 业务指标一致? |
| 特征 | 高基数衍生是否出现过「CV 升、公榜不动或反跌」?目标编码是否严格折内?平滑是否考虑过? |
| 模型 | 是否走完「单模型 → 集成 → 防过拟合 / 减法」的路线,而非一步跳到最复杂? |
| 产出 | 提交文件是否符合官方格式?多端预测融合版本是否与单模型版本对照过? |
| 可追溯 | 随机种子、环境、关键参数与分数能否在数月后仍复述出来? |
参考
- Titanic: Machine Learning from Disaster — 赛题与数据说明
- scikit-learn — StackingClassifier
- Optuna — 贝叶斯优化试验框架
