使用 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 模型时出现预测功能问题的主要内容,如果未能解决你的问题,请参考以下文章
sshdo使用training mode来获得incoming ssh会执行什么命令