首页 > 解决方案 > Caret 如何生成具有 K 折交叉验证的 OLS 模型?

问题描述

假设我有一些通用数据集,OLS 回归是最佳选择。因此,我生成了一个包含一些一阶项的模型,并决定在 R 中使用 Caret 进行回归系数估计和误差估计。

在插入符号中,这最终是:

k10_cv = trainControl(method="cv", number=10)
ols_model = train(Y ~ X1 + X2 + X3, data = my_data, trControl = k10_cv, method = "lm")

从那里,我可以使用提取回归信息summary(ols_model),也可以通过调用来提取更多信息ols_model

当我只看时ols_model,RMSE/R-square/MAE 是通过典型的 k-fold CV 方法计算的吗?另外,当我看到的模型summary(ols_model)生成时,这个模型是在整个数据集上训练的,还是在每个折叠中生成的模型的平均值?

如果没有,为了用方差换取偏差,有没有办法在 Caret 中获得一个一次训练一个倍的 OLS 模型?

标签: rlinear-regressioncross-validationr-caret

解决方案


这是您示例的可重现数据。

library("caret")
my_data <- iris

k10_cv <- trainControl(method="cv", number=10)

set.seed(100)
ols_model <- train(Sepal.Length ~  Sepal.Width + Petal.Length + Petal.Width,
                  data = my_data, trControl = k10_cv, method = "lm")


> ols_model$results
  intercept      RMSE  Rsquared       MAE     RMSESD RsquaredSD      MAESD
1      TRUE 0.3173942 0.8610242 0.2582343 0.03881222 0.04784331 0.02960042

1)ols_model$results以上基于以下每个不同重采样的平均值:

> (ols_model$resample)
        RMSE  Rsquared       MAE Resample
1  0.3386472 0.8954600 0.2503482   Fold01
2  0.3154519 0.8831588 0.2815940   Fold02
3  0.3167943 0.8904550 0.2441537   Fold03
4  0.2644717 0.9085548 0.2145686   Fold04
5  0.3769947 0.8269794 0.3070733   Fold05
6  0.3720051 0.7792611 0.2746565   Fold06
7  0.3258501 0.8095141 0.2647466   Fold07
8  0.2962375 0.8530810 0.2731445   Fold08
9  0.3059100 0.8351535 0.2611982   Fold09
10 0.2615792 0.9286246 0.2108592   Fold10

IE

> mean(ols_model$resample$RMSE)==ols_model$results$RMSE
[1] TRUE

2)模型在整个训练集上进行训练。您可以使用 usinglm或指定method = "none"for来检查这一点trainControl

 coef(lm(Sepal.Length ~  Sepal.Width + Petal.Length + Petal.Width, data = my_data))
 (Intercept)  Sepal.Width Petal.Length  Petal.Width 
   1.8559975    0.6508372    0.7091320   -0.5564827 

这与ols_model$finalModel.


推荐阅读