橘智橘智
bestwater
预计阅读时间:10分钟21秒

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

在这篇指南中,我们将介绍如何使用AutoGluon进行表格赛的训练与预测。以下内容适合参与Kaggle比赛的开发者,可以帮助你快速上手并应用AutoGluon来实现高效的自动化机器学习(AutoML)

0
0

一、环境准备

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 df

3.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、部分模型性能示例

modelscore_valeval_metricpred_time_valfit_timepred_time_val_marginalfit_time_marginalstack_levelcan_infer fit_order
0WeightedEnsemble_L20.906024roc_auc2.4452421602.980510.0006370.2100612TRUE112
1NeuralNetFastAI_r102_BAG_L10.901765roc_auc0.785038405.8661930.785038405.8661931TRUE25
2NeuralNetFastAI_r134_BAG_L10.90123roc_auc0.894156678.3086690.894156678.3086691TRUE60
3NeuralNetTorch_r41_BAG_L10.901226roc_auc0.330853145.3849840.330853145.3849841TRUE49
4NeuralNetFastAI_r103_BAG_L10.899884roc_auc0.2965587.9297450.2965587.9297451TRUE39
5NeuralNetFastAI_r100_BAG_L10.899763roc_auc0.903822612.4784320.903822612.4784321TRUE102


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_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

九、参考链接

B站相关视频

AutoGluon官方文档

Playground第一名AutoGluon解决方案

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

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

评论