PyTorch Tabular:表格数据深度学习框架

0 阅读6分钟

PyTorch Tabular 简介

在处理表格数据时,梯度提升模型通常优于其他机器学习模型。虽然在文本和图像领域,深度学习表现出了非凡的效果,但在表格数据上,这种优势尚未完全展现。然而,近期的深度学习革命已将部分焦点转向了表格数据领域,因此,专门为表格数据设计的新型架构和模型不断涌现。其中许多模型的表现已经可以与经过良好调优的梯度提升模型相媲美,甚至略有超越。

PyTorch Tabular 是一个框架/封装库,旨在使表格数据的深度学习易于应用,并能服务于实际场景和研究。该库的设计核心原则是:

  • 低阻力的可用性
  • 易于定制
  • 可扩展且易于部署

该框架并非从零开始构建,而是建立在 PyTorch 和 PyTorch Lightning 等成熟项目的基础之上。

该框架还包含一些前沿的深度学习模型,可以使用 pandas 数据帧轻松进行训练。

核心特性

  • 高层配置驱动 API:通过配置驱动的API,可以快速使用和迭代。用户只需提供 pandas 数据帧,库会自动处理归一化、标准化、类别特征编码以及数据加载器的准备工作。
  • 易于扩展BaseModel 类提供了一个易于扩展的抽象类,用于实现自定义模型,同时仍可利用库中封装的其他功能。
  • 集成SOTA模型:实现了如 Neural Oblivious Decision Ensembles (NODE) 和 TabNet 等前沿网络。具体使用方法可参考文档中的示例。
  • 基于 PyTorch Lightning:通过使用 PyTorch Lightning 进行训练,PyTorch Tabular 继承了其提供的灵活性和可扩展性。

为什么选择 PyTorch Tabular?

PyTorch Tabular 旨在降低表格数据深度学习在工业应用和研究中的门槛。目前,使用神经网络并不像使用传统的 Sci-kit Learn 机器学习模型那样简单。

PyTorch Tabular 致力于将神经网络工作中的“软件工程”部分变得尽可能简单和轻松,让用户能专注于模型本身。同时,它也希望能将表格数据领域的不同发展统一到一个单一框架中,并提供一套能与各种前沿模型协同工作的 API。

目前,表格深度学习的大多数发展都分散在各个独立的 Github 仓库中。除了 fastai 之外,几乎没有框架真正关注过表格数据。这正是 PyTorch Tabular 应运而生的原因。

如何使用 PyTorch Tabular?

安装

虽然安装包包含了 PyTorch,但最佳且推荐的方式是先从官方网站安装 PyTorch,为你的机器选择合适的 CUDA 版本(PyTorch 版本需高于 1.3)。

安装好 PyTorch 后,直接使用以下命令安装包含额外依赖(用于实验跟踪的 Weights & Biases)的完整库:

pip install pytorch_tabular[all]

如果只需要基础功能,则安装:

pip install pytorch_tabular

PyTorch Tabular 的源代码可以从 Github 仓库下载。

你可以克隆公共仓库:

git clone git://github.com/manujosephv/pytorch_tabular

获取源代码副本后,可以通过以下命令安装:

python setup.py install

配置设置

你需要提供四个配置项(大部分都有智能默认值),它们将驱动后续的整个流程:

  • DataConfig:定义目标列名称、类别和数值列名称、需要执行的任何转换等。
  • ModelConfig:每个模型都有特定的配置。这决定了要训练哪个模型,并允许你定义模型的超参数。
  • TrainerConfig:通过设置 batch_sizeepochs、早停等参数来配置训练过程。大部分参数直接来自 PyTorch Lightning,并在训练时传递给底层的 Trainer 对象。
  • OptimizerConfig:允许你定义和使用不同的优化器和学习率调度器。支持标准的 PyTorch 优化器和学习率调度器。对于自定义优化器,可以在 fit 方法中使用相应参数进行覆盖。自定义优化器应与 PyTorch 兼容。
  • ExperimentConfig:这是一个可选参数。如果设置,则用于定义实验跟踪。目前支持两种实验跟踪框架:Tensorboard 和 Weights & Biases。W&B 实验跟踪器具有更多功能,例如跟踪跨epoch的梯度和 logits。

以下是配置示例:

data_config = DataConfig(
    target=['target'], # 目标变量始终应为列表。仅回归支持多目标。多任务分类尚未实现。
    continuous_cols=num_col_names,
    categorical_cols=cat_col_names,
)
trainer_config = TrainerConfig(
    auto_lr_find=True, # 运行LRFinder自动推导学习率
    batch_size=1024,
    max_epochs=100,
    gpus=1, # 使用的GPU索引。0表示CPU
)
optimizer_config = OptimizerConfig()

model_config = CategoryEmbeddingModelConfig(
    task="classification",
    layers="1024-512-512",  # 每层的节点数
    activation="LeakyReLU", # 层间的激活函数
    learning_rate = 1e-3
)

模型初始化和训练

定义好配置后,需要使用这些配置初始化模型,并调用 fit 方法。

tabular_model = TabularModel(
    data_config=data_config,
    model_config=model_config,
    optimizer_config=optimizer_config,
    trainer_config=trainer_config,
)
tabular_model.fit(train=train, validation=val)

完成。模型将按指定的 epoch 数进行训练。

已实现的模型列表

  • 带类别嵌入的前馈网络:一个简单的前馈网络,但为类别列添加了嵌入层。这与 fastai 的表格模型非常相似。
  • NODE:在 ICLR 2020 上提出的模型,据作者称,该模型在许多数据集上击败了经过良好调优的梯度提升模型。
  • TabNet:出自某研究机构的另一个模型,它在多步决策过程中使用稀疏注意力来建模输出。

要实现新模型,请参阅“如何实现新模型”教程,其中涵盖了基础和高级架构。

在未见数据上评估模型

要使用训练期间相同的指标/损失在新数据上评估模型,可以使用 evaluate 方法。

result = tabular_model.evaluate(test)

示例输出:

--------------------------------------------------------------------------
DATALOADER:0 TEST RESULTS
{'test_accuracy': tensor(0.6924, device='cuda:0'),
 'train_accuracy': tensor(0.6051, device='cuda:0'),
 'train_loss': tensor(0.6258, device='cuda:0'),
 'valid_accuracy': tensor(0.7440, device='cuda:0'),
 'valid_loss': tensor(0.5769, device='cuda:0')}
--------------------------------------------------------------------------

对未见数据进行预测

要获取预测结果的数据帧,可以使用 predict 方法。这会将预测结果添加到传入的同一个数据帧中。对于分类问题,会同时返回概率和以 0.5 为阈值的最终预测结果。

pred_df = tabular_model.predict(test)

保存和加载模型

可以保存模型,并在之后加载用于推理。

tabular_model.save_model("examples/basic")
loaded_model = TabularModel.load_from_checkpoint("examples/basic")
result = loaded_model.evaluate(test)

代码、文档和贡献方式

  • 框架代码可在 GitHub 上获取。
  • 文档和教程可在 Read the Docs 上找到。
  • 非常欢迎贡献,相关指南也已提供。

相关工作

fastai 是与 PyTorch Tabular 最接近的框架,两者都基于 PyTorch。但 PyTorch Tabular 的不同之处在于其模块化和解耦的特性,以及它对标准 PyTorch 和 PyTorch Lightning 组件的使用,这使得采用新模型和修改代码比使用 fastai 容易得多。

参考文献

  1. Sergei Popov, Stanislav Morozov, Artem Babenko. "Neural Oblivious Decision Ensembles for Deep Learning on Tabular Data". arXiv:1909.06312 [cs.LG] (2019)
  2. Sercan O. Arik, Tomas Pfister. "TabNet: Attentive Interpretable Tabular Learning". arXiv:1908.07442 (2019).

后续计划

作者将继续撰写独立的博客文章,介绍 PyTorch Tabular 中目前已实现的不同模型。敬请期待。FINISHED