こんにちは,shun(@datasciencemore)です!!
最近,tabnetというアルゴリズムがkaggleで流行っているそうです.
tabnetを簡単に説明すると表形式データで効果を発揮するディープラーニングです.
表形式データだと今まではxgboost,lightgbm,catboostなどの勾配ブースティングが代表的なアルゴリズムでした.
tabneのこれからの動向が楽しみですね!
さてそんなtabnetですが,PythonだけでなくRでも使用できますよ~
しかも嬉しいことにtidymodelsとの連携もOKということです!
ということで,tabnetをtidymodelsで使用したので,メモ書き程度ですがまとめていきます!!
tabnetは,{torch}の一部なので,使用するためには{torch}もインストールする必要があります.
1.データ
今回使用するデータは,パッケージ{DALEX}に付属の「HR」というデータです.
この「HR」は,とある会社の従業員データを示しています.
「HR」のstatus列に人事評価の結果(promoted:昇進,ok:現状維持,fired:解雇)が記載されています.
ということで,
目的変数:status
説明変数:gender,age,hours,evaluation,salary
として,tabnetを使用してみましょう!
2.コーディング
次のようなコードになります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# パッケージ読み込み(インストールしていない場合は,インストールしてください.) library(stats) library(MASS) library(tidyverse) library(tidymodels) library(withr) library(torch) library(tabnet) library(DALEX) # train,test ({DALEX}のHRを学習データ,評価データに分類) initial_split = initial_split(tibble(DALEX::HR), prop = 0.8) %>% with_seed(1234, .) train = training(initial_split) test = testing(initial_split) # splits (分割データ作成) splits = vfold_cv(train, v = 4, strata = "status") %>% with_seed(1234, .) # rule (学習ルール作成) rule <- tabnet( epochs = tune(), penalty = tune(), batch_size = tune(), decision_width = tune(), attention_width =tune(), num_steps = tune(), learn_rate = 0.08, momentum = 0.6) %>% set_engine("torch", verbose = TRUE) %>% set_mode("classification") # rec (レシピ作成) rec = recipe(status ~ ., data = train) %>% step_normalize(all_numeric_predictors()) %>% step_nzv(all_predictors()) # wf (ワークフロー作成) wf = workflow() %>% add_model(rule) %>% add_recipe(rec) # range_hypara (hyparaの探索範囲作成) range_hypara = wf %>% parameters() %>% update( epochs = epochs(c(50, 70)), decision_width = decision_width(range = c(20, 40)), attention_width = attention_width(range = c(20, 40)), num_steps = num_steps(range = c(4, 8)) ) %>% finalize(train) # grid (グリッド作成) grid = range_hypara %>% grid_latin_hypercube(size = 1) %>% with_seed(1234, .) # tune(ハイパラチューニング) tune = wf %>% tune_grid( resamples = splits, grid = grid, control = control_grid(save_pred = TRUE), metrics = metric_set(accuracy) ) # 良さげなハイパラを選定 good_hypara = tune %>% show_best() %>% dplyr::slice(1) # なぜかfinalize_workflowが使えないので,手動で学習ルールとワークフローを更新(多分バグです.) # upd_rule(学習ルール更新) upd_rule = tabnet( epochs = good_hypara %>% pull(epochs), penalty = good_hypara %>% pull(penalty), batch_size = good_hypara %>% pull(batch_size), decision_width = good_hypara %>% pull(decision_width), attention_width = good_hypara %>% pull(attention_width), num_steps = good_hypara %>% pull(num_steps), learn_rate = 0.08, momentum = 0.6) %>% set_engine("torch", verbose = TRUE) %>% set_mode("classification") # upd_wf(ワークフロー更新) upd_wf = workflow() %>% add_model(upd_rule) %>% add_recipe(rec) # model(モデル構築) model = upd_wf %>% fit(train) %>% with_seed(1234, .) # pred(予測値算出) pred = bind_cols( predict(model, new_data = test, type = "class"), predict(model, new_data = test, type = "prob") ) # result(評価データと予測値をマージ) result = bind_cols(test, pred) # accuracy(正答率算出) accuracy = result %>% accuracy(truth = status, estimate = .pred_class) # accuracy確認 accuracy # A tibble: 1 x 3 .metric .estimator .estimate <chr> <chr> <dbl> 1 accuracy multiclass 0.722 |
そこまで特徴量エンジニアリングしていないのにaccuracy:0.722程度なので,まずまずいいですね!!
まとめ
最近話題のtabnetを使用してみました!
ちょっとしたバグもありましたが,他のアルゴリズムとほぼ同じように運用できそうです.
精度も高そうなので,今後ますます流行ってくるかもしれませんね!
それでは,お疲れ様でした!