R中的线性回归性能

数据挖掘 r 统计数据 线性回归
2022-03-03 13:11:22

我对 R 的性能有疑问: 是我的脚本。

问题是我需要在拥有约 600 万客户的基础上使用它(每个客户一个线性模型),而且处理时间很长。

谁能帮助我提高脚本的性能?我认为问题出在data.frame rbind功能上。

1个回答

实际上,您的脚本中存在一些问题,并且不断增长的对象(无论是使用rbind()还是bind_rows())都会严重影响您的性能。因此,如果您知道自己有多少行,请先创建一个包含那么多行的对象。

接下来,您依赖数据框。如果您只是将信息存储在单独的向量中并且最后只将它们组合起来,那么您将再次消除大量开销。看看以下三个模型示例:

library(rbenchmark)
library(dplyr)
# The naive way
f1 <- function(n){
  out <- data.frame(x = numeric(), y = numeric())
  for(i in seq.int(n)){
    tmp <- data.frame(x = rnorm(1), y=rnorm(1))
    out <- bind_rows(out, tmp)
  }
  return(out)
}
# Preallocating memory
f2 <- function(n){
  out <- data.frame(x = numeric(n), y = numeric(n))
  for(i in seq.int(n)){
    out$x[i] <- rnorm(1)
out$y[i] <- rnorm(1)
  }
  return(out)
}
# Using vectors
f3 <- function(n){
  outx <- numeric(n)
  outy <- numeric(n)
  for(i in seq.int(n)){
    outx[i] <- rnorm(1)
    outy[i] <- rnorm(1)
  }
  return(data.frame(x = outx, y = outy))
}

在我的机器上,我得到以下时间:

benchmark(
  f1(100),
  f2(100),
  f3(100),
  columns = c("test","elapsed","relative","replications")
)
##     test elapsed relative replications
## 1 f1(100)    2.16    27.00          100
## 2 f2(100)    0.34     4.25          100
## 3 f3(100)    0.08     1.00          100

仅仅改变它已经可以严重减少你的运行时间。