使用 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 二、数据加载与查看
接下来,我们加载并查看比赛提供的数据集(训练集、测试集以及提交模板)。首先使用pd.read_csv加载数据集:
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()三、数据处理与特征工程
3.1、在进行模型训练前,我们需要对数据进行处理。
首先,我们为训练集和测试集添加标识,并进行数据合并以方便后续处理。
train["dataset"] = "train"
test["dataset"] = "test"
df = pd.concat([train, test], axis=0, ignore_index=True)3.2、处理特征
我们定义了一个函数 process_feature,用于处理与云量(cloud)相关的特征。这个函数包括填充缺失值、特征构造、多项式变换等步骤。
def process_feature(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 df
3.3、然后,调用该函数处理数据
# 调用函数处理与 cloud 相关的特征,并构造目标统计特征
df = process_feature_1(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、注意事项
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,找出存在的问题和隐患,但在后台让模型更长时间运行,以便模型学习的更好
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可以很方便的做多种尝试,不同的评估指标有时候会影响最终的模型性能
# time_limit 当你想快速查验结果时必备参数
# auto_stack 建议新手设置为True,num_stack_levels、num_bag_folds、num_bag_sets这三个参数,AutoGluon会自动评估设置
# num_gpus 当我有GPU时候,可以设置GPU数量。没有GPU的时候,也不会报错。如果想设置CPU数量,使用num_cpus
# presets 可以通过设置该参数 来调整优化策略和模型配置六、预测结果
训练完成后,我们可以查看模型的表现并对测试集进行预测
6.1、模型性能排行
predictor.leaderboard() # 查看模型排名和评估指标
# 你可以看到不同模型的性能,通过选择或排除某些模型,提6.2、对测试集进行预测
predictor.leaderboard() # 查看模型排名和评估指标
# 对测试集进行预测
pred_proba = predictor.predict_proba(test)[1].values # 获取预测的概率值
sample_submission['rainfall'] = pred_proba.clip(0, 1) # 保证预测值在0到1之间
# 保存提交文件
sample_submission.to_csv('AutogluonFiles/submission.csv', index=False)
七、获取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九、参考链接
Playground Series - Season 5, Episode 3 开源AutoGluon代码
Rohlik Sales Forecasting Challenge 比赛AutoGluon开源代码
Predict App Users' Next Step比赛AutoGluon开源代码
十、总结
通过本篇指南,你应该掌握了如何使用AutoGluon进行自动化机器学习,并应用于Kaggle Playground表格赛的任务。通过自动化的特征工程、模型选择和超参数调优,AutoGluon能够帮助你更快速地构建高效的机器学习模型。
特点1、通过time_limit参数,你可以尽早的打通整个比赛流程,进行一些观察和分析
特点2、你可以尽量多的关注特征工程,将简单的缺失值处理、模型选择和融合等交给AutoGluon。
特点3、将大部分的工作交给AutoGluon,我们只做我们关心的事情,我觉得,这样对于新手来说,蛮愉快的