2016-04-13 6 views
3

Ich habe eine Frage zu Zeitreihen und SVM. Ich habe das mächtige Internet gefragt, aber leider ist die Information knapp und beschäftigt sich hauptsächlich mit Handelsdaten.R: Zwei Ansätze zur Prognose von monatlichen Verkaufsdaten mit Support Vector Machines

Meine Situation ist die folgende: Zurzeit versuche ich, von Arima-Vorhersagen zu anspruchsvolleren Modellen zu wechseln. Derzeit versuche ich ein SVM-Modell zu verstehen und zu implementieren. Ich habe einige Daten über die monatlichen Verkäufe asiatischer Autos auf dem US-Markt gefunden. Jetzt experimentiere ich mit diesen Daten.

Zuerst gehe ich Zeitreihenprognosen mit SVR/SVM mit zwei verschiedenen Routinen an. Als nächstes implementiere ich eine absolut einfache auto.arima auf den gleichen Daten. Schließlich vergleiche ich die Residuen dieser 3 Ansätze.

Meine Fragen sind: Bin ich mit diesen Implementierungen in die richtige Richtung? Wie kann ich die SVM-Modelle verbessern? Gibt es mehr Informationen zur Prognose als andere Finanzdaten?

Lassen Sie sich mit einem kleinen Problem zu umgehen beginnen zu meiner Eingangsmatrix (Daten aus goodcarbadcar.net) zu konstruieren:

library(zoo) 
library(e1071) 
library(quantmod) 
library(kernlab) 
library(caret) 
library(forecast) 

Date <-c("2010-01-01", "2010-02-01", "2010-03-01", "2010-04-01", "2010-05-01", "2010-06-01", "2010-07-01", "2010-08-01", "2010-09-01", 
    "2010-10-01", "2010-11-01", "2010-12-01", "2011-01-01", "2011-02-01", "2011-03-01", "2011-04-01", "2011-05-01", "2011-06-01", 
    "2011-07-01", "2011-08-01", "2011-09-01", "2011-10-01", "2011-11-01", "2011-12-01", "2012-01-01", "2012-02-01", "2012-03-01", 
    "2012-04-01", "2012-05-01", "2012-06-01", "2012-07-01", "2012-08-01", "2012-09-01", "2012-10-01", "2012-11-01", "2012-12-01", 
    "2013-01-01", "2013-02-01", "2013-03-01", "2013-04-01", "2013-05-01", "2013-06-01", "2013-07-01", "2013-08-01", "2013-09-01", 
    "2013-10-01", "2013-11-01", "2013-12-01", "2014-01-01", "2014-02-01", "2014-03-01", "2014-04-01", "2014-05-01", "2014-06-01", 
    "2014-07-01", "2014-08-01", "2014-09-01", "2014-10-01", "2014-11-01", "2014-12-01", "2015-01-01", "2015-02-01", "2015-03-01", 
    "2015-04-01", "2015-05-01", "2015-06-01", "2015-07-01", "2015-08-01", "2015-09-01", "2015-10-01", "2015-11-01", "2015-12-01", 
    "2016-01-01", "2016-02-01", "2016-03-01") 

Nissan <- c(55861, 63148, 85526, 56558, 75673, 56266, 72573, 67399, 65900, 61843, 63184, 81228, 64442, 83226, 109854, 64765, 69759, 
      65659, 77191, 82517, 84485, 75484, 76754, 89937, 72517, 97492, 126132, 64200, 81202, 81801, 86722, 87360, 82462, 70928, 
      84300, 86663, 73793, 90489, 126623, 80003, 106558, 95010, 101279, 108614, 77828, 81866, 93376, 96526, 81472, 105631, 136642, 
      94764, 125558, 101069, 112914, 125224, 95118, 94072, 91790, 105311, 94449, 106777, 132560, 99869, 124305, 114243, 120439, 
      122716, 111562, 104904, 95389, 124207, 97220, 120540, 149784,) 

Mitsubishi <- c(4170, 4019, 5434, 3932, 4737, 4198, 5648, 4293, 4961, 5111, 4306, 4874, 5714, 6893, 7560, 8081, 7568, 8299, 7972, 
       7985, 5803, 4378, 3735, 5032, 4711, 4736, 7160, 5280, 5575, 5411, 4194, 4249, 4806, 3981, 3574, 4113, 4659, 6051, 
       5286, 4461, 4715, 5297, 5230, 5281, 4001, 4752, 6071, 6423, 4867, 5977, 8996, 6542, 7269, 6021, 6349, 6786, 5558, 
       6199, 6534, 6545, 1112, 1184, 1715, 1933, 1996, 1982, 2052, 2320, 2066, 1984, 1637, 1403, 1288, 1547, 2123) 

mydata <- data.frame(Date, Nissan, Mitsubishi) 
mydata$Date <- as.Date(mydata$Date, format = "%Y-%m-%d") 
mydata <- xts(mydata[,-1], order.by = mydata[,1]) 

So habe ich den gleichen Eingang wie bei dem CSV-Import. Im nächsten Schritt wird ein Datenrahmen definiert, der die Grundlage für weitere Analysen bildet.

uns, dass die Verkäufe von Nissan t abhängig vom Umsatz zum Zeitpunkt t-1, t-2 und t-3 zum Zeitpunkt Nehmen wir an. Des Weiteren davon aus, dass Umsatz von Nissan zum Zeitpunkt t auch auf Mitsubishi hängen bei t-3

nun zum ersten Ansatz. Hier verwende ich Zeitscheiben

#################### 
#Use SVR technique# 
#################### 

Nissan <- data$Nissan 
Mitsubishi <- data$Mitsubishi 

#Assume dependency on Nissan Lag1 + Lag2 and Mitsubishi Lag1 
feature = merge(lag(Nissan,1),lag(Nissan,2), lag(Nissan,3), 
      lag(Mitsubishi,3), 
      all=FALSE) 

colnames(feature) = c("n.lag.1", "n.lag.2", "n.lag.3", 
         "m.lag.3") 

#TARGET to predict: Nissan 
dataset = na.trim(merge(feature,Nissan,all=FALSE)) 

#Label columns of dataset 
colnames(dataset) = c("n.lag.1", "n.lag.2", "n.lag.3", 
         "m.lag.3", 
         "TARGET") 

################# 
#Use Time Slices# 
################# 

myTimeControl <- trainControl(method = "timeslice", 
           initialWindow = 48, 
           horizon = 6, 
           fixedWindow = TRUE) 

TimeModel <- train(TARGET ~ ., 
        data = dataset, 
        method = "pls", 
        preProc = c("center", "scale"), 
        trControl = myTimeControl) 
TimeModel 

#################################### 
#Predict with control data set 2016# 
#################################### 

#Define the test set 
control.feature <- merge(lag(mydata$Nissan["2010/2016"],1), lag(mydata$Nissan["2010/2016"],2), lag(mydata$Nissan["2010/2016"],3), 
         lag(mydata$Mitsubishi["2010/2016"],3), 
         all = FALSE) 

colnames(control.feature) = c("n.lag.1", "n.lag.2", "n.lag.3", 
         "m.lag.3") 

#Make a prediction 
svr.fc <- predict(TimeModel, control.feature["2016"]) 

#Show SVR Residuals 

Nun würde Ich mag meinen zweiter Ansatz zeigen, auf dem Paket E1071 unter Berufung

#################### 
#Use Package e1071# 
#################### 

#initialize svm model 
nissan.model <- svm(TARGET ~ ., dataset) 

#test model on the existing set 
nissanY <- predict(nissan.model, dataset) 
plot(index(dataset),dataset[,ncol(dataset)], pch=16) 
points(index(dataset),nissanY, col="red", pch=4) 

#predict 2016 values and compare with actuals 
predictY <- predict(nissan.model, control.feature["2016"]) 
mydata$Nissan["2016"] - predictY 

#tune the existing model with grid search 
nissan.tuneResult <- tune(svm, TARGET ~ ., data = dataset, 
        ranges = list(epsilon = seq(0,1, 0.01), cost=2^(2:9))) 
print(nissan.tuneResult) 
plot(nissan.tuneResult) 

#initialize tuned model 
tuned.nissan.model <- nissan.tuneResult$best.model 
tuned.nissanY <- predict(tuned.nissan.model, dataset) 

plot(index(dataset),dataset[,ncol(dataset)], pch=16) 
points(index(dataset),tuned.nissanY, col="red", pch=4) 

#compare 2016 forecast and actual values 
tuned.predictY <- predict(tuned.nissan.model, control.feature["2016"]) 

Last but not least stellt ich meine Vanille auto.arima.

############################ 
#Use time series techniques# 
############################ 

#Define time series which should be forecasted 
nissan.ts <- ts(data$Nissan, frequency = 12, start = c(2010,1)) 

#Assume that Nissan depends on Mitsubishi 
xreg <- data.frame(data$Mitsubishi) 

#auto.arima on Nissan with XREG = Mitsubishi 
arima.fit <- auto.arima(nissan.ts, D = 1, xreg = xreg) 
arima.fc <- forecast(arima.fit, xreg = xreg) 

#How did the ARIMA forecast perform in the first quarter of 2016 
comparison.arima <- actual$Nissan - arima.fc$mean[1:3] 
rmse.arima <- sqrt(sum((actual$Nissan - arima.fc$mean[1:3])^2/3)) 

Und schließlich der Vergleich der Residuen aus diesen 3 nähert sich

#Print the details ARIMA 
comparison.arima 
#Print details e1071 
mydata$Nissan["2016"] - tuned.predictY 
#Print details Time Slices 
mydata$Nissan["2016"] - svr.fc 

Meine eigenen Schlüsse sind:

  1. auto.arima Nutzungen (2,1,0) -Modell. Ich habe 3 Verzögerungen im SVM-Modell. Also der Unterschied
  2. Auto.arima verwendet keine lag (Mitsubishi, 3) aber nur XREG (Mitsubishi)
  3. beide SVM-Modelle verwenden nur einige Annahmen ohne weitere Spezifikation
  4. schließlich die Datenmenge genug für SVM nicht hoch

Ich würde mich freuen, wenn Sie mir ein paar Tipps zu meinen Fragen geben oder noch mehr über die Modelle diskutieren könnten. Mit freundlichen Grüßen

Alex

+0

Viele Wörter hier. Gibt es speziell eine Programmierfrage? – cory

+0

"Werden die Bibliotheken e1071 und kernlab richtig verwendet?" das wäre "die eine und einzige" Frage – Alex

Antwort

0

Alex, Warum sind Sie unter der Annahme, dass Mitsubishi einen Einfluss auf Y. Bad Dinge hat geschehen, wenn Sie zusammen unkorrelierte Daten erzwingen. Ich zeichnete Y und X in einem normalisierten Streudiagramm, wobei X um 3 Perioden nach unten verschoben war (dh Verlieren der ersten 3 Beobachtungen). Dies scheint nicht korreliert zu sein, was ein Teil Ihres Problems sein könnte.

enter image description here

Die Mitsubishi Daten hatten eine große Abnahme in der Periode 61 und Nissan war unbeeinflusst. Dies unterstützt, dass es keine Beziehung gibt. Es gibt so viele wirklich gute kausale Beispiele, die Sie vielleicht zuerst versuchen möchten (Lydia Pinkham oder Gasofen mit Luft & Methan von Box-Jenkins)