predict()
возвращает подогнанные значения модели, если я пытаюсь поместить ее в функцию с кодом, который правильно преобразовывает мои переменные.Если я запускаю тот же блок кода за пределами моей оболочки функций, код возвращает прогноз точки, который я ищу.После того, как код был запущен за пределами оболочки функции, пользовательская функция будет возвращать прогноз точки, который был возвращен автономным блоком кода, по существу игнорируя любые новые входные данные функции.
Я пробовалзапуск блока кода сам по себе (вне вызова функции), и он работает, как я и ожидал (возвращает точечный прогноз).
require(e1071)
require(tidyverse)
df1 <- mtcars
df_resp <- log10(df1$mpg + 1)
df_pred <- select(df1, -mpg, -cyl, -vs, -gear, -carb, -am)
df_pred_scale <- scale(df_pred, center = T, scale = T)
attr_center <- attr(df_pred_scale, 'scaled:center')
attr_scale <- attr(df_pred_scale, 'scaled:scale')
df_pred_scale <- cbind.data.frame(df_pred_scale, as.factor(df1$cyl))
colnames(df_pred_scale) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")
df_pred <- cbind.data.frame(df_pred, as.factor(df1$cyl))
colnames(df_pred) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")
for(i in 1:6) assign(paste0('x', i), df_pred_scale[,i])
svr_mpg <- svm(df_resp ~ x1 + x2 + x3 + x4 + x5 + x6,
epsilon = 0.1,
gamma = 0.1,
cost = 1,
cross = 5)
Этот код, обернутый в функцию Предикат_mpg, предназначен для возврата точечного предсказания. По какой-то причине он фактически возвращает подогнанные значения внутри svr_mpg
predict_mpg <- function(cylinder, horsepower){
df_test <- df_pred %>% filter(., cyl == cylinder)
data_point <- df_test[1,]
for(i in 1:5) data_point[,i] <- median(df_test[,i])
data_point$hp <- horsepower
df_norm <- scale(data_point[,1:5], t(attr_center), t(attr_scale))
df_set <- data.frame(df_norm, data_point[,6])
colnames(df_set) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")
for(i in 1:6) assign(paste0('x', i), df_set[,i])
predict(svr_mpg, newdata = df_set) %>% 10^. -1
}
Запуск этого перед блокомПриведенный ниже код приведет к тому, что подогнанные значения внутри svr_mpg будут возвращены, если он будет запускаться после блока ниже, он будет по существу игнорировать входные данные для лошадиных сил и цилиндра и вместо этого вернет прогноз точки для кода ниже
predict_mpg(6, 250)
Этоследующий блок кода идентичен коду в функции предиката_mpg. По какой-то причине этот код вернет прогноз точки, который я хочу
cylinder <- 6
horsepower <- 250
df_test <- df_pred %>% filter(., cyl == cylinder)
data_point <- df_test[1,]
for(i in 1:5) data_point[,i] <- median(df_test[,i])
data_point$hp <- horsepower
df_norm <- scale(data_point[,1:5], t(attr_center), t(attr_scale))
df_set <- data.frame(df_norm, data_point[,6])
colnames(df_set) <- c("disp", "hp", "drat", "wt", "qsec", "cyl")
for(i in 1:6) assign(paste0('x', i), df_set[,i])
predict(svr_mpg, newdata = df_set) %>% 10^. -1
Я ожидал, что функция вернет одно значение, прогноз точки, ноон на самом деле возвращает подогнанные значения для svr_mpg