Почему функция предиката () возвращает предсказание точки вне оболочки функции, а внутри установлены значения - PullRequest
0 голосов
/ 12 июня 2019

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

1 Ответ

2 голосов
/ 12 июня 2019

Это будет моя версия.Наиболее важной частью является то, что я запускаю модель на data.frame, а не на отдельных переменных.Я не уверен, что newdata сделает что-нибудь, если вы не использовали аргумент data.

library(e1071)
library(tidyverse)

df1 <- mtcars %>% 
  select(-vs, -gear, -carb, -am) %>% 
  mutate(
    mpg = log10(mpg + 1),
    cyl = as.factor(cyl)
  ) %>% 
  mutate_at(vars(-mpg, -cyl), ~scale(.)[,1])

svr_mpg <- svm(   # Gives a warning for me!
  mpg ~ .,
  df1,   
  epsilon = 0.1,
  gamma = 0.1,
  cost = 1,
  cross = 5
)

predict_mpg <- function(cylinder, horsepower){
  df_set <- df1 %>% 
    filter(cyl == cylinder) %>% 
    mutate_if(is.numeric, median) %>% 
    slice(1) %>% 
    select(-mpg) %>% 
    mutate(hp = horsepower)
  predict(svr_mpg, newdata = df_set) %>% 10^. -1
}
predict_mpg(6, 250)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...