在保持预测能力的同时最小化 R 中模型大小的策略

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

在使用 R 中的文本包训练回归模型时,模型的大小随着训练数据点的数量而增加,导致模型对象变得不必要的大。这些模型是使用 parsnip 包和 glmnet 引擎创建的。 R 的内存处理系统可以防止数据重复,因此很难区分模型的哪些组件/属性占用了空间;例如:object_size(model) 显示 700 MB,但 object_size(model$final_recipe) 和 object_size(model$final_model) 几乎相同,分别为 698 MB,因此不显示组件的实际大小。

  • 如何有效识别并删除模型中占用大量内存的组件,以减小其大小,同时保持其预测能力?

示例: object_size(模型) # 700Mb object_size(模型$final_recipe) # 698Mb object_size(模型$final_model) # 698Mb

删除 Final_recipe 属性时(仅作为示例,实际上我不会做任何事情): 模型$final_recipe <- NULL

模型的大小仍然是700Mb: object_size(模型) # 700Mb

  • 如何有效识别并删除模型中占用大量内存的组件,以减小其大小,同时保持其预测能力?
r regression glmnet r-parsnip
1个回答
0
投票

如果您只关心预测,您可以将系数提取为矩阵并通过矩阵乘法进行预测。此示例显示结果与

predict(model, data)
相同。

library(glmnet)
#> Loading required package: Matrix
#> Loaded glmnet 4.1-7

x <- mtcars[, c("cyl", "wt", "gear")] |> as.matrix()
y <- mtcars$mpg

fit1 <- cv.glmnet(x, y)

# extract coefficients
b <- coef(fit1, "lambda.min")

# compare predictions
data.frame(
  y,
  x,
  pred1 = as.vector(cbind(1, x) %*% b), # predict with matrix multiplication
  pred2 = as.vector(predict(fit1, x, "lambda.min"))
) |> 
  head()
#>                      y cyl    wt gear    pred1    pred2
#> Mazda RX4         21.0   6 2.620    4 22.16138 22.16138
#> Mazda RX4 Wag     21.0   6 2.875    4 21.39066 21.39066
#> Datsun 710        22.8   4 2.320    4 25.90130 25.90130
#> Hornet 4 Drive    21.4   6 3.215    3 20.36304 20.36304
#> Hornet Sportabout 18.7   8 3.440    3 16.84980 16.84980
#> Valiant           18.1   6 3.460    3 19.62254 19.62254

# compare sizes
object.size(fit1)
#> 26496 bytes
object.size(b)
#> 1976 bytes

创建于 2024-01-19,使用 reprex v2.0.2

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