**上下文:**我尝试评估一个模型,使用tune::last_fit()
和一个独立的数据集。
**问题:**似乎tune::collect_metrics()
和summary()
得到的指标不一样。
**问题:**使用tune::collect_metrics()
和summary()
计算的度量(此处为R²)之间的差异是什么?哪一个对应于独立数据集的观测值和这些观测值的预测值之间的R²?
**可复制示例:**以https://tune.tidymodels.org/reference/last_fit.html的示例为起点。
library(recipes)
library(rsample)
library(parsnip)
set.seed(6735)
tr_te_split <- initial_split(mtcars)
spline_rec <- recipe(mpg ~ ., data = mtcars) %>%
step_ns(disp)
lin_mod <- linear_reg() %>%
set_engine("lm")
spline_res <- tune::last_fit(lin_mod, spline_rec, split = tr_te_split)
spline_res
#> # Resampling results
#> # Manual resampling
#> # A tibble: 1 × 6
#> splits id .metrics .notes .predictions .workflow
#> <list> <chr> <list> <list> <list> <list>
#> 1 <split [24/8]> train/test split <tibble> <tibble> <tibble [8 × 4]> <workflow>
# Here are the performance metrics for the model
tune::collect_metrics(spline_res)
#> # A tibble: 2 × 4
#> .metric .estimator .estimate .config
#> <chr> <chr> <dbl> <chr>
#> 1 rmse standard 3.80 Preprocessor1_Model1
#> 2 rsq standard 0.729 Preprocessor1_Model1
spline_res %>%
parsnip::extract_fit_engine() %>% # back to stats lm object
summary()
#>
#> Call:
#> stats::lm(formula = ..y ~ ., data = data)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -3.4453 -1.1980 -0.1464 1.3246 2.8223
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 23.087028 18.641785 1.238 0.239
#> cyl 0.326218 1.402236 0.233 0.820
#> hp 0.005969 0.024848 0.240 0.814
#> drat -0.009576 1.597293 -0.006 0.995
#> wt -0.902839 2.503336 -0.361 0.725
#> qsec 0.185826 0.745021 0.249 0.807
#> vs 1.492756 2.255781 0.662 0.521
#> am 4.101555 3.110797 1.318 0.212
#> gear 0.174875 1.730223 0.101 0.921
#> carb -1.278962 1.009824 -1.267 0.229
#> disp_ns_1 -15.149506 13.649995 -1.110 0.289
#> disp_ns_2 -4.905087 6.756046 -0.726 0.482
#>
#> Residual standard error: 2.397 on 12 degrees of freedom
#> Multiple R-squared: 0.9204, Adjusted R-squared: 0.8473
#> F-statistic: 12.61 on 11 and 12 DF, p-value: 5.869e-05
创建于2023-05-22带有reprex v2.0.2
如你所见,两个R²并不相等。
1条答案
按热度按时间zy1mlcev1#
通过
last_fit()
获得的统计数据来自holdout数据。来自summary.lm()
的那些不是;它们来自用于拟合模型的相同数据。重用数据来评估模型性能是建模时的一个主要缺陷。它会给予你乐观的结果(也许是压倒性的乐观,取决于模型)。
有很多关于这个的参考资料。我们在tdiymodels一书中给予了一个小例子。
此外,虽然这不是问题所在,但tidymodels(以及之前的插入符号)对$R^2$使用的估计量与线性回归使用的标准估计量不同(参见
?yardstick::rsq
)。当模型的度量值接近于零时,它的性能更好。