如何使用 DAAG 包在 R 中执行重复的 k 折交叉验证?
How to perform repeated k-fold cross validation in R with DAAG package?
我使用 DAAG 包的 HousePrices 数据集创建了一个 3 折线性回归模型。我已经阅读了此处和交叉验证中的一些线程,并且多次提到交叉验证必须重复多次(如 50 或 100)以确保稳健性。我不确定这是什么意思?是不是简单运行代码50次,算出整体ms的平均值?
> cv.lm(data = DAAG::houseprices, form.lm = formula(sale.price ~ area+bedrooms),
+ m = 3, dots = FALSE, seed = 29, plotit = c("Observed","Residual"),
+ main="Small symbols show cross-validation predicted values",
+ legend.pos="topleft", printit = TRUE)
Analysis of Variance Table
Response: sale.price
Df Sum Sq Mean Sq F value Pr(>F)
area 1 18566 18566 17.0 0.0014 **
bedrooms 1 17065 17065 15.6 0.0019 **
Residuals 12 13114 1093
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
fold 1
Observations in test set: 5
11 20 21 22 23
Predicted 206 249 259.8 293.3 378
cvpred 204 188 199.3 234.7 262
sale.price 215 255 260.0 293.0 375
CV residual 11 67 60.7 58.3 113
Sum of squares = 24351 Mean square = 4870 n = 5
fold 2
Observations in test set: 5
10 13 14 17 18
Predicted 220.5 193.6 228.8 236.6 218.0
cvpred 226.1 204.9 232.6 238.8 224.1
sale.price 215.0 112.7 185.0 276.0 260.0
CV residual -11.1 -92.2 -47.6 37.2 35.9
Sum of squares = 13563 Mean square = 2713 n = 5
fold 3
Observations in test set: 5
9 12 15 16 19
Predicted 190.5 286.3 208.6 193.3 204
cvpred 174.8 312.5 200.8 178.9 194
sale.price 192.0 274.0 212.0 220.0 222
CV residual 17.2 -38.5 11.2 41.1 27
Sum of squares = 4323 Mean square = 865 n = 5
Overall (Sum over all 5 folds)
ms
2816
每次我重复它时,我都会得到相同的 ms=2816。有人可以解释一下重复 100 次 CV 到底意味着什么吗?因为重复这段代码 100 次似乎并没有改变 ms.
重复此代码 100 次不会有任何改变。你已经设置了一个种子,这意味着你的集合总是相同的集合,这意味着三折,你将有相同的三折,所以所有 100 次你都会得到相同的均方误差。
您似乎没有足够的样本来支持 50 或 100 次折叠是合适的。并且没有适合所有数据集的折叠次数。
折叠的数量要合理,这样才能有足够的测试数据。
此外,您不希望 运行 具有不同种子的多个不同 CV 模型,以尝试找到性能最佳的种子,因为这种形式的错误黑客是过度拟合的代表。
您应该很好地整理数据,正确地设计和转换变量,选择合理的折叠数,设置种子,以便您的利益相关者可以重复您的发现,然后构建您的模型。
我使用 DAAG 包的 HousePrices 数据集创建了一个 3 折线性回归模型。我已经阅读了此处和交叉验证中的一些线程,并且多次提到交叉验证必须重复多次(如 50 或 100)以确保稳健性。我不确定这是什么意思?是不是简单运行代码50次,算出整体ms的平均值?
> cv.lm(data = DAAG::houseprices, form.lm = formula(sale.price ~ area+bedrooms),
+ m = 3, dots = FALSE, seed = 29, plotit = c("Observed","Residual"),
+ main="Small symbols show cross-validation predicted values",
+ legend.pos="topleft", printit = TRUE)
Analysis of Variance Table
Response: sale.price
Df Sum Sq Mean Sq F value Pr(>F)
area 1 18566 18566 17.0 0.0014 **
bedrooms 1 17065 17065 15.6 0.0019 **
Residuals 12 13114 1093
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
fold 1
Observations in test set: 5
11 20 21 22 23
Predicted 206 249 259.8 293.3 378
cvpred 204 188 199.3 234.7 262
sale.price 215 255 260.0 293.0 375
CV residual 11 67 60.7 58.3 113
Sum of squares = 24351 Mean square = 4870 n = 5
fold 2
Observations in test set: 5
10 13 14 17 18
Predicted 220.5 193.6 228.8 236.6 218.0
cvpred 226.1 204.9 232.6 238.8 224.1
sale.price 215.0 112.7 185.0 276.0 260.0
CV residual -11.1 -92.2 -47.6 37.2 35.9
Sum of squares = 13563 Mean square = 2713 n = 5
fold 3
Observations in test set: 5
9 12 15 16 19
Predicted 190.5 286.3 208.6 193.3 204
cvpred 174.8 312.5 200.8 178.9 194
sale.price 192.0 274.0 212.0 220.0 222
CV residual 17.2 -38.5 11.2 41.1 27
Sum of squares = 4323 Mean square = 865 n = 5
Overall (Sum over all 5 folds)
ms
2816
每次我重复它时,我都会得到相同的 ms=2816。有人可以解释一下重复 100 次 CV 到底意味着什么吗?因为重复这段代码 100 次似乎并没有改变 ms.
重复此代码 100 次不会有任何改变。你已经设置了一个种子,这意味着你的集合总是相同的集合,这意味着三折,你将有相同的三折,所以所有 100 次你都会得到相同的均方误差。
您似乎没有足够的样本来支持 50 或 100 次折叠是合适的。并且没有适合所有数据集的折叠次数。
折叠的数量要合理,这样才能有足够的测试数据。
此外,您不希望 运行 具有不同种子的多个不同 CV 模型,以尝试找到性能最佳的种子,因为这种形式的错误黑客是过度拟合的代表。
您应该很好地整理数据,正确地设计和转换变量,选择合理的折叠数,设置种子,以便您的利益相关者可以重复您的发现,然后构建您的模型。