Это реализация Pytorch of Tabnet (Arik, SO, & Pfister, T. (2019). Tabnet: внимательное интерпретируемое табличное обучение. Arxiv Preprint arxiv: 1908.07442.) Https://arxiv.org/pdf/1908.07442.pdf. Обратите внимание, что некоторые различные варианты были сделаны сверхурочно для улучшения библиотеки, которая может отличаться от организации.
Есть вопросы? Хотите внести свой вклад? Поговорить с нами? Вы можете присоединиться к нам в 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 для установки всех зависимостей, включая Юпитер
make notebook в том же терминале. Затем вы можете перейти ссылку на ноутбук Jupyter с установленной TabNet.
grouped_features ). Внимание теперь делается на уровне группы, а не на уровне функций. Это особенно полезно, если набор данных имеет много столбцов, поступающих на одном источнике данных (Exemple: текстовый столбец, преобразованный с использованием TD-IDF).Принимая во внимание репозиторий TabNet, пожалуйста, сначала обсудите изменение, которое вы хотите внести с помощью новой или уже существующей проблемы.
Наши коммиты следуют правилам, представленным здесь.
Tabnet теперь совместим с Scikit, обучение TabnetClassifier или TabnetResor действительно просто.
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/customize_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 (default = [] - обязательно для внедрения)
Список индексов категориальных функций.
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 (default = torch.optim.adam)
Функция оптимизатора Pytorch
optimizer_params : DICT (по умолчанию = DICT (LR = 2E-2))
Параметры, совместимые с Optimizer_FN, использовали инициализируйте оптимизатор. Поскольку у нас есть Адам в качестве нашего оптимизатора по умолчанию, мы используем это для определения начальной скорости обучения, используемой для обучения. Как упомянуто в оригинальной статье, большая начальная скорость обучения 0.02 с распадом является хорошим вариантом.
scheduler_fn : torch.optim.lr_scheduler (default = none)
Планировщик Pytorch для изменения ставок обучения во время обучения.
scheduler_params : dict
Dictionnary of Parameters для применения к планированию ganculer_fn. Пример: {"Гамма": 0,95, "Step_size": 10}
model_name : str (default = 'dreamquarktabnet')
Название модели, используемой для сохранения на диске, вы можете настроить это, чтобы легко извлечь и повторно использовать свои обученные модели.
verbose : int (по умолчанию = 1)
Мервесность для записных книг, установив на 1, чтобы увидеть каждую эпоху, 0, чтобы получить его.
device_name : str (default = 'auto') «ЦП» для обучения процессора, «GPU» для обучения графического процессора, «Auto» для автоматического обнаружения графического процессора.
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 : список корпуса
Список набора кортежей Eval (x, y).
Последний используется для ранней остановки
eval_name : список Str
СПИСОК ИМЕНИ ЭВАХ УСТАНОВКИ.
eval_metric : список Str
Список показателей оценки.
Последняя метрика используется для ранней остановки.
max_epochs : int (по умолчанию = 200)
Максимальное количество эпох для тренировок.
patience : int (по умолчанию = 10)
Количество последовательных эпох без улучшения до ранней остановки.
Если терпение устанавливается на 0, то ранняя остановка не будет выполнена.
Обратите внимание, что если терпение включено, то лучшие веса из лучшей эпохи будут автоматически загружаться в конце 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 (default = 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) Чтобы соответствовать API Scikit-Learn, это установлено на false. Это позволяет установить дважды одну и ту же модель и начинаться с теплого старта.
compute_importance : bool (default = true)
Вычислить важность функции