train()函数在Caret for trees中出现了缺失值错误。

6

我刚开始使用R,并尝试构建一棵决策树。我已经使用了party包的ctreerpart包的rpart。

但是,由于我需要对模型进行交叉验证,因此我开始使用caret包,因为我可以通过使用函数`train()`和想要使用的方法来实现。

library(caret)
cvCtrl <- trainControl(method = "repeatedcv", repeats = 2,
                   classProbs = TRUE)

ctree.installed<- train(TARGET ~ OPENING_BALANCE+ MONTHS_SINCE_EXPEDITION+
                    RS_DESC+SAP_STATUS+ ACTIVATION_STATUS+ ROTUL_STATUS+ 
                    SIM_STATUS+ RATE_PLAN_SEGMENT_NORM,
                    data=trainSet,
                    method = "ctree",
                    trControl = cvCtrl)

然而,我的变量OPENING_BALANCEMONTHS_SINCE_EXPEDITION有一些缺失值,因此该函数无法工作。我不明白为什么会出现这种情况,因为我正在尝试构建一棵树。当我使用其他包时,这个问题并不会发生。
这是错误信息:
Error in na.fail.default(list(TARGET = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,  : 
missing values in object

我不想使用na.action=pass,因为我真的不想丢弃那些观测值。

我做错了什么吗?为什么会发生这种情况?你有什么建议吗?


na.action = na.pass 不会丢弃 NA 值,而是将其传递下去,这意味着如果您使用的 predict 函数不支持 NA 值,则会失败。na.action = na.omit 将会丢弃这些观测值。 - Janna Maas
你找到了吗?这可能也会有所帮助:https://stats.stackexchange.com/questions/144922/r-caret-and-nas - Janna Maas
感谢您的回答。我发现的问题是,当我使用预测函数时,结果返回的观测值比我在测试集上给出的要少得多。假设测试集有30000个观测值,我只收到了20000个预测值,因为其中10000个缺少输入变量的值。 - Carolina Leana Santos
1个回答

7
我开始考虑 mlbench 软件包中的数据集 PimaIndiansDiabetes2,该数据集存在一些缺失值。
data(PimaIndiansDiabetes2, package = "mlbench")
head(PimaIndiansDiabetes2)

  pregnant glucose pressure triceps insulin mass pedigree age diabetes
1        6     148       72      35      NA 33.6    0.627  50      pos
2        1      85       66      29      NA 26.6    0.351  31      neg
3        8     183       64      NA      NA 23.3    0.672  32      pos
4        1      89       66      23      94 28.1    0.167  21      neg
5        0     137       40      35     168 43.1    2.288  33      pos
6        5     116       74      NA      NA 25.6    0.201  30      neg

train中,我将na.action设置为na.pass(这会导致返回未更改的数据集),然后在ctree中设置maxsurrogate参数。
library(caret)
cvCtrl <- trainControl(method="repeatedcv", repeats = 2, classProbs = TRUE)
set.seed(1234)
ctree1 <- train(diabetes ~ ., data=PimaIndiansDiabetes2,
                    method = "ctree",
                    na.action  = na.pass,
                    trControl = cvCtrl,
                    controls=ctree_control(maxsurrogate=2))

结果如下:
print(ctree1)
Conditional Inference Tree 

392 samples
  8 predictor
  2 classes: 'neg', 'pos' 

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 2 times) 
Summary of sample sizes: 691, 692, 691, 691, 691, 691, ... 
Resampling results across tuning parameters:

  mincriterion  Accuracy   Kappa    
  0.01          0.7349111  0.4044195
  0.50          0.7485731  0.4412557
  0.99          0.7323906  0.3921662

Accuracy was used to select the optimal model using  the largest value.
The final value used for the model was mincriterion = 0.5.

谢谢您的回答 :) 为什么要设置maxsurrogate参数? - Carolina Leana Santos
1
我的目的是展示如何在train中传递ctree参数。此外,在存在缺失值时,maxsurrogate是一个重要的参数(必须设置为正值)。 - Marco Sandri
为什么?抱歉,我是新手 xD - Carolina Leana Santos
在本文档的第5.2节中(https://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf),简要但清晰地解释了使用代理变量和代理分割来处理CART中缺失值的方法。(如果我的建议对您的问题有帮助,请考虑为我的答案投票:http://stackoverflow.com/help/privileges/vote-up) - Marco Sandri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接