การพยากรณ์อนุกรมเวลา R ด้วยเครือข่ายประสาทเทียม auto.arima และ ets


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 ได้อย่างไร

คำถามอื่นคือจะเพิ่มช่วงความมั่นใจสำหรับเครือข่ายประสาทได้อย่างไรหากเป็นไปได้เช่นนั้นจะถูกเพิ่มโดยอัตโนมัติสำหรับ auto.arima / ets

คำตอบ:


14

พอดีในตัวอย่างไม่ใช่คู่มือที่เชื่อถือได้สำหรับความแม่นยำในการพยากรณ์นอกตัวอย่าง มาตรฐานทองคำในการวัดความแม่นยำในการพยากรณ์คือการใช้ตัวอย่างที่เก็บไว้ ลบ 30 วันล่าสุดออกจากตัวอย่างการฝึกอบรมปรับโมเดลของคุณให้พอดีกับข้อมูลส่วนที่เหลือใช้แบบจำลองที่ติดตั้งไว้เพื่อคาดการณ์ตัวอย่างของการรอออกและเพียงเปรียบเทียบความถูกต้องของการออกโดยใช้ค่าเฉลี่ย Absolute Deviations (MAD) หรือ (wMAPEs)

นี่คือตัวอย่างการใช้อาร์ฉันใช้ชุดที่ 2000 ของการแข่งขัน M3 ซึ่งแบ่งออกเป็นชุดการฝึกอบรมM3[[2000]]$xและข้อมูลการทดสอบM3[[2000]]$xxแล้ว นี่คือข้อมูลรายเดือน สองบรรทัดสุดท้ายแสดงผล 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) และ NNs ไม่ใช่อย่างง่ายดายใน ETS

ในที่สุดฉันขอแนะนำหนังสือเล่มนี้เกี่ยวกับการคาดการณ์: http://otexts.com/fpp/


ขอบคุณสำหรับคำตอบ คำแนะนำของคุณดีมาก แต่น่าเสียดายที่พวกเขาไม่เหมาะกับฉัน ฉันมีซีรีย์เวลาจำนวนมากที่มีช่วงเวลาต่างกันและฉันต้องทำการคาดการณ์สำหรับพวกเขาดังนั้นฉันจึงกำลังมองหาโมเดลที่เรียบง่ายและดีที่สุด ฉันคิดว่าถ้าฉันสามารถเปรียบเทียบวิธีการโดย AIC แล้วฉันจะเลือกวิธีที่ดีที่สุด
Jurgita

ฉันไม่สามารถมองหาเซเรียในแต่ละครั้งด้วยตนเองฉันควรจะเขียนโปรแกรมที่จะหารูปแบบที่ดีที่สุดและใช้มัน
Jurgita

เป็นไปได้หรือไม่ที่จะเพิ่มตัวแปรอธิบาย (วันคริสต์มาส) ให้กับตัวแบบพยากรณ์อัตโนมัติ หรือเป็นไปได้เฉพาะเมื่อทำงานกับ arima?
Jurgita

1
คุณสามารถเขียนวนรอบชุดของคุณและดูว่าวิธีใดให้ wMAPE ที่ดีที่สุดสำหรับแต่ละชุด หากวิธีหนึ่งมีประสิทธิภาพเหนือกว่าวิธีอื่นอย่างชัดเจนให้ใช้วิธีนั้นในทุกซีรี่ส์ มิฉะนั้นคิดเกี่ยวกับการใช้วิธีการที่แตกต่างกันต่อชุด AIC จะไม่ช่วยคุณในหลายซีรี่ส์! หรือดีกว่านั้นให้มองหาซอฟต์แวร์เฉพาะสำหรับการคาดการณ์ซีรีย์ค้าปลีกรายวันจำนวนมากที่คำนึงถึงการเปลี่ยนแปลงราคาและอื่น ๆ ด้วย นี่คือสิ่งที่ฉันทำเพื่อหาเลี้ยงชีพฉันจะทำให้คุณติดต่อกับพนักงานขายของเราอย่างมีความสุข ;-) แต่ฉันก็ยินดีที่จะช่วยเหลือคุณที่นี่!
เตฟาน Kolassa

สำหรับauto.arima()ใช้xregพารามิเตอร์ ?auto.arimaดู
เตฟาน Kolassa

4

คำแนะนำของสเตฟานด้านบนเป็นสิ่งที่ดี ฉันจะเพิ่มว่าการใช้ AIC เป็นวิธีที่ถูกต้องในการเลือกภายในรุ่น - แต่ไม่ใช่ในหมู่พวกเขา นั่นคือคุณสามารถ (และควร!) ใช้เกณฑ์ข้อมูลเพื่อเลือกแบบจำลอง ARIMA ซึ่งแบบจำลองการยกกำลังแบบเอ็กซ์โปเนนเชียล ฯลฯ และเปรียบเทียบผู้สมัครอันดับต้นของคุณโดยใช้การทำนายตัวอย่าง (MASE, MAPE ฯลฯ ) )

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


1

ดูวิดีโอนี้โดยศาสตราจารย์ Rob https://www.youtube.com/watch?v=1Lh1HlBUf8k

ในวิดีโอศาสตราจารย์ร็อบสอนเกี่ยวกับฟังก์ชั่นความแม่นยำและความแตกต่างระหว่างความถูกต้องของตัวอย่างและความไม่แน่นอนของตัวอย่าง

เช่นการพูดถึงข้อมูลของคุณ 80-90% พอดีกับแบบจำลองพยากรณ์ จากนั้นตรวจสอบความถูกต้องโดยใช้ข้อมูลที่คาดการณ์ด้วย 10% (เนื่องจากเรามีค่าจริงของข้อมูล 10% ของคุณเราจึงสามารถตรวจสอบความถูกต้องของตัวอย่างของโมเดลได้)

รวมถึงอ้างถึงหนังสือเรียนออนไลน์ใน otext

เช่นเดียวกับที่กล่าวถึงอื่น ๆ เมื่อเราเปรียบเทียบแบบจำลองกับแบบจำลองเราจะใช้ความแม่นยำ () เพื่อเปรียบเทียบกับชุดทดสอบ จากนั้นคุณสามารถวัดข้อผิดพลาดต่าง ๆ เช่นแม่, 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 หรืออะไรก็ได้ที่คุณต้องการ


ฉันต้องอ่านสองสามครั้งเพื่อให้ได้คะแนนของคุณ ในขณะที่การตั้งชื่อของตัวแปรเป็นการฝึกการเขียนโปรแกรมที่ดีมันไม่ได้เป็นศูนย์กลางของคำตอบ ส่วนหลักของคำตอบของคุณอยู่ในบรรทัดสุดท้าย (ใช้แม่ ฯลฯ ) หากคุณสามารถเน้น (หรือดีกว่าขยาย) ว่ามันจะปรับปรุงนี้
mkt - Reinstate Monica

เมื่อคุณใช้ฟังก์ชั่นความแม่นยำ (รุ่น) มันให้สถิติบางอย่างเช่น ME, แม่, RMSE, MPE และอื่น ๆ คุณสามารถใช้หนึ่งหรือทั้งหมดเพื่อเปรียบเทียบสองรุ่นขึ้นไป ตัวอย่างเช่นโมเดลที่มี RMSE น้อยที่สุด (Root Mean Square Error) ถือเป็นโมเดลที่ดีที่สุดในบรรดาทั้งหมด
Komal Batool

นั่นเป็นประโยชน์ที่จะรู้ แต่ประเด็นของฉันคือเว็บไซต์นี้ไม่ใช่เว็บไซต์เกี่ยวกับการเขียนโค้ดถึงแม้ว่ารหัสจะสามารถให้แสงสว่างกับคำถามและคำตอบได้ ดังนั้นคำตอบของคุณจะดีกว่าถ้าคุณไฮไลต์ที่สำคัญปัญหา
mkt - Reinstate Monica

คำถามคือวิธีที่ ANN สามารถนำมาเปรียบเทียบกับแบบจำลองทางสถิติเช่น ARIMA (เนื่องจากแบบจำลองเหล่านี้ถูกนำมาเปรียบเทียบโดยใช้ค่า AIC ของพวกเขา) และคำตอบก็คือการใช้ค่าทางสถิติอื่น ๆ เช่น Mae หรือ RMSE ไม่มีความสับสนในตัวมัน
Komal Batool
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.