首页 > 解决方案 > bagImpute 错误并从 caret 包中预测

问题描述

preProcess尝试使用包中的功能时出现以下错误caret。该predict函数适用于 knn 和中值插补,但会给出 bagging 错误。我应该如何编辑我对预测函数的调用。

可重现的例子:

data = iris
set.seed(1)
data = as.data.frame(lapply(data, function(cc) cc[ sample(c(TRUE, NA), prob = c(0.8, 0.2), size = length(cc), replace = TRUE) ]))

preprocess_values = preProcess(data, method = c("bagImpute"), verbose = TRUE)
data_new = predict(preprocess_values, data)

这给出了以下错误:

> data_new = predict(preprocess_values, data)
Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "NULL"

标签: r-caretimputation

解决方案


插入符号中的预处理/插补函数仅适用于数值变量。如帮助中所述preProcess

xa 矩阵或数据框。允许使用非数字预测变量,但将被忽略。

您很可能在应该忽略非数值变量的部分中发现了一个错误,该错误会引发无信息错误,而不是忽略它们。

如果删除因子变量,则插补有效

library(caret)

df <- iris
set.seed(1)
df <- as.data.frame(lapply(data, function(cc) cc[ sample(c(TRUE, NA), prob = c(0.8, 0.2), size = length(cc), replace = TRUE) ]))
df <- df[,-5] #remove factor variable
           
preprocess_values <- preProcess(df, method = c("bagImpute"), verbose = TRUE)

data_new <- predict(preprocess_values, df)

最后一行代码有效,但会导致一堆警告:

In cprob[tindx] + pred :
  longer object length is not a multiple of shorter object length

这些警告不是来自插入符号,而是来自内部调用,内部调用ipred::baggingcaret::preProcess. 这些错误的原因是数据中连续存在 3 个 NA 值的实例,当它们被删除时

df <- df[rowSums(sapply(df, is.na)) != 3,]

preprocess_values <- preProcess(df, method = c("bagImpute"), verbose = TRUE)

data_new <- predict(preprocess_values, df)

警告消失。

您应该查看食谱,特别step_bagimpute是要克服上述限制。


推荐阅读