使用 AutoGluon 进行Playground表格赛任务的完整指南
本文档介绍了如何使用 AutoGluon 进行表格数据(Tabular Data)赛道的任务,从数据加载到模型训练,再到提交最终的结果。AutoGluon 是一个自动化机器学习(AutoML)库,可以帮助用户快速进行机器学习任务,特别是对于表格数据集。无论你是机器学习新手,还是有经验的从业者,本文都将为你提供清晰的步骤和实用的技巧,助你轻松完成比赛。
使用AutoGluon打比赛:Playground表格赛指南
在这篇指南中,我们将介绍如何使用AutoGluon进行表格赛的训练与预测。以下内容适合参与Kaggle比赛的开发者,可以帮助你快速上手并应用AutoGluon来实现高效的自动化机器学习(AutoML)
一、环境准备
1.1、小技巧
因为有时候kaggle的Notebook会卡死,运行一个简单的print,可以让你更快速的了解notebook的运行状态,避免盲目的久等
"Good Luck!"1.2、首先,我们需要安装AutoGluon包
%%time
!pip install autogluon.tabular --no-cache-dir -q >/dev/null 2>&1
# autogluon.tabular是 AutoGluon 库中的一个模块,专门用于表格数据的自动化机器学习任务。
# >/dev/null 2>&1 可以隐藏输出,优化显示
# %%time 记录一下时间1.3、安装完成后,导入相关的Python库:
import os
import numpy as np
import pandas as pd
from autogluon.tabular import TabularDataset, TabularPredictor 二、数据加载与查看
接下来,我们加载并查看比赛提供的数据集(训练集、测试集以及提交模板)
train = pd.read_csv("/kaggle/input/playground-series-s5e3/train.csv")
test = pd.read_csv("/kaggle/input/playground-series-s5e3/test.csv")
sample_submission = pd.read_csv("/kaggle/input/playground-series-s5e3/sample_submission.csv")
# 打印数据集的部分信息
print("Train shape", train.shape)
train.head()三、数据处理与特征工程
备注:AutoGluon会自动进行常规特征工程,也支持自动化特征处理。但从效果来看,还是手动做特征工程比较好。故,暂不对AutoGluon自动化特征工程技术做过多介绍,有兴趣,可以自行搜索
3.1、在进行模型训练前,我们需要对数据进行处理。
首先,我们为训练集和测试集添加标识,并进行数据合并以方便后续处理。
train["dataset"] = "train"
test["dataset"] = "test"
df = pd.concat([train, test], axis=0, ignore_index=True)3.2、处理特征
我们定义了一个函数 feature_engineering,用于处理与云量(cloud)相关的特征。以下为示例:
def feature_engineering(df):
df['day'] = pd.to_datetime(df['day'], errors='coerce') # 将日期转换为datetime格式
bins = [0, 25, 50, 87, 100]
labels = [1, 2, 3, 4] # 对 cloud 特征进行分桶
df["cloud_bins"] = pd.cut(df["cloud"], bins=bins, labels=labels, include_lowest=True)
# 构造衍生特征
df["cloud_cubed"] = df["cloud"] ** 3
df["cloud_log"] = np.log1p(df["cloud"]) # 对数变换
df["cloud_humidity"] = df["cloud"] * df["humidity"]
df["cloud_sunshine_ratio"] = df["cloud"] / (df["sunshine"] + 1e-3)
# 滚动窗口计算统计量
window_size = 7
df['cloud_humidity_max'] = df.groupby('day')['cloud_humidity'].transform(lambda x: x.rolling(window=window_size, min_periods=1).max())
df['cloud_humidity_mean'] = df.groupby('day')['cloud_humidity'].transform(lambda x: x.rolling(window=window_size, min_periods=1).mean())
return df3.3、然后,调用该函数处理数据
# 调用函数处理与 cloud 相关的特征,并构造目标统计特征
df = feature_engineering(df)
# 重新拆分数据集,将合并后的数据根据 'dataset' 列分回 train 和 test
train = df[df["dataset"] == "train"].drop(columns=["dataset"])
test = df[df["dataset"] == "test"].drop(columns=["dataset"])
# 输出处理后训练集和测试集的形状
print("训练集形状(特征工程处理后):", train.shape)
print("测试集形状(特征工程处理后):", test.shape)
# 查看处理后的训练集前5行数据
train.head() 3.4、保存数据集
有时候,我们需要进一步进行数据分析,以便下一步的特征工程。这个时候,需要在删除无效特征前,保存数据集。
# 保存训练和测试文件 以便EDA分析
train.to_csv('train.csv', index=False)
test.to_csv('test.csv', index=False) 3.5、注意事项
AutoGluon会自动处理id列,但如果确定的话,往往手动删除比较好(有时候,AutoGluon会判断id可能会携带某些信息而不做删除操作)
# 剔除无效特征
drop_features = [
'id'
]
train.drop(columns=drop_features, inplace=True)
test.drop(columns=drop_features, inplace=True)
train四、kaggle验证
这段代码可以在kaggle页面上快速跑通baseline,找出可能存在的问题,保存Notebook之后,它将在后台运行更长时间,以获得更好的模型效果
import os
import sys
def is_interactive():
"""判断是否在交互环境(Jupyter Notebook / Kaggle 前台)运行"""
try:
from IPython import get_ipython
ipy = get_ipython()
# 检查是否在 Jupyter / IPython 交互模式下运行
if ipy is None:
return False # 非 Jupyter 环境
shell = ipy.__class__.__name__
is_jupyter = shell in ["ZMQInteractiveShell", "TerminalInteractiveShell"]
# Kaggle 后台运行时,KAGGLE_KERNEL_RUN_TYPE = "batch"
is_kaggle_batch = os.environ.get("KAGGLE_KERNEL_RUN_TYPE", "").lower() == "batch"
return is_jupyter and not is_kaggle_batch
except:
return False # 任何异常情况都认为是非交互环境
# 检测环境
print('Interactive?', is_interactive())
if is_interactive():
time_limit = 100
feature_time_limit = 100
# train = train[:1000]
print("🔹 交互模式:使用 1000 条数据快速测试", time_limit, feature_time_limit)
else:
time_limit = 41000
feature_time_limit = 1000
print("✅ Kaggle Notebook 后台运行", time_limit, feature_time_limit) 五、模型训练与预测
使用处理后的数据,进行模型训练。我们将使用AutoGluon的TabularPredictor来自动选择最佳模型,并进行训练。
%%time
from autogluon.tabular import TabularDataset, TabularPredictor
# 创建 TabularPredictor 对象,进行表格数据的预测任务
predictor = TabularPredictor(
label='rainfall', # 指定目标列,'rainfall' 为预测的目标变量,通常是你想要预测的列名
eval_metric='roc_auc', # 指定评估指标,这里使用 ROC AUC 分数,适合二分类问题
).fit(
train, # 训练数据集,用于训练模型
time_limit=time_limit, # 限制模型训练的最大时间,单位为秒,用于控制训练时长
# presets='best_quality', # 使用最佳质量设置,提供更高质量的模型,但训练时间较长(已注释)
presets='experimental', # 使用实验性设置,可能会使用一些较新的算法和方法,效果较好但不稳定
auto_stack=True, # 是否启用堆叠模型(stacking),即多层次模型组合,通常可以提高性能
num_stack_levels=2, # 堆叠模型的层数,这里设置为 2,意味着会训练两个堆叠层
num_bag_folds=10, # 用于 bagging(自助法)中的折数,设置为 10 表示会分成 10 个子集进行训练
num_bag_sets=3, # 用于 bagging 的子集数量,设置为 3 表示将进行 3 次 bagging 训练
# excluded_model_types=['KNN'], # 排除某些模型类型(已注释),例如在这里可以排除 KNN 模型
# ag_args_fit={"stopping_metric": "log_loss"}, # 设置停止准则,可以通过选择 "log_loss" 来决定何时停止训练(已注释)
# num_cpus=4, # 设置 CPU 核心数,这里是 4 核,控制并行计算的数量(已注释)
num_gpus=2, # 设置 GPU 数量,这里是 2 个 GPU,利用 GPU 进行加速训练
)
# %%time记录运行时间用于参考
# 提供label值,AutoGluon会自动拆分预测列
# eval_metric 可以很方便的做多种尝试,不同的评估指标有时候会影响最终的模型性能
# eval_metric AutoGluon会自动判断是分类还是回归等任务类型,不设置该项有时候会有意外惊喜
# time_limit 当你想快速查验结果时必备参数
# auto_stack 建议新手设置为True,num_stack_levels、num_bag_folds、num_bag_sets这三个参数,AutoGluon会自动评估设置
# num_gpus 有GPU时候,可以设置GPU数量。没有GPU的时候,设置了该参数也不会报错。如果想设置CPU数量,使用num_cpus
# presets 可以通过设置该参数 来调整优化策略和模型配置
# verbosity=2 可以通过该参数设置日志等级,一般默认即可
六、预测结果
训练完成后,我们可以查看模型的表现并对测试集进行预测
6.1、模型性能排行
predictor.leaderboard() # 查看模型排名和评估指标
# 你可以看到不同模型在验证集上的性能指标
# 通过选择或排除某些模型,来提高最终模型的性能,例如:excluded_model_types=['KNN']6.2、部分模型性能示例
| model | score_val | eval_metric | pred_time_val | fit_time | pred_time_val_marginal | fit_time_marginal | stack_level | can_infer | fit_order | |
| 0 | WeightedEnsemble_L2 | 0.906024 | roc_auc | 2.445242 | 1602.98051 | 0.000637 | 0.210061 | 2 | TRUE | 112 |
| 1 | NeuralNetFastAI_r102_BAG_L1 | 0.901765 | roc_auc | 0.785038 | 405.866193 | 0.785038 | 405.866193 | 1 | TRUE | 25 |
| 2 | NeuralNetFastAI_r134_BAG_L1 | 0.90123 | roc_auc | 0.894156 | 678.308669 | 0.894156 | 678.308669 | 1 | TRUE | 60 |
| 3 | NeuralNetTorch_r41_BAG_L1 | 0.901226 | roc_auc | 0.330853 | 145.384984 | 0.330853 | 145.384984 | 1 | TRUE | 49 |
| 4 | NeuralNetFastAI_r103_BAG_L1 | 0.899884 | roc_auc | 0.29655 | 87.929745 | 0.29655 | 87.929745 | 1 | TRUE | 39 |
| 5 | NeuralNetFastAI_r100_BAG_L1 | 0.899763 | roc_auc | 0.903822 | 612.478432 | 0.903822 | 612.478432 | 1 | TRUE | 102 |
6.3、对测试集进行预测
# 创建文件夹,如果文件夹已存在,不会报错
os.makedirs('AutogluonFiles', exist_ok=True)
# sample_submission['Price'] = np.expm1(predictor.predict(test))
pred_proba = predictor.predict_proba(test)[1].values
sample_submission['rainfall'] = pred_proba.clip(0,1)
# 保存提交文件
sample_submission.to_csv('AutogluonFiles/submission.csv', index=False)
# 1、kaggle上由于AutoGluon保存的模型文件过多,导致提交会有问题,故创建AutogluonFiles文件夹保存提交文件,以便正常提交
# 2、部分比赛的目标列可能是长尾,可以进行log1处理,预测之后使用np.expm1还原
# 3、predict返回预测的类别标签
# 4、predict_proba返回每个类别的预测概率,有部分比赛可能不是AutoGluon默认的类别概率,需要使用该方式获取指定类别概率七、获取OOF预测数据
7.1、你可以获取Out-Of-Fold(OOF)预测数据,这对于交叉验证和模型调优非常有用:
# 获取 OOF 预测数据
oof_predictions = predictor.predict_oof() # 返回一个 Pandas Series
# 将 OOF 预测数据转为 DataFrame 并添加列名
oof_predictions_df = oof_predictions.to_frame(name='oof_prediction')
# 保存 OOF 数据到 CSV 文件
oof_predictions.to_csv('AutogluonFiles/oof_predictions.csv', index=False)
# 查看数据
oof_predictions7.2、计算CV分数
# 计算 SMAPE 评分
def smape(y_true, y_pred):
return np.mean(2 * np.abs(y_pred - y_true) / (np.abs(y_true) + np.abs(y_pred))) * 100
# 假设 y_true 是你的真实价格数据(从训练数据中获取)
# 这里你需要替换为实际的真实价格数据
y_true = train["price"] # 真实价格
y_pred = oof_predictions # OOF 预测值
# 计算 SMAPE
cv_score = smape(y_true, y_pred)
print(f"Cross-Validation SMAPE: {cv_score:.4f}") 八、特征重要性检测
8.1、进行特征排行
%%time
feature_importance = predictor.feature_importance(train,time_limit=feature_time_limit)
feature_importance.to_csv("AutogluonFiles/feature_importance.csv") 8.2、打印特征重要性排行
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
feature_importance九、参考链接
Predict App Users' Next Step比赛AutoGluon开源代码
Rohlik Sales Forecasting Challenge 比赛AutoGluon开源代码
Playground Series - Season 5, Episode 3 开源AutoGluon代码
十、总结
通过本篇指南,你应该掌握了如何使用AutoGluon进行自动化机器学习,并应用于Kaggle Playground表格赛的任务。通过自动化的特征工程、模型选择和超参数调优,AutoGluon能够帮助你更快速地构建高效的机器学习模型。
特点1、AutoGluon支持自动化简单的数据处理(缺失值)、特征处理、模型选择和融合。一个词:省心
特点2、可以尽量多的关注特征工程(当然,理论上你所有关于模型的优化都能通过AutoGluon实现,但目前看起来,实现似乎并不太友好)。从社区比赛结束后的分析来看,是可以通过只做特征工程来争取前排的。一个词:省力
特点3、可以通过time_limit参数,尽早的打通整个比赛流程,进行下一步的观察和分析。一个词:省时
特点4、AutoGluon是为了工业化进行设计的,这意味着,除了比赛,你在生活中使用它也是一个不错的选择
特点5、将大部分的工作交给AutoGluon,我们只做我们关心的事情,我个人觉得,对于新手来说,蛮愉快的