【问题标题】:Faster way to run a regression on large Data在大数据上运行回归的更快方法
【发布时间】:2020-08-12 23:28:54
【问题描述】:

我有一个包含 70k+ 行和几列可变数据的大型数据集。另外我有一列 我需要使用超过 5000 个因素。

有什么方法可以加速回归,因为目前它需要超过 40 分钟才能运行。 我认为加快速度的唯一方法是,如果我可以仅将测试数据中的因素过滤到训练数据中,或者使用 data.table 并从中运行 reg。

任何帮助将不胜感激。

library(dbplyr)
library(dplyr)
library(data.table)
library(readr)


greys <- read_excel("Punting'/Dogs/greys.xlsx", sheet = 'Vic')
greys$name<- as.factor(greys$name)
ggtrain<- tail(greys,63000)
gtrain<- head(ggtrain, -190)
gtest1<- tail(ggtrain,190)
gtest<- filter(gtest1, runnum >5)

#mygrey<- gam(gtrain$time~ s(name, bs='fs')+s(box)+s(distance),data = gtrain,method = 'ML')
mygrey<- lm(gtrain$margin~name+box+distance+trate+grade+trackid, data = gtrain)
pgrey<- predict(mygrey,gtest)
gdf<- data.frame(gtest$name,pgrey)
#gdf
write.csv(gdf,'thedogs.csv')```

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   63000 obs. of  25 variables:
 $ position: num  4 5 6 7 1 2 3 4 5 6 ...
 $ box     : num  3 10 5 8 3 7 9 5 2 4 ...
 $ name    : Factor w/ 5903 levels "AARON'S ME BOY",..: 4107 2197 3294 3402 4766 4463 5477 274 5506 2249 ...
 $ trainer : chr  "Marcus Lloyd" "Ian Robinson" "Adam Richardson" "Nathan  Hunt" ...
 $ time    : num  22.9 23 23.1 23.5 22.5 ...
 $ margin  : num  7.25 8.31 9.96 15.33 0 ...
 $ split   : num  9.17 8.98 9.12 9.14 8.62 8.73 8.8 8.99 9.04 9.02 ...
 $ inrun   : num  75 44 56 67 11 22 33 54 76 67 ...
 $ weight  : num  27.9 26.2 30.3 27.7 26.5 31.5 34.1 32.8 31.2 34 ...
 $ sire    : chr  "Didda Joe" "Swift Fancy" "Barcia Bale" "Hostile" ...
 $ dam     : chr  "Hurricane Queen" "Ulla Allen" "Diva's Shadow" "Flashing Bessy" ...
 $ odds    : num  20.3 55.5 1.6 33.2 1.6 5 22.6 7.9 12.5 9.9 ...
 $ distance: num  390 390 390 390 390 390 390 390 390 390 ...
 $ grade   : num  4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 ...
 $ race    : chr  "Race 11" "Race 11" "Race 11" "Race 11" ...
 $ location: chr  "Ballarat" "Ballarat" "Ballarat" "Ballarat" ...
 $ date    : chr  "Monday 5th of August 2019" "Monday 5th of August 2019" "Monday 5th of August 2019" "Monday 5th of August 2019" ...
 $ state   : chr  "vic" "vic" "vic" "vic" ...
 $ trate   : num  0.515 0.376 0.818 0.226 0.55 ...
 $ espeed  : num  75 44 56 67 11 22 33 54 76 67 ...
 $ trackid : num  3 3 3 3 3 3 3 3 3 3 ...
 $ runnum  : num  4 6 3 2 2 2 3 4 2 4 ...
 $ qms     : chr  "M/75" "M/44" "M/56" "M/67" ...


【问题讨论】:

标签: r data.table lm


【解决方案1】:

由于name 变量,您的回归拟合缓慢。拟合具有 5903 个级别的因子将为您的设计矩阵添加 5903 列 - 这就像尝试拟合 5903 个单独的变量一样。

您的设计矩阵将具有 63000x5908 的尺寸,其中一个会占用大量内存,两个会使得 lm 努力生成其估计值(因此需要 40 分钟的拟合时间)。

你有几个选择:

  1. 保持您的设计不变,然后等待(或找到稍微快一点的lm
  2. 丢弃name 变量,在这种情况下lm 几乎立即适合
  3. 拟合混合效果模型,name 作为随机效果,使用lmer 或其他包。 lmer 特别为随机效应使用了稀疏设计矩阵,利用了每个观察只能有 5903 个名称中的一个这一事实(因此大多数矩阵为空)。

在这三个选项中,第三个选项可能是最有原则的前进方式。随机效应将解释观察中个体水平的变化,并在不同个体之间汇集信息,以帮助对没有大量观察的狗进行更好的估计。最重要的是,由于稀疏设计矩阵,它可以快速计算。

您的数据集的简单模型可能如下所示:

library(lme4)
## read data
mygrey <- lmer(gtrain$margin~(1|name)+box+distance+trate+grade+trackid,
               data = gtrain)

如果您想走这条路,我建议您阅读有关混合效应模型的更多信息,以便您可以选择对您的数据有意义的模型结构。这里有两个很好的资源:

【讨论】:

  • 工作就像一个魅力。附带说明一下,是否有任何类似的软件包可以处理此类数据,但以非线性方式。例如类似于 GAM 回归的东西?
  • 一个选项是gamm4 package。请注意,在此包中,您在 random 参数中指定随机效果,而不是在主公式中。
猜你喜欢
  • 2018-02-15
  • 2013-09-13
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2020-07-13
  • 2014-04-11
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多