r-在大数据上运行回归的更快方法



我有一个大数据集,其中有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" ...

由于name变量,您的回归拟合速度较慢。用5903个级别拟合一个因子将为您的设计矩阵添加5903列——这就像试图拟合5903个单独的变量一样。

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

你有几个选择:

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

在这三种选择中,第三种选择可能是最有原则的前进道路。随机效应将解释观察结果中个体水平的变化,并汇集不同个体之间的信息,以帮助对没有太多观察结果的狗做出更好的估计。除此之外,由于稀疏的设计矩阵,它将快速计算。

数据集的一个简单模型可能看起来像这样:

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

如果你想走这条路,我建议你多读一些关于混合效应模型的文章,这样你就可以选择对你的数据有意义的模型结构。这里有两个很好的资源:

  • lmer使用指南-https://stats.stackexchange.com/questions/13166/rs-lmer-cheat-sheet
  • 随机/混合效应的更多理论讨论-https://stats.stackexchange.com/a/151800/

相关内容

最新更新