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:
- auto.arima Nutzungen (2,1,0) -Modell. Ich habe 3 Verzögerungen im SVM-Modell. Also der Unterschied
- Auto.arima verwendet keine lag (Mitsubishi, 3) aber nur XREG (Mitsubishi)
- beide SVM-Modelle verwenden nur einige Annahmen ohne weitere Spezifikation
- 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
Viele Wörter hier. Gibt es speziell eine Programmierfrage? – cory
"Werden die Bibliotheken e1071 und kernlab richtig verwendet?" das wäre "die eine und einzige" Frage – Alex