支持向量机 - R代码 - 预测时间序列的残差

时间:2017-01-14 16:52:57

标签: r svm prediction

我正在尝试使用R代码预测时间序列的残差。我的数据集有以下两列(我将放置前10行的样本):

Observation Residuals
1   -0,087527458
2   -0,06907199
3   -0,066604145
4   -0,07796713
5   -0,081723932
6   -0,094046868
7   -0,101535816
8   -0,101884203
9   -0,11131246
10  -0,092548176

对于预测,我正在使用R:

构建支持向量机
# Load the data from the csv file
dataDirectory <- "C://"  
data <- read.csv(paste(dataDirectory, "Data_SVM_Test.csv", sep=""),sep=";", header = TRUE)
head(data)
# Plot the data 
plot(data, pch=16)

# Create a linear regression model
model <- lm(Residuals ~ Observation, data)

# Add the fitted line
abline(model)

predictedY <- predict(model, data)

# display the predictions
points(data$Observation, predictedY, col = "blue", pch=4) 

# This function will compute the RMSE
rmse <- function(error)
{
  sqrt(mean(error^2))
}

error <- model$residuals  # same as data$Y - predictedY
predictionRMSE <- rmse(error)   # 5.70377

plot(data, pch=16)

plot.new()
# svr model ==============================================
if(require(e1071)){ 
  model <- svm(Residuals ~ Observation , data)

  predictedY <- predict(model, data)

  points(data$Observation, predictedY, col = "red", pch=4)

  # /!\ this time  svrModel$residuals  is not the same as data$Y - predictedY
  # so we compute the error like this
  error <- data$Residuals - predictedY  
  svrPredictionRMSE <- rmse(error)  # 3.157061 
} 

当我执行上面的代码时,我收到以下错误消息,没有任何输出:

Warning message:
In Ops.factor(data$Residuals, predictedY) : ‘-’ not meaningful for factors

任何人都知道如何解决这个错误?

非常感谢!

1 个答案:

答案 0 :(得分:0)

使用svm进行分类时,输出的类型为factor。这来自文档:

  

svm的输出:预测值的矢量​​(用于分类:标签矢量,用于密度估计:逻辑矢量)。

从以下示例可以看出:

library(e1071)
model <- svm(Species ~ ., data = iris)
> str( predict(model, iris))
 Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...

您的数据也是如此。级别显示PredictedY是一个因素:

> predictedY <- predict(model, df)
> predictedY
           1            2            3            4            5            6            7            8            9           10 
-0,087527458  -0,06907199 -0,066604145  -0,07796713 -0,081723932 -0,094046868 -0,101535816 -0,101884203  -0,11131246 -0,092548176 
Levels: -0,066604145 -0,06907199 -0,07796713 -0,081723932 -0,087527458 -0,092548176 -0,094046868 -0,101535816 -0,101884203 -0,11131246

在您的代码行predictedY <- predict(model, data)中,predictedY属于类型因素。如果您尝试从某个因子中扣除一个数字(反之亦然),则会收到错误:

> 1:10 - as.factor(1:10)
 [1] NA NA NA NA NA NA NA NA NA NA
Warning message:
In Ops.factor(1:10, as.factor(1:10)) : ‘-’ not meaningful for factors

如果您想使其有效,则需要使用as.numeric将因子转换为数字。 1:10 - as.numeric(as.factor(1:10))

我不知道你的数据是什么样的,但我从问题的标题来看svm对于时间序列可能不是一个好主意。