gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:12:20 25 4
gpt4 key购买 nike

我有一个包含 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)

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

关于r - 对大数据运行回归的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61492260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com