はじめに
最近kaggleでよく目にするTabNetについて、簡単にどんなものなのか、どうやって使うのかについて紹介していきます。
どんなもの何かについては簡単に紹介し、どうやって使うかをメインで紹介していきます。
TabNetとは
TabNetとは、テーブルデータに対して高精度かつ解釈可能なニューラルネットワークモデルになります。最近ではkaggleでもよく使われています。
下記の画像のように、事前にマスクされた特徴量を予測するような教師なし学習をし、学習モデルに適用することで予測の精度を向上させています。
論文より
また、予測したモデルでの特徴量の重要度もわかるようになっています。
論文は以下になります。
https://arxiv.org/pdf/1908.07442.pdf
基本的な使い方
TabNetを利用する場合は下記のリポジトリがよく使われるので、こちらの使い方について紹介していきます。
分類問題
分類問題は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にまとめられています。
特徴量の重要度
学習後の特徴量ごとの重要度は下記で取得できます。
model.feature_importances_
seaborn
などを利用することで各特徴量の重要度を可視化できます。
titanicコンペで実践
実際にkaggleのtitanicコンペでTabNetを利用してみました。
Notebookは公開しています。スコアは0.78229となりました。