นี่คือการใช้งาน Pytorch ของ Tabnet (Arik, So, & Pfister, T. (2019) Tabnet: การเรียนรู้แบบตารางตีความที่ตีความได้ โปรดทราบว่ามีตัวเลือกที่แตกต่างกันบางอย่างที่ทำค่าล่วงเวลาเพื่อปรับปรุงห้องสมุดซึ่งอาจแตกต่างจากกระดาษ orginal
คำถามใด ๆ ? ต้องการมีส่วนร่วม? คุยกับเรา? คุณสามารถเข้าร่วมกับเราได้ที่ Slack
คุณสามารถติดตั้งโดยใช้ 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 ภายในเทอร์มินัลเดียวกัน จากนั้นคุณสามารถติดตามลิงค์ไปยังสมุดบันทึก Jupyter ที่ติดตั้ง Tabnet
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_example.ipynb
เพิ่มในภายหลังไปยังกระดาษต้นฉบับของ Tabnet ตอนนี้การฝึกอบรมก่อนการดูแลแบบกึ่งผู้ดูแลระบบจะพร้อมใช้งานผ่าน Class 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 และสามารถใช้ตามที่เป็นอยู่
มันง่ายมากที่จะบันทึกและโหลดโมเดลที่ผ่านการฝึกอบรมใหม่ซึ่งทำให้การผลิตแท็บเน็ตพร้อม
# 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 (default = 3)
จำนวนขั้นตอนในสถาปัตยกรรม (โดยปกติระหว่าง 3 ถึง 10)
gamma : ลอย (ค่าเริ่มต้น = 1.3)
นี่คือค่าสัมประสิทธิ์สำหรับการใช้ฟีเจอร์ซ้ำในหน้ากาก ค่าใกล้เคียงกับ 1 จะทำให้การเลือกหน้ากากมีความสัมพันธ์น้อยที่สุดระหว่างเลเยอร์ ค่ามีช่วงตั้งแต่ 1.0 ถึง 2.0
cat_idxs : รายการ int (default = [] - บังคับสำหรับ embeddings)
รายการดัชนีคุณสมบัติหมวดหมู่
cat_dims : รายการ int (default = [] - บังคับสำหรับ embeddings)
รายการคุณสมบัติหมวดหมู่จำนวนของ modalities (จำนวนของค่าที่ไม่ซ้ำกันสำหรับคุณสมบัติหมวดหมู่) /! ไม่สามารถทำนายโมเดลใหม่ได้
cat_emb_dim : รายการ int (ไม่บังคับ)
รายการขนาดฝังสำหรับแต่ละคุณสมบัติหมวดหมู่ (ค่าเริ่มต้น = 1)
n_independent : int (ค่าเริ่มต้น = 2)
จำนวนเลเยอร์หน่วยเชิงเส้นที่มีรั้วรอบขอบชิดอิสระในแต่ละขั้นตอน ค่าปกติอยู่ในช่วง 1 ถึง 5
n_shared : int (ค่าเริ่มต้น = 2)
จำนวนหน่วยเชิงเส้นที่มีรั้วรอบขอบชิดที่ใช้ร่วมกันในแต่ละขั้นตอนค่าปกติมีช่วงตั้งแต่ 1 ถึง 5
epsilon : Float (ค่าเริ่มต้น 1E-15)
ควรจะไม่ถูกแตะต้อง
seed : int (default = 0)
เมล็ดสุ่มสำหรับการทำซ้ำ
momentum : ลอย
โมเมนตัมสำหรับการทำให้เป็นมาตรฐานแบบแบทช์มักจะอยู่ในช่วงตั้งแต่ 0.01 ถึง 0.4 (ค่าเริ่มต้น = 0.02)
clip_value : ลอย (ไม่มีค่าเริ่มต้น)
หากได้รับการลอยนี้จะตัดการไล่ระดับสีที่ clip_value
lambda_sparse : float (default = 1e-3)
นี่คือค่าสัมประสิทธิ์การสูญเสีย Sparsity พิเศษตามที่เสนอในกระดาษต้นฉบับ ค่าสัมประสิทธิ์ที่ใหญ่กว่านี้คือ sparser โมเดลของคุณจะเป็นในแง่ของการเลือกคุณสมบัติ ขึ้นอยู่กับความยากลำบากของปัญหาของคุณการลดค่านี้อาจช่วยได้
optimizer_fn : Torch.optim (default = torch.optim.adam)
ฟังก์ชั่น Pytorch Optimizer
optimizer_params : dict (default = dict (lr = 2e-2))
พารามิเตอร์ที่เข้ากันได้กับ Optimizer_FN ที่ใช้เริ่มต้นเครื่องมือเพิ่มประสิทธิภาพ เนื่องจากเรามีอดัมเป็นเครื่องมือเพิ่มประสิทธิภาพเริ่มต้นของเราเราจึงใช้สิ่งนี้เพื่อกำหนดอัตราการเรียนรู้เริ่มต้นที่ใช้สำหรับการฝึกอบรม ดังที่ได้กล่าวไว้ในกระดาษต้นฉบับอัตราการเรียนรู้เริ่มต้นขนาดใหญ่ที่ 0.02 พร้อมการสลายตัวเป็นตัวเลือกที่ดี
scheduler_fn : torch.optim.lr_scheduler (default = none)
Pytorch Scheduler เพื่อเปลี่ยนอัตราการเรียนรู้ระหว่างการฝึกอบรม
scheduler_params : dict
พารามิเตอร์ Dictionnary เพื่อใช้กับ scheduler_fn ตัวอย่าง: {"Gamma": 0.95, "step_size": 10}
model_name : str (default = 'dreamquarktabnet')
ชื่อของโมเดลที่ใช้ในการบันทึกในดิสก์คุณสามารถปรับแต่งสิ่งนี้เพื่อดึงและนำรุ่นที่ผ่านการฝึกอบรมมาใช้ใหม่ได้อย่างง่ายดาย
verbose : int (ค่าเริ่มต้น = 1)
Verbosity for Notebooks พล็อตตั้งค่าเป็น 1 เพื่อดูทุกยุคสมัยและไม่ได้รับ
device_name : str (default = 'auto') 'CPU' สำหรับการฝึกอบรม CPU, 'GPU' สำหรับการฝึกอบรม GPU, 'auto' เพื่อตรวจจับ GPU โดยอัตโนมัติ
mask_type: str (default = 'sparsemax') "sparsemax" หรือ "entmax": นี่คือฟังก์ชั่นการปิดบังที่ใช้สำหรับการเลือกคุณสมบัติ
grouped_features: list of list of ints (default = none) ซึ่งจะช่วยให้โมเดลสามารถแบ่งปันคุณสมบัติความสนใจที่เกิดขึ้นภายในกลุ่มเดียวกัน สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อการประมวลผลล่วงหน้าของคุณสร้างคุณสมบัติที่สัมพันธ์กันหรือขึ้นอยู่กับ: เช่นถ้าคุณใช้ TF-IDF หรือ PCA บนคอลัมน์ข้อความ โปรดทราบว่าความสำคัญของคุณสมบัติจะเหมือนกันระหว่างคุณสมบัติในกลุ่มเดียวกัน โปรดทราบว่าการฝังตัวที่สร้างขึ้นสำหรับตัวแปรเด็ดขาดนั้นอยู่ในกลุ่มเดียวกันเสมอ
n_shared_decoder : int (default = 1)
จำนวนบล็อก Glu ที่ใช้ร่วมกันในตัวถอดรหัสสิ่งนี้มีประโยชน์สำหรับ TabNetPretrainer เท่านั้น
n_indep_decoder : int (default = 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 (default = 200)
จำนวนสูงสุดของยุคสำหรับ trainng
patience : int (ค่าเริ่มต้น = 10)
จำนวนยุคติดต่อกันโดยไม่ต้องปรับปรุงก่อนที่จะหยุดเร็ว
หากความอดทนถูกตั้งค่าเป็น 0 แสดงว่าจะไม่มีการหยุดเร็ว
โปรดทราบว่าหากเปิดใช้งานความอดทนน้ำหนักที่ดีที่สุดจากยุคที่ดีที่สุดจะถูกโหลดโดยอัตโนมัติเมื่อสิ้นสุด fit
weights : int หรือ dict (default = 0)
/! สำหรับ TabnetClassifier พารามิเตอร์พารามิเตอร์ 0: ไม่มีการสุ่มตัวอย่าง 1: การสุ่มตัวอย่างอัตโนมัติที่มีคลาสผกผันเกิดขึ้น dict: ปุ่มคือคลาสค่าคือน้ำหนักสำหรับแต่ละคลาส
loss_fn : Torch.loss หรือ List of Torch.loss
ฟังก์ชั่นการสูญเสียสำหรับการฝึกอบรม (ค่าเริ่มต้นเป็น MSE สำหรับการถดถอยและไขว้เอนโทรปีสำหรับการจำแนกประเภท) เมื่อใช้ TabnetMultItaskClassifier คุณสามารถตั้งค่าความยาวเท่ากับจำนวนงานแต่ละงานจะได้รับการกำหนดฟังก์ชั่นการสูญเสียของตัวเอง
batch_size : int (default = 1024)
จำนวนตัวอย่างต่อชุด แนะนำให้ใช้ชุดขนาดใหญ่
virtual_batch_size : int (default = 128)
ขนาดของมินิแบทช์ที่ใช้สำหรับ "การทำให้เป็นมาตรฐานของผี" /! virtual_batch_size ควรแบ่ง batch_size
num_workers : int (default = 0)
หมายเลขหรือคนงานที่ใช้ใน Torch.utils.data.dataloader
drop_last : bool (default = false)
ไม่ว่าจะวางชุดสุดท้ายถ้ายังไม่เสร็จในระหว่างการฝึกอบรม
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 (default = false) เพื่อให้ตรงกับ Scikit-learn API นี่ถูกตั้งค่าเป็นเท็จ ช่วยให้พอดีกับรุ่นเดียวกันสองเท่าและเริ่มต้นจากการเริ่มต้นที่อบอุ่น
compute_importance : bool (default = true)
ไม่ว่าจะคำนวณความสำคัญของคุณสมบัติ