2

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

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

当我运行 rpart 命令来获取 CART 模型(使用包“rpart”)时,我对 predict 函数没有任何问题。但是,我想通过交叉验证来改进模型,因此使用包“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

性别变量有两个值:女性、男性

谁能帮我理解错误

4

2 回答 2

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)

在这种情况下,它可以与公式界面一起正常工作。

于 2016-03-14T08:39:58.387 回答
0

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

于 2015-01-05T17:30:51.057 回答