使用 train 命令通过 CrossValidation 构建 CART 模型时出现预测功能问题

Posted

技术标签:

【中文标题】使用 train 命令通过 CrossValidation 构建 CART 模型时出现预测功能问题【英文标题】:Issues with predict function when building a CART model via CrossValidation using the train command 【发布时间】:2014-05-31 21:34:33 【问题描述】:

我正在尝试使用“caret”包的 train 功能通过交叉验证来构建 CART 模型。

我的数据是 4500 x 110 数据框,其中所有预测变量(除了我不用于模型构建的前两个,UserId 和 YOB(出生年份))都是具有 2 个级别的因子,但因变量除外是整数类型(虽然只有两个值 1 和 0)。性别是自变量之一。

当我运行 rpart 命令来获取 CART 模型(使用包“rpart”)时,我对预测函数没有任何问题。但是,我想通过交叉验证来改进模型,因此使用“caret”包中的 train 函数和以下命令:

tr = train(y ~ ., data = subImpTrain, method = "rpart", trControl = tr.control, tuneGrid = cp.grid)

这会生成带有以下警告的模型

Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.

但它确实给了我一个最终模型(best.tree)。但是,当我尝试使用以下命令运行预测函数时:

best.tree.pred = predict(best.tree, newdata = subImpTest)

在测试数据上,它给了我以下错误:

Error in eval(expr, envir, enclos) : object 'GenderMale' not found

Gender 变量有两个值:Female,Male

谁能帮我理解错误

【问题讨论】:

看起来它正在寻找 GenderMale 列。你能比较一下你的训练和测试集中的变量吗? identical(names(subImpTrain),names(subImpTest))的输出是什么 它们很相似,这更让人困惑。 【参考方案1】:

正如@lorelai 建议的那样,caret 如果你提供一个公式,就会对你的变量进行虚拟编码。另一种方法是自己提供变量,如下所示:

tr = train(y = subImpTrain$y, x = subImpTrain[, -subImpTrain$y],
           method = "rpart", trControl = tr.control, tuneGrid = cp.grid)

然而,更重要的是,您不应使用predict.rpart,而应使用predict.train,如下所示:

predict(tr, subImpTest)

在这种情况下,它可以很好地使用公式界面。

【讨论】:

【参考方案2】:

我过去也遇到过类似的问题,尽管涉及另一种算法。 基本上,一些算法将因子变量转换为虚拟变量并相应地重命名它们。 我的解决方案是创建自己的假人并将它们保留为数字格式。 我读到决策树即使这样也能正常工作。

【讨论】:

以上是关于使用 train 命令通过 CrossValidation 构建 CART 模型时出现预测功能问题的主要内容,如果未能解决你的问题,请参考以下文章

模型保存与恢复自定义命令行参数

在 R 中调整 knn train() 命令中的 K

sshdo使用training mode来获得incoming ssh会执行什么命令

通过循环通过 train_test_split 训练模型并在不循环的情况下进行训练

Linux常用命令

python调用shell命令之三慷慨法