分類の問題に使用したいのですがxgboost
、2 つの予測変数 (いくつかのうち) は、たまたまいくつかの欠損値を持つバイナリ列です。モデルを でフィッティングする前にxgboost
、各バイナリ列にモードを代入して、これらの欠損値を置き換えたいと思います。
tidymodels
私の問題は、この代入を「レシピ」の一部として実行したいということです。つまり、dplyr
/ tidyr
/などの典型的なデータ ラングリング手順を使用しないことです。レシピ内で代入を行うことで、「情報漏えいdata.table
」を防ぐことができます。
このrecipes
パッケージには、データの前処理用に設計された多くの関数が用意されていますが、数値バイナリ列でモードstep_*()
ごとに目的の代入を行う方法が見つかりませんでした。という関数がありますが、これは名義変数 (つまり、クラスまたは) のみを受け入れます。ただし、エンジンに渡すことができるように、バイナリ列を数値のままにする必要があります。step_impute_mode()
factor
character
xgboost
次のおもちゃの例を考えてみましょう。この参照ページから取得し、問題を反映するためにデータを少し変更しました。
おもちゃデータ作成
# install.packages("xgboost")
library(tidymodels)
tidymodels_prefer()
# original data shipped with package
data(two_class_dat)
# simulating 2-column binary data + NAs
n_rows <- nrow(two_class_dat)
df_x1_x2 <-
data.frame(x1 = rbinom(n_rows, 1, runif(1)),
x2 = rbinom(n_rows, 1, runif(1)))
## randomly replace 25% of each column with NAs
df_x1_x2[c("x1", "x2")] <-
lapply(df_x1_x2[c("x1", "x2")], function(x) {
x[sample(seq_along(x), 0.25 * length(x))] <- NA
x
})
# bind original data & simulated data
df_to_xgboost <- cbind(two_class_dat, df_x1_x2)
# split data to training and testing
data_train <- df_to_xgboost[-(1:10), ]
data_test <- df_to_xgboost[ 1:10 , ]
tidymodels ツールを使用してモデル仕様と前処理レシピを設定する
# model specification
xgb_spec <-
boost_tree(trees = 15) %>%
# This model can be used for classification or regression, so set mode
set_mode("classification") %>%
set_engine("xgboost")
# preprocessing recipe
xgb_recipe <-
recipe(formula = Class ~ ., data = data_train) %>%
step_bin2factor(x1, x2) %>% # <-~-~-~-~-~-~-~-~-~-~-~-~-~| these 2 lines are the heart of the problem
step_impute_mode(x1, x2) # <-~-~-~-~-~-~-~-~-~-~-~-~-~| I can't impute unless I first convert columns from numeric to factor/chr.
# | But once I do, xgboost fails with non-numeric data.
# | There isn't `step_*()` for converting back to numeric (like as.numeric())
# bind `xgb_spec` and `xgb_recipe` into a workflow object
xgb_wflow <-
workflow() %>%
add_recipe(xgb_recipe) %>%
add_model(xgb_spec)
モデルに適合する
fit(xgb_wflow, data_train)
#> Error in xgboost::xgb.DMatrix(x, label = y, missing = NA): 'data' has class 'character' and length 3124.
#> 'data' accepts either a numeric matrix or a single filename.
#> Timing stopped at: 0 0 0
とが あたりの係数data_train$x1
になるため、フィッティングは失敗します。それが私の現在のキャッチです: 一方では、すべてのデータが数値でない限り、モデルを適合させることはできません。一方、データが factor/chr でない限り、モードで代入することはできません。data_train$x2
step_bin2factor(x1, x2)
xgboost
カスタム関数を作成する方法はありますが、少し複雑です。だから私は最初に手を差し伸べて、私が見逃しているかもしれない些細な解決策があるかどうかを確認したかった. およびバイナリ予測子に関する私の現在の状況はかなり主流のように思われ、車輪の再発明はしたくありません。step_*()
xgboost