在R中的完整数据集上重新训练最佳模型

在R中的完整数据集上重新训练最佳模型,r,R,我有两个模型可供选择,并根据一些标准从两个模型中选择一个。下面只是一个例子,我知道这没有多大意义 library(forecast) set.seed(4) sample_dat= sample(1:nrow(cars), 5) train = cars[-sample_dat, ] test = cars[sample_dat, ] models = list(lm(dist ~ speed, train), glm(dist ~ speed, train, family = "poisson

我有两个模型可供选择,并根据一些标准从两个模型中选择一个。下面只是一个例子,我知道这没有多大意义

library(forecast)
set.seed(4)
sample_dat= sample(1:nrow(cars), 5)
train = cars[-sample_dat, ]
test = cars[sample_dat, ]
models = list(lm(dist ~ speed, train), glm(dist ~ speed, train, family = "poisson"))
test_res = sapply(models, function(x) accuracy(predict(x, test, type = "response"), test$dist)[2]) #Getting the RMSE for each model
best_model = models[which.min(test_res)]

如何使用完整数据集训练+测试重新训练最佳模型?我检查了update和update.formula函数,但它们似乎没有更新数据部分。

Base R使用您自己的逻辑,首先创建一个镜像模型列表的列表:

set.seed(4)
sample_dat= sample(1:nrow(cars), 5)
train = cars[-sample_dat, ]
test = cars[sample_dat, ]
models = list(lm(dist ~ speed, train), glm(dist ~ speed, train, family = "poisson"))
model_application = list(as.expression("lm(dist ~ speed, cars)$call"), 
                         as.expression("glm(dist ~ speed, cars, family = 'poisson'))$call"))
test_res = sapply(models, 
                  function(x){
                    # Store a function to caclulate the RMSE: rmse => function 
                    rmse <- function(actual_vec, pred_vec){sqrt(mean((pred_vec - actual_vec)**2))}
                    # Getting the RMSE for each model: numeric scalar => .GlobalEnv
                    rmse(test$dist, predict(x, data = test, type = "response"))
                  }
)

best_model = models[[which.min(test_res)]]
applied_model <- eval(eval(as.expression(parse(text = model_application[[which.min(test_res)]]))))

Base R使用您自己的逻辑,首先创建一个镜像模型列表的列表:

set.seed(4)
sample_dat= sample(1:nrow(cars), 5)
train = cars[-sample_dat, ]
test = cars[sample_dat, ]
models = list(lm(dist ~ speed, train), glm(dist ~ speed, train, family = "poisson"))
model_application = list(as.expression("lm(dist ~ speed, cars)$call"), 
                         as.expression("glm(dist ~ speed, cars, family = 'poisson'))$call"))
test_res = sapply(models, 
                  function(x){
                    # Store a function to caclulate the RMSE: rmse => function 
                    rmse <- function(actual_vec, pred_vec){sqrt(mean((pred_vec - actual_vec)**2))}
                    # Getting the RMSE for each model: numeric scalar => .GlobalEnv
                    rmse(test$dist, predict(x, data = test, type = "response"))
                  }
)

best_model = models[[which.min(test_res)]]
applied_model <- eval(eval(as.expression(parse(text = model_application[[which.min(test_res)]]))))
您不希望更改公式,因为这是最佳模型,而是更新数据


您不想更改公式,因为这是最好的模型,而是更新数据

许多模型都包含调用的表达式,因此您可能会弄乱它并将其传递给eval,但这有点荒谬。可能最好保存一个函数列表来创建模型,然后在这里使用它来创建模型,然后在选择后将其子集到您想要的函数并再次调用它。谢谢,这真的很有帮助。我尝试了model_list=listglm,lm,然后重新训练了model_list[[which.minrest\u res]]dist~speed,data=cars,它适用于lm车型。但是,您如何传递family=poisson参数呢?您应该使用update:updatebest_model[[1]],data=rbindtrain,testYup就是这样,谢谢!请将其作为答案发布。许多模型都包含呼叫表达式,所以您可以将其搞乱并传递给eval,但这有点可笑。可能最好保存一个函数列表来创建模型,然后在这里使用它来创建模型,然后在选择后将其子集到您想要的函数并再次调用它。谢谢,这真的很有帮助。我尝试了model_list=listglm,lm,然后重新训练了model_list[[which.minrest\u res]]dist~speed,data=cars,它适用于lm车型。但是,您如何传递family=poisson参数呢?您应该使用update:updatebest_model[[1]],data=rbindtrain,testYup就是这样,谢谢!请将其作为答案发布。谢谢,但这将训练整个数据集上的所有模型。这是我想要避免的。@User2321尝试一下,有点混乱,但会延迟执行,直到显式计算。@User2321如果您觉得我的答案有用和/或满足您的需要,请进行投票并接受我的答案,否则请告诉我您是否希望我进行任何更改谢谢,但这会训练整个数据集上的所有模型。这是我想要避免的。@User2321尝试一下,有点混乱,但会延迟执行,直到显式计算。@User2321如果您觉得我的答案有用和/或满足您的需要,请进行投票并接受我的答案。否则,请告诉我您是否希望我进行任何更改