gpt4 book ai didi

重用 R 中内置的模型

转载 作者:行者123 更新时间:2023-12-03 05:15:20 29 4
gpt4 key购买 nike

在 R 中构建模型时,如何保存模型规范以便可以在新数据上重用它?假设我根据历史数据建立逻辑回归,但直到下个月才会有新的观察结果。最好的方法是什么?

我考虑过的事情:

  • 保存模型对象并在新 session 中加载
  • 我知道某些模型可以使用 PMML 导出,但还没有真正见过有关导入 PMML 的任何内容

简单地说,我试图了解当您需要在新 session 中使用模型时您会做什么。

最佳答案

重用模型来预测新的观察结果

如果模型的计算成本不高,我倾向于在 R 脚本中记录整个模型构建过程,并在需要时重新运行。如果模型拟合中涉及随机元素,我确保设置一个已知的随机种子。

如果模型的计算成本很高,那么我仍然使用上面的脚本,但使用 save() 将模型对象保存到 rda 对象中。然后,我倾向于修改脚本,以便如果保存的对象存在,则加载它,或者如果不存在,则使用简单的 if()...else 子句包裹相关部分来重新调整模型代码。

加载保存的模型对象时,请务必重新加载任何所需的包,但在您的情况下,如果 logit 模型通过 glm() 适合,则不会再加载 R 之外的任何其他包.

这是一个例子:

> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> ## save this model
> save(m1, file = "my_model1.rda")
>
> ## a month later, new observations are available:
> newdf <- data.frame(x = rnorm(20))
> ## load the model
> load("my_model1.rda")
> ## predict for the new `x`s in `newdf`
> predict(m1, newdata = newdf)
1 2 3 4 5 6
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255
7 8 9 10 11 12
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537
13 14 15 16 17 18
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407
19 20
5.4247548 2.6906722

如果想自动执行此操作,那么我可能会在脚本中执行以下操作:

## data
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))

## check if model exists? If not, refit:
if(file.exists("my_model1.rda")) {
## load model
load("my_model1.rda")
} else {
## (re)fit the model
m1 <- lm(y ~ x, data = df)
}

## predict for new observations
## new observations
newdf <- data.frame(x = rnorm(20))
## predict
predict(m1, newdata = newdf)

当然,数据生成代码将被加载实际数据的代码所取代。

用新的观测值更新之前拟合的模型

如果您想使用其他新观测值重新拟合模型。那么 update() 是一个有用的函数。它所做的只是使用更新的一个或多个模型参数来重新拟合模型。如果您想要在用于拟合模型的数据中包含新观察结果,请将新观察结果添加到传递给参数 'data' 的数据框中,然后执行以下操作:

m2 <- update(m1, . ~ ., data = df)

其中m1是原始的、保存的模型拟合,。 ~ . 是模型公式更改,在本例中意味着包含 ~ 左右两侧的所有现有变量(换句话说,不对模型公式进行任何更改) ),df 是用于拟合原始模型的数据框,经过扩展以包含新可用的观测值。

这是一个工作示例:

> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> m1

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept) x
4.960 2.222

>
> ## new observations
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
> ## add on to df
> df <- rbind(df, newdf)
>
> ## update model fit
> m2 <- update(m1, . ~ ., data = df)
> m2

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept) x
4.928 2.187

其他人在评论中提到formula(),它从拟合模型中提取公式:

> formula(m1)
y ~ x
> ## which can be used to set-up a new model call
> ## so an alternative to update() above is:
> m3 <- lm(formula(m1), data = df)

但是,如果模型拟合涉及其他参数,例如更复杂的模型拟合函数中的 'family''subset' 参数。如果 update() 方法可用于您的模型拟合函数(它们适用于许多常见的拟合函数,例如 glm()),则它提供了一种更简单的方法来更新模型拟合而不是提取和重用模型公式。

如果您打算在 R 中进行所有建模和 future 预测,那么通过 PMML 或类似工具抽象模型似乎没有多大意义。

关于重用 R 中内置的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118074/

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