AutoGluon 表格常见问题解答

如何获得最准确的预测?

参见“最大化预测性能”在Tabular Essentials教程中

我可以在Mac/Windows上运行AutoGluon Tabular吗?

是的!

我可以使用GPU进行模型训练吗?

是的!AutoGluon使用的大多数模型都支持GPU训练,包括LightGBM、CatBoost、XGBoost和FastAI神经网络。

要启用GPU训练,请在predictor.fit中指定参数num_gpus=SOME_VALUE。这将为所有支持GPU训练的模型启用GPU训练。多GPU训练仍处于实验阶段。

对于大多数这些模型,必须安装CUDA,并且一些模型可能需要特殊安装,如LightGBM,以便与GPU训练兼容。有关更多详细信息,请参阅安装说明

什么机器最适合运行AutoGluon Tabular?

作为一个开源库,AutoGluon 可以在任何机器上运行,包括您的笔记本电脑。目前,训练 TabularPredictor 不需要使用 GPU,因此 CPU 机器即可(相比之下,MultiModalPredictor 需要 GPU)。大多数表格问题是由于内存不足引起的,因此我们建议在内存尽可能多的机器上运行。例如,如果使用 AWS 实例进行表格处理:我们推荐 M5 实例,其中 m5.24xlarge 机器应该能够处理大多数数据集。

如何解决内存问题?

请参阅深入教程中的“如果您遇到内存问题”

如何解决磁盘空间问题?

请参阅深入教程中的“如果您遇到磁盘空间问题”

如何减少训练所需的时间?

predictor.fit中指定time_limit参数为你愿意等待的秒数(更长的时间限制通常会导致更好的预测性能)。你也可以尝试predictor.fit中的presets参数的其他设置,并且可以通过train_data.sample(n=SUBSAMPLE_SIZE)对你的数据进行子采样以进行快速试验运行。如果某种特定类型的模型在你的数据上训练的时间比其他类型的模型长得多,你可以通过在fit()excluded_model_types参数中指定其短名称来告诉AutoGluon不要训练这种特定类型的任何模型。

由于许多减少内存使用的策略也会减少训练时间,还请查看:“如果你遇到内存问题”在深度教程中

如何减少预测所需的时间?

参见“深入教程中的加速推理”

AutoGluon Tabular 内部是如何工作的?

详细信息在以下论文中提供:

AutoGluon-Tabular: 结构化数据的鲁棒且准确的自动机器学习. Arxiv, 2020.

如何查看在拟合过程中发生的更详细的日志?

fit()中指定参数verbosity = 4

AutoGluon 使用什么模型进行预测?

参见“深入教程中的预测选项”

预测概率对应哪些类别?

如果你查看预测概率输出的pandas DataFrame列名,这一点应该变得显而易见:

predictor.predict_proba(test_data)

对于二分类和多分类问题:

predictor.class_labels

是一个类列表,其顺序对应于predict_proba(as_pandas=False)输出为Numpy数组时的列。

你可以通过以下方式查看AutoGluon在二分类中视为正类的类别:

predictor.positive_class

正类也可以通过 predictor.class_labels[-1] 获取。对于二分类问题,predict_proba(as_multiclass=False) 的输出是正类的概率。

如何使用AutoGluon进行可解释性分析?

请参阅“深度教程中的可解释性(特征重要性)”,它允许您量化每个特征对AutoGluon预测准确性的贡献程度。

此外,您可以使用Shapely值来解释特定的AutoGluon预测。展示这一点的笔记本可以在以下链接找到:https://github.com/autogluon/autogluon/tree/master/examples/tabular/interpret。我们建议从该文件夹中的“SHAP with AutoGluon-Tabular”笔记本开始,该笔记本展示了如何处理多类分类任务和具有分类特征的数据。

如何在无法放入内存的文件上执行推理?

表格数据集API与pandas DataFrames一起工作,支持将数据分块成适合内存的大小。 以下是一个基于分块的推理示例:

from autogluon.tabular import TabularDataset, TabularPredictor
import pandas as pd
import requests

train_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')
predictor = TabularPredictor(label='class').fit(train_data.sample(n=100, random_state=0), hyperparameters={'GBM': {}})

# Get the test dataset, if you are working with local data then omit the next two lines
r = requests.get('https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv', allow_redirects=True)
open('test.csv', 'wb').write(r.content)
reader = pd.read_csv('test.csv', chunksize=1024)
y_pred = []
y_true = []
for df_chunk in reader:
    y_pred.append(predictor.predict(df_chunk))
    y_true.append(df_chunk['class'])
y_pred = pd.concat(y_pred, axis=0, ignore_index=True)
y_true = pd.concat(y_true, axis=0, ignore_index=True)
predictor.evaluate_predictions(y_true=y_true, y_pred=y_pred)

在这里,我们将测试数据分割成每块最多1024行,但您可以选择更大的大小,只要它适合您系统的内存。 Further Reading

如何跳过某些特定的模型?

为了避免训练某些模型,请在excluded_model_types参数中指定这些模型。例如,以下是如何在不训练K最近邻(KNN)、随机森林(RF)或ExtraTrees(XT)模型的情况下调用fit()

task.fit(..., excluded_model_types=['KNN','RF','XT'])

如何将我自己的自定义模型添加到AutoGluon训练、调优和集成的模型集合中?

要了解如何将您自己的自定义模型添加到AutoGluon训练、调优和集成的集合中,请查看Tabular Custom Model

如何在不使用AutoGluon的情况下重现模型XYZ的结果?

在不使用AutoGluon的情况下完全重现AutoGluon模型的结果可能具有挑战性 (例如:尝试在不依赖AutoGluon的情况下复制AutoGluon的LightGBM结果)。 AutoGluon使用了多种在其构建的模型框架中不存在的技术,如数据预处理、 边缘情况处理、自定义早停和自定义架构。这些都是为了提高性能 并简化使用,超越了原始模型框架(如LightGBM、XGBoost、FastAI等)的功能。 这是AutoML框架的核心优势,并且本质上难以复制 (你将不得不重新实现AutoGluon在幕后所做的许多工作)。 如果你仍然希望尝试复制结果,可以从源代码中推导出逻辑。

为什么选择了XYZ设计决策?

通常答案归结为 “因为它在各种基准数据集上的平均表现优于我们测试的其他方法” 和/或“因为它简单易实现,同时可能与更复杂的方法表现相似” 和/或“因为它表现足够好,我们还没有进一步研究其他选项”。 AutoML本质上是一个以经验为导向的领域,而不是理论性的。 这是因为从理论上解释为什么各种AutoML组件在实践中比众多替代方案更好地协同工作既不太可行也不具有普遍性。

如何添加我自己的自定义数据预处理或特征工程?

请注意,TabularDataset 对象本质上是一个 pandas DataFrame,你可以在调用 fit() 之前以任何方式转换你的训练数据。请注意,你自己执行的任何转换也必须在调用 predict() 之前应用于所有未来的测试数据,并且 AutoGluon 仍将在 fit() 中对你的转换数据执行其默认处理。

要仅使用自定义数据预处理并自动将您的自定义转换应用于训练数据和推理期间遇到的所有未来数据,您应该创建一个自定义的FeatureGenerator。请按照源代码中的示例操作:examples/tabular/example_custom_feature_generator.py

如何对训练样本的重要性进行不同的加权?

你可以在初始化TabularPredictor时指定sample_weightweight_evaluation arguments

AutoGluon中缺失值插补是如何工作的?

AutoGluon 不执行通用的缺失值插补,而是将缺失值发送给每个模型,每个模型对缺失值有不同的自定义处理方式。这提高了模型的多样性,从而增强了集成的最终效果。请参考模型源代码以了解如何处理缺失值。

我在训练或推理过程中收到C++警告垃圾邮件

Warning message: [W ParallelNative.cpp:206] Warning: Cannot set number of intraop threads after parallel work has started or after set_num_threads call when using native parallel backend (function set_num_threads)

在使用特定环境时,这可能是由于下游的PyTorch依赖(如OpenMP)引起的。如果您正在使用PyTorch 1.7、Mac OS X、Python 3.6/3.7,并且使用PyTorch的DataLoader,那么您可能会收到此警告信息。我们仅在TabTransformer模型中观察到这种情况。参考打开的torch问题

从torch问题中推荐的解决方法是设置一个在OpenMP中使用的环境变量以抑制此警告。这已在Torch 1.7、Python 3.6和Mac OS X上进行了测试。

export OMP_NUM_THREADS=1

如何限制AutoGluon使用的核心数量

虽然通常建议让AutoGluon使用所有核心,但您可以通过设置num_cpus来限制它:

predictor = TabularPredictor(...).fit(..., num_cpus = NUM_CORES_YOU_WANT)

您还可以限制特定模型使用的核心数量:

# We use 1 core for CatBoost model, 4 cores for XGBoost model, and all cores for lightGBM model here.
predictor = TabularPredictor(...).fit(..., hyperparameters= {'CAT': {'ag_args_fit': {'num_cpus': 1}}, 'XGB': {'ag_args_fit': {'num_cpus': 4}}, 'GBM': {}},)

我的自定义指标正在引发 _pickle.PicklingError: Can't pickle 错误

参见自定义指标教程中的“确保指标可序列化”

我知道AutoGluon底层使用了ray。我应该遵循什么最佳实践?

通常建议不要在同一脚本中自定义使用ray资源,即初始化ray集群,与AutoGluon一起使用。 Ray不支持在同一脚本中运行多个运行时,因此可能会发生意外行为。

SageMaker Notebook 上的空间不足错误

如果您在SageMaker Notebook上使用AutoGluon,可能会遇到这样的错误:OSError: [Errno 28] No space left on device。这是因为无论类型如何,SageMaker Notebook实例的默认磁盘大小都是5 GiB。在某些大型数据集上进行AutoGluon训练可能会生成大于5GiB的产物。

为了解决这个问题,要么清理你的工作空间,要么 1) 关闭你的Notebook实例 2) 选择你的Notebook实例 3) 在Edit下更新Volume size in GB字段

Issues not addressed here

首先搜索您的问题是否在教程示例文档Github问题(搜索已关闭和未关闭的问题)中得到了解决。如果没有,请打开一个新的Github问题并清楚地描述您的问题。如果您遇到错误,请包括:您的代码(调用fit(..., verbosity=4),这将打印更多详细信息)、代码执行期间打印的输出,以及有关您的操作系统、Python版本和已安装包的信息(pip freeze的输出)。