Caret 如何生成具有 K 折交叉验证的 OLS 模型?
How does Caret generate an OLS model with K-fold cross validation?
假设我有一些通用数据集,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 折 CV 方法计算的吗?另外,当我在 summary(ols_model)
中看到的模型生成时,这个模型是在整个数据集上训练的,还是在每个折叠中生成的模型的平均值?
如果不是,为了用方差换取偏差,有没有办法在 Caret 中获取一个 OLS 模型,是 一次训练一次?
这是您的示例的可重现数据。
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
即
> mean(ols_model$resample$RMSE)==ols_model$results$RMSE
[1] TRUE
2) 模型是在整个训练集上训练的。 您可以使用 lm
或为 [= 指定 method = "none"
来检查这一点17=].
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
相同。
假设我有一些通用数据集,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 折 CV 方法计算的吗?另外,当我在 summary(ols_model)
中看到的模型生成时,这个模型是在整个数据集上训练的,还是在每个折叠中生成的模型的平均值?
如果不是,为了用方差换取偏差,有没有办法在 Caret 中获取一个 OLS 模型,是 一次训练一次?
这是您的示例的可重现数据。
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
即
> mean(ols_model$resample$RMSE)==ols_model$results$RMSE
[1] TRUE
2) 模型是在整个训练集上训练的。 您可以使用 lm
或为 [= 指定 method = "none"
来检查这一点17=].
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
相同。