هذا هو تطبيق Pytorch لـ TabNet (Arik ، So ، & Pfister ، T. (2019). TabNet: التعلم الجدولي القابل للتفسير. arxiv preprint arxiv: 1908.07442.) https://arxiv.org/pdf/1908.07442.pdf. يرجى ملاحظة أن بعض الخيارات المختلفة قد تم اتخاذها العمل الإضافي لتحسين المكتبة التي يمكن أن تختلف عن الورقة الزراعية.
أي أسئلة؟ تريد المساهمة؟ للتحدث معنا؟ يمكنك الانضمام إلينا على سلاك
يمكنك التثبيت باستخدام pip أو conda على النحو التالي.
مع PIP
pip install pytorch-tabnetمع كوندا
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 داخل نفس المحطة. يمكنك بعد ذلك متابعة الرابط إلى دفتر Jupyter مع تثبيت TabNet.
grouped_features ). يتم الانتباه الآن على مستوى المجموعة وليس مستوى الميزات. يعد هذا مفيدًا بشكل خاص إذا كان لدى مجموعة البيانات الكثير من الأعمدة القادمة من مصدر واحد للبيانات (exemple: تم تحويل عمود نصي باستخدام 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) عند القيام بالتنبؤات.
يمكنك إنشاء مقياس لحاجتك المحددة. فيما يلي مثال على درجة جيني (لاحظ أنك بحاجة إلى تحديد ما إذا كان ينبغي تعظيم هذا المقياس أم لا):
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 :
# 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 أن النموذج الخاص بك يعيد بناء أسوأ من التنبؤ بالمتوسط لكل ميزة ، فإن الخسارة تعني أن النموذج يعمل بشكل أفضل من التنبؤ بالمتوسط.
يمكن العثور على مثال كامل ضمن دفتر Notebook pretraining_example.ipynb .
/! : يحاول التنفيذ الحالي إعادة بناء المدخلات الأصلية ، ولكن تطبيع الدُفعات يطبق تحولًا عشوائيًا لا يمكن استنتاجه بواسطة خط واحد ، مما يجعل إعادة الإعمار أكثر صعوبة. قد يجعل خفض batch_size أسهل.
أصبح من الممكن الآن تطبيق خط أنابيب تكبير البيانات المخصص أثناء التدريب. تمت إضافة قوالب للتصنيفات Mote و CrgressionsMote في 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 : تعويم (افتراضي = 1.3)
هذا هو معامل إعادة استخدام الميزة في الأقنعة. القيمة القريبة من 1 ستجعل اختيار القناع مرتبطًا على الأقل بين الطبقات. تتراوح القيم من 1.0 إلى 2.0.
cat_idxs : قائمة int (افتراضي = [] - إلزامي للتضمينات)
قائمة مؤشرات الميزات الفئوية.
cat_dims : قائمة int (افتراضي = [] - إلزامي للتضمينات)
قائمة الميزات الفئوية عدد الطرائق (عدد القيم الفريدة للميزة الفئوية) /! لا يمكن التنبؤ بطرائق جديدة
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 : تعويم (لا شيء افتراضي)
إذا تم إعطاء تعويم ، فسيقص التدرج على Clip_Value.
lambda_sparse : تعويم (افتراضي = 1e-3)
هذا هو معامل خسارة SPARSITY الإضافية كما هو مقترح في الورقة الأصلية. كلما كان هذا المعامل أكبر ، سيكون نموذجك المتناثر من حيث اختيار الميزات. اعتمادًا على صعوبة مشكلتك ، قد يساعد تقليل هذه القيمة.
optimizer_fn : Torch.optim (افتراضي = torch.optim.adam)
Pytorch Optimizer وظيفة
optimizer_params : Dict (افتراضي = dict (lr = 2e-2))
المعلمات متوافقة مع Optimizer_FN المستخدمة تهيئة المحسن. نظرًا لأن لدينا آدم كمحسّن افتراضي ، نستخدم هذا لتحديد معدل التعلم الأولي المستخدم للتدريب. كما هو مذكور في الورقة الأصلية ، يعد معدل التعلم الأولي الكبير 0.02 مع الانحلال خيارًا جيدًا.
scheduler_fn : Torch.optim.lr_scheduler (افتراضي = لا شيء)
جدولة Pytorch لتغيير معدلات التعلم أثناء التدريب.
scheduler_params : Dict
DictionNary من المعلمات لتطبيق على Scheduler_FN. على سبيل المثال: {"gamma": 0.95 ، "Step_Size": 10}
model_name : str (default = 'dreamquarktabnet')
اسم النموذج المستخدم للحفظ في القرص ، يمكنك تخصيص هذا لاسترداد وإعادة استخدام النماذج المدربة بسهولة.
verbose : int (افتراضي = 1)
أفعال مؤامرات دفاتر الملاحظات ، تم تعيينها على 1 لرؤية كل عصر ، 0 للحصول على أي شيء.
device_name : str (default = 'auto') 'CPU "للتدريب على وحدة المعالجة المركزية ،" GPU "للتدريب على GPU ،" Auto "للكشف تلقائيًا من 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 : قائمة tuple
قائمة مجموعة Tuple (x ، y).
يتم استخدام آخر واحد للتوقف المبكر
eval_name : قائمة Str
قائمة أسماء مجموعة التقييم.
eval_metric : قائمة Str
قائمة مقاييس التقييم.
يتم استخدام المقياس الأخير للتوقف المبكر.
max_epochs : int (افتراضي = 200)
الحد الأقصى لعدد الحصر للقطار.
patience : int (افتراضي = 10)
عدد العصر المتتالي دون تحسن قبل إجراء التوقف المبكر.
إذا تم ضبط الصبر على 0 ، فلن يتم إجراء التوقف المبكر.
لاحظ أنه إذا تم تمكين الصبر ، فسيتم تحميل أفضل الأوزان من Best Epoch تلقائيًا في نهاية fit .
weights : int أو dict (افتراضي = 0)
/! فقط لمعلمة أخذ عينات TabNetClassifier 0: لا يوجد أخذ عينات 1: أخذ العينات الآلية مع حوادث الفئة العكسية: مفاتيح فئات ، والقيم هي أوزان لكل فئة
loss_fn : torch.loss أو قائمة torch.loss
وظيفة الخسارة للتدريب (الافتراضي لـ MSE للانحدار والإنتروبيا المتقاطعة للتصنيف) عند استخدام TabNetMultItAskClassifier ، يمكنك تعيين قائمة بنفس طول عدد المهام ، وسيتم تعيين كل مهمة لوظيفة الخسارة الخاصة بها
batch_size : int (افتراضي = 1024)
عدد الأمثلة لكل دفعة. ينصح بأحجام دفع كبيرة.
virtual_batch_size : int (افتراضي = 128)
حجم الدُفعات المصغرة المستخدمة في "تطبيع دفعة الأشباح". /! virtual_batch_size يجب تقسيم batch_size
num_workers : int (افتراضي = 0)
العدد أو العمال المستخدمة في torch.utils.data.dataloader
drop_last : Bool (افتراضي = خطأ)
ما إذا كان يجب إسقاط الدفعة الأخيرة إذا لم تكتمل أثناء التدريب
callbacks : قائمة وظيفة رد الاتصال
قائمة عمليات الاسترجاعات المخصصة
pretraining_ratio : تعويم
/! 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 (افتراضي = خطأ) من أجل مطابقة API SCIKIT-Learn ، تم تعيين هذا على خطأ. يسمح بتناسب مرتين نفس النموذج والبدء من بداية دافئة.
compute_importance : bool (افتراضي = صحيح)
ما إذا كان لحساب أهمية الميزة