【问题标题】:All values of AUC ROC Curve 1 using tidymodels使用 tidymodels 的 AUC ROC 曲线 1 的所有值
【发布时间】:2021-05-06 05:42:31
【问题描述】:

尝试使用 tidymodels 制作具有二元结果的 LASSO 模型,我基本上从 tidymodels 网页 (https://www.tidymodels.org/start/case-study/)(酒店住宿数据集)复​​制了案例研究,并将其应用于我自己的数据,但出于某种原因ROC 曲线下我所在区域的值的值为 1(如下图所示)。我唯一改变的是配方(尝试适应我的数据)

  recipe(outcome ~ ., data = df_train) %>% 
  step_dummy(all_nominal(), -all_outcomes()) %>% 
  step_zv(all_predictors()) %>% 
  step_normalize(all_predictors()) %>% 
  step_medianimpute(all_predictors())

所以我不知道是我的食谱不正确还是我的数据不适合任何原因。如前所述,我有一个二元结果和 68 个预测变量(59 个因子和 9 个数字),有些确实缺少数据,但认为 step_medianimpute 可以解决这个问题。非常感谢任何人都可以提供的任何帮助

My AUC ROC Curve

【问题讨论】:

  • 有多少个预测变量处于最高惩罚状态?如果没有使用实际数据,很难找到原因。

标签: r lasso-regression tidymodels


【解决方案1】:

没有看到数据很难确定,但您的结果表明了几件事。

首先,AUC ROC 为 1。二元分类模型的 AOC ROC 为 1 表明该模型完全能够区分这两个类别。这可能是过度拟合的情况,也可能是您只有线性可分的类。

其次,不同惩罚值的恒定度量值。对于 LASSO 模型,随着惩罚的增加,越来越多的变量将缩小为零。在您的情况下,对于所有惩罚值(如果您关注帖子,它将是 10^(-4)10^(-1)),您会看到相同的表现。这意味着即使您使用10^(-1) 的惩罚,您仍然没有缩小足够的预测变量来伤害/改变性能。下面的代表

set.seed(1234)
library(tidymodels)
response <- rep(c(0, 10), length.out = 1000)

data <- bind_cols(
  response = factor(response),
  map_dfc(seq_len(50), ~ rnorm(1000, response)) 
)

data_split <- initial_split(data)

data_train <- training(data_split)
data_test <- testing(data_split)

lasso_spec <- logistic_reg(mixture = 1, penalty = tune()) %>%
  set_engine("glmnet")

lasso_wf <- workflow() %>%
  add_model(lasso_spec) %>%
  add_formula(response ~ .)

data_folds <- vfold_cv(data_train)

param_grid <- tibble(penalty = 10^seq(-4, -1, length.out = 30))

tune_res <- tune_grid(
  lasso_wf, 
  resamples = data_folds, 
  grid = param_grid
)

autoplot(tune_res)

您可以做的是扩大处罚范围,直到您的表现发生变化。下面我们看到,一旦惩罚足够高,最后一个重要的预测变量就会缩小到零,我们就会失去性能。

param_grid <- tibble(penalty = 10^seq(-1, 0, length.out = 30))

tune_res <- tune_grid(
  lasso_wf, 
  resamples = data_folds, 
  grid = param_grid
)

autoplot(tune_res)

为了验证,我们使用一种良好的性能惩罚来拟合模型,并得到完美的预测。

lasso_final <- finalize_workflow(lasso_wf, select_best(tune_res))

lasso_final_fit <- fit(lasso_final, data = data_train)

augment(lasso_final_fit, new_data = data_train) %>%
  conf_mat(truth = response, estimate = .pred_class)
#>           Truth
#> Prediction   0  10
#>         0  375   0
#>         10   0 375

reprex package (v2.0.0) 于 2021-05-08 创建

【讨论】:

  • 大家好,感谢您的帮助!不幸的是,出于保密原因,所有医疗数据都无法共享。我已经相应地编辑了我的数据并扩展了网格,我的准确度和 ROC-AUC 确实下降了,与你上面的图表非常相似,仍然得到可疑的好读数,这不可能是真的,所以我的基础肯定有问题数据或我在模型中包含的内容。再次感谢!
  • 您可能遇到了数据泄露问题。我认为您尝试弄清楚是否包含不应该包含的预测变量是正确的。
  • 有什么方法可以明确检查数据泄露吗?还是总是“疑似”数据泄露?
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 2019-04-11
  • 2019-04-24
  • 2018-05-29
  • 2020-05-18
  • 2016-08-04
  • 2020-05-19
  • 2015-06-23
相关资源
最近更新 更多