对大数据进行回归的快速方法

问题描述 投票:2回答:1

我有一个大型数据集,其中包含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个回答
0
投票

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

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

您有几种选择:

  1. 保持设计不变,然后等待(或找到更快的lm
  2. 丢弃name变量,在这种情况下,lm将几乎立即适合
  3. 使用name或其他程序包,将lmer作为随机效果来拟合混合效果模型。 lmer特别针对随机效应使用稀疏设计矩阵,这是因为每个观察结果只能具有5903个名称之一(因此,大多数矩阵为空)。
  4. 在这三个选项中,第三个选项可能是最原则的方法。随机效应将解释观察结果之间个体水平的差异,并且还会汇总不同个体之间的信息,以帮助更好地估计没有大量观察结果的狗。最重要的是,得益于稀疏的设计矩阵,它可以快速进行计算。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.