2016-04-13 8 views
3

私は時系列とSVMに関する質問があります。私は強力なインターネットに尋ねましたが、残念ながらその情報は不足しており、ほとんどの取引データに関心があります。R:サポートベクターマシンを使用した月次売上データ予測に関する2つのアプローチ

私の状況は以下の通りです。 現時点では、有馬予報からより洗練されたモデルに切り替えるようにしています。現在私はSVMモデルを理解し実装しようとしています。私は米国市場で毎月のアジア車の販売に関するデータを見つけました。今私はこのデータを実験します。

最初に、2つの異なるルーチンを使用してSVR/SVMで時系列予測を行います。 次は、同じデータに完全に単純なauto.arimaを実装します。 最後に、これら3つのアプローチの残差を比較します。

私の質問は次のとおりです: 私はこれらの実装で正しい方向に向かっていますか? SVMモデルを改善するにはどうすればよいですか? 財務データ以外の予測に関する情報はありますか?

は私の入力行列(goodcarbadcar.netからのデータ)を構築するために、小さな問題を回避するで始まるのをしてみましょう:

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

したがって、私は.CSVインポートと同じ入力を持っています。 次のステップでは、後で分析するための基礎となるdata.frameを定義します。

は、私たちは仮定しましょう、その時点で日産の販売が売上に依存 トン時点でT-1トン-2トン-3。さらに、時間トンでの日産の販売はまた、最初のアプローチに今トン-3

で三菱に依存していることを前提としています。ここで私はタイムスライス

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

は今、私は私の第二のアプローチは、パッケージ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"]) 

最後に頼るのではなく、少なくとも私は私のバニラ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)) 

そして最後に、これら3からの残差の比較は

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

私自身の結論に近づいては、以下のとおりです。

  1. auto.arimaの用途(2,1,0)モデル。 SVMモデルには3つのラグがあります。したがって、 差異
  2. auto。有馬は、最終的にデータ量をSVM
  3. ために十分 高くない
  4. 両方SVMモデルはちょうどさらに仕様
  5. ことなく、いくつかの仮定を使用ラグ(三菱、3)ちょうど XREG(三菱)を使用しません

私の質問にいくつかのヒントを与えたり、モデルについてさらに話したりできたらうれしいです。敬具

アレックスは

+0

ここにはたくさんの言葉があります。質問、具体的にはプログラミングに関する質問はありますか? – cory

+0

"ライブラリe1071とkernlabは適切な方法で使用されていますか?"それは "唯一の"質問になるでしょう – Alex

答えて

0

アレックス、なぜあなたはあなたが一緒に無相関のデータを強制する際に、三菱はY.悪いものに影響を与えているが起こると想定されています。私はXを3周期下にずらして(すなわち、最初の3つの観察を失った)正規化した散布図にYとXをプロットしました。これはあなたの問題の一部であるかもしれない相関関係には見えません。

enter image description here

三菱データは期間61で主要な減少があったと日産は影響を受けませんでした。これは関係がないことを支持する。あなたが最初に試してみたいかもしれない多くの本当の良い因果事例があります(Lydia PinkhamまたはGas Furnace with Air &メタンfrom Box-Jenkins)

関連する問題