tabnet

GitHub
2.9k 514 非常简单 1 次阅读 2天前MIT数据工具开发框架其他
AI 解读 由 AI 自动生成,仅供参考

TabNet 是一个基于 PyTorch 实现的开源深度学习模型,专为处理表格数据而设计。它解决了传统机器学习方法在处理结构化数据时难以兼顾高精度与可解释性的痛点,能够高效应对二分类、多分类以及单任务或多任务回归等多种场景。

这款工具非常适合数据科学家、AI 研究人员以及需要处理复杂表格数据的开发者使用。其最大的技术亮点在于引入了“注意力机制”,让模型在预测过程中能自动筛选出最关键的特征,不仅提升了预测准确率,还让用户清晰地看到哪些数据列对结果影响最大,从而实现了真正的“可解释性”。此外,TabNet 完美兼容 scikit-learn 的使用习惯,接口简洁直观,只需几行代码即可完成从训练到预测的全流程。最新版本更增强了对嵌入特征的感知能力,支持特征分组注意力,即使面对由文本转化而来的高维稀疏数据也能游刃有余。无论是学术研究还是工业级应用,TabNet 都能为你提供强大且透明的表格数据分析能力。

使用场景

某金融风控团队正在构建信用卡欺诈检测模型,需要处理包含数百个数值型和类别型特征的高维表格数据。

没有 tabnet 时

  • 传统机器学习模型(如 XGBoost)难以自动捕捉特征间复杂的非线性交互关系,依赖人工进行繁琐的特征工程。
  • 深度学习模型(如 MLP)虽然拟合能力强,但如同“黑盒”,无法向监管方解释为何判定某笔交易为欺诈。
  • 面对稀疏的类别特征(如商户 ID),直接 One-Hot 编码导致维度爆炸,模型训练缓慢且容易过拟合。
  • 缺乏内置的注意力机制,无法直观识别哪些关键特征(如交易金额、地点)对预测结果起了决定性作用。

使用 tabnet 后

  • TabNet 利用独特的串行注意力机制,自动筛选并组合关键特征,显著减少了人工特征工程的工作量。
  • 模型提供可视化的特征重要性掩码(Feature Mask),清晰展示每次决策的依据,完美满足合规性解释需求。
  • 原生支持嵌入层(Embedding)与注意力分组,高效处理高基数类别特征,在保持精度的同时大幅降低显存占用。
  • 通过逐层关注不同特征子集,TabNet 在欺诈样本极少的不平衡数据集中,依然能精准捕捉细微的异常模式。

TabNet 成功将深度学习的高精度与决策树的可解释性合二为一,让金融风控模型既“算得准”又“说得清”。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU
  • 非必需
  • 支持 CPU 和 GPU 模式
  • 若使用 GPU,需 NVIDIA 显卡及对应的 CUDA 环境(具体版本取决于本地 PyTorch 安装),README 未指定最低显存要求
内存

未说明

依赖
notes该工具是 TabNet 的 PyTorch 实现,可通过 pip 或 conda 安装。支持半监督预训练和自定义数据增强。若使用 Docker 运行,提供了专门的 CPU 和 GPU 构建命令。模型支持保存和加载以便生产部署。对于 'rmsle' 评估指标,预测时需注意将负值裁剪为 0。
python3.7+ (根据 PyPI badge 推断,具体取决于 torch 版本)
torch
scikit-learn
pandas
numpy
tabnet hero image

快速开始

说明文档

TabNet:专注且可解释的表格数据学习

这是TabNet的PyTorch实现(Arik, S. O., & Pfister, T. (2019). TabNet: Attentive Interpretable Tabular Learning. arXiv预印本arXiv:1908.07442)。https://arxiv.org/pdf/1908.07442.pdf。请注意,为了改进该库,我们在此过程中做出了一些不同的选择,这些选择可能与原始论文有所不同。

CircleCI

PyPI版本

PyPI - 下载量

PyPI - Python版本

Conda - 平台

Conda(仅频道)

GitHub - 许可证

有任何问题吗?想贡献代码吗?想和我们交流吗?您可以通过Slack加入我们。

安装

简单安装

您可以使用pipconda进行安装,如下所示。

使用pip

pip install pytorch-tabnet

使用conda

conda install -c conda-forge pytorch-tabnet

源代码

如果您想在本地Docker容器中使用它:

  • git clone git@github.com:dreamquark-ai/tabnet.git

  • cd tabnet进入仓库目录


仅CPU

  • make start构建并进入容器

GPU

  • make start-gpu构建并进入GPU容器

  • poetry install安装所有依赖项,包括Jupyter

  • 在同一终端中运行make notebook。然后您可以按照链接打开一个已安装TabNet的Jupyter笔记本。

新功能?

  • 从版本**> 4.0**开始,注意力机制现在考虑了嵌入信息。这旨在即使在大量嵌入的情况下也能保持良好的注意力机制。此外,现在还可以指定注意力组(使用grouped_features)。注意力现在是在组级别而不是特征级别上进行的。如果数据集有许多来自单一数据源的列(例如:使用TF-IDF转换的文本列),这一点尤其有用。

贡献

在为TabNet仓库做出贡献时,请务必先通过新的或现有的问题讨论您希望进行的更改。

我们的提交遵循这里介绍的规则。

PyTorch TabNet能解决哪些问题?

  • TabNetClassifier:二分类和多分类问题
  • TabNetRegressor:简单回归和多任务回归问题
  • TabNetMultiTaskClassifier:多任务多分类问题

如何使用?

TabNet现在与scikit-learn兼容,训练TabNetClassifier或TabNetRegressor非常容易。

from pytorch_tabnet.tab_model import TabNetClassifier, TabNetRegressor

clf = TabNetClassifier()  #TabNetRegressor()
clf.fit(
  X_train, Y_train,
  eval_set=[(X_valid, y_valid)]
)
preds = clf.predict(X_test)

或者对于TabNetMultiTaskClassifier:

from pytorch_tabnet.multitask import TabNetMultiTaskClassifier
clf = TabNetMultiTaskClassifier()
clf.fit(
  X_train, Y_train,
  eval_set=[(X_valid, y_valid)]
)
preds = clf.predict(X_test)

y_train/y_valid中的目标应包含单一类型(例如,它们必须全部是字符串或整数)。

默认评估指标

实现了一些经典的评估指标(自定义指标见下文):

  • 二分类指标:'auc'、'accuracy'、'balanced_accuracy'、'logloss'
  • 多分类:'accuracy'、'balanced_accuracy'、'logloss'
  • 回归:'mse'、'mae'、'rmse'、'rmsle'

重要提示:由于模型可能会预测负值,'rmsle'会自动将负预测截断为0。为了匹配给定的分数,在进行预测时需要使用np.clip(clf.predict(X_predict), a_min=0, a_max=None)

自定义评估指标

您可以根据自己的需求创建指标。以下是一个基尼系数的示例(请注意,您需要指定该指标是应该最大化还是最小化):

from pytorch_tabnet.metrics import Metric
from sklearn.metrics import roc_auc_score

class Gini(Metric):
    def __init__(self):
        self._name = "gini"
        self._maximize = True

    def __call__(self, y_true, y_score):
        auc = roc_auc_score(y_true, y_score[:, 1])
        return max(2*auc - 1, 0.)

clf = TabNetClassifier()
clf.fit(
  X_train, Y_train,
  eval_set=[(X_valid, y_valid)],
  eval_metric=[Gini]
)

一个专门的自定义示例笔记本在这里:https://github.com/dreamquark-ai/tabnet/blob/develop/customizing_example.ipynb

半监督预训练

半监督预训练后来被添加到TabNet的原始论文中,现在可以通过TabNetPretrainer类实现:


# TabNet预训练器
无监督模型 = TabNetPretrainer(
    优化器函数=torch.optim.Adam,
    优化器参数=dict(lr=2e-2),
    掩码类型='entmax' # "sparsemax"
)

无监督模型.fit(
    X_train=X_train,
    eval_set=[X_valid],
    预训练比例=0.8,
)

分类器 = TabNetClassifier(
    优化器函数=torch.optim.Adam,
    优化器参数=dict(lr=2e-2),
    调度器参数={"step_size":10, # 如何使用学习率调度器
                  "gamma":0.9},
    调度器函数=torch.optim.lr_scheduler.StepLR,
    掩码类型='sparsemax' # 如果使用预训练模型,此设置将被覆盖
)

分类器.fit(
    X_train=X_train, y_train=y_train,
    eval_set=[(X_train, y_train), (X_valid, y_valid)],
    eval_name=['train', 'valid'],
    eval_metric=['auc'],
    from_unsupervised=无监督模型
)

损失函数已被归一化,使其与pretraining_ratiobatch_size以及问题中特征的数量无关。 自监督损失大于1意味着模型的重建效果比单纯预测每个特征的均值还要差;而损失小于1则表示模型的表现优于仅预测均值。

完整的示例可以在笔记本文件pretraining_example.ipynb中找到。

/!\:当前实现试图重建原始输入,但批量归一化会应用一种无法通过单一线性变换推导出的随机变换,这使得重建变得更加困难。降低batch_size可能会使预训练更容易进行。

实时数据增强

现在可以在训练过程中应用自定义的数据增强流程。分类SMOTE和回归SMOTE的模板已添加到pytorch-tabnet/augmentations.py中,可以直接使用。

简便的保存与加载

保存和重新加载训练好的模型非常容易,这使得TabNet可以用于生产环境。

# 保存TabNet模型
saving_path_name = "./tabnet_model_test_1"
saved_filepath = clf.save_model(saving_path_name)

# 定义一个具有基本参数的新模型,并加载状态字典权重
loaded_clf = TabNetClassifier()
loaded_clf.load_model(saved_filepath)

有用链接

模型参数

  • n_d : 整数(默认=8)

    决策预测层的宽度。较大的值会增加模型的容量,但也存在过拟合的风险。通常取值范围为8到64。

  • n_a: 整数(默认=8)

    每个掩码的注意力嵌入宽度。 根据论文,n_d=n_a通常是不错的选择。(默认=8)

  • n_steps : 整数(默认=3)

    架构中的步骤数(通常在3到10之间)

  • gamma : 浮点数 (默认=1.3)

    这是掩码中特征重用的系数。 值接近1时,各层之间的掩码选择相关性最低。 取值范围为1.0到2.0。

  • cat_idxs : 整数列表(默认=[] - 嵌入必需)

    分类特征索引列表。

  • cat_dims : 整数列表(默认=[] - 嵌入必需)

    分类特征的类别数(即分类特征的唯一值数量) /!\ 不能预测新的类别

  • cat_emb_dim : 整数列表(可选)

    每个分类特征的嵌入维度。(默认=1)

  • n_independent : 整数 (默认=2)

    每个步骤中独立门控线性单元层的数量。 通常取值范围为1到5。

  • n_shared : 整数(默认=2)

    每个步骤中共享的门控线性单元层数 通常取值范围为1到5

  • epsilon : 浮点数 (默认 1e-15)

    应保持不变。

  • seed : 整数(默认=0)

    用于复现性的随机种子

  • momentum : 浮点数

    批量归一化的动量,通常在0.01到0.4之间(默认=0.02)

  • clip_value : 浮点数(默认 None)

    如果给出浮点数值,则会将梯度裁剪至该值。

  • lambda_sparse : 浮点数(默认 = 1e-3)

    这是原始论文中提出的额外稀疏性损失系数。该系数越大,模型在特征选择方面的稀疏性就越强。根据问题的难度,适当降低此值可能会有所帮助。

  • optimizer_fn : torch.optim(默认=torch.optim.Adam)

    PyTorch优化器函数

  • optimizer_params: 字典(默认=dict(lr=2e-2))

    与optimizer_fn兼容的参数,用于初始化优化器。由于我们默认使用Adam优化器,因此这里用来定义训练时的初始学习率。正如原始论文所提到的,采用较大初始学习率0.02并配合衰减是一个不错的选择。

  • scheduler_fn : torch.optim.lr_scheduler(默认=None)

    PyTorch学习率调度器,用于在训练过程中调整学习率。

  • scheduler_params : 字典

    应用于调度器函数的参数字典。例如:{"gamma": 0.95, "step_size": 10}

  • model_name : 字符串(默认 = 'DreamQuarkTabNet')

    用于在磁盘上保存模型时的名称,您可以自定义此名称以便于检索和重用训练好的模型。

  • verbose : 整数(默认=1)

    用于笔记本绘图的详细程度,设置为1可查看每一轮迭代,设置为0则不显示任何内容。

  • device_name : 字符串(默认='auto') 'cpu'表示在CPU上训练,'gpu'表示在GPU上训练,'auto'则自动检测GPU。

  • mask_type: str(默认='sparsemax') 可以是“sparsemax”或“entmax”:这是用于特征选择的掩码函数。

  • grouped_features: 列表的列表的整数(默认=None) 这允许模型在同一组内的特征之间共享注意力。 当您的预处理生成了相关或依赖的特征时,这一点尤其有用:例如,您对文本列使用TF-IDF或PCA时。 请注意,在同一组内的特征之间,其重要性将是完全相同的。 此外,请注意,为分类变量生成的嵌入始终位于同一组内。

  • n_shared_decoder : 整数(默认=1)

    解码器中共享GLU块的数量,这仅对TabNetPretrainer有用。

  • n_indep_decoder : 整数(默认=1)

    解码器中独立GLU块的数量,这仅对TabNetPretrainer有用。

拟合参数

  • X_train : np.array 或 scipy.sparse.csr_matrix

    训练特征

  • y_train : np.array

    训练目标

  • eval_set: 元组列表

    评估元组集合列表 (X, y)。
    最后一个用于早停

  • eval_name: 字符串列表
    评估集名称列表。

  • eval_metric : 字符串列表
    评估指标列表。
    最后一个指标用于早停。

  • max_epochs : int (默认 = 200)

    训练的最大轮数。

  • patience : int (默认 = 10)

    在执行早停之前,连续无提升的轮数。

    如果将耐心值设置为 0,则不会进行早停。

    注意,如果启用了耐心机制,那么在 fit 结束时会自动加载最佳轮次的权重。

  • weights : int 或字典 (默认=0)

    /!\ 仅适用于 TabNetClassifier 抽样参数 0 : 不抽样 1 : 根据类别出现频率自动抽样 字典 : 键为类别,值为每个类别的权重

  • loss_fn : torch.loss 或 torch.loss 列表

    训练用损失函数(回归默认为均方误差,分类默认为交叉熵)。 使用 TabNetMultiTaskClassifier 时,可以设置一个与任务数量相同长度的列表, 每个任务将分配到其专属的损失函数。

  • batch_size : int (默认=1024)

    每个批次的样本数。建议使用较大的批次大小。

  • virtual_batch_size : int (默认=128)

    用于“Ghost Batch Normalization”的小批次大小。 /!\ virtual_batch_size 应能整除 batch_size

  • num_workers : int (默认=0)

    torch.utils.data.Dataloader 中使用的工作者数量。

  • drop_last : bool (默认=False)

    训练过程中,如果最后一个批次不完整,是否将其丢弃。

  • callbacks : 回调函数列表
    自定义回调函数列表。

  • pretraining_ratio : 浮点数

    /!\ 仅限 TabNetPretrainer:预训练期间要掩码的输入特征百分比。 应介于 0 和 1 之间。数值越大,重建任务就越难。

  • warm_start : bool (默认=False) 为了兼容 scikit-learn 的 API,该参数被设置为 False。 它允许对同一个模型进行两次拟合,并从热启动开始。

  • compute_importance : bool (默认=True)

    是否计算特征重要性

版本历史

v4.1.02023/07/23
v4.02022/09/14
v3.1.12021/02/02
v3.1.02021/01/12
v3.0.02020/12/15
v2.0.12020/10/15
v2.0.02020/10/13
v1.2.02020/07/01
v1.1.02020/06/02
v1.0.62020/04/20
v1.0.52020/03/13
v1.0.42020/02/28
v1.0.32020/02/07
v1.0.22020/02/03
v1.0.12020/01/20
v1.0.02019/12/03
v0.1.22019/11/06

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架