我正在使用Caret包训练函数来拟合模型然后预测以预测未知数据集上的值(然后我得到反馈,因此我知道我的预测质量)。我遇到了问题,并且我确信它与预处理未知数据有关。
简单而简单地说,这就是我正在做的事情:
流程前培训数据:
preproc = preProcess(train_num,method = c("center", "scale"))
train_standardized <- predict(preproc, train_num)
训练模型:
gbmGrid <- expand.grid(interaction.depth = c(1, 5, 9),
n.trees = c(100,500),
shrinkage = 0.1,
n.minobsinnode = 20)
train.boost = train(x=train_standardized[,-length(train_standardized)],
y=train_standardized$response,
method = "gbm",
metric = "ROC",
maximize = FALSE,
tuneGrid= gbmGrid,
trControl = trainControl(method="cv",
number=5,
classProbs = TRUE,
verboseIter = TRUE,
summaryFunction=twoClassSummary,
savePredictions = TRUE))
为预测准备未知数据:
...
unknown_standardized <- predict(preproc, unknown_num)
...
对未知数据进行实际预测:
preds <- predict(train.boost,newdata=unknown_standardized,type="prob")
请注意&#34; preproc&#34;对象与训练集的分析相同,用于制作模型训练的中心/标准化预测。
当我的评估结果显示我对未知数据的评估时,它比使用训练集预测的要差得多(ROC使用训练数据通过交叉验证约为.83,ROC使用我从中获取的未知数据评估方约为.70)。
我有正确的流程吗?我做错了什么?
提前致谢。
答案 0 :(得分:0)
从某种意义上说,你根本没有做错任何事。
预测变量可能会在训练样本上做得更好,因为它已使用该数据来构建模型。
训练集的重点是看模型的概括程度。它可能会或多或少地“过度拟合”训练数据,并且在新数据上做得更差。
至少一旦你对新数据得分,就会知道模型的真实准确性。如果该精度足以满足您的需要,那么该模型将是可用的(并且因为您已经完成了培训/测试)对新数据具有鲁棒性。
现在,如果对更广泛的数据进行培训,模型可能会更好。因此,为了提高实际准确性,可能值得使用交叉验证在多个数据切片上进行训练 - k折叠交叉验证。 Caret有一个很好的设施。 http://machinelearningmastery.com/how-to-estimate-model-accuracy-in-r-using-the-caret-package/