2016-10-03 73 views
0

我想用R.中的支持向量回归预测未来的能源消耗。我有这段代码,但我不确定天气是否正确。在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

+0

你有什么代码? – blacksite

+0

这是他的代码。我使用48个值训练模型,但是我希望模型只预测24个值。 –

+0

我会建议您使用当前输入数据的方法。当你调用'predict'然后使用第二个'data.frame'时,设置两个'data.frames',它们是你的训练和测试/验证集合,最初只提供训练集。您当前的方法在您的环境中有冗余信息。 – zacdav

回答

0

发现使用用于预测的newdata参数(你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 
+0

我试过你的代码,它工作正常。但它不能很好地处理我的数据。如果有任何数据链接是提供的,你可以纠正任何错误http://pastebin.com/MUfWFCPM –

+0

你只有48个数据点,你正在训练整个数据集。你想预测什么?你的代码试图预测行49:72不存在@Akash Joshi –

+0

先生我很抱歉看起来我有一些概念上的差距,我想问的是,是否有可能通过训练来预测第二天看不见的数据模型2天? –

0

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

Y_ {T + H} =阿尔法+ phi_1 Y_ {吨} + phi_2 Y_ {T-1} + E_ {T + H}

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

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

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

在两天内预测温带=阿尔法+ 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个观测值来预测样本内。

相关问题