我正在尝试使用" 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
任何人都可以帮我理解错误
答案 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)
我过去曾遇到过类似的问题,但涉及另一种算法。 基本上,一些算法将因子变量转换为虚拟变量并相应地重命名它们。 我的解决方案是创建我自己的假人,并将它们保留为数字格式。 我读到决策树即使如此也能正常工作。