R中使用支持向量回归的预测

时间:2016-10-03 17:02:13

标签: r machine-learning forecasting

我想在R.中使用支持向量回归来预测未来的能源消耗。我有这个代码,但我不确定天气是否正确。

    `#gathering the data
data<-read.csv("C:\\2003_smd_hourly.csv",header=TRUE) #these are the values which are used to train the given model#
data
#data1<-read.csv("C:\\pr.csv",header=TRUE)#this file/ddata is used for checking the accuracy of prediction# 
#data1
#y1<-data1[,15] 
#x0<-data1[,2]  
y<-data[,15]    #sysload
x1<-data[,2]    #houroftheday
x2<-data[,13]     #drybulb temp(actualtemp)
x3<-data[,14]     #dewpnttemp
#train<-sample(744,447)
#train
library(e1071)
model<-svm(y~x1+x2+x3,data=data[1:48,],cost=2.52*10^11,epsilon=0.0150,gamma=1)
model
#pr<-data[-train,]
#pr
predict1<-predict(model,newdata=data[49:72,])
predict1
par(mfrow=c(2,2))
plot(x1,y,col="red",pch=4)
#par(new=TRUE)
plot(x1,predict1,col="blue",pch=5) #plotting the values that have been predicted
#par(new=TRUE)
plot(x0,y1,col="black",pch=1)
error=y1-predict1
error
mae <- function(error)
{
  mean(abs(error))
}
mae(error)

error <- y1 - predict1

error
rmse <- function(error)
{
  sqrt(mean(error^2))
}
svrPredictionRMSE <- rmse(error)
svrPredictionRMSE
max(error)
min(error)

mape <- function(y1,predict1)
mape
mean(abs((y1 - predict1)/y1))*100
mape

`例如:数据可以在http://pastebin.com/MUfWFCPM

找到

2 个答案:

答案 0 :(得分:0)

使用newdata参数进行预测(您测试的新数据应具有与训练数据相同的一组功能)。例如,使用mtcars数据集

library(e1071)
model<-svm(mpg~wt+disp+qsec,data=mtcars[1:24,],cost=512,epsilon=0.01)
model
predict1<-predict(model,newdata=mtcars[25:32,])
predict1 # prediction for the new 8 data points
Pontiac Firebird        Fiat X1-9    Porsche 914-2     Lotus Europa   Ford Pantera L     Ferrari Dino    Maserati Bora       Volvo 142E 
       28.514002        31.184527        23.022863        22.603601         6.228431        30.482475         6.801507        22.939945 

答案 1 :(得分:0)

如果您想预测接下来两天会发生什么,您必须培训模型以预测未来两天。让我们选一个简单的例子,然后我将转向SVR。假设我们使用线性AR直接预测模型,并通过某种方法确定两个滞后就足够了。所以我们有这个模型:

y_ {t + h} = alpha + phi_1 y_ {t} + phi_2 y_ {t-1} + e_ {t + h}

经济学文献称这是AR直接预测,因为它直接输出y_ {t + h},而不是通过提供跨预测的递归关系间接产生y_ {t + h}。假设'y'是以摄氏度为单位的温度,因此您希望使用温度数据在两天内预测温度,直到今天 - 包括 - 。假设我们使用上个月的每日温度。

我们知道普通最小二乘是α,phi_1和phi_2的收敛估计,所以我们可以形成一个矩阵,X,包含一列1,温度滞后h列一列,温度列滞后h + 1次。然后,计算我们的温度矢量y在X上的线性投影,如下所示:估计[alpha,phi_1,phi_2] =(X'X)^ - 1X'Y。

现在,我们估算了整个样本的参数。如果我想知道y_ {t + h},我需要一个常数(我们任意选择'1'估算模型,所以我们将使用'1'),今天的温度和昨天的温度。假设h = 2:

预测两天的温度=今天的alpha + phi_1 x温度+昨天的phi_2 x温度

你知道,训练模型和应用模型之间的区别在于一个简单的转变:y_ {t} = alpha + phi_1 y_ {th} + phi_2 y_ {th-1} + e_ {t}是我们的安装在训练样本中。我们使用这个模型进行的最后样本预测是今天的温度,分别使用3天和4天前的温度。我们还对所有其他观测到的温度进行了最小二乘预测,除了前三个观测值 - 用这个模型预测,我们需要两个观测加上两天的间隙。

现在,对于SVM和SVR,重点非常相似。在回归问题的情况下,您的预测输出是实值标签。假设我们还想提前两天预测温度,使用相同的数据并使用相同的回归量。然后,我们的SVR的输入空间由两个向量定义 - 我们使用的温度相同的两个滞后向量。

当我们在整个数据集上训练SVR时,我们为数据集中的每个观测值生成预测 - 再次,除了前三个观测值。

对于电子不敏感的SVR,让K()成为我们使用的内核,x_i是支持向量(它是y_ {t},y_ {t-1}空间中的一个点),n_sv是支持的数量载体:

y_ {t + h} = sum_ {i = 1} ^ {n_sv}(alpha_i - alpha_i *)K(x_i,x)

预测y_ {t + h}就像询问x的实值标签是什么:你在SVR的训练决策规则中输入最后一个p(在这种情况下,p = 2)观察它给你一个标签。如果它是一个用于分类的支持向量机,训练将产生一个超高速飞机,你可以通过询问“在飞机的哪一侧是它?”来决定输入空间中具有坐标的任何点的标签。这是完全相同的事情,除非你正在寻找一个真正的价值。

因此,在编程方面,您只需要提供一个具有正确维度的向量来“预测”:predict(best_model_you_picked, newdata=appropriate_input_space_vector)

请注意,如果您在“整个样本”上训练模型,但是您使用的某些变量是滞后变量,则模型不适用于非滞后变量的最后几个观察...就像OLS估计的AR模型不使用最后的h观测来预测样本内。