如何在 Kaggle 竞赛中使用 AutoGluon

Open In Colab Open In SageMaker Studio Lab

本教程将教您如何在 Kaggle 竞赛中使用 AutoGluon,无需编写大量代码即可成为一名认真的 Kaggle 竞争者。我们首先概述在 Kaggle 竞赛中使用 AutoGluon 的通用步骤。在此,我们假设竞赛涉及存储在一个(或多个)CSV 文件中的表格数据。

  1. 运行 Bash 命令: pip install kaggle

  2. 导航到: https://www.kaggle.com/account 并创建一个帐户(如果需要)。然后,点击“创建新的 API 令牌”,并将下载的文件移动到您机器上的这个位置:~/.kaggle/kaggle.json。有关故障排除,请参阅Kaggle API 说明

  3. 通过编程方式下载数据:在您的终端中执行此 Bash 命令

kaggle competitions download -c [COMPETITION]

在此,[COMPETITION] 应替换为您希望参加的竞赛名称。或者,您也可以手动下载数据:只需导航到您希望参加的 Kaggle 竞赛网站,点击“下载所有”,并接受竞赛条款。

  1. 如果竞赛的训练数据由多个 CSV 文件组成,请使用 pandas 将它们正确合并/连接到一个数据表中,其中行 = 训练样本,列 = 特征。

  2. 在生成的数据表上运行 autogluon fit()

  3. 加载竞赛的测试数据集(同样进行必要的合并/连接以确保其格式与训练数据表完全相同),然后调用 autogluon predict()。随后使用 pandas.read_csv 将竞赛的 sample_submission.csv 文件加载到 DataFrame 中,将 AutoGluon 的预测结果放入此 DataFrame 的正确列中,最后通过 pandas.to_csv 将其保存为 CSV 文件。如果竞赛不提供样本提交文件,您将需要通过适当重新格式化 AutoGluon 的测试预测结果自行创建提交文件。

  4. 通过 Bash 命令提交您的预测结果

kaggle competitions submit -c [COMPETITION] -f [FILE] -m ["MESSAGE"]

在此,[COMPETITION] 再次是竞赛名称,[FILE] 是您创建的包含预测结果的 CSV 文件名称,而 [“MESSAGE”] 是您希望随此提交条目记录的字符串消息。或者,您也可以在竞赛网站上手动上传您的预测文件。

  1. 最后,导航到竞赛排行榜网站查看您的提交表现如何!您的提交结果可能需要一些时间才能显示。

下面,我们演示如何在 Python 中针对特定的 Kaggle 竞赛:ieee-fraud-detection 进行步骤 (4)-(6)。这意味着您需要在每个命令中将 [COMPETITION] 替换为 ieee-fraud-detection 来运行上述步骤。在此,我们假设您已完成步骤 (1)-(3),并且数据 CSV 文件已在您的计算机上可用。为了开始步骤 (4),我们首先将竞赛的训练数据加载到 Python 中

import pandas as pd
import numpy as np
from autogluon.tabular import TabularPredictor

directory = '~/IEEEfraud/'  # directory where you have downloaded the data CSV files from the competition
label = 'isFraud'  # name of target variable to predict in this competition
eval_metric = 'roc_auc'  # Optional: specify that competition evaluation metric is AUC
save_path = directory + 'AutoGluonModels/'  # where to store trained models

train_identity = pd.read_csv(directory+'train_identity.csv')
train_transaction = pd.read_csv(directory+'train_transaction.csv')

由于本次竞赛的训练数据由多个 CSV 文件组成,我们首先将它们连接到一个大的数据表(行 = 样本,列 = 特征)中,然后再应用 AutoGluon

train_data = pd.merge(train_transaction, train_identity, on='TransactionID', how='left')

请注意,对于本次 Kaggle 竞赛,基于 TransactionID 键的左连接恰好是最合适的,但对于涉及多个训练数据文件的其他竞赛,您可能需要使用不同的连接策略(务必非常仔细地考虑这一点)。现在,我们所有的训练数据都位于一个表中,我们可以应用 AutoGluon 了。下面,我们指定 presets 参数以最大化 AutoGluon 的预测准确性,这通常需要您使用更长的时限运行 fit()(下面的 3600 秒在您的运行中可能需要增加)

predictor = TabularPredictor(label=label, eval_metric=eval_metric, path=save_path, verbosity=3).fit(
    train_data, presets='best_quality', time_limit=3600
)

results = predictor.fit_summary()

现在,我们使用训练好的 AutoGluon Predictor 对竞赛的测试数据进行预测。务必将多个测试数据文件以与训练数据完全相同的方式连接起来。由于本次竞赛是基于 AUC(ROC 曲线下面积)指标进行评估,因此我们要求 AutoGluon 提供预测的类别概率而不是类别预测。一般来说,何时使用 predictpredict_proba 将取决于具体的竞赛。

test_identity = pd.read_csv(directory+'test_identity.csv')
test_transaction = pd.read_csv(directory+'test_transaction.csv')
test_data = pd.merge(test_transaction, test_identity, on='TransactionID', how='left')  # same join applied to training files

y_predproba = predictor.predict_proba(test_data)
y_predproba.head(5)  # some example predicted fraud-probabilities

在提交分类竞赛的预测概率时,务必确保这些概率与 Kaggle 期望的同一类别相对应。对于二元分类任务,您可以通过以下方式查看 AutoGluon 的预测概率对应哪个类别

predictor.positive_class

对于多类别分类任务,您可以通过以下方式查看 AutoGluon 的预测概率对应哪些类别

predictor.class_labels  # classes in this list correspond to columns of predict_proba() output

现在,让我们获取整个测试数据的预测概率,同时只获取正类预测,通过指定

y_predproba = predictor.predict_proba(test_data, as_multiclass=False)

现在我们已经对测试数据集中的每一行进行了预测,我们可以将这些预测结果提交给 Kaggle。大多数 Kaggle 竞赛都提供一个样本提交文件,您只需将样本预测结果替换为您自己的预测结果即可,如下所示

submission = pd.read_csv(directory+'sample_submission.csv')
submission['isFraud'] = y_predproba
submission.head()
submission.to_csv(directory+'my_submission.csv', index=False)

现在我们已完成本教程顶部的步骤 (4)-(6)。要将您的预测结果提交到 Kaggle,您可以在终端中(从适当的目录)运行以下命令

kaggle competitions submit -c ieee-fraud-detection -f sample_submission.csv -m "my first submission"

现在您可以尝试不同的 fit() 参数和特征工程技术,以最大化您在 Kaggle 排行榜上的排名!

最大化预测性能的技巧

  • 如果竞赛网站上指定了适当的评估指标,请务必指定!如果您不确定哪个指标最好,那么在调用 fit() 时只需不指定此参数即可;AutoGluon 仍然会通过自动推断要使用的指标来生成高质量模型。

  • 如果训练样本是基于时间的,并且竞赛测试样本来自未来的数据,我们建议您将最近收集的训练样本保留为单独的验证数据集,并将其传递给 fit()。否则,您无需自行指定验证集,AutoGluon 会自动将竞赛训练数据划分为其自己的训练/验证集。

  • 除了简单地指定 presets = 'best_quality',您还可以尝试更高级的 fit() 参数,例如:num_bag_folds, num_stack_levels, num_bag_sets, hyperparameter_tune_kwargs, hyperparameters, refit_full。但是,我们建议您将大部分时间花在特征工程上,并在调用 fit() 时只指定 presets = 'best_quality'

故障排除

  • 检查您是否在计算机上拥有正确的用户权限来访问从 Kaggle 下载的数据文件。

  • 有关下载 Kaggle 数据或提交预测的问题,请检查您的 Kaggle 帐户设置和 Kaggle 常见问题