警告消息:使用rpart在插入符号train()中"重新采样性能度量中缺少值"

USE*_*R_1 26 r rpart r-caret

我正在使用插入包来训练带有"rpart"包的模型;

tr = train(y ~ ., data = trainingDATA, method = "rpart")
Run Code Online (Sandbox Code Playgroud)

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

    Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.
Run Code Online (Sandbox Code Playgroud)

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

top*_*epo 25

没有更多数据,没有明确的肯定.

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

如果分类,很难说.你可以有一个重新抽样,其中一个结果类没有样本,因此灵敏度或特异性是不确定的NA.


bmc*_*bmc 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.
Run Code Online (Sandbox Code Playgroud)

在您的问题的基础上,caret 正在运行该函数,因此请确保您修复了超过 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"]
Run Code Online (Sandbox Code Playgroud)

解决方案

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

这里是我搞掂的代码,调整分类变量邮编,你甚至可以在有一个数值包装像这样包起来: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"]
Run Code Online (Sandbox Code Playgroud)

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

Agi*_*ean 5

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

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

希望能有所启发。