警告消息:使用 rpart 的插入符号 train() 中的“重采样性能测量中的缺失值”

Posted

技术标签:

【中文标题】警告消息:使用 rpart 的插入符号 train() 中的“重采样性能测量中的缺失值”【英文标题】:Warning message: "missing values in resampled performance measures" in caret train() using rpart 【发布时间】:2015-01-05 21:03:23 【问题描述】:

我正在使用 caret 包来训练带有“rpart”包的模型;

tr = train(y ~ ., data = trainingDATA, method = "rpart")

数据没有缺失值或 NA,但在运行命令时会出现警告消息;

    Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.

有谁知道(或者可以指出我在哪里可以找到答案)这个警告是什么意思? 我知道它告诉我在重新采样的性能指标中存在缺失值 - 但这究竟意味着什么以及如何会出现这样的情况? 顺便说一句,predict() 函数适用于拟合模型,所以这只是我的好奇心。

【问题讨论】:

【参考方案1】:

我的问题是我不小心将createDataPartition()(或其朋友:createFolds(), createMultiFolds() etc.)与未分为训练和验证的元数据一起使用。

结果是 corss-validation 列表中的一些索引超出了训练数据。

【讨论】:

【参考方案2】:

就我而言,在 bmc 的回答的帮助下,我发现这是因为结果列是数字的(由数据集提供)。将其转换为因子并 然后 运行 train 成功且没有错误。

【讨论】:

【参考方案3】:

在将训练数据拟合到单个决策树时,我遇到了同样的错误。但是,一旦我在拆分训练集和测试集之前从原始数据中删除了 NA 值,它就得到了解决。我想这是我们拆分和拟合模型时数据的不匹配。 脚步: 1:从原始数据中删除 NA。 2:现在分成训练集和测试集。 3:现在训练模型,希望它现在修复错误。

【讨论】:

这可能是问题所在,但 OP 表示数据没有缺失值或 NA ..【参考方案4】:

当模型在某些交叉验证折叠中未收敛时会发生此错误,预测得到零方差。结果,无法计算 RMSE 或 Rsquared 等指标,因此它们成为 NA。 有时您可以调整一些参数以获得更好的收敛性,例如神经网络库提供了增加阈值,这几乎总是会导致收敛。但是,我不确定 rpart 库。

发生这种情况的另一个原因是您的训练数据中已经存在 NA。那么显而易见的解决方法是在通过 train(data = na.omit(training.data)) 传递它们之前将它们删除。

希望能有所启发。

【讨论】:

【参考方案5】:

问题

问题在于 rpart 使用的是基于树的算法,它只能处理给定特征中有限数量的因素。因此,您可能有一个变量已设置为超过 53 个类别的因子:

> rf.1 <- randomForest(x = rf.train.2, 
+                      y = rf.label, 
+                      ntree = 1000)
Error in randomForest.default(x = rf.train.2, y = rf.label, ntree = 1000) : 
Can not handle categorical predictors with more than 53 categories.

在您的问题的基础上,插入符号正在运行该函数,因此请确保您修复了超过 53 个级别的分类变量。

这是我之前的问题所在(注意邮政编码作为一个因素):

# ------------------------------- #
# RANDOM FOREST WITH CV 10 FOLDS  #
# ------------------------------- #
rf.train.2 <- df_train[, c("v1",
                      "v2",
                      "v3",
                      "v4",
                      "v5",
                      "v6",
                      "v7",
                      "v8",
                      "zipcode",
                      "price",
                      "made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
                     v2=as.factor(rf.train.2$v2),
                     v3=as.factor(rf.train.2$v3),
                     v4=as.factor(rf.train.2$v4),
                     v5=as.factor(rf.train.2$v5),
                     v6=as.factor(rf.train.2$v6),
                     v7=as.factor(rf.train.2$v7),
                     v8=as.factor(rf.train.2$v8),
                     zipcode=as.factor(rf.train.2$zipcode),
                     price=rf.train.2$price,
                     made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]

解决方案

删除所有超过 53 个级别的分类变量

这是我的固定代码,调整分类变量 zipcode,您甚至可以将其包装在一个数字包装器中,如下所示:as.numeric(rf.train.2$zipcode)

# ------------------------------- #
# RANDOM FOREST WITH CV 10 FOLDS  #
# ------------------------------- #
rf.train.2 <- df_train[, c("v1",
                      "v2",
                      "v3",
                      "v4",
                      "v5",
                      "v6",
                      "v7",
                      "v8",
                      "zipcode",
                      "price",
                      "made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
                     v2=as.factor(rf.train.2$v2),
                     v3=as.factor(rf.train.2$v3),
                     v4=as.factor(rf.train.2$v4),
                     v5=as.factor(rf.train.2$v5),
                     v6=as.factor(rf.train.2$v6),
                     v7=as.factor(rf.train.2$v7),
                     v8=as.factor(rf.train.2$v8),
                     zipcode=rf.train.2$zipcode,
                     price=rf.train.2$price,
                     made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]

【讨论】:

我只有男性女性并且得到了同样的错误信息 也许我错了,但我不清楚将邮政编码之类的东西转换为整数是否明智。如果它是一个整数,那么算法会将其视为协变量而不是因子,因此邮政编码 55105 比 55104 大一个单位,而实际上它们没有那种关系。我认为您最好将邮政编码的精度降低到前两位数。我意识到这个讨论有点陈旧,但我认为无论如何都值得讨论。【参考方案6】:

没有更多数据,无法确定。

如果这是回归,最有可能的情况是树没有找到好的分割并使用结果的平均值作为预测变量。这很好,但您无法计算 R^2,因为预测的方差为零。

如果分类的话,很难说。您可以进行重新采样,其中一个结果类的样本为零,因此敏感性或特异性未定义,因此NA

【讨论】:

谢谢@topepo。这是回归,所以没有好的分裂是一个合理的理由。顺便说一句,你知道用随机森林解释线性回归的好书吗? @topepo,rpartnnet 我也遇到了同样的问题。对于后者,我只需设置linout = TRUE 即可摆脱警告消息并获得正确的交叉验证预测。但是,我还没有找到rpart 的解决方案:交叉验证预测非常好。我感觉rpart 期待一些我们无法使用train 传递的参数,例如method = "anova"rpart的帮助页面说“直接指定方法是最明智的”。 我对随机森林 (method = rf) 有同样的问题,但前提是数据集中的行数太少。使用更大的数据集(与较小的结构相同)不会出现警告。

以上是关于警告消息:使用 rpart 的插入符号 train() 中的“重采样性能测量中的缺失值”的主要内容,如果未能解决你的问题,请参考以下文章

如何在插入符号包中制作树图?

插入符号 rpart 决策树绘图结果

无法运行插入符号 xgboost 分类

尝试创建分类树时rpart未运行

当我尝试预测 R 中的类别概率时出错 - 插入符号

在使用插入符号的 train() 使用公式训练的 randomForest 对象上使用 predict() 时出错