Я пытаюсь построить общую структуру для быстрой оценки различных моделей.Я пытаюсь использовать фабричный шаблон для генерации функций «модельного тренера», которые берут фрейм данных и возвращают обученную модель.Однако я сталкиваюсь с неожиданным поведением встроенной функции R lm
в этой среде.
gen_lm_model_trainer <- function(formula, weights_col = NULL) {
function(train_data) {
trained_lm <- lm(formula = formula,
data = train_data,
weights = train_data[[weights_col]])
pred_func <- function(test_data) {
prediction <- predict(trained_lm, newdata = test_data)
return(prediction)
}
return(list(predict = pred_func, info = trained_lm))
}
}
mtcars$random_weights <- rbeta(nrow(mtcars), shape1 = 5, shape2 = 2)
trainer <- gen_lm_model_trainer(formula = mpg ~ ., weights_col = 'random_weights')
trained_model <- trainer(mtcars)
Ответ на этот код следующий:
Error in eval(extras, data, env) : object 'train_data' not found
Этоаналогично другому вопросу SO, Ошибка объекта не найдена при передаче формулы модели в другую функцию , но эта проблема не решается путем назначения среды формулы для среды сгенерированной функции, то есть
gen_lm_model_trainer <- function(formula, weights_col = NULL) {
function(train_data) {
scoped_formula <- as.formula(formula, env = environment())
trained_lm <- lm(formula = scoped_formula,
data = train_data,
weights = train_data[[weights_col]])
pred_func <- function(test_data) {
prediction <- predict(trained_lm, newdata = test_data)
return(prediction)
}
return(list(predict = pred_func, info = trained_lm))
}
}
Решение, которое работает последовательно для обеих проблем, будет наиболее ценно.