我试图使用插入符号'过滤器'函数在使用以下代码训练模型之前进行变量选择:
filterCtrl <- sbfControl(functions = rfSBF,
method = "repeatedcv",
repeats = 5,
verbose = TRUE)
set.seed(10)
rfWithFilter <- sbf(x, y, sbfControl = filterCtrl)
我相信这几乎就是插入广告网站上关于sbf的一个例子(&#39;选择过滤器&#39;)。正如您所看到的,我使用的是预定义的&rfSBF&#39;功能。 http://topepo.github.io/caret/filters.html但是,当我在我的数据集上运行时,我收到错误:
{:任务1失败 - &#34;在预测变量中不允许NA&#34; 另外:有50个或更多警告(使用警告()查看前50个)
警告:
在model.response中(mf,&#34;数字&#34;):强制引入的NA
现在看来,我的数据中的某些内容被强制转换为拟合算法讨厌的数字,因为它是随机森林,预测变量中有NA。所以我想我对这个问题有所了解,但是由于我不确切知道问题出在哪里(因为插入符号变量选择使用了传递的函数,而我的问题发生在其中一个中功能)我不确定这种情况发生在哪里,所以我无法从代码中的行向后工作到我需要对数据集做什么来解决问题。我想我可以一次一个地运行这些函数(fit,pred等等)但是我不确定它的确切顺序或运行方式(甚至源代码的位置)是试图推断这个程序)。有什么想法吗?
提醒一下,这些是为rfSBF传递给filterCtrl的预定义函数:
> rfSBF
$summary
function (data, lev = NULL, model = NULL)
{
if (is.character(data$obs))
data$obs <- factor(data$obs, levels = lev)
postResample(data[, "pred"], data[, "obs"])
}
<environment: namespace:caret>
$fit
function (x, y, ...)
{
if (ncol(x) > 0) {
loadNamespace("randomForest")
randomForest::randomForest(x, y, ...)
}
else nullModel(y = y)
}
<environment: namespace:caret>
$pred
function (object, x)
{
if (class(object) == "nullModel") {
tmp <- predict(object, x)
if (!is.null(object$levels)) {
out <- cbind(data.frame(pred = tmp), as.data.frame(predict(object,
x, type = "prob")))
}
else out <- tmp
}
else {
tmp <- predict(object, x)
if (is.factor(object$y)) {
out <- cbind(data.frame(pred = tmp), as.data.frame(predict(object,
x, type = "prob")))
}
else out <- tmp
}
out
}
<environment: namespace:caret>
$score
function (x, y)
{
if (is.factor(y))
anovaScores(x, y)
else gamScores(x, y)
}
<environment: namespace:caret>
$filter
function (score, x, y)
score <= 0.05
<environment: namespace:caret>