理解tune::last_fit指标与summary()不同的原因

ryoqjall  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(107)

**上下文:**我尝试评估一个模型,使用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²并不相等。

zy1mlcev

zy1mlcev1#

通过last_fit()获得的统计数据来自holdout数据。来自summary.lm()的那些不是;它们来自用于拟合模型的相同数据。
重用数据来评估模型性能是建模时的一个主要缺陷。它会给予你乐观的结果(也许是压倒性的乐观,取决于模型)。
有很多关于这个的参考资料。我们在tdiymodels一书中给予了一个小例子。
此外,虽然这不是问题所在,但tidymodels(以及之前的插入符号)对$R^2$使用的估计量与线性回归使用的标准估计量不同(参见?yardstick::rsq)。当模型的度量值接近于零时,它的性能更好。

相关问题