これは、TabnetのPytorch実装です(Arik、So、&Pfister、T。(2019)。Tabnet:ARXIV PREPRINT ARXIV:1908.07442。)https://arxiv.org/pdf/1908.0742.pdf。オリジナル紙とは異なるライブラリを改善するために、いくつかの異なる選択が残業していることに注意してください。
質問はありますか?貢献したいですか?私たちと話すために? Slackに参加できます
次のように、 pipまたはcondaを使用してインストールできます。
ピップ付き
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 、GPUコンテナの内部に入りますJupyterを含むすべての依存関係をインストールするためpoetry install
同じ端末内にmake notebook 。その後、TabNetをインストールした状態でJupyterノートブックへのリンクをたどることができます。
grouped_featuresを使用)。現在、グループレベルでは注意が払われており、機能レベルではありません。これは、データセットに単一のデータソースから多くの列がある場合に特に便利です(Epemple: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の元の論文に追加されたセミスーパーバイザーの事前トレーニングは、クラス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を超える自己監視された損失は、モデルが各機能の平均を予測するよりも悪い再構築を再構築していることを意味します。LossBellow1は、モデルが平均を予測するよりも優れていることを意味します。
ノートブック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(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 :フロート(デフォルト1E-15)
手つかずのままにする必要があります。
seed :int(デフォルト= 0)
再現性のためのランダムシード
momentum :フロート
バッチ正規化の運動量、通常は0.01から0.4の範囲(デフォルト= 0.02)
clip_value :float(デフォルトなし)
フロートが与えられた場合、これによりclip_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と互換性のあるパラメーターは、Optimizerを初期化します。アダムはデフォルトのオプティマイザーとして存在するため、これを使用してトレーニングに使用される初期学習率を定義します。元の論文で言及されているように、崩壊を伴う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に設定されています。
device_name :str(default = 'auto') 'cpu' 'cpuトレーニングの' cpu '、gpuトレーニングのgpu'、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 :タプルのリスト
評価タプルセット(x、y)のリスト。
最後のものは、早期停止に使用されます
eval_name :strのリスト
評価セット名のリスト。
eval_metric :strのリスト
評価メトリックのリスト。
最後のメトリックは、早期停止に使用されます。
max_epochs :int(default = 200)
Trainngのエポックの最大数。
patience :int(デフォルト= 10)
早期停止を行う前に、改善のない連続したエポックの数。
忍耐が0に設定されている場合、早期停止は実行されません。
忍耐が有効になっている場合、Best Epochからのベストウェイトは、 fitの終わりに自動的にロードされることに注意してください。
weights :intまたはdict(デフォルト= 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 :フロート
/! 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 :scikit-learnAPIに一致するために、bool(default = false)、これはfalseに設定されています。同じモデルの2倍に合わせて、暖かいスタートから始めることができます。
compute_importance :bool(default = true)
機能の重要性を計算するかどうか