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)
包装在函数predict_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)
下一个代码块与函数predict_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的拟合值
答案 0 :(得分:2)
这将是我的版本。最重要的部分是我在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)