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

时间:2014-04-16 20:07:56

标签: r classification r-caret rpart

我正在尝试使用" caret"的训练函数通过交叉验证来构建CART模型。包。

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

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

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

任何人都可以帮我理解错误

2 个答案:

答案 0 :(得分: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)

在这种情况下,它可以正常使用公式界面。

答案 1 :(得分:0)

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