AutoGluon 实战:从零到 Kaggle 前列的 AutoML 踩坑记录
前言
AutoML(自动机器学习)工具越来越成熟,但真正用在 Kaggle 竞赛中能拿到好成绩吗?
本文记录一次使用 AutoGluon 参加 Kaggle 金融风控二分类竞赛的完整经历:从数据探索、特征工程,到最终提交。最终 OOF AUC 达到 0.75758,公榜 0.75727,排名约 Top 10。
什么是 AutoGluon?
AutoGluon 是亚马逊开源的 AutoML 框架,核心理念是 “几行代码搞定机器学习”。它不同于传统 AutoML 的暴力搜索,而是通过:
- 自动模型选择:同时训练多种模型(树模型、神经网络、线性模型等)
- 自动超参调优:内置贝叶斯优化
- 自动 Stacking:多层模型堆叠提升泛化能力
- 自动 Bagging:K 折交叉验证降低方差
一行 fit() 就能完成从特征处理到模型集成的全流程。
AutoGluon 能做什么?
| 任务类型 | 支持情况 | 核心类 |
|---|---|---|
| 表格分类 | ✅ 强项 | TabularPredictor |
| 表格回归 | ✅ 强项 | TabularPredictor |
| 多模态(图片+表格) | ✅ 支持 | MultiModalPredictor |
| 文本分类 | ✅ 支持 | MultiModalPredictor |
| 时间序列 | ✅ 支持 | TimeSeriesPredictor |
在 Kaggle 的表格竞赛中,AutoGluon 的 TabularPredictor 是最常用的选择。
安装
# 基础安装(CPU)
pip install autogluon
# 如果需要 GPU 加速(神经网络部分)
pip install autogluon[torch]
⚠️ 踩坑 1:AutoGluon 依赖较多,建议在干净的虚拟环境中安装。安装时间较长(5-10 分钟),不要中途取消。
快速上手
from autogluon.tabular import TabularDataset, TabularPredictor
# 加载数据
train_data = TabularDataset('train.csv')
test_data = TabularDataset('test.csv')
# 一行训练
predictor = TabularPredictor(
label='target', # 目标列名
eval_metric='roc_auc', # 评估指标
path='ag_models', # 模型保存路径
).fit(
train_data,
presets='best_quality', # 最高质量预设
time_limit=3600, # 训练时间限制(秒)
)
# 预测
y_pred = predictor.predict_proba(test_data, as_multiclass=False)
本次竞赛流程
数据概况
- 任务:二分类(预测贷款违约概率)
- 训练集:约 10 万条样本
- 测试集:约 6 万条样本
- 特征:约 20 个原始特征,包括数值型和类别型
- 评估指标:AUC-ROC
特征工程(关键!)
原始特征只有约 20 个,但通过以下方式扩展到 239 个特征:
# 1. Target Encoding(目标编码)
for col in cat_cols:
df[f'{col}_te'] = df.groupby(col)[target].transform('mean')
# 2. 数值特征交互(两两组合)
from itertools import combinations
for c1, c2 in combinations(num_cols, 2):
df[f'{c1}_x_{c2}'] = df[c1] * df[c2]
df[f'{c1}_div_{c2}'] = df[c1] / (df[c2] + 1e-8)
# 3. 非线性变换
for col in num_cols:
df[f'{col}_log'] = np.log1p(df[col].clip(lower=0))
df[f'{col}_sqrt'] = np.sqrt(df[col].clip(lower=0))
df[f'{col}_sq'] = df[col] ** 2
# 4. 类别聚合统计
for col in cat_cols:
for agg in ['mean', 'std', 'median']:
df[f'{col}_{agg}'] = df.groupby(col)[target].transform(agg)
⚠️ 踩坑 2:Target Encoding 必须用 out-of-fold 方式计算,否则会严重过拟合。直接用全量数据的均值会导致训练集 AUC 虚高,但验证集表现差。
AutoGluon 训练配置
predictor = TabularPredictor(
label='Default',
eval_metric='roc_auc',
path='/workspace/ag_models',
verbosity=2,
).fit(
ag_train,
presets='best_quality',
time_limit=3600,
num_bag_folds=5, # 5折 bagging
num_stack_levels=1, # 1层 stacking
)
关键参数说明:
presets='best_quality':启用所有模型 + 超参调优 + 最大化集成num_bag_folds=5:5 折 bagging,降低方差num_stack_levels=1:启用 1 层 stacking(L1 模型输出作为 L2 输入)
L1 模型介绍
AutoGluon 在 best_quality 预设下会自动训练以下 L1 模型:
| 模型 | 一句话介绍 |
|---|---|
| LightGBM | 微软开源的梯度提升框架,速度快、内存低,通过直方图算法加速分裂点搜索 |
| CatBoost | Yandex 开源的梯度提升库,原生支持类别特征,内置 ordered target encoding 防止过拟合 |
| XGBoost | 陈天奇的经典梯度提升实现,二阶泰勒展开 + 正则化,Kaggle 竞赛常客 |
| Random Forest | Breiman 的随机森林,Bagging + 随机特征子集,天然抗过拟合的集成方法 |
| Extra Trees | 比随机森林更”随机”的变体,分裂点随机选择而非最优,进一步降低方差 |
| KNN (K-Nearest Neighbors) | 基于距离的懒惰学习算法,通过 K 个最近邻的加权投票预测,无需训练阶段 |
| Neural Network (TabularNN) | 多层感知机 + Embedding 层处理类别特征,Adam 优化器 + 学习率调度 |
| Linear Model (LR) | 逻辑回归,线性决策边界 + L2 正则化,简单但作为 baseline 有参考价值 |
每个模型都会在 5 折 bagging 下训练,最终取平均预测。
L2 Stacking 解释
Stacking(堆叠)是 AutoGluon 的核心优势之一。本次竞赛使用 1 层 Stacking:
┌─────────────────────────────────────────────────────┐
│ L2: WeightedEnsemble │
│ (加权集成 L1 模型的 OOF 预测) │
├─────────────┬─────────────┬─────────────┬───────────┤
│ LightGBM │ CatBoost │ XGBoost │ 其他模型 │ ← L1 层
│ (5-fold) │ (5-fold) │ (5-fold) │ (5-fold) │
└─────────────┴─────────────┴─────────────┴───────────┘
↑ ↑ ↑ ↑
└────────────┴────────────┴────────────┘
原始训练数据
工作原理:
- L1 训练:每个 L1 模型在 5 折 bagging 下训练,每个 fold 的模型对未见过的 fold 产生 OOF(Out-of-Fold)预测
- L1 输出:所有 L1 模型的 OOF 预测组成新的特征矩阵(每行有 N 个 L1 模型的预测值)
- L2 训练:WeightedEnsemble(加权集成)在 L1 的 OOF 预测上训练,学习最优权重
- 推理:测试集先经过所有 L1 模型,再由 L2 WeightedEnsemble 加权得到最终预测
⚠️ 踩坑 3:
num_bag_folds和num_stack_levels不能随意调大。num_bag_folds过大(如 10)会显著增加训练时间但收益有限;num_stack_levels超过 2 容易过拟合。本次实验中5-fold + 1-layer是最佳平衡。
踩坑总结
| # | 踩坑点 | 解决方案 |
|---|---|---|
| 1 | 安装依赖冲突 | 使用干净虚拟环境,pip install autogluon 一次装完 |
| 2 | Target Encoding 过拟合 | 用 out-of-fold 方式计算,或交给 AutoGluon 内部处理 |
| 3 | Stacking 层数过多过拟合 | num_stack_levels=1 即可,2 层以上收益递减 |
| 4 | 训练时间不够 | time_limit 至少给 1800 秒(30 分钟),best_quality 建议 3600+ |
| 5 | 特征工程不足导致模型天花板低 | AutoGluon 再强也需要好特征,手动构造交互特征提升显著 |
| 6 | 内存不足 | 239 个特征 + 10 万样本约需 4-8GB 内存,注意 num_bag_folds 会倍增内存 |
| 7 | predict_proba 返回格式 |
设 as_multiclass=False 获取正类概率,否则返回 DataFrame |
| 8 | 模型路径冲突 | 每次实验用不同的 path,否则会加载旧模型而非重新训练 |
最终成绩
- OOF AUC: 0.75758
- 公榜 AUC: 0.75727
- 排名: 约 Top 10(Top 1 为 0.75789,差距仅 0.031%)
从特征工程的 20 个原始特征扩展到 239 个特征,AutoGluon 的自动模型选择和 Stacking 在此基础上进一步挖掘了特征间的组合关系,最终以极小差距逼近排行榜顶端。
总结
AutoGluon 是一个非常强大的 AutoML 工具,尤其适合:
- 快速 baseline:几行代码就能得到一个不错的模型
- 特征工程验证:快速验证新特征是否有效
- 竞赛 submission:
best_quality+num_bag_folds=5+num_stack_levels=1是一个经过验证的强力配置
但它不是万能的——特征工程仍然是提升成绩的关键。AutoGluon 能帮你把 80 分的特征用到 95 分,但从 60 分的特征到 80 分,还是需要人工理解和构造。