이것은 Tabnet (Arik, So, & Pfister, T. (2019). Tabnet : 세심한 해석 가능한 표식 학습. Arxiv preprint arxiv : 1908.07442.)의 pytorch 구현입니다. https://arxiv.org/pdf/1908.07442.pdf. 원래 논문과 다를 수있는 도서관을 개선하기 위해 몇 가지 다른 선택이 초과 근무로 이루어졌습니다.
질문이 있습니까? 기여하고 싶습니까? 우리와 이야기하려면? 슬랙에 우리와 함께 할 수 있습니다
다음과 같이 pip 또는 conda 사용하여 설치할 수 있습니다.
PIP와 함께
pip install pytorch-tabnet콘다와 함께
conda install -c conda-forge pytorch-tabnetDocker 컨테이너 내에서 로컬로 사용하기를 원한다면 :
git clone [email protected]:dreamquark-ai/tabnet.git
cd tabnet 저장소에 들어갑니다
make start make start-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_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 낮추면 사전 여지가 더 쉬워 질 수 있습니다.
이제 교육 중에 사용자 정의 데이터 확대 파이프 라인을 적용 할 수 있습니다. ClassicationSmote 및 RegressionsMote를위한 템플릿이 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 (default = 8)
의사 결정 예측 계층의 너비. 더 큰 값은 과적으로 과적 할 위험이있는 모델에 더 많은 용량을 제공합니다. 값은 일반적으로 8에서 64입니다.
n_a : int (default = 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 = [] - 임베딩 필수)
범주 형 기능 지수의 목록.
cat_dims : int 목록 (default = [] - 임베딩 필수)
범주 형 기능 목록 양식 수 (범주 형 기능에 대한 고유 한 값 수) /! 새로운 양식을 예측할 수 없습니다.
cat_emb_dim : int 목록 (선택 사항)
각 범주 특징에 대한 임베딩 크기 목록. (기본값 = 1)
n_independent : int (default = 2)
각 단계에서 독립적 인 게이트 선형 유닛의 수. 일반적인 값의 범위는 1에서 5입니다.
n_shared : int (default = 2)
각 단계에서 공유 게이트 선형 단위의 수 일반 값은 1에서 5입니다.
epsilon : Float (기본 1E-15)
손대지 않아야합니다.
seed : int (default = 0)
재현성을위한 임의의 종자
momentum : 플로트
배치 정규화를위한 운동량은 일반적으로 0.01 ~ 0.4입니다 (기본값 = 0.02)
clip_value : float (기본값 없음)
플로트가 주어지면 클립 _value에서 그라디언트를 클립합니다.
lambda_sparse : float (default = 1e-3)
이것은 원래 논문에서 제안 된 여분의 희소성 손실 계수입니다. 이 계수가 클수록 모델의 특징 선택 측면에서 모델이 될 수 있습니다. 문제의 어려움에 따라이 값을 줄이는 것이 도움이 될 수 있습니다.
optimizer_fn : Torch.optim (default = torch.optim.adam)
Pytorch Optimizer 기능
optimizer_params : Dict (default = dict (lr = 2e-2))
Optimizer_FN과 호환되는 매개 변수는 최적화를 초기화했습니다. 우리는 기본 최적화기로 Adam을 가지고 있기 때문에이를 사용하여 교육에 사용 된 초기 학습 속도를 정의합니다. 원래 논문에서 언급 한 바와 같이, 붕괴로 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 (default = 1)
노트북 음모에 대한 참각에 대한 참으로, 1로 설정하여 모든 시대를 보려면 0, 0을 얻지 못합니다.
device_name : str (default = 'auto') 'CPU'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 : 튜플 목록
평가 튜플 세트 목록 (x, y).
마지막은 조기 정지에 사용됩니다
eval_name : str 목록
평가 세트 이름 목록.
eval_metric : str 목록
평가 메트릭 목록.
마지막 메트릭은 조기 정지에 사용됩니다.
max_epochs : int (default = 200)
Trainng의 최대 에포크 수.
patience : int (default = 10)
조기 정지를 수행하기 전에 개선없이 연속 에포크의 수.
인내심이 0으로 설정되면 조기 정지가 수행되지 않습니다.
인내심이 활성화되면 Best Epoch의 최상의 가중치가 fit 끝에 자동으로로드됩니다.
weights : int 또는 dict (default = 0)
/! tabnetClassifier 샘플링 매개 변수 0 : 샘플링 없음 1 : 역 클래스 발생으로 자동화 된 샘플링 DICT : 키는 클래스, 값은 각 클래스의 가중치입니다.
loss_fn : TORCH.LOSS 또는 TORCH.LOSS 목록
TabnetMultitAskClassifier를 사용할 때 교육을위한 손실 함수 (회귀를위한 MSE 기본 및 분류를위한 교차 엔트로피) 작업 수와 동일한 길이 목록을 설정할 수 있으면 각 작업이 자체 손실 기능을 할당 할 수 있습니다.
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 : 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)
기능 중요성을 계산할지 여부