【kaggle】TabNetの使い方

スポンサーリンク

はじめに

最近kaggleでよく目にするTabNetについて、簡単にどんなものなのか、どうやって使うのかについて紹介していきます。

どんなもの何かについては簡単に紹介し、どうやって使うかをメインで紹介していきます。

TabNetとは

TabNetとは、テーブルデータに対して高精度かつ解釈可能なニューラルネットワークモデルになります。最近ではkaggleでもよく使われています。

下記の画像のように、事前にマスクされた特徴量を予測するような教師なし学習をし、学習モデルに適用することで予測の精度を向上させています。


論文より

また、予測したモデルでの特徴量の重要度もわかるようになっています。

論文は以下になります。

https://arxiv.org/pdf/1908.07442.pdf

基本的な使い方

TabNetを利用する場合は下記のリポジトリがよく使われるので、こちらの使い方について紹介していきます。

GitHub - dreamquark-ai/tabnet: PyTorch implementation of TabNet paper : https://arxiv.org/pdf/1908.07442.pdf
PyTorchimplementationofTabNetpaper:-GitHub-dreamquark-ai/tabnet:PyTorchimplementationofTabNetpaper:

分類問題

分類問題はTabNetClassifierを利用します。

from pytorch_tabnet.tab_model import TabNetClassifier

model = TabNetClassifier()
model.fit(
  X_train, Y_train,
  eval_set=[(X_valid, y_valid)]
)
preds = model.predict(X_test)

回帰問題

回帰問題はTabNetRegressorを利用します。

from pytorch_tabnet.tab_model import TabNetRegressor

model = TabNetRegressor()
model.fit(
  X_train, Y_train,
  eval_set=[(X_valid, y_valid)]
)
preds = model.predict(X_test)

評価関数のカスタマイズ

以下の評価関数はデフォルトで利用できますが、それ以外のものは自分でカスタマイズする必要があります。

  • 二値分類 : 'auc', 'accuracy', 'balanced_accuracy', 'logloss'
  • 多クラス分類 : 'accuracy', 'balanced_accuracy', 'logloss'
  • 回帰 : 'mse', 'mae', 'rmse', 'rmsle'

カスタマイズする場合は、以下のような評価関数用のクラスを作成し、学習時のパラメータとして設定します。

from pytorch_tabnet.metrics import Metric
from sklearn.metrics import f1_score

# 評価関数用のクラス
class F1ScoreMacro(Metric):
    def __init__(self):
        self._name = "f1_score_macro"
        self._maximize = True

    def __call__(self, y_true, y_pred):
        f1score = f1_score(y_true, np.argmax(y_pred, axis=1), average='macro')
        return f1score

model = TabNetClassifier()
model.fit(
  X_train, Y_train,
  eval_set=[(X_valid, y_valid)],
  eval_metric=[F1ScoreMacro] # 作成した関数の設定
)

事前学習

事前の教師なし学習はTabNetPretrainerでできます。

事前学習したモデルをfrom_unsupervisedパラメータで指定します。

# 事前学習モデル
unsupervised_model = TabNetPretrainer(
    optimizer_fn=torch.optim.Adam,
    optimizer_params=dict(lr=2e-2),
    mask_type='entmax'
)

unsupervised_model.fit(
    X_train=X_train,
    eval_set=[X_valid],
    pretraining_ratio=0.8,
)

model = TabNetClassifier(
    optimizer_fn=torch.optim.Adam,
    optimizer_params=dict(lr=2e-2),
    scheduler_params={"step_size":10,
                      "gamma":0.9},
    scheduler_fn=torch.optim.lr_scheduler.StepLR,
    mask_type='sparsemax'
)

model.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 # 事前学習したモデルの指定
)

パラメータ

モデルと学習時にパラメータが設定できます。

各種パラメータはリポジトリのREADMEにまとめられています。

GitHub - dreamquark-ai/tabnet: PyTorch implementation of TabNet paper : https://arxiv.org/pdf/1908.07442.pdf
PyTorchimplementationofTabNetpaper:-GitHub-dreamquark-ai/tabnet:PyTorchimplementationofTabNetpaper:
GitHub - dreamquark-ai/tabnet: PyTorch implementation of TabNet paper : https://arxiv.org/pdf/1908.07442.pdf
PyTorchimplementationofTabNetpaper:-GitHub-dreamquark-ai/tabnet:PyTorchimplementationofTabNetpaper:

特徴量の重要度

学習後の特徴量ごとの重要度は下記で取得できます。

model.feature_importances_

seabornなどを利用することで各特徴量の重要度を可視化できます。

titanicコンペで実践

実際にkaggleのtitanicコンペでTabNetを利用してみました。

Titanic - Machine Learning from Disaster | Kaggle
Starthere!PredictsurvivalontheTitanicandgetfamiliarwithMLbasics

Notebookは公開しています。スコアは0.78229となりました。

Titanic: How to use TabNet
ExploreandrunmachinelearningcodewithKaggleNotebooks|UsingdatafromTitanic-MachineLearningfromDisaster

参考

タイトルとURLをコピーしました