我只有30个样本的小型数据集,所以我只有训练数据集,而没有测试集。因此,我想使用交叉验证来评估模型。我已经使用交叉验证和LOO在r中运行了pls模型。 mvr
输出具有fitted values
和validation$preds
值,它们是不同的。作为仅针对训练集的R2和RMSE的最终结果,我应该使用最终的fitted values
还是validation$preds
值?
答案 0 :(得分:0)
简单的答案是,如果您想知道模型的预测能力如何,您将使用validation$preds
,因为它是在看不见的数据上进行测试的。 $fitted.values
下的值是通过将最终模型拟合到所有训练数据上而获得的,这意味着在构建模型和预测时会使用相同的训练数据。因此,从最终拟合中获得的值会低估模型在看不见的数据上的性能。
您可能需要解释“有效”的含义(在您的评论中)。
使用交叉验证来确定哪个是最佳超参数,在这种情况下,该参数是模型的组件数量。
在交叉验证期间,一部分数据不用于拟合,而是用作测试集。这实际上提供了一个粗略的估计,该模型将对看不见的数据起作用。请查看scikit learn中的这张图片,了解简历的工作原理。
LOO的工作方式与此类似。在找到最佳参数之后,您应该获得要在测试集上使用的最终模型。在这种情况下,mvr
在2-6台PC上的所有模型上进行训练,但是$ fitted.values来自对所有训练数据进行训练的模型。
您还可以在下面看到它们的不同之处,首先我要拟合模型
library(pls)
library(mlbench)
data(BostonHousing)
set.seed(1010)
idx = sample(nrow(BostonHousing),400)
trainData = BostonHousing[idx,]
testData = BostonHousing[-idx,]
mdl <- mvr(medv ~ ., 4, data = trainData, validation = "CV",
method = "oscorespls")
然后,我们使用4台PC来计算CV,完整的训练模型和测试数据中的平均RMSE:
calc_RMSE = function(pred,actual){ mean((pred - actual)^2)}
# error in CV
calc_RMSE(mdl$validation$pred[,,4],trainData$medv)
[1] 43.98548
# error on full training model , not very useful
calc_RMSE(mdl$fitted.values[,,4],trainData$medv)
[1] 40.99985
# error on test data
calc_RMSE(predict(mdl,testData,ncomp=4),testData$medv)
[1] 42.14615
如果您有测试数据,则可以看到交叉验证的错误更接近您得到的错误。同样,这实际上取决于您的数据。