【发布时间】:2017-11-27 14:09:54
【问题描述】:
lm 默认设置model = TRUE,这意味着用于学习的整个数据集被复制并与拟合对象一起返回。这由predict 使用,但会产生内存开销(示例如下)。
我想知道,复制的数据集是否用于predict以外的任何其他原因?
没有必要回答,但我也想知道以 predict 以外的原因存储数据的模型。
示例
object.size(lm(mpg ~ ., mtcars))
#> 45768 bytes
object.size(lm(mpg ~ ., mtcars, model = FALSE))
#> 28152 bytes
更大的数据集 = 更大的开销。
动机
为了分享我的动机,twidlr 包强制用户在使用predict 时提供数据。如果这使得在学习时复制数据集变得不必要,那么默认为model = FALSE 来节省内存似乎是合理的。我已经打开了一个相关的问题here。
次要动机 - 您可以轻松地将 lm 等许多模型与 pipelearner 匹配,但每次复制数据都会产生大量开销。所以找到减少内存需求的方法会非常方便!
【问题讨论】:
-
不确定这是否相关,但 data.frame 有时有助于确定创建模型的数据的特征。例如,如果您拟合这样的模型
lm(mpg ~ drat^2, data=mtcars),data.frame 将为您提供mpg和drat的实际值,否则您将不知道drat的分布以及它是否由于平方数据的转换,可能会呈现正值或负值。 -
如果我知道 data.frame 的分布,我可以更好地了解在进行新预测时我是从模型中插值还是外推。
-
感谢@StevenMortimer。虽然这不是我所追求的,但我同意了解数据的属性很重要。但是,我倾向于在建模之前执行此操作,而不是先拟合模型然后检查复制的数据。
-
是的,没错,但有时您会得到其他人的模型,原始数据会丢失或无法供您检查。
-
对我来说,存储数据的频率不足以保证存储数据(尤其是当您可能要拟合 1000 多个模型和/或基于大型数据集时),但我明白您的意思。如果像这样传递它们,我希望人们能正确记录合适的模型。我的问题的另一个原因是
lm以外的许多模型指向而不是复制数据。例如,见gist.github.com/drsimonj/5b2cfc428fce350676db5dc77c059052