用于树的 train() 函数插入符号中的缺失值错误

Posted

技术标签:

【中文标题】用于树的 train() 函数插入符号中的缺失值错误【英文标题】:Missing values error in train() function Caret for trees 【发布时间】:2017-09-25 02:48:02 【问题描述】:

我是使用 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,它会传递它们,这意味着如果您使用不支持 NApredict 函数,它将失败。 na.action = na.omit放弃这些观察。 你找到了吗?它也可能有帮助:stats.stackexchange.com/questions/144922/r-caret-and-nas 感谢您的回答。我发现的问题是,当我使用预测函数时,结果返回的观察结果比我在测试集上给出的观察结果要少得多。假设测试集有 30000 个观察值,我只收到 20000 个的预测,因为其中 10000 个在输入变量上有缺失值。 【参考方案1】:

我开始考虑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 参数? 我的目的是展示如何在train 中传递ctree 参数。另外maxsurrogate是缺失值时的重要参数(必须设置为正值)。 为什么?对不起,我是新手xD 在本文档cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf 的第 5.2 节中,对使用代理变量和代理拆分来处理 CART 中的缺失值进行了简要但清晰的解释。 (如果我的建议对解决您的问题有帮助,请考虑在上面为我的回答点赞:***.com/help/privileges/vote-up)

以上是关于用于树的 train() 函数插入符号中的缺失值错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在函数中绘制插入符号列车对象

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

无法运行插入符号 xgboost 分类

带有插入符号错误的 SVM 分类(基本)

插入符号中训练数据的 ROC 曲线

将 PCA 预处理参数传递给 train()