【问题标题】:R - mice - machine learning: re-use imputation scheme from train to test setR - 老鼠 - 机器学习:重用从训练到测试集的插补方案
【发布时间】:2016-02-03 15:50:48
【问题描述】:

我正在构建一个预测模型,并使用 mice 包在我的训练集中估算 NA。由于我需要为我的测试集重复使用相同的插补方案,我该如何将它重新应用到我的测试数据中?

# 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)

【问题讨论】:

  • 你想完成什么?当您说“重用相同的插补方案”时,似乎暗示您只需使用与您在训练集中使用的相同方法来插补测试集中的缺失数据。在这种情况下,您将使用逻辑回归作为基础插补方法进行多重插补。
  • 我实际上也在尝试这样做。 MICE 训练一个线性模型(至少使用“logreg”方法)。您可以按照步骤 7 中的gerkovink.com/miceVignettes/Convergence_pooling/… 中的说明获取模型。编辑:方法和包的作者在此处写了关于此主题的 cmets:github.com/stefvanbuuren/mice/issues/32

标签: r machine-learning r-caret r-mice


【解决方案1】:

从mice::mice 3.12.0 版开始,包含将涵盖大多数用例的忽略参数。

只需向其传递一个向量,对于应该在训练期间使用的所有行和 FALSE 的所有行只应该估算(但在训练期间不使用)。

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

    • 引自github.com/amices/mice/issues/32 "mice.reuse 是我自己破解的函数,不是mice 包的一部分(你仍然可以在这里找到它,但我不建议再使用它了)。mice: :mice 版本 3.12.0 包含一次执行相同操作的忽略参数。只需将一个向量传递给它,对于应该在训练期间使用的所有行和 TRUE 的所有行都应该在训练期间使用(但在训练期间不使用)训练)。有关如何使用它的想法,请参阅我在两个 cmets 前的示例中提出的解决方案。”
    【解决方案3】:

    在训练模型时,您不能在任何意义上使用测试数据。因此,您不能在拆分之前使用 MICE 估算完整的数据集。测试数据的插补也需要仅使用训练数据

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2020-07-01
      • 1970-01-01
      • 2015-12-21
      • 2019-07-03
      • 2016-12-03
      • 2019-04-20
      • 2017-06-25
      • 2017-10-09
      相关资源
      最近更新 更多