ニューラルネットワーク、auto.arimaおよびetsを使用したR時系列予測


10

ニューラルネットワークを使用して時系列を予測することについて少し聞いたことがあります。

比較するにはどうすればよいですか?auto.arima(x)、ets(x)、またはnnetar(x)の時系列(日次小売データ)を予測する方法はどちらが優れていますか。

auto.arimaとetsをAICまたはBICで比較できます。しかし、どうすればニューラルネットワークと比較できますか?

例えば:

   > dput(x)
 c(1774, 1706, 1288, 1276, 2350, 1821, 1712, 1654, 1680, 1451, 
 1275, 2140, 1747, 1749, 1770, 1797, 1485, 1299, 2330, 1822, 1627, 
 1847, 1797, 1452, 1328, 2363, 1998, 1864, 2088, 2084, 594, 884, 
 1968, 1858, 1640, 1823, 1938, 1490, 1312, 2312, 1937, 1617, 1643, 
 1468, 1381, 1276, 2228, 1756, 1465, 1716, 1601, 1340, 1192, 2231, 
 1768, 1623, 1444, 1575, 1375, 1267, 2475, 1630, 1505, 1810, 1601, 
 1123, 1324, 2245, 1844, 1613, 1710, 1546, 1290, 1366, 2427, 1783, 
 1588, 1505, 1398, 1226, 1321, 2299, 1047, 1735, 1633, 1508, 1323, 
 1317, 2323, 1826, 1615, 1750, 1572, 1273, 1365, 2373, 2074, 1809, 
 1889, 1521, 1314, 1512, 2462, 1836, 1750, 1808, 1585, 1387, 1428, 
 2176, 1732, 1752, 1665, 1425, 1028, 1194, 2159, 1840, 1684, 1711, 
 1653, 1360, 1422, 2328, 1798, 1723, 1827, 1499, 1289, 1476, 2219, 
 1824, 1606, 1627, 1459, 1324, 1354, 2150, 1728, 1743, 1697, 1511, 
 1285, 1426, 2076, 1792, 1519, 1478, 1191, 1122, 1241, 2105, 1818, 
 1599, 1663, 1319, 1219, 1452, 2091, 1771, 1710, 2000, 1518, 1479, 
 1586, 1848, 2113, 1648, 1542, 1220, 1299, 1452, 2290, 1944, 1701, 
 1709, 1462, 1312, 1365, 2326, 1971, 1709, 1700, 1687, 1493, 1523, 
 2382, 1938, 1658, 1713, 1525, 1413, 1363, 2349, 1923, 1726, 1862, 
 1686, 1534, 1280, 2233, 1733, 1520, 1537, 1569, 1367, 1129, 2024, 
 1645, 1510, 1469, 1533, 1281, 1212, 2099, 1769, 1684, 1842, 1654, 
 1369, 1353, 2415, 1948, 1841, 1928, 1790, 1547, 1465, 2260, 1895, 
 1700, 1838, 1614, 1528, 1268, 2192, 1705, 1494, 1697, 1588, 1324, 
 1193, 2049, 1672, 1801, 1487, 1319, 1289, 1302, 2316, 1945, 1771, 
 2027, 2053, 1639, 1372, 2198, 1692, 1546, 1809, 1787, 1360, 1182, 
 2157, 1690, 1494, 1731, 1633, 1299, 1291, 2164, 1667, 1535, 1822, 
 1813, 1510, 1396, 2308, 2110, 2128, 2316, 2249, 1789, 1886, 2463, 
 2257, 2212, 2608, 2284, 2034, 1996, 2686, 2459, 2340, 2383, 2507, 
 2304, 2740, 1869, 654, 1068, 1720, 1904, 1666, 1877, 2100, 504, 
 1482, 1686, 1707, 1306, 1417, 2135, 1787, 1675, 1934, 1931, 1456)

auto.arimaの使用:

y=auto.arima(x)
plot(forecast(y,h=30))
points(1:length(x),fitted(y),type="l",col="green")

ここに画像の説明を入力してください

> summary(y)
Series: x 
ARIMA(5,1,5)                    

Coefficients:
         ar1      ar2     ar3      ar4      ar5      ma1     ma2      ma3     ma4      ma5
      0.2560  -1.0056  0.0716  -0.5516  -0.4822  -0.9584  1.2627  -1.0745  0.8545  -0.2819
s.e.  0.1014   0.0778  0.1296   0.0859   0.0844   0.1184  0.1322   0.1289  0.1388   0.0903

sigma^2 estimated as 58026:  log likelihood=-2191.97
AIC=4405.95   AICc=4406.81   BIC=4447.3

Training set error measures:
                   ME     RMSE      MAE       MPE     MAPE      MASE
Training set 1.457729 240.5059 173.9242 -2.312207 11.62531 0.6157512

etsの使用:

fit <- ets(x)
plot(forecast(fit,h=30))
points(1:length(x),fitted(fit),type="l",col="red")

ここに画像の説明を入力してください

 > summary(fit)
 ETS(M,N,N) 

 Call:
  ets(y = x) 

   Smoothing parameters:
     alpha = 0.0449 

   Initial states:
     l = 1689.128 

   sigma:  0.2094

      AIC     AICc      BIC 
 5570.373 5570.411 5577.897 

 Training set error measures:
                    ME     RMSE      MAE      MPE     MAPE      MASE
 Training set 7.842061 359.3611 276.4327 -4.81967 17.98136 0.9786665

この場合、auto.arimaはetsよりも適合します。

ニューラルネットワークを歌ってみましょう:

 library(caret)
 fit <- nnetar(x)
 plot(forecast(fit,h=60))
 points(1:length(x),fitted(fit),type="l",col="green")

ここに画像の説明を入力してください

グラフから、ニューラルネットワークモデルは非常によく適合していることがわかりますが、auto.arima / etsとどのように比較できますか?AICの計算方法を教えてください。

もう1つの質問は、auto.arima / etsに自動的に追加されるように、可能な場合、ニューラルネットワークに信頼区間を追加する方法です。

回答:


14

サンプル内フィットは、サンプル外の予測精度の信頼できるガイドではありません。予測精度測定のゴールドスタンダードは、ホールドアウトサンプルを使用することです。トレーニングサンプルから過去30日間を削除し、モデルを残りのデータに適合させ、適合モデルを使用してホールドアウトサンプルを予測し、平均絶対偏差(MAD)または加重平均絶対パーセントエラーを使用して、ホールドアウトの精度を単純に比較します。 (wMAPE)。

これはRを使用した例です。私はM3コンテストの2000シリーズを使用していM3[[2000]]$xますM3[[2000]]$xx。これは、トレーニングシリーズとテストデータに既に分割されています。これは月次データです。最後の2行は2つのモデルからの予測のwMAPEを出力します。ここで、ARIMAモデル(wMAPE 18.6%)が自動的に適合されたETSモデル(32.4%)よりも優れていることがわかります。

library(forecast)
library(Mcomp)

M3[[2000]]

ets.model <- ets(M3[[2000]]$x)
    arima.model <- auto.arima(M3[[2000]]$x)

ets.forecast <- forecast(ets.model,M3[[2000]]$h)$mean
arima.forecast <- forecast(arima.model,M3[[2000]]$h)$mean

sum(abs(ets.forecast-M3[[2000]]$xx))/sum(M3[[2000]]$xx)
sum(abs(arima.forecast-M3[[2000]]$xx))/sum(M3[[2000]]$xx)

また、280〜300の指数付近で異常に売上高が高いようです。これはクリスマスセールですか?このようなカレンダーイベントについて知っている場合は、それらを説明変数として予測モデルにフィードすることをお勧めします。これにより、次にクリスマスが繰り広げられるときに、より良い予測が得られます。これは、ARIMA(X)とNNで簡単に実行できますが、ETSではそれほど簡単ではありません。

最後に、予測に関するこのテキストブックをお勧めします:http : //otexts.com/fpp/


答えてくれてありがとう。あなたの提案はとても良いですが、残念ながらそれらは私には合いません。期間が異なる多くの時系列があり、それらを予測する必要があるため、シンプルで最適なモデルを探しています。AICで手法を比較できれば、一番いいものを選ぶと思いました。
Jurgita

毎回セリエを手動で探すことができないので、最適なモデルを見つけて適用するプログラムを作成する必要があります
Jurgita

auto.arima予測モデルに説明変数(クリスマスの日)を追加することは可能ですか?それとも有馬でしかできないの?
Jurgita

1
シリーズ全体にループを作成し、各シリーズに最適なwMAPEを提供する方法を確認できます。1つの方法が他の方法より明らかに優れている場合は、その方法をすべてのシリーズに使用します。それ以外の場合は、シリーズごとに異なる方法を使用することを検討してください。AICは複数のシリーズであなたを助けません!または、さらに良いのは、価格の変化なども考慮に入れて、毎日の小売時系列を多数予測するための専用ソフトウェアを探すことです。これは私が生計を立てていることです。私は喜んであなたに私たちの営業担当者と連絡を取ります;-)しかし、私もここであなたをお手伝いさせていただきます!
Stephan Kolassa 14年

以下のためにauto.arima()使用し、xregパラメータを。を参照してください?auto.arima
Stephan Kolassa、2014年

4

上記のステファンの提案は良いものです。私は、AICを使用することは間違いなくモデル内で選択する有効な方法であると付け加えますが、モデル間では選択できません。つまり、情報基準を使用して、どのARIMAモデル、どの指数平滑法モデルなどを選択し、サンプル外予測(MASE、MAPEなど)を使用して上位候補を比較することができます(そうすべきです!)。 )。

http://robjhyndman.com/hyndsight/aic/


1

Rob教授によるこのビデオを見る https://www.youtube.com/watch?v=1Lh1HlBUf8k

ビデオでは、ロブ教授が精度関数と、サンプル内精度とサンプル外精度の違いについて教えました。

つまり、データの80〜90%を取り上げ、モデルに適合させ、予測します。次に、10%の予測データを使用して精度を確認します(10%のデータの実際の値があるため、モデルのサンプルの精度を確認できます)

otextのオンライン教科書を参照するだけでなく

他の言及のように、モデルとモデルを比較するときは、正確度()を使用してテストセットと比較します。次に、モデルとモデルを比較するために使用されるMAE、MSE、RMSE ...などのさまざまなエラー測定値を設定できます


0

名前をNNモデルに適合させる代わりに、fit_nnを使用します。同様に、fit_arimaおよびfit_ets。すべてのモデルを比較できるようにします。

library(caret)
#ets
fit_ets <- ets(x)
#ANN
fit_nn <- nnetar(x)
plot(forecast(fit,h=60))
points(1:length(x),fitted(fit_nn),type="l",col="green")
library(forecast)
accuracy(fit_nn)
accuracy(fit_ets)

これで、ME、MAE、または必要なものを使用して両方のモデルを比較できます。


あなたの要点を得るために、私はこれを数回読まなければなりませんでした。変数の命名は優れたコーディング慣行ですが、答えの中心にはなりません。回答の主要部分は最終行にあります(MAEなどを使用)。あなたがそれを強調することができれば(あるいはもっと良いことに、拡大して)、それはこれを改善するでしょう。
mkt-モニカを復活させる

関数の精度(モデル)を使用すると、ME、MAE、RMSE、MPEなどの特定の統計が得られます。それらのいずれかまたはすべてを使用して、2つ以上のモデルを比較できます。たとえば、最小のRMSE(二乗平均平方根誤差)を持つモデルが、すべての中で最良のモデルと見なされるとします。
Komal Batool

知っておくと役に立ちます。しかし、私の質問は、コードは確かに質問と回答を明らかにすることができますが、これはコーディングに関するサイトではないということです。そして、あなたが実質的な問題を強調した場合、あなたの答えはより良いでしょう。
mkt-モニカを復活させる

問題は、ANNをARIMAなどの統計モデルと比較する方法(これらのモデルはAIC値を使用して比較されるため)であり、答えは、MASEやRMSEなどのprecision()関数で取得できる他の統計値を使用することです。そこに混乱のポイントはありません。
Komal Batool
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.