橘智橘智
bestwater
预计阅读时间:8分钟44秒

使用 AutoGluon 进行Playground表格赛任务的完整指南

本文档介绍了如何使用 AutoGluon 进行表格数据(Tabular Data)赛道的任务,从数据加载到模型训练,再到提交最终的结果。AutoGluon 是一个自动化机器学习(AutoML)库,可以帮助用户快速进行机器学习任务,特别是对于表格数据集。无论你是机器学习新手,还是有经验的从业者,本文都将为你提供清晰的步骤和实用的技巧,助你轻松完成比赛。

0
0

使用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_predictions

7.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,我们只做我们关心的事情,我觉得,这样对于新手来说,蛮愉快的

希望你能在比赛中取得优异成绩!祝你好运!

评论