2016-10-03 99 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個觀測值來預測樣本內。

相關問題