0

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

4

1 回答 1

0

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

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

交叉验证用于查找最佳超参数,在这种情况下是模型的组件数量。

在交叉验证期间,一部分数据不用于拟合并用作测试集。这实际上提供了一个粗略的估计,该模型将处理看不见的数据。请参阅scikit的这张图片,了解CV 的工作原理。

在此处输入图像描述

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

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

于 2020-08-10T10:49:25.877 回答