R中pls模型的拟合值和交叉验证值之间的差异

时间:2020-08-10 06:42:51

标签: r pls

我只有30个样本的小型数据集,所以我只有训练数据集,而没有测试集。因此,我想使用交叉验证来评估模型。我已经使用交叉验证和LOO在r中运行了pls模型。 mvr输出具有fitted valuesvalidation$preds值,它们是不同的。作为仅针对训练集的R2和RMSE的最终结果,我应该使用最终的fitted values还是validation$preds值?

1 个答案:

答案 0 :(得分:0)

简单的答案是,如果您想知道模型的预测能力如何,您将使用validation$preds,因为它是在看不见的数据上进行测试的。 $fitted.values下的值是通过将最终模型拟合到所有训练数据上而获得的,这意味着在构建模型和预测时会使用相同的训练数据。因此,从最终拟合中获得的值会低估模型在看不见的数据上的性能。

您可能需要解释“有效”的含义(在您的评论中)。

使用交叉验证来确定哪个是最佳超参数,在这种情况下,该参数是模型的组件数量。

在交叉验证期间,一部分数据不用于拟合,而是用作测试集。这实际上提供了一个粗略的估计,该模型将对看不见的数据起作用。请查看scikit learn中的这张图片,了解简历的工作原理。

enter image description here

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

如果您有测试数据,则可以看到交叉验证的错误更接近您得到的错误。同样,这实际上取决于您的数据。