在Caret中预处理数据并对未知数据集进行预测

时间:2016-03-15 23:15:32

标签: r r-caret

我正在使用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)。

我有正确的流程吗?我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

从某种意义上说,你根本没有做错任何事。

预测变量可能会在训练样本上做得更好,因为它已使用该数据来构建模型。

训练集的重点是看模型的概括程度。它可能会或多或少地“过度拟合”训练数据,并且在新数据上做得更差。

至少一旦你对新数据得分,就会知道模型的真实准确性。如果该精度足以满足您的需要,那么该模型将是可用的(并且因为您已经完成了培训/测试)对新数据具有鲁棒性。

现在,如果对更广泛的数据进行培训,模型可能会更好。因此,为了提高实际准确性,可能值得使用交叉验证在多个数据切片上进行训练 - k折叠交叉验证。 Caret有一个很好的设施。 http://machinelearningmastery.com/how-to-estimate-model-accuracy-in-r-using-the-caret-package/