Ini adalah implementasi Pytorch dari Tabnet (Arik, So, & Pfister, T. (2019). Tabnet: Pembelajaran Tabular yang Dapat Ditafsirkan. Harap dicatat bahwa beberapa pilihan berbeda telah dibuat lembur untuk meningkatkan perpustakaan yang dapat berbeda dari kertas orginal.
Ada pertanyaan? Ingin berkontribusi? Berbicara dengan kami? Anda dapat bergabung dengan kami di Slack
Anda dapat menginstal menggunakan pip atau conda sebagai berikut.
dengan pip
pip install pytorch-tabnetdengan conda
conda install -c conda-forge pytorch-tabnetJika Anda ingin menggunakannya secara lokal dalam wadah Docker:
git clone [email protected]:dreamquark-ai/tabnet.git
cd tabnet untuk masuk ke dalam repositori
make start membangun dan masuk ke dalam wadah make start-gpu dan masuk ke dalam wadah GPU poetry install untuk menginstal semua dependensi, termasuk Jupyter
make notebook di dalam terminal yang sama. Anda kemudian dapat mengikuti tautan ke buku catatan Jupyter dengan TabNet yang diinstal.
grouped_features ). Perhatian sekarang dilakukan di level grup dan bukan tingkat fitur. Ini sangat berguna jika dataset memiliki banyak kolom berasal dari sumber data tunggal (Exemple: kolom teks yang diubah menggunakan TD-IDF).Saat berkontribusi pada Repositori Tabnet, pastikan untuk terlebih dahulu membahas perubahan yang ingin Anda lakukan melalui masalah baru atau sudah ada.
Komit kami mengikuti aturan yang disajikan di sini.
TabNet sekarang kompatibel dengan Scikit, melatih TabNetClassifier atau Tabnetregressess sangat mudah.
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 )atau untuk 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 ) Target pada y_train/y_valid harus berisi jenis yang unik (misalnya semuanya harus menjadi string atau bilangan bulat).
Beberapa metrik evaluasi klasik diimplementasikan (lihat lebih lanjut di bawah ini untuk yang kustom):
Catatan Penting: 'RMSLE' akan secara otomatis mengklipsi prediksi negatif ke 0, karena model dapat memprediksi nilai negatif. Untuk mencocokkan skor yang diberikan, Anda perlu menggunakan np.clip(clf.predict(X_predict), a_min=0, a_max=None) saat melakukan prediksi.
Anda dapat membuat metrik untuk kebutuhan spesifik Anda. Berikut adalah contoh untuk skor gini (perhatikan bahwa Anda perlu menentukan apakah metrik ini harus dimaksimalkan atau tidak):
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 ]
)Contoh kustomisasi spesifik notebook tersedia di sini: https://github.com/dreamquark-ai/tabnet/blob/develop/customizing_example.ipynb
Ditambahkan nanti ke kertas asli Tabnet, pra-pelatihan semi-diawasi sekarang tersedia melalui kelas 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
) Fungsi kerugian telah dinormalisasi menjadi independen dari pretraining_ratio , batch_size dan jumlah fitur dalam masalah. Kerugian yang diawasi sendiri lebih besar dari 1 berarti bahwa model Anda merekonstruksi lebih buruk daripada memprediksi rata -rata untuk setiap fitur, kerugian di bawah 1 berarti bahwa model tersebut melakukan lebih baik daripada memprediksi rata -rata.
Contoh lengkap dapat ditemukan dalam notebook pretraining_example.ipynb .
/! : Implementasi saat ini sedang mencoba merekonstruksi input asli, tetapi normalisasi batch menerapkan transformasi acak yang tidak dapat disimpulkan oleh satu baris, membuat rekonstruksi lebih sulit. Menurunkan batch_size mungkin membuat pretraining lebih mudah.
Sekarang dimungkinkan untuk menerapkan pipa augmentasi data khusus selama pelatihan. Template untuk klasifikasi dan regresi telah ditambahkan dalam pytorch-tabnet/augmentations.py dan dapat digunakan sebagaimana adanya.
Sangat mudah untuk menyimpan dan memuat ulang model yang terlatih, ini membuat produksi Tabnet siap.
# 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 (default = 8)
Lebar lapisan prediksi keputusan. Nilai yang lebih besar memberikan lebih banyak kapasitas pada model dengan risiko overfitting. Nilai biasanya berkisar dari 8 hingga 64.
n_a : int (default = 8)
Lebar yang menarik perhatian untuk setiap topeng. Menurut kertas N_D = N_A biasanya merupakan pilihan yang baik. (default = 8)
n_steps : int (default = 3)
Jumlah langkah dalam arsitektur (biasanya antara 3 dan 10)
gamma : float (default = 1.3)
Ini adalah koefisien untuk reusage fitur dalam topeng. Nilai yang mendekati 1 akan membuat seleksi topeng paling tidak berkorelasi antar lapisan. Nilai berkisar dari 1,0 hingga 2.0.
cat_idxs : Daftar int (default = [] - wajib untuk embeddings)
Daftar Indeks Fitur Kategori.
cat_dims : Daftar int (default = [] - wajib untuk embeddings)
Daftar fitur kategorikal Jumlah modalitas (jumlah nilai unik untuk fitur kategorikal) /! Tidak ada modalitas baru yang dapat diprediksi
cat_emb_dim : Daftar int (opsional)
Daftar ukuran embeddings untuk setiap fitur kategori. (default = 1)
n_independent : int (default = 2)
Jumlah lapisan unit linier independen yang berpagar di setiap langkah. Nilai biasa berkisar dari 1 hingga 5.
n_shared : int (default = 2)
Jumlah unit linier yang dipagari bersama pada setiap langkah nilai biasa berkisar dari 1 hingga 5
epsilon : float (default 1e-15)
Harus dibiarkan tidak tersentuh.
seed : int (default = 0)
Benih acak untuk reproduktifitas
momentum : Mengapung
Momentum untuk normalisasi batch, biasanya berkisar dari 0,01 hingga 0,4 (default = 0,02)
clip_value : float (tidak ada default)
Jika float diberikan ini akan memotong gradien di clip_value.
lambda_sparse : float (default = 1e-3)
Ini adalah koefisien kehilangan sparsity ekstra seperti yang diusulkan dalam makalah asli. Semakin besar koefisien ini, semakin jarang model Anda dalam hal pemilihan fitur. Tergantung pada kesulitan masalah Anda, mengurangi nilai ini dapat membantu.
optimizer_fn : torch.optim (default = torch.optim.adam)
Fungsi pengoptimal pytorch
optimizer_params : dict (default = dict (lr = 2e-2))
Parameter kompatibel dengan optimizer_fn yang digunakan menginisialisasi pengoptimal. Karena kami memiliki Adam sebagai pengoptimal default kami, kami menggunakan ini untuk menentukan tingkat pembelajaran awal yang digunakan untuk pelatihan. Seperti yang disebutkan dalam makalah asli, tingkat pembelajaran awal yang besar 0.02 dengan pembusukan adalah pilihan yang baik.
scheduler_fn : torch.optim.lr_scheduler (default = tidak ada)
Penjadwal Pytorch untuk mengubah tingkat pembelajaran selama pelatihan.
scheduler_params : Dikt
Dictionnary of Parameter untuk diterapkan ke SCRETERER_FN. Mis: {"gamma": 0.95, "step_size": 10}
model_name : str (default = 'dreamquarktabnet')
Nama model yang digunakan untuk menyimpan dalam disk, Anda dapat menyesuaikan ini untuk dengan mudah mengambil dan menggunakan kembali model terlatih Anda.
verbose : int (default = 1)
Verbositas untuk plot notebook, diatur ke 1 untuk melihat setiap zaman, 0 untuk mendapatkan tidak ada.
device_name : str (default = 'auto') 'cpu' untuk pelatihan CPU, 'GPU' untuk pelatihan GPU, 'Auto' untuk secara otomatis mendeteksi GPU.
mask_type: str (default = 'sparsemax') baik "sparsemax" atau "entmax": Ini adalah fungsi masking yang digunakan untuk memilih fitur.
grouped_features: list of list of ints (default = tidak ada) Ini memungkinkan model untuk berbagi fitur Accross perhatian di dalam grup yang sama. Ini bisa sangat berguna ketika preprocessing Anda menghasilkan fitur yang berkorelasi atau tergantung: seperti jika Anda menggunakan TF-IDF atau PCA pada kolom teks. Perhatikan bahwa kepentingan fitur akan persis sama antara fitur pada grup yang sama. Harap perhatikan juga bahwa embeddings yang dihasilkan untuk variabel kategori selalu berada di dalam grup yang sama.
n_shared_decoder : int (default = 1)
Jumlah blok Glu bersama dalam dekoder, ini hanya berguna untuk TabNetPretrainer .
n_indep_decoder : int (default = 1)
Jumlah blok Glu independen dalam dekoder, ini hanya berguna untuk TabNetPretrainer .
X_train : np.array atau scipy.sparse.csr_matrix
Fitur pelatihan
y_train : np.array
Target pelatihan
eval_set : Daftar tuple
Daftar set eval tuple (x, y).
Yang terakhir digunakan untuk berhenti lebih awal
eval_name : Daftar STR
Daftar nama set eval.
eval_metric : Daftar STR
Daftar metrik evaluasi.
Metrik terakhir digunakan untuk berhenti lebih awal.
max_epochs : int (default = 200)
Jumlah maksimum zaman untuk trainng.
patience : int (default = 10)
Jumlah zaman berturut -turut tanpa perbaikan sebelum melakukan pemberhentian lebih awal.
Jika kesabaran diatur ke 0, maka tidak ada penghentian awal yang akan dilakukan.
Perhatikan bahwa jika kesabaran diaktifkan, maka bobot terbaik dari zaman terbaik akan secara otomatis dimuat pada akhir fit .
weights : int atau dikt (default = 0)
/! Hanya untuk parameter pengambilan sampel TabNetClassifier 0: Tidak ada pengambilan sampel 1: Pengambilan sampel otomatis dengan kejadian kelas terbalik dikt: tombol adalah kelas, nilai adalah bobot untuk setiap kelas
loss_fn : torch.loss atau daftar torch.loss
Fungsi kerugian untuk pelatihan (default ke MSE untuk regresi dan entropi silang untuk klasifikasi) Saat menggunakan tabnetmultitaskClassifier Anda dapat menetapkan daftar panjang yang sama dengan jumlah tugas, setiap tugas akan ditetapkan fungsi kerugiannya sendiri sendiri
batch_size : int (default = 1024)
Jumlah contoh per batch. Ukuran batch besar direkomendasikan.
virtual_batch_size : int (default = 128)
Ukuran batch mini yang digunakan untuk "normalisasi batch hantu". /! virtual_batch_size harus membagi batch_size
num_workers : int (default = 0)
Nomor atau pekerja yang digunakan di torch.utils.data.dataloader
drop_last : bool (default = false)
Apakah akan menjatuhkan batch terakhir jika tidak selesai selama pelatihan
callbacks : Daftar fungsi panggilan balik
Daftar panggilan balik khusus
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) Untuk mencocokkan API scikit-learn, ini diatur ke false. Ini memungkinkan untuk menyesuaikan dua kali model yang sama dan mulai dari awal yang hangat.
compute_importance : bool (default = true)
Apakah akan menghitung kepentingan fitur