我正在研究一种预测功能,该功能使用遗传算法优化RBF内核的nu-SVR超参数。该模型包括因变量的滞后值和其他回归量的滞后值。
关于我做什么的一些说明
GA用于适应性的标准是减去样本外的均方误差。使用扩展窗口预测练习生成OOS错误。如果你遗漏了100个观测训练集中的30%,那么遗传算法将使用超参数估计X许多SVR,它从1到(70-h + 1)的观测值中选择,其中h是预测范围。然后,它将针对所考虑的所有超参数值预测观测值70并计算误差。然后,窗口扩展到包括观察(71-h + 1)并重复该过程。 GA在一代中考虑的所有超参数将产生30个OOS预测误差。每个超参数向量的适应度是-mean(errors ^ 2)。
我使用输出列表列表的自定义函数为扩展窗口练习生成子样本。在上面的示例中,列表中有30个项目。在每种情况下,[[1]]将是用于估计的子样本,[[2]]包含用于进行预测和收集误差的观察矩阵的行。在所有情况下,第一列包含因变量,其他列包含回归量。
回归矩阵也是使用自定义函数制作的。它还使用自定义函数来计算GA的MSE和模型适应度。我使用套餐' e1071'对于SVR和' GA'对于遗传算法。
问题
昨天,一切都运转正常。我实际上设法运行遗传算法,获得最佳hp并产生预测。今天,我添加了一个函数来为“预测函数”创建一个合适的矩阵。并设法使用最佳hp和最后观察到的值获得预测。遗憾的是,我没有保存很多我的工作副本(我再也不会这样做了),所以我无法取回工作代码。
但是,我可能在我的一个自定义函数中的某处改变了一行。问题的复杂性在于' ga'调用' fit_fct',调用' mse_fct',调用' svm' ...如果你单独运行这些功能,它们可以很好地处理对象我使用(即fit_fct,mse_fct和所有其他函数都可以自己工作。问题实际上就是如何调用它们。)
我收到此错误消息:
' svm.default中的错误(x,y,scale = scale,...,na.action = na.action): 外国函数调用中的NA / NaN / Inf(arg 12)'
现在,我将为您提供重现所有内容的代码。首先,所有功能:
# TS_validation -------------------------------------------
TS_samples <- function(data, frac, h){
# Description: this function forms training and test samples
# in an extended window POOS pattern.
#
# INPUTS
# Data contains both left hand and right hand side variables
# frac is the fraction used for testing the model
# h is the forecast horizon
#
# OUTPUTS
# list_TS is a list containing both training and test sets
# organized as follows: list_TS[[sample]][[type]] where
# type==1 is the training set and type==2 is the test set.
bigt <- nrow(data) # Length of training set
tau <- round((1-frac)*bigt) # Start of OOS
list_TS <- lapply(tau:bigt, function(i) list(
train <- data[1:(i-h),],
test <- data[i,]
))
return(list_TS)
} # ----------------------------------------------------- #
# MSE function for SVM ------------------------------------
mse_fct <- function(formula_svm, train, test, cost, gamma, nu){
# Description: computes MSE for an nu-SVR using training
# and test sets.
#
# NOTE: variable to forecasted must be in the first column
# Dependencies: e1071
#
# INPUTS
# formula_svm is the structure of the model
# train and test are training and test sets
# cost, gamma and nu are the hyperparameters of the SVM
#
# OUTPUTS
# mse (mean squared error)
test <- as.matrix(test)
if (dim(test)[2] == 1){
test <- t(test)
}
# TRAIN MODEL
mdl <- svm(formula_svm, data=train,
kernel='radial', type='nu-regression',
cost=cost, gamma=gamma, nu=nu)
# PREDICT LABELS
mse <- mean((predict(mdl, newdata=test) - test[,1])^2, na.rm=TRUE)
return(mse)
} # ----------------------------------------------------- #
# Fitness function for GA ---------------------------------
fit_fct <- function(x, list_data, formula_svm){
# Nu-SVR parameters
cost <- x[1]
gamma <- x[2]
nu <- x[3]
# Get MSE across all folds
a <- list_data
mse_value <- sapply(1:length(a),
function(i) mse_fct(formula_svm = formula_svm,
train=a[[i]][[1]], test=a[[i]][[2]],
cost=cost, gamma=gamma, nu=nu))
# Fitness measure is maximized, thus -mse
fit <- -mean(mse_value)
return(fit)
} # ----------------------------------------------------- #
# Function to make regression matrix ----------------------
make_reg_matrix <- function(y,factors,h,max_y,max_f){
# Description: This function creates a regression matrix
# containing the dependent variable, y, its lagged values
# from h to max_y and lagged exogenous regressors,
# from lag h to max_f
#
# NOTE: y and factors must of same time dimension.
#
# OUTPUT
# First column is dependent variable. All others are
# regressors.
if (max_y < h || max_f < h){
stop('Lags must be greater than or equal to forecast horizons.')
}
bigt <- nrow(as.matrix(y)) # Time dimension
bign <- ncol(as.matrix(factors)) # Number of factors
lags <- sapply(h:max_y, function(i) c(array(NA,dim=i),y[1:(bigt-i)]))
f <- do.call(cbind, lapply(h:max_f, function(i)
rbind(array(NA,dim=c(i,bign)),
factors[1:(bigt-i),]))
)
reg <- cbind(y,lags,f)
colnames(reg) <- 1:ncol(reg)
return(reg)
}
现在,这里的代码类似于我正在编写的函数。在我看来,以这种方式跟踪错误更简单,而且确实产生完全相同的错误 问题,所以如果它在这里得到解决,它会在任何地方得到解决:
set.seed(1234)
y <- as.matrix(rnorm(100))
factors <- array(rnorm(200), dim=c(100,2))
max_y <- 3
max_f <- 3
frac <- .3
h <- 2
# FORECASTING CODE
# Range of hyperparameters
min_theta <- c(abs(median(y)-3*sd(y)), 2^(-5), 0.1)
max_theta <- c(abs(median(y)+3*sd(y)), 2^5, 0.7)
# Make regressor matrix and last observed values
train <- make_reg_matrix(y,factors,h,max_y,max_f)
# Drop NAs (if any)
drop <- max(sapply(seq_along(colnames(train)),
function(i) sum(is.na(train[,i]))))
train <- train[-c(1:drop),] # Dropping missing values
# Add names to columns for formulas
colnames(train) <- paste('V', colnames(train), sep='')
# Make newdata for prediction (last observations)
last <- make_last(y,factors,h,max_y,max_f)
# Make samples
samples <- TS_samples(train,frac,h)
# Genetic algorithm
formula_svm <- as.formula(c('V1 ~ 1 +',
paste(paste('V', 2:ncol(train), sep=''),
collapse='+')))
results <- ga(type = "real-valued", fitness = fit_fct, samples,
formula_svm,
names = c('Cost', 'Gamma', 'Nu'),
min = min_theta, max = max_theta,
popSize = 50, maxiter = 10, maxFitness=-0.002,
seed = 1071)
您可以尝试单独调用每个函数(mse_fct,fit_fct等),并确保它们确实可以自行运行。当我打电话给#ga;时,这只是一个问题,这很奇怪,因为它真正做的就是选择超参数向量并调用&#39; fit_fct&#39;评估健康......
如果有人提出解决方案,我会非常满意,因为我完全不知道发生了什么。提前感谢您的帮助。