這是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)
是否要計算特徵重要性