这是TabNet的Pytorch实现(Arik,So,&Pfister,T。(2019)。TabNet:专注的可解释的表格学习。ARXIVPreprint Arxiv:1908.07442。)https://arxiv.org.org.org.org/pdf/pdf/pdf/1908.074442.pdf。请注意,已经加班了一些不同的选择,以改善与原始纸不同的库。
有问题吗?想贡献吗?与我们交谈?你可以加入我们的懈怠
您可以使用pip或conda安装如下。
与pip
pip install pytorch-tabnet与Conda
conda install -c conda-forge pytorch-tabnet如果您要在Docker容器中本地使用它:
git clone [email protected]:dreamquark-ai/tabnet.git
cd tabnet进入存储库
make start建造并进入容器中make start-gpu构建并进入GPU容器poetry install以安装所有依赖关系,包括jupyter
在同一终端中make notebook 。然后,您可以按照已安装TabNet的链接链接到jupyter笔记本。
grouped_features )。现在注意到小组级别而不是功能级别。如果数据集在单个数据源上有很多列(示例:使用TD-IDF转换的文本列),这一点尤其有用。在为TabNet存储库做出贡献时,请确保首先讨论您希望通过新的或已经存在的问题进行的更改。
我们的承诺遵循此处介绍的规则。
TABNET现在与Scikit兼容,训练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上的目标应包含唯一类型(例如它们都必须是字符串或整数)。
实施了一些经典的评估指标(有关自定义的指标,请参见下面的信息):
重要说明:“ RMSLE”将自动将负面预测夹为0,因为该模型可以预测负值。为了匹配给定的分数,您需要使用np.clip(clf.predict(X_predict), a_min=0, a_max=None)进行预测。
您可以为您的特定需求创建指标。这是Gini分数的一个示例(请注意,您需要指定该指标是否应最大化):
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/customizing_example.ipynb
稍后添加到TabNet的原始论文中,现在可以通过类TabNetPretrainer获得半监督的预训练:
# TabNetPretrainer
unsupervised_model = TabNetPretrainer (
optimizer_fn = torch . optim . Adam ,
optimizer_params = dict ( lr = 2e-2 ),
mask_type = 'entmax' # "sparsemax"
)
unsupervised_model . fit (
X_train = X_train ,
eval_set = [ X_valid ],
pretraining_ratio = 0.8 ,
)
clf = TabNetClassifier (
optimizer_fn = torch . optim . Adam ,
optimizer_params = dict ( lr = 2e-2 ),
scheduler_params = { "step_size" : 10 , # how to use learning rate scheduler
"gamma" : 0.9 },
scheduler_fn = torch . optim . lr_scheduler . StepLR ,
mask_type = 'sparsemax' # This will be overwritten if using pretrain model
)
clf . 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 = unsupervised_model
)损耗函数已被归一化,以独立于pretraining_ratio , batch_size和问题中的功能数量。自我监督损失大于1意味着您的模型比预测每个功能的平均值更糟,损失1表示模型的表现要好于预测平均值。
可以在笔记本pretraining_example.ipynb中找到一个完整的示例。
/!:当前的实现正在尝试重建原始输入,但是批处理归一化应用了一个随机转换,该转换无法通过一线行推导,从而使重建更加困难。降低batch_size可能会使预处理更容易。
现在可以在培训期间应用自定义数据扩展管道。在pytorch-tabnet/augmentations.py中添加了分类模板和回归模板,并且可以按原样使用。
保存和重新加载训练有素的型号真的很容易,这使TabNet生产准备就绪。
# save tabnet model
saving_path_name = "./tabnet_model_test_1"
saved_filepath = clf.save_model(saving_path_name)
# define new model with basic parameters and load state dict weights
loaded_clf = TabNetClassifier()
loaded_clf.load_model(saved_filepath)
n_d :int(默认= 8)
决策预测层的宽度。更大的价值为模型提供了更大的能力,并有过度拟合的风险。值通常在8到64之间。
n_a :int(默认= 8)
每个面具的注意力嵌入的宽度。根据论文,n_d = n_a通常是一个不错的选择。 (默认= 8)
n_steps :int(默认= 3)
体系结构中的步骤数(通常在3到10之间)
gamma :float(默认= 1.3)
这是掩模中特征重新使用的系数。接近1的值将使掩模选择在层之间最少相关。值范围为1.0到2.0。
cat_idxs :int列表(默认= [] - 嵌入的强制性)
分类特征索引列表。
cat_dims :int列表(default = [] - 嵌入的强制性)
类别特征列表的数量数量(分类功能的唯一值数) /!无需预测新模式
cat_emb_dim :int列表(可选)
每个分类特征的嵌入式尺寸列表。 (默认= 1)
n_independent :int(默认= 2)
每个步骤的独立门通线性单元层的数量。通常的值在1到5不等。
n_shared :int(默认= 2)
每个步骤的共享封闭线性单元的数量从1到5
epsilon :float(默认1E-15)
应该保持不变。
seed :int(默认= 0)
随机种子可重现性
momentum :漂浮
分批归一化的动量,通常为0.01至0.4(默认值= 0.02)
clip_value :float(默认无)
如果给出了浮子,则将夹在clip_value处的梯度。
lambda_sparse :float(默认= 1E-3)
这是原始论文中提出的额外的稀疏损失系数。该系数越大,您的模型就会越稀疏。根据您的问题的困难,降低此价值可能会有所帮助。
optimizer_fn :TORCH.OPTIM(默认= torch.optim.adam)
Pytorch优化功能
optimizer_params :dict(default = dict(lr = 2e-2)))
与使用优化器兼容的参数初始化优化器。由于我们将亚当作为默认优化器,因此我们使用它来定义用于培训的初始学习率。正如原始论文中提到的那样,衰减的大型初始学习率为0.02是一个不错的选择。
scheduler_fn :torch.optim.lr_scheduler(default = none)
Pytorch调度程序以更改培训期间的学习率。
scheduler_params :dict
参数字典词将应用于Scheduler_fn。例如:{“伽马”:0.95,“ step_size”:10}
model_name :str(default ='dreamquarktabnet')
用于保存磁盘的模型的名称,您可以自定义以轻松检索和重复训练有素的模型。
verbose :int(默认= 1)
笔记本图的详细性,设置为1以查看每个时期,0均无法获得。
device_name :str(default ='auto')用于CPU培训的CPU,用于GPU培训的'GPU',“自动”以自动检测GPU。
mask_type: str (default ='sparsemax')“ sparsemax”或“ entmax”:这是用于选择功能的掩模函数。
grouped_features: list of list of ints这允许模型在同一组内共享其注意力累积功能。当您的预处理生成相关或因功能时,这可能特别有用:例如,如果您在文本列上使用TF-IDF或PCA。请注意,同一组的功能之间的特征重要性将完全相同。另请注意,为分类变量生成的嵌入始终在同一组内。
n_shared_decoder :int(默认= 1)
在解码器中共享的GLU块的数量,这仅对TabNetPretrainer有用。
n_indep_decoder :int(默认= 1)
在解码器中的独立GLU块数量,这仅对TabNetPretrainer有用。
X_train :np.array或scipy.sparse.csr_matrix
培训功能
y_train :np.array
培训目标
eval_set :元组清单
评估元组集(x,y)的列表。
最后一个用于提早停止
eval_name :str列表
评估集名称列表。
eval_metric :str列表
评估指标列表。
最后一个指标用于提早停止。
max_epochs :int(默认= 200)
最大的火车时代数量。
patience :int(默认= 10)
在执行早期停止之前,连续的时期数量无改进。
如果耐心设置为0,则不会进行早期停止。
请注意,如果启用了耐心,那么最佳时期的最佳权重将在fit结束时自动加载。
weights :int或dict(默认= 0)
/!仅用于TABNETCLASSIFIER采样参数0:无抽样1:与倒数类别的自动采样dict dict:键是类,值是每个类的权重
loss_fn :TORCH.LOSS或TORCH列表。
培训的损失功能(默认为MSE进行回归和分类的交叉熵)时,使用TABNETMULTITASKCLASSIFIER您可以设置与任务数量相同长度的列表,每个任务将分配其自己的损失函数
batch_size :int(默认= 1024)
每个批次的示例数。建议使用大批量。
virtual_batch_size :int(默认= 128)
用于“ Ghost Batch归一化”的迷你批次的大小。 /! virtual_batch_size应该划分batch_size
num_workers :int(默认= 0)
torch.utils.data.dataloader中使用的数字或工人
drop_last :bool(默认= false)
如果在训练期间,如果不完整,是否要丢下最后一批
callbacks :回调功能列表
自定义回调列表
pretraining_ratio :float
/! TabNetPretrainer Only : Percentage of input features to mask during pretraining.
Should be between 0 and 1. The bigger the harder the reconstruction task is.
warm_start :bool(default = false)以匹配Scikit-learn API,将其设置为false。它允许适合两倍相同的型号,并从温暖的开始。
compute_importance :bool(default = true)
是否要计算特征重要性