【问题标题】:Caret::train - Values Not ImputedCaret::train - 未估算的值
【发布时间】:2015-01-11 14:38:10
【问题描述】:

我试图通过将“knnImpute”传递给 Caret 的 train() 方法的 preProcess 参数来估算值。根据以下示例,这些值似乎没有被估算,保持为 NA 然后被忽略。我做错了什么?

非常感谢任何帮助。

library("caret")

set.seed(1234)
data(iris)

# mark 8 of the cells as NA, so they can be imputed
row <- sample (1:nrow (iris), 8)
iris [row, 1] <- NA

# split test vs training
train.index <- createDataPartition (y = iris[,5], p = 0.80, list = F)
train <- iris [ train.index, ]
test  <- iris [-train.index, ]

# train the model after imputing the missing data
fit <- train (Species ~ ., 
              train, 
              preProcess = c("knnImpute"), 
              na.action  = na.pass, 
              method     = "rpart" )
test$species.hat <- predict (fit, test)

# there is 1 obs. (of 30) in the test set equal to NA  
# this 1 obs. was not returned from predict
Error in `$<-.data.frame`(`*tmp*`, "species.hat", value = c(1L, 1L, 1L,  : 
  replacement has 29 rows, data has 30

更新:我已经能够直接使用 preProcess 函数来估算值。我仍然不明白为什么在 train 函数中似乎没有发生这种情况。

# attempt to impute using nearest neighbors
x <- iris [, 1:4]
pp <- preProcess (x, method = c("knnImpute"))
x.imputed <- predict (pp, newdata = x)

# expect all NAs were populated with an imputed value
stopifnot( all (!is.na (x.imputed)))
stopifnot( length (x) == length (x.imputed))

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    见?predict.train:

     ## S3 method for class 'train'
     predict(object, newdata = NULL, type = "raw", na.action = na.omit, ...)
    

    这里也有na.omit:

     > length(predict (fit, test))
     [1] 29
     > length(predict (fit, test, na.action = na.pass))
     [1] 30
    

    最大

    【讨论】:

    • 这显示了如何使用 predict 函数直接处理 NA - 有没有办法指定在 train() 函数中处理缺失值?否则它不包含在 CV 循环中。
    • @Misconstruction 请记住在train 和predict 中都包含na.action = na.pass。
    猜你喜欢
    • 2017-01-13
    • 2014-05-23
    • 2018-03-16
    • 2018-03-11
    • 2017-07-20
    • 2017-06-01
    • 2012-05-16
    • 2013-11-06
    • 2016-04-24
    相关资源
    最近更新 更多