R - mice - 机器学习:如何将训练集中的补全数据方案应用到测试集中

9

我正在构建一个预测模型,使用 mice 包来填补训练集中的缺失值。由于我需要重复使用相同的填补方案来处理测试集,那么我该如何将其应用到测试数据上呢?

# generate example data
set.seed(333)
mydata <- data.frame(a = as.logical(rbinom(100, 1, 0.5)),
                     b = as.logical(rbinom(100, 1, 0.2)),
                     c = as.logical(rbinom(100, 1, 0.8)),
                     y = as.logical(rbinom(100, 1, 0.6)))

na_a <- as.logical(rbinom(100, 1, 0.3))
na_b <- as.logical(rbinom(100, 1, 0.3))
na_c <- as.logical(rbinom(100, 1, 0.3))
mydata$a[na_a] <- NA
mydata$b[na_b] <- NA
mydata$c[na_c] <- NA

# create train/test sets
library(caret)
inTrain <- createDataPartition(mydata$y, p = .8, list = FALSE)
train <- mydata[ inTrain, ] 
test <-  mydata[-inTrain, ]

# impute NAs in train set
library(mice)
imp <- mice(train, method = "logreg")
train_imp <- complete(imp)

# apply imputation scheme to test set
test_imp <- unknown_function(test, imp$unknown_data)

你想要达到什么目的?当你说“重复使用相同的填补方案”时,似乎意味着你会在测试集中使用与训练集中相同的方法来填补缺失数据。在这种情况下,你正在使用 logistic 回归作为基础填补方法进行多次填补。 - Matt S
我其实也在尝试做同样的事情。MICE训练一个线性模型(至少使用方法“logreg”)。您可以按照以下说明获取该模型:https://www.gerkovink.com/miceVignettes/Convergence_pooling/Convergence_and_pooling.html第7步。编辑:该方法和软件包的作者在此主题方面发表评论:https://github.com/stefvanbuuren/mice/issues/32 - mic
4个回答

4

从mice::mice版本3.12.0开始,新增了ignore参数,它可以覆盖大多数使用情况。

只需要传入一个向量,其中对于所有应该在训练期间使用的行,将其设为TRUE;而对于仅需进行插补而不在训练期间使用的行,则将其设为FALSE。

imp.ignore <- mice(data, ignore = c(rep(FALSE, 99), TRUE), maxit = 5, m = 2, seed = 1)

3

prockenschaub创建了一个很棒的函数,叫做mice.reuse()

library(mice)
library(scorecard)

# function to impute new observations based on the previous imputation model
source("https://raw.githubusercontent.com/prockenschaub/Misc/master/R/mice.reuse/mice.reuse.R")

# split data into train and test
data_list <- split_df(airquality, y = NULL, ratio = 0.75, seed = 186)

imp <- mice(data = data_list$train, 
            seed = 500, 
            m = 5,
            method = "pmm",
            print = FALSE)


# impute test data based on train imputation model
test_imp <- mice.reuse(imp, data_list$test, maxit = 1)

3
"mice.reuse"是我自己修改的函数,不是"MICE"包的一部分(你仍然可以在这里找到它,但我不建议再使用它)。"MICE"包的3.12.0版本包含了"ignore"参数,可以一步完成同样的功能。只需传递一个向量,其中所有应在训练期间使用的行都为FALSE,而所有应仅进行插补而不参与训练的行都为TRUE。请参见我之前两条评论中提出的解决方案,以了解如何使用它。 - Adam Waring

0

当你在训练模型时,不能以任何方式使用测试数据。因此,在拆分数据之前,你不能使用MICE对完整数据集进行插补。必须仅使用训练数据来对测试数据进行插补。


-4

在合并的数据集上运行鼠标插补,然后再将其拆分为训练集和测试集,在训练集上拟合机器学习分类器,然后在测试集上进行。


由于数据泄露和低估测试误差而不明智:https://machinelearningmastery.com/data-leakage-machine-learning/#comment-363225 - ramhiser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接