2016-04-13 20 views
3

Zaman serisi ve SVM ile ilgili bir sorum var. Güçlü internet sordum ama maalesef bilgi az ve ticaret verileri ile ilgilidir.R: Destek vektör makineleri ile aylık satış verilerini tahmin etmede iki yaklaşım

Durumum şu: Şu anda Arima tahminlerinden daha gelişmiş modellere geçmeyi deniyorum. Şu anda bir SVM modelini anlamaya ve uygulamaya çalışıyorum. ABD pazarında asyalı arabaların aylık satışları hakkında bazı veriler buldum. Şimdi bu verileri deneyeceğim.

İlk olarak, iki farklı rutine sahip SVR/SVM ile zaman dizisi tahminine yaklaşıyorum. Ardından aynı veriler üzerinde mutlak basit bir auto.arima uygularım. Son olarak, bu 3 yaklaşımın kalıntılarını karşılaştırıyorum.

Sorularım şunlardır: Bu uygulamalarla doğru yönde ilerliyor muyum? SVM modellerini nasıl geliştirebilirim? Finansal veriler dışındaki öngörülerle ilgili daha fazla bilgi var mı?

en (goodcarbadcar.net verileri) benim giriş matrisini oluşturmak için küçük bir çözüm ile başlar edelim:
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]) 

Böylece .csv alma ile aynı girişi vardır. Sonraki adım, daha fazla analiz için temel olacak bir data.frame tanımlamaktır.

alalım o zaman Nissan satışların satış bağlıdır t zamanında de t-1, t-2 ve t-3. Ayrıca zaman t de Nissan satışları da ilk yaklaşıma Şimdi t-3

de Mitsubishi bağlı olduğunu varsayalım. İşte Zaman Dilimleri

#################### 
#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 

Şimdi benim ikinci yaklaşım paket e1071

#################### 
#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"]) 

Son güvenerek ama en az benim vanilya auto.arima sunmak göstermek istiyorum kullanın.

  1. auto.arima kullanımları (2,1,0) modeli:
    ############################ 
    #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)) 
    

    Ve

    nihayet bu 3 ila artıkların karşılaştırılması

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

    Kendi sonuçlar şunlardır yaklaşır. SVM modelinde 3 gecikme var. Böylece arasındaki fark

  2. otomatiktir.Arima sonunda veri miktarı SVM
  3. için yeterli yüksek değildir
  4. iki SVM modelleri sadece daha tarifnamede
  5. olmadan bazı varsayım kullanmak lag (Mitsubishi, 3) ama sadece xreg (Mitsubishi) kullanmıyorsa

Sorularımın bazı ipuçlarını verebilirseniz veya modelleri daha fazla tartışırsanız memnun olurum. Saygılarımızla

Alex

+0

Burada bir çok kelime. Özellikle bir programlama sorusu var mı? – cory

+0

"Kütüphaneler e1071 ve kernlab uygun şekilde kullanılıyor mu?" Bu "tek ve tek" soru olurdu – Alex

cevap

0

Alex, neden birlikte ilintisiz verileri zorlamak ne zaman Mitsubishi Y. Kötü şeyler üzerinde bir etkisi vardır gerçekleşmesi varsayıyoruz. X ve 3 periyotlarını (yani, ilk 3 gözlemi kaybetmek) kaydırarak, normalize bir dağılım grafiğinde Y ve X'i çizdim. Bu, sorununun bir parçası olabilecek ilişkili görünmüyor.

enter image description here

Mitsubishi veri

dönemi 61 de büyük bir düşüş oldu ve Nissan etkilenmemiştir. Bu, hiçbir ilişki olmadığını desteklemektedir. Önce denemek isteyebileceğiniz pek çok gerçek iyi örnek vardır (Box-Jenkins'den Lydia Pinkham veya Gas Ocağı ile & Metan)

İlgili konular