30

我正在使用 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() 功能适用​​于拟合模型,所以这只是我的好奇心。

4

6 回答 6

27

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

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

如果分类,那就不好说了。您可以进行重新采样,其中结果类之一的样本为零,因此敏感性或特异性未定义,因此NA.

于 2014-11-14T20:36:53.120 回答
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"]
于 2017-01-21T04:05:08.877 回答
4

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

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

希望能有所启发。

于 2019-01-27T10:08:05.793 回答
0

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

于 2019-11-07T11:19:34.027 回答
0

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

于 2020-08-31T22:15:46.313 回答
0

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

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

于 2022-01-17T13:22:09.210 回答