【问题标题】:Fitting several regression models after group_by with dplyr and applying the resulting models into test sets在 group_by 之后使用 dplyr 拟合几个回归模型并将结果模型应用到测试集中
【发布时间】:2017-01-10 17:53:47
【问题描述】:

我有一个大数据集,我想根据特定变量的值(在我的情况下为生命周期)进行分区,然后在每个分区上运行逻辑回归。按照@tchakravarty 在Fitting several regression models with dplyr 中的回答,我编写了以下代码:

lifetimemodels = data %>% group_by(lifetime) %>% sample_frac(0.7)%>%
     do(lifeModel = glm(churn ~., x= TRUE, family=binomial(link='logit'), data = .))

我现在的问题是如何使用生成的逻辑模型来计算其余数据(未选择的 0.3 部分)的 AUC,这些数据应该再次按生命周期分组?

提前非常感谢!

【问题讨论】:

  • 引入一列training = sample(c(T, F), size = n(), prob = c(0.3,0.7), replace = TRUE),然后从glm 中保留这些行training == TRUE

标签: r dplyr broom


【解决方案1】:

您可以调整您的dplyr 方法以使用tidyrpurrr 框架。您查看分组/嵌套,以及 mutatemap 函数来创建列表框架来存储您的工作流程。

您正在寻找的测试/训练拆分是 modelr 的一部分,该软件包旨在协助在 purrr 框架内进行建模。特别是 cross_vmccross_vkfold 函数。

使用mtcars 的玩具示例(仅用于说明框架)。

library(dplyr)
library(tidyr)
library(purrr)
library(modelr)

analysis <- mtcars %>%
  nest(-cyl) %>%
  unnest(map(data, ~crossv_mc(.x, 1, test = 0.3))) %>%
  mutate(model = map(train, ~lm(mpg ~ wt, data = .x))) %>%
  mutate(pred = map2(model, train, predict)) %>%
  mutate(error = map2_dbl(model, test, rmse))

这个:

  1. 乘坐mtcars
  2. 嵌套到名为data 的列表框架中,cyl
  3. 通过将crossv_mc 映射到每个元素,然后使用unnest 生成testtrain 列表列,将每个data 分离到一个训练集中。
  4. lm 模型映射到每个train,将其存储在model
  5. predict 函数映射到modeltrain 并存储在pred
  6. rmse 函数映射到modeltest 集并错误存储。

可能有比我更熟悉工作流程的用户,所以请更正/详细说明。

【讨论】:

  • 感谢您提供非常好的答案!我实际上正在寻找 AUC,因为我有分类问题。您知道如何获得 AUC 而不是 rmse 吗?我在一个数据集中执行此操作的方式如下(使用 AUC 包),但我不知道是否可以轻松地将其适应您的解决方案:p1 &lt;- predict(model, newdata = testSet, type="response") pr1 &lt;- prediction(p1, testSet$dependentvariable) prf1 &lt;- performance(pr1, measure = "tpr", x.measure = "fpr") auc1 &lt;- performance(pr1, measure = "auc") auc1 &lt;- auc1@y.values[[1]] auc1
  • 它需要 unnest(map(testSet, ~select(.x, "dependentvariable))) 然后重复 mutate(var = map(col1, col2, fun)) 以应用 auc 措施。
  • 我现在有点失落。在解决方案的 pred 步骤之后取消嵌套?对于你的“有趣”论点,我可以输入“auc”吗?
  • 您需要扩展链,或从analysis 开始并应用您的AUC 措施。研究如何以这种方式使用tidyrpurrrherehere
  • 非常感谢您的参考。我的代码达到了以下级别:analysis &lt;- data %&gt;% nest(-lifetime) %&gt;% unnest(map(data, ~crossv_mc(.x, 1, test = 0.3))) %&gt;% mutate(model = map(train, ~glm(churn ~., x= TRUE, family=binomial(link='logit'), data = .x))) %&gt;% mutate(pred = map2(model, test, predict, type="response")) %&gt;% unnest(map(test, ~select(.x, dependentvariable))) 但是当我尝试取消嵌套时,为了选择因变量,我收到以下错误:“错误:没有适用于类对象的 'select_' 的适用方法”重新采样“”。有什么想法吗?
猜你喜欢
  • 2014-05-07
  • 2016-09-03
  • 2021-12-12
  • 1970-01-01
  • 2014-09-11
  • 2014-05-27
  • 2021-12-08
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多