前言

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)  │
└─────────────┴─────────────┴─────────────┴───────────┘
         ↑            ↑            ↑            ↑
         └────────────┴────────────┴────────────┘
                    原始训练数据

工作原理

  1. L1 训练:每个 L1 模型在 5 折 bagging 下训练,每个 fold 的模型对未见过的 fold 产生 OOF(Out-of-Fold)预测
  2. L1 输出:所有 L1 模型的 OOF 预测组成新的特征矩阵(每行有 N 个 L1 模型的预测值)
  3. L2 训练:WeightedEnsemble(加权集成)在 L1 的 OOF 预测上训练,学习最优权重
  4. 推理:测试集先经过所有 L1 模型,再由 L2 WeightedEnsemble 加权得到最终预测

⚠️ 踩坑 3num_bag_foldsnum_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:几行代码就能得到一个不错的模型
  • 特征工程验证:快速验证新特征是否有效
  • 竞赛 submissionbest_quality + num_bag_folds=5 + num_stack_levels=1 是一个经过验证的强力配置

但它不是万能的——特征工程仍然是提升成绩的关键。AutoGluon 能帮你把 80 分的特征用到 95 分,但从 60 分的特征到 80 分,还是需要人工理解和构造。


参考资料