【问题标题】:Forecasting using support vector regression in R在 R 中使用支持向量回归进行预测
【发布时间】:2016-10-03 17:02:13
【问题描述】:

我想在 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

【问题讨论】:

  • 你已经有什么代码了?
  • 这是他的代码。我使用 48 个值训练模型,但我希望模型只预测 24 个值
  • 我建议您不要使用当前用于输入数据的方法。设置两个data.frames,它们是你的训练和测试/验证集,最初只提供训练集,当你调用predict时,然后使用第二个data.frame。您当前的方法在您的环境中有冗余信息。

标签: r machine-learning forecasting


【解决方案1】:

使用 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 

【讨论】:

  • 我试过你的代码,它工作正常。但它不能很好地处理我的数据。如果数据链接与提供的pastebin.com/MUfWFCPM一样,你能纠正任何错误@
  • 您只有 48 个数据点,您正在对整个数据集进行训练。你想预测什么?您的代码尝试预测不存在的第 49:72 行@Akash Joshi
  • 先生,对不起,我想问的是我在概念上有一些差距,是否可以通过训练模型 2 天来预测第二天看不见的数据?
【解决方案2】:

如果您想预测未来两天会发生什么,您必须训练一个模型来预测未来两天。让我们举一个简单的例子,然后我将转向 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”是以摄氏度为单位的温度,因此您想使用直到今天(包括今天)的温度数据来预测两天内的温度。假设我们使用上个月的每日温度。

我们知道普通最小二乘法是 alpha、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_{t-h} + phi_2 y_{t-h-1} + e_{t} 就是我们适合训练样本。我们使用该模型进行的最后一次样本内预测是今天的温度,分别使用 3 天和 4 天前的温度。除了前三个观测值外,我们还对所有其他观测到的温度进行了最小二乘预测——要使用这个模型进行预测,我们需要两个观测值加上两天的间隔。

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

当我们在整个数据集上训练 SVR 时,我们会为数据集中的每个观察结果生成预测——同样,除了前三个观察结果。

对于 e-insensitive 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 个观测值来预测样本内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 2013-05-27
    • 2021-01-19
    • 2013-03-24
    • 2018-08-11
    • 2014-08-22
    • 2015-07-11
    • 2013-05-25
    相关资源
    最近更新 更多