আপনার পূর্বাভাস প্যাকেজটি ব্যবহার করা উচিত , যা এই সমস্ত মডেলগুলিকে সমর্থন করে (এবং আরও অনেক কিছু) এবং এগুলি একটি স্ন্যাপের জন্য উপযুক্ত করে তোলে:
library(forecast)
x <- AirPassengers
mod_arima <- auto.arima(x, ic='aicc', stepwise=FALSE)
mod_exponential <- ets(x, ic='aicc', restrict=FALSE)
mod_neural <- nnetar(x, p=12, size=25)
mod_tbats <- tbats(x, ic='aicc', seasonal.periods=12)
par(mfrow=c(4, 1))
plot(forecast(mod_arima, 12), include=36)
plot(forecast(mod_exponential, 12), include=36)
plot(forecast(mod_neural, 12), include=36)
plot(forecast(mod_tbats, 12), include=36)
আমি আপনার মডেল ফিট করার আগে ডেটা মসৃণ করার বিরুদ্ধে পরামর্শ দেব। আপনার মডেল সহজাতভাবে ডেটা মসৃণ করার চেষ্টা করতে চলেছে, তাই প্রাক-স্মুথিং কেবল জিনিসগুলিকে জটিল করে তোলে।
নতুন ডেটার ভিত্তিতে সম্পাদনা করুন:
দেখে মনে হচ্ছে অরিমা সবচেয়ে খারাপ মডেলগুলির মধ্যে একটি যা আপনি এই প্রশিক্ষণ এবং পরীক্ষার জন্য বেছে নিতে পারেন।
আমি আপনার ডেটা একটি ফাইল কলে সংরক্ষণ করেছি coil.csv
, এটিকে আর-তে লোড করেছি এবং এটিকে প্রশিক্ষণ এবং পরীক্ষার সেটে বিভক্ত করেছি:
library(forecast)
dat <- read.csv('~/coil.csv')
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
test_x <- window(x, start=c(2012, 3))
x <- window(x, end=c(2012, 2))
এরপরে আমি বেশ কয়েকটি সময়ের সিরিজের মডেলগুলিতে ফিট করে: আরিমা, এক্সফোনেনশিয়াল স্মুথিং, নিউরাল নেটওয়ার্ক, টিবিটস, ব্যাটস, মরসুমী পচন এবং কাঠামোগত সময় সিরিজ:
models <- list(
mod_arima = auto.arima(x, ic='aicc', stepwise=FALSE),
mod_exp = ets(x, ic='aicc', restrict=FALSE),
mod_neural = nnetar(x, p=12, size=25),
mod_tbats = tbats(x, ic='aicc', seasonal.periods=12),
mod_bats = bats(x, ic='aicc', seasonal.periods=12),
mod_stl = stlm(x, s.window=12, ic='aicc', robust=TRUE, method='ets'),
mod_sts = StructTS(x)
)
তারপরে আমি কিছু পূর্বাভাস দিয়েছিলাম এবং পরীক্ষার সেটটির সাথে তুলনা করি। আমি একটি নিষ্পাপ পূর্বাভাস অন্তর্ভুক্ত করেছি যা সর্বদা একটি সমতল, অনুভূমিক রেখার পূর্বাভাস দেয়:
forecasts <- lapply(models, forecast, 12)
forecasts$naive <- naive(x, 12)
par(mfrow=c(4, 2))
for(f in forecasts){
plot(f)
lines(test_x, col='red')
}
আপনি দেখতে পাচ্ছেন, অরিমা মডেলটি প্রবণতাটি ভুল পেয়েছে তবে আমি "বেসিক স্ট্রাকচারাল মডেল" এর মতো দেখতে চাই I
শেষ অবধি, আমি পরীক্ষার সেটগুলিতে প্রতিটি মডেলের যথার্থতা পরিমাপ করেছি:
acc <- lapply(forecasts, function(f){
accuracy(f, test_x)[2,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
mod_sts 283.15 609.04 514.46 0.69 1.27 0.10 0.77 1.65
mod_bats 65.36 706.93 638.31 0.13 1.59 0.12 0.85 1.96
mod_tbats 65.22 706.92 638.32 0.13 1.59 0.12 0.85 1.96
mod_exp 25.00 706.52 641.67 0.03 1.60 0.12 0.85 1.96
naive 25.00 706.52 641.67 0.03 1.60 0.12 0.85 1.96
mod_neural 81.14 853.86 754.61 0.18 1.89 0.14 0.14 2.39
mod_arima 766.51 904.06 766.51 1.90 1.90 0.14 0.73 2.48
mod_stl -208.74 1166.84 1005.81 -0.52 2.50 0.19 0.32 3.02
ব্যবহৃত মেট্রিকগুলি হেন্ডম্যান, আরজে এবং অ্যাথানসোপল্লোস, জি। (2014) "পূর্বাভাস: নীতি ও অনুশীলন" তে বর্ণিত হয়েছে , যারা পূর্বাভাস প্যাকেজের লেখকও হয়ে থাকে। আমি আপনাকে তাদের পাঠ্যটি পড়ার জন্য অত্যন্ত পরামর্শ দিচ্ছি: এটি অনলাইনে বিনামূল্যে available স্ট্রাকচারাল টাইম সিরিজটি এমএএসই সহ বেশ কয়েকটি মেট্রিকের সেরা মডেল, যা আমি মডেল নির্বাচনের জন্য পছন্দ করি এমন মেট্রিক।
একটি চূড়ান্ত প্রশ্ন: কাঠামোগত মডেল কি এই পরীক্ষার সেটটিতে ভাগ্যবান হয়েছিল? এটি মূল্যায়নের একটি উপায় প্রশিক্ষণের সেট ত্রুটিগুলি দেখছে। প্রশিক্ষণ সেট ত্রুটিগুলি পরীক্ষার সেট ত্রুটির তুলনায় কম নির্ভরযোগ্য (কারণ তারা অতিরিক্ত ফিট হতে পারে) তবে এই ক্ষেত্রে কাঠামোগত মডেলটি এখনও শীর্ষে আসে:
acc <- lapply(forecasts, function(f){
accuracy(f, test_x)[1,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
mod_sts -0.03 0.99 0.71 0.00 0.00 0.00 0.08 NA
mod_neural 3.00 1145.91 839.15 -0.09 2.25 0.16 0.00 NA
mod_exp -82.74 1915.75 1359.87 -0.33 3.68 0.25 0.06 NA
naive -86.96 1936.38 1386.96 -0.34 3.75 0.26 0.06 NA
mod_arima -180.32 1889.56 1393.94 -0.74 3.79 0.26 0.09 NA
mod_stl -38.12 2158.25 1471.63 -0.22 4.00 0.28 -0.09 NA
mod_bats 57.07 2184.16 1525.28 0.00 4.07 0.29 -0.03 NA
mod_tbats 62.30 2203.54 1531.48 0.01 4.08 0.29 -0.03 NA
(মনে রাখবেন যে নিউরাল নেটওয়ার্ক ওভারফিট, প্রশিক্ষণ সেটে দুর্দান্ত এবং পরীক্ষার সেটটিতে খারাপভাবে পারফর্ম করছে)
অবশেষে, এই মডেলগুলির সমস্তকেই বৈধতা দেওয়ার পক্ষে একটি ভাল ধারণা হবে, সম্ভবত ২০০৮-২০০৯ / ২০১০-তে পরীক্ষা করা, ২০০৮-২০১০-তে প্রশিক্ষণ / ২০১১-তে প্রশিক্ষণ, ২০০৮-২০১১-এ প্রশিক্ষণ, ২০১২-এ পরীক্ষা, প্রশিক্ষণ ২০০৮-২০১২ তে / ২০১৩-তে পরীক্ষা করা এবং এই সমস্ত সময়কালে জুড়ে গড় ত্রুটি। আপনি যদি সেই পথে নামতে চান তবে আমার কাছে গিথুবটিতে ক্রস-বৈধকরণের সময় সিরিজের মডেলগুলির জন্য একটি আংশিক সম্পূর্ণ প্যাকেজ রয়েছে যা আমি আপনাকে চেষ্টা করতে এবং আমাকে প্রতিক্রিয়া জানাতে / অনুরোধ জানাতে চাই:
devtools::install_github('zachmayer/cv.ts')
library(cv.ts)
সম্পাদনা 2: আমার নিজের প্যাকেজটি কীভাবে ব্যবহার করতে হবে তা মনে আছে কিনা তা দেখতে দিন!
প্রথমত, গিথুব থেকে প্যাকেজটি ইনস্টল করুন এবং লোড করুন (উপরে দেখুন)। তারপরে কিছু মডেলকে (সম্পূর্ণ ডেটাসেট ব্যবহার করে) ক্রস-বৈধতা দিন:
library(cv.ts)
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
ctrl <- tseriesControl(stepSize=1, maxHorizon=12, minObs=36, fixedWindow=TRUE)
models <- list()
models$arima = cv.ts(
x, auto.arimaForecast, tsControl=ctrl,
ic='aicc', stepwise=FALSE)
models$exp = cv.ts(
x, etsForecast, tsControl=ctrl,
ic='aicc', restrict=FALSE)
models$neural = cv.ts(
x, nnetarForecast, tsControl=ctrl,
nn_p=6, size=5)
models$tbats = cv.ts(
x, tbatsForecast, tsControl=ctrl,
seasonal.periods=12)
models$bats = cv.ts(
x, batsForecast, tsControl=ctrl,
seasonal.periods=12)
models$stl = cv.ts(
x, stl.Forecast, tsControl=ctrl,
s.window=12, ic='aicc', robust=TRUE, method='ets')
models$sts = cv.ts(x, stsForecast, tsControl=ctrl)
models$naive = cv.ts(x, naiveForecast, tsControl=ctrl)
models$theta = cv.ts(x, thetaForecast, tsControl=ctrl)
(মনে রাখবেন যে আমি নিউরাল নেটওয়ার্ক মডেলটির নমনীয়তা হ্রাস করেছি, এটি অত্যধিক ফিটনেস থেকে রোধে সহায়তা করার চেষ্টা করার জন্য)
একবার আমরা মডেলগুলি ফিট করে নিলে, আমরা সেগুলি ম্যাপের সাথে তুলনা করতে পারি (সিভি.টিস এখনও ম্যাসকে সমর্থন করে না):
res_overall <- lapply(models, function(x) x$results[13,-1])
res_overall <- Reduce(rbind, res_overall)
row.names(res_overall) <- names(models)
res_overall <- res_overall[order(res_overall[,'MAPE']),]
round(res_overall, 2)
ME RMSE MAE MPE MAPE
naive 91.40 1126.83 961.18 0.19 2.40
ets 91.56 1127.09 961.35 0.19 2.40
stl -114.59 1661.73 1332.73 -0.29 3.36
neural 5.26 1979.83 1521.83 0.00 3.83
bats 294.01 2087.99 1725.14 0.70 4.32
sts -698.90 3680.71 1901.78 -1.81 4.77
arima -1687.27 2750.49 2199.53 -4.23 5.53
tbats -476.67 2761.44 2428.34 -1.23 6.10
সেকি। এটি প্রদর্শিত হবে যে আমাদের কাঠামোগত পূর্বাভাস ভাগ্যবান হয়েছে। দীর্ঘমেয়াদে, নির্বিকার পূর্বাভাসটি 12 মাসের দিগন্ত জুড়ে গড়ে সেরা গড় পূর্বাভাস দেয় (অরিমা মডেলটি এখনও সবচেয়ে খারাপ মডেলগুলির মধ্যে একটি)। আসুন 12 টি পূর্বাভাস দিগন্তের প্রতিটিতে মডেলগুলির তুলনা করুন এবং দেখুন যে তাদের মধ্যে কখনও কোনও নিষ্পাপ মডেলকে পরাজিত করে:
library(reshape2)
library(ggplot2)
res <- lapply(models, function(x) x$results$MAPE[1:12])
res <- data.frame(do.call(cbind, res))
res$horizon <- 1:nrow(res)
res <- melt(res, id.var='horizon', variable.name='model', value.name='MAPE')
res$model <- factor(res$model, levels=row.names(res_overall))
ggplot(res, aes(x=horizon, y=MAPE, col=model)) +
geom_line(size=2) + theme_bw() +
theme(legend.position="top") +
scale_color_manual(values=c(
"#1f78b4", "#ff7f00", "#33a02c", "#6a3d9a",
"#e31a1c", "#b15928", "#a6cee3", "#fdbf6f",
"#b2df8a")
)
স্পষ্টতই, ক্ষতিকারক স্মুথিং মডেলটি সর্বদা নিখুঁত মডেলটিকে বেছে নিয়ে থাকে (কমলা রেখা এবং নীল লাইন ওভারল্যাপ 100%)। অন্য কথায়, "পরের মাসের কয়েল দাম একই মাসের কয়েল দামের সমান হবে" এর নিষ্পাপ পূর্বাভাস 7 অত্যন্ত পরিশীলিত সময় সিরিজের মডেলের চেয়ে আরও নির্ভুল (প্রায় প্রতিটি পূর্বাভাস দিগন্তে) is আপনার কাছে কিছু গোপন তথ্য না থাকলে কয়েল বাজার ইতিমধ্যে জানে না, নিষ্পাপ কয়েল দামের পূর্বাভাসকে মারধর করা অত্যন্ত কঠিন হতে চলেছে ।
এটি কখনই উত্তরটি শুনতে চায় না, তবে পূর্বাভাসের সঠিকতা যদি আপনার লক্ষ্য হয় তবে আপনার সর্বাধিক নির্ভুল মডেলটি ব্যবহার করা উচিত। নিষ্পাপ মডেল ব্যবহার করুন।