警告消息:"重新采样的性能指标中缺少值"在插入火车()使用rpart

时间:2014-11-09 13:51:54

标签: r rpart r-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()函数适用于拟合模型,所以这只是我的好奇心。

5 个答案:

答案 0 :(得分:22)

没有更多数据,不能确定无疑。

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

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

答案 1 :(得分:1)

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

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

希望会有所启发。

答案 2 :(得分:0)

问题

问题在于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个级别修复分类变量。

以前我的问题在哪里撒谎(注意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=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"]

答案 3 :(得分:0)

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

答案 4 :(得分:0)

在我的情况下,借助于bmc的答案,我发现这是因为结果列为数字(由数据集提供)。将其转换为因数,然后运行train then 成功,没有错误。