使用 tidymodels 配方包添加缺失的指标列
Add missing indicator columns using the tidymodels recipes package
我想使用 recipes 包创建一个方法,它既可以估算缺失数据,又可以添加指示缺失值的指标列。如果可以选择为原始数据框中的每一列包含一个指示列,或者只为原始数据框中缺少数据的列包含一个指示列,那也很好。我知道我可以很容易地用 recipes 来估算缺失值,但是是否有内置的方法来添加缺失的指标列?
例如,如果我有这样的数据框:
> data.frame(x = c(1, NA, 3), y = 4:6)
x y
1 1 4
2 NA 5
3 3 6
我希望插补和添加缺失指标列后的输出看起来像这样:
x y x_missing
1 1 4 FALSE
2 2 5 TRUE
3 3 6 FALSE
当然,对于这样一个简单的例子,我可以手工完成。但是,在机器学习管道中处理大型数据集时,采用自动化方法会很有帮助。
根据 recipes::check_missing
的文档,有一个 columns
参数,
columns A character string of variable names that will be populated (eventually) by the terms argument.
但我不确定那是什么意思,因为 check_missing
没有 terms
参数。
作为参考,我正在寻找的功能由 MissingIndicator class.
在 scikit-learn 中实现
可以通过创建自定义步骤来执行此操作。按照 vignettes 之一中描述的过程,创建定义步骤的函数,然后为自定义步骤定义 prep
和 bake
方法。
以下代码定义了创建缺失值指示符的新步骤。添加了一个新列,其名称附加了后缀 _missing
。
step_missing_ind <- function(recipe,
...,
role = NA,
trained = FALSE,
columns = NULL,
skip = FALSE,
id = rand_id("missing_ind")) {
terms <- ellipse_check(...)
add_step(
recipe,
step_missing_ind_new(
terms = terms,
trained = trained,
role = role,
columns = columns,
skip = skip,
id = id
)
)
}
step_missing_ind_new <- function(terms,
role,
trained,
columns,
skip,
id) {
step(
subclass = "missing_ind",
terms = terms,
role = role,
trained = trained,
columns = columns,
skip = skip,
id = id
)
}
print.step_missing_ind <- function(x, width = max(20, options()$width), ...) {
cat("Missing indicator on ")
cat(format_selectors(x$terms, width = width))
if (x$trained) cat(" [trained]\n") else cat("\n")
invisible(x)
}
prep.step_missing_ind <- function(x, training, info = NULL, ...) {
col_names <- terms_select(terms = x$terms, info = info)
step_missing_ind_new(
terms = x$terms,
trained = TRUE,
role = x$role,
columns = col_names,
skip = x$skip,
id = x$id
)
}
bake.step_missing_ind <- function(object, new_data, ...) {
for (var in object$columns) {
new_data[[paste0(var, "_missing")]] <- is.na(new_data[[var]])
}
as_tibble(new_data)
}
然后我们可以在配方管道中使用这个缺失指标步骤,如下例所示,我们在其中添加缺失值指标并执行均值插补。缺失指标和插补步骤的顺序很重要:缺失指标步骤必须在插补步骤之前。
library(recipes)
data <- tribble(
~x, ~y, ~z,
1, 4, 7,
NA, 5, 8,
3, 6, NA
)
recipe(~ ., data = data) %>%
step_missing_ind(x, y, z) %>%
step_meanimpute(x, y, z) %>%
prep() %>%
juice()
#> # A tibble: 3 x 6
#> x y z x_missing y_missing z_missing
#> <dbl> <dbl> <dbl> <lgl> <lgl> <lgl>
#> 1 1 4 7 FALSE FALSE FALSE
#> 2 2 5 8 TRUE FALSE FALSE
#> 3 3 6 7.5 FALSE FALSE TRUE
我想使用 recipes 包创建一个方法,它既可以估算缺失数据,又可以添加指示缺失值的指标列。如果可以选择为原始数据框中的每一列包含一个指示列,或者只为原始数据框中缺少数据的列包含一个指示列,那也很好。我知道我可以很容易地用 recipes 来估算缺失值,但是是否有内置的方法来添加缺失的指标列?
例如,如果我有这样的数据框:
> data.frame(x = c(1, NA, 3), y = 4:6)
x y
1 1 4
2 NA 5
3 3 6
我希望插补和添加缺失指标列后的输出看起来像这样:
x y x_missing
1 1 4 FALSE
2 2 5 TRUE
3 3 6 FALSE
当然,对于这样一个简单的例子,我可以手工完成。但是,在机器学习管道中处理大型数据集时,采用自动化方法会很有帮助。
根据 recipes::check_missing
的文档,有一个 columns
参数,
columns A character string of variable names that will be populated (eventually) by the terms argument.
但我不确定那是什么意思,因为 check_missing
没有 terms
参数。
作为参考,我正在寻找的功能由 MissingIndicator class.
在 scikit-learn 中实现可以通过创建自定义步骤来执行此操作。按照 vignettes 之一中描述的过程,创建定义步骤的函数,然后为自定义步骤定义 prep
和 bake
方法。
以下代码定义了创建缺失值指示符的新步骤。添加了一个新列,其名称附加了后缀 _missing
。
step_missing_ind <- function(recipe,
...,
role = NA,
trained = FALSE,
columns = NULL,
skip = FALSE,
id = rand_id("missing_ind")) {
terms <- ellipse_check(...)
add_step(
recipe,
step_missing_ind_new(
terms = terms,
trained = trained,
role = role,
columns = columns,
skip = skip,
id = id
)
)
}
step_missing_ind_new <- function(terms,
role,
trained,
columns,
skip,
id) {
step(
subclass = "missing_ind",
terms = terms,
role = role,
trained = trained,
columns = columns,
skip = skip,
id = id
)
}
print.step_missing_ind <- function(x, width = max(20, options()$width), ...) {
cat("Missing indicator on ")
cat(format_selectors(x$terms, width = width))
if (x$trained) cat(" [trained]\n") else cat("\n")
invisible(x)
}
prep.step_missing_ind <- function(x, training, info = NULL, ...) {
col_names <- terms_select(terms = x$terms, info = info)
step_missing_ind_new(
terms = x$terms,
trained = TRUE,
role = x$role,
columns = col_names,
skip = x$skip,
id = x$id
)
}
bake.step_missing_ind <- function(object, new_data, ...) {
for (var in object$columns) {
new_data[[paste0(var, "_missing")]] <- is.na(new_data[[var]])
}
as_tibble(new_data)
}
然后我们可以在配方管道中使用这个缺失指标步骤,如下例所示,我们在其中添加缺失值指标并执行均值插补。缺失指标和插补步骤的顺序很重要:缺失指标步骤必须在插补步骤之前。
library(recipes)
data <- tribble(
~x, ~y, ~z,
1, 4, 7,
NA, 5, 8,
3, 6, NA
)
recipe(~ ., data = data) %>%
step_missing_ind(x, y, z) %>%
step_meanimpute(x, y, z) %>%
prep() %>%
juice()
#> # A tibble: 3 x 6
#> x y z x_missing y_missing z_missing
#> <dbl> <dbl> <dbl> <lgl> <lgl> <lgl>
#> 1 1 4 7 FALSE FALSE FALSE
#> 2 2 5 8 TRUE FALSE FALSE
#> 3 3 6 7.5 FALSE FALSE TRUE