مبداء نورد

  • 2021-07-29

هنگامی که نیاز به انتخاب مناسب ترین مدل یا روش پیش بینی برای داده ها وجود دارد ، پیش بینی کنندگان معمولاً نمونه موجود را به دو قسمت تقسیم می کنند: در نمونه (با نام "مجموعه آموزش") و نمونه نگهدارنده (یا نمونه خارج از کشور یا "نمونه یا"مجموعه آزمون "). سپس مدل در نمونه تخمین زده می شود و عملکرد پیش بینی آن با استفاده از برخی از اندازه گیری های خطا در نمونه نگهدارنده ارزیابی می شود.

اگر چنین روشی فقط یک بار انجام شود ، به این ارزیابی "مبدا ثابت" گفته می شود. با این حال ، سری زمانی ممکن است حاوی Outliers یا تغییر سطح باشد و یک مدل ضعیف ممکن است عملکرد بهتری نسبت به مدل مناسب تر داشته باشد فقط به همین دلیل. به منظور استحکام ارزیابی مدل ها ، از چیزی به نام "Origin Rolling" استفاده می شود.

Origin Rolling یک تکنیک ارزیابی است که براساس آن ، مبدا پیش بینی به صورت متوالی به روز می شود و پیش بینی ها از هر منشاء تولید می شود (Tashman 2000). این تکنیک امکان به دست آوردن چندین خطای پیش بینی برای سری زمانی را فراهم می کند ، که درک بهتری از نحوه عملکرد مدل ها ارائه می دهد. گزینه های مختلفی در مورد نحوه انجام این کار وجود دارد.

چگونه می توان این کار را انجام داد؟

شکل زیر (از (Svetunkov و Petropoulos 2018)) ایده اصلی مبدا نورد را نشان می دهد. سلولهای سفید با داده های نمونه مطابقت دارند ، در حالی که سلولهای خاکستری روشن با پیش بینی های سه مرحله ای مطابقت دارند. سری زمانی 25 مشاهده در آن شکل دارد و پیش بینی ها از 8 مبدا تولید می شوند ، از مبدا 15 شروع می شود. این مدل در هر تکرار دوباره تخمین زده می شود و پیش بینی ها تولید می شوند. پس از آن مشاهده جدیدی در پایان سری اضافه می شود و روش ادامه می یابد. این فرآیند هنگامی متوقف می شود که داده های بیشتری برای اضافه کردن وجود نداشته باشد. این می تواند به عنوان منشأ نورد با اندازه نمونه نگهدارنده ثابت در نظر گرفته شود. در نتیجه این روش 8 پیش بینی های یک تا سه قدم پیش بینی می شود. بر اساس آنها می توانیم اقدامات خطای ارجح را محاسبه کنیم و بهترین مدل عملکرد را انتخاب کنیم.

گزینه دیگر تولید پیش بینی از 8 مبدا ، شروع از مبدا 17 به جای 15 است (شکل زیر را ببینید). در این حالت ، این روش تا منشأ 22 ، هنگامی که پیش بینی سه مرحله ای آخر تولید می شود ، ادامه می یابد و سپس با کاهش افق پیش بینی ادامه می یابد. بنابراین پیش بینی دو مرحله ای از مبدا 23 تولید می شود و فقط یک مرحله پیش بینی یک مرحله ای از مبدا 24 تولید می شود. در نتیجه ما 8 پیش بینی یک مرحله ای ، 7 پیش بینی دو مرحله ای را بدست می آوریم و6 پیش بینی سه مرحله ای. این می تواند به عنوان یک منشأ نورد با اندازه نمونه نگهدارنده غیر ثابت در نظر گرفته شود. این امر می تواند در موارد نمونه های کوچک مفید باشد ، هنگامی که ما هیچ گونه مشاهداتی برای صرفه جویی نداریم.

سرانجام ، در هر دو مورد فوق ، اندازه در نمونه افزایش یافته بودیم. با این حال برای برخی از اهداف تحقیقاتی ممکن است به یک نمونه ثابت نیاز داشته باشیم. شکل زیر چنین وضعیتی را نشان می دهد. در این حالت در هر تکرار ، ما در انتهای سری مشاهده ای اضافه می کنیم و یکی را از ابتدای سری (سلولهای خاکستری تیره) حذف می کنیم.

این چه ارتباطی با R دارد؟

تابع Ro () از بسته Greybox (نوشته شده توسط ایو Sagaert و ایوان Svetunkov در سال 2016 در مسیر سمپوزیوم بین المللی در مورد پیش بینی) ارزیابی مبدا نورد را برای هر عملکردی که دوست دارید با یک تماس از پیش تعریف شده انجام می دهد و مقدار مورد نظر را برمی گرداند. این به شدت به دو متغیر متکی است: فراخوانی و ارزش - بنابراین درک چگونگی تدوین آنها برای به دست آوردن نتایج مطلوب بسیار مهم است. به طور کلی ، RO () یک عملکرد بسیار انعطاف پذیر است ، اما در نتیجه ، خیلی ساده نیست. بیایید ببینیم که چگونه کار می کند.

ما با یک مثال ساده شروع می کنیم ، تولید سری از توزیع عادی:

ما برای این مثال از Arima (0،1،1) استفاده می کنیم:

فراخوانی که ما مشخص می کنیم شامل دو عنصر مهم است: داده و ساعت. داده ها مشخص می کند که مقادیر درون نمونه ای در عملکردی که می خواهیم از آنها استفاده کنیم قرار دارد و باید در تماس "داده" نامیده شود. H عملکرد ما را می گوید ، جایی که افق پیش بینی در عملکرد انتخاب شده مشخص شده است. توجه داشته باشید که در این مثال ما از ARIMA (X = DATA ، ORDE = C (0،1،1)) استفاده می کنیم ، که یک مدل ARIMA (1/0) مورد نظر تولید می کند و سپس از پیش بینی استفاده می کنیم (N. Ahead = H) ، که پیش بینی آن مدل را تولید می کند. قسمت ARIMA (x = داده ، ترتیب = C (0،1،1)) همچنین می تواند طبق قوانین کلی R. به ARIMA (داده ، ترتیب = C (0،1،1)) ساده شود.

با تماس ، ما همچنین باید مشخص کنیم که عملکرد باید برگردد. این می تواند میانگین مشروط (پیش بینی نقطه) ، فواصل پیش بینی ، پارامترهای یک مدل یا در واقع هر چیزی باشد که مدل باز می گردد (به عنوان مثال نام مدل متناسب و احتمال آن). با این حال ، بسته به آنچه که شما از بازده استفاده می کنید ، تفاوت هایی در آنچه RO () باز می گردد وجود دارد. اگر یک بردار باشد ، RO () یک ماتریس (با مقادیر برای هر منشاء در ستون ها) تولید می کند. اگر یک ماتریس باشد ، آرایه ای بازگردانده می شود. سرانجام ، اگر لیستی باشد ، لیستی از لیست ها بازگردانده می شود.

برای اینکه بیش از حد چیزها را بیان نکنیم ، بیایید با جمع آوری میانگین مشروط از عملکرد پیش بینی () شروع کنیم:

توجه: اگر مقدار بازگشت را مشخص نکنید ، عملکرد سعی خواهد کرد همه چیز را برگرداند ، اما ممکن است شکست بخورد ، به خصوص اگر مقادیر زیادی برگردانده شوند. بنابراین ، برای اینکه در سمت امن باشید ، همیشه در صورت امکان مقدار را تأمین کنید.

اکنون که OurCall و Value را مشخص کرده ایم ، می توانیم با استفاده از Origin Rolling ، پیش بینی هایی را از مدل تولید کنیم. بیایید بگوییم که ما می خواهیم پیش بینی های سه مرحله ای و 8 مبدا با مقادیر پیش فرض تمام پارامترهای دیگر:

این تابع لیستی را با تمام مقادیری که از آنها خواسته ایم به علاوه مقادیر واقعی از نمونه نگهدارنده باز می گردد. ما می توانیم برخی از اندازه گیری خطای اساسی را بر اساس آن مقادیر محاسبه کنیم ، به عنوان مثال ، میانگین خطای مطلق مقیاس (Petropoulos and Kourentzes 2015):

در این مثال ما از عملکرد () استفاده می کنیم تا بین افق های مختلف پیش بینی تمایز قائل شویم و ایده ای در مورد عملکرد مدل برای هر یک از آنها داشته باشیم. به یک روش مشابه ما می توانیم عملکرد برخی از مدل های دیگر را ارزیابی کرده و خطاها را با موارد تولید شده توسط مدل اول مقایسه کنیم. این اعداد به تنهایی به ما نمی گویند ، اما اگر عملکرد این مدل را با مدل دیگر مقایسه کنیم ، می توانیم استنباط کنیم که آیا یک مدل مناسب تر از داده ها است.

ما همچنین می توانیم پیش بینی های منشأ نورد را ترسیم کنیم ، که نشان می دهد مدل انتخاب شده چگونه رفتار می کند:

در این مثال پیش بینی های منشاء مختلف نزدیک به یکدیگر هستند. این امر به این دلیل است که داده ها ثابت هستند و مدل کاملاً پایدار است.

اگر می خواهیم پارامترهای پیش فرض RO را تغییر دهیم ، می توانیم به عنوان مثال ، برای نگه داشتن غیر ثابت و نمونه ثابت در نمونه:

توجه داشته باشید که مقادیر از returnedValues2 مستقیماً با مقادیر returnedValues1 قابل مقایسه نیستند، زیرا از مبداهای مختلف تولید می شوند. این زمانی آشکارتر می شود که چیزهایی را ترسیم کنیم:

اگر تصمیم دارید از توابع بسته پیش بینی استفاده کنید، فراخوانی و مقادیر برگشتی را می توان به روش زیر تغییر داد:

توجه داشته باشید که ما در اینجا فقط برای یک سطح درخواست می کنیم. اگر این کار را نکنیم، تابع پیش‌بینی به جای بردارها، ماتریس‌هایی را برای مقادیر بالا و پایین برمی‌گرداند، و آن‌ها نمی‌توانند به اندازه کافی به فرمت مورد نظر تبدیل شوند، بنابراین ro() یک خطا برمی‌گرداند.

هیجان انگیزتر کردن چیزها پیچیده تر

همانطور که می بینید، ro () یک تابع راحت است، زمانی که یک مدل و یک سری زمانی دارید. اما اگر نیاز به اعمال مدل های مختلف برای سری های زمانی مختلف داشته باشید، چه؟ما به یک حلقه نیاز داریم، درست است؟آره. و یک راه ساده برای استفاده از ro() در این مورد وجود دارد. بیایید مثال خود را ادامه دهیم اما اکنون چندین سری زمانی را معرفی می کنیم:

برای این مثال به آرایه ای از مقادیر بازگشتی نیاز داریم:

در اینجا 3 سری زمانی، 2 مدل و پیش بینی 3 گام جلوتر از 8 مبدا خواهیم داشت. مدل های ما در یک لیست جداگانه ذخیره می شوند. در این مثال ARIMA(0, 1, 1) و ARIMA(1, 1, 0) خواهیم داشت:

همانطور که قبلاً انجام دادیم، همان مقدار pred را از تابع برمی گردانیم، اما باید فراخوانی را تغییر دهیم، زیرا اکنون باید این دو مدل مختلف را در نظر بگیریم:

همانطور که می بینید، به جای اینکه مدل را مستقیماً مشخص کنیم، از عنصر i-امین لیست استفاده می کنیم.

همچنین می‌خواهیم مقادیر واقعی را از Holdout ذخیره کنیم تا بتوانیم اندازه‌های خطا را محاسبه کنیم:

این آرایه دارای ابعاد برای 3 سری زمانی و پیش بینی 3 گام جلوتر از 8 مبدا است.

در نهایت، می‌توانیم یک حلقه بنویسیم و پیش‌بینی‌ها را تولید کنیم:

اگرچه ما i به صراحت در هیچ کجای فراخوانی ro() در بالا مشخص نمی کنیم، اما در ourCall استفاده می شود و در نتیجه مدل های مختلف در حلقه داخلی تخمین زده می شوند. مقایسه عملکرد این دو در سری‌های زمانی متفاوتی که داریم (این RelMAE از (Davydenko و Fildes 2013) است):

بنابراین بر اساس این نتایج، می توان نتیجه گرفت که ARIMA (0،1،1) به طور متوسط دقیق تر از ARIMA (1،1،0) در سه سری زمانی ما است.

هیجان انگیز کردن چیزها حتی پیچیده تر

برای آخرین نمونه‌هایمان، چارچوب داده را ایجاد می‌کنیم و سعی می‌کنیم رگرسیون خطی را برازش کنیم:

توجه داشته باشید که در این مثال تابع ro() را تقلب می کنیم و یک فراخوانی برقرار می کنیم که حاوی داده یا h نیست، زیرا رگرسیون پیاده سازی شده در تابع lm() به فریم های داده متکی است و از افق پیش بینی استفاده نمی کند:

در این مورد ما فقط باید مطمئن شویم که محیط جهانی حاوی قاب داده xreg است. متغیر counti در فراخوانی برای حلقه داخلی مورد نیاز است - طول نمونه را تعیین می کند. به طور مشابه counto طول نگهدارنده را مشخص می کند. هر دوی آنها در داخل تابع ro () تعریف شده اند.

علاوه بر این، ما نیازی به تعیین ourValue نداریم، زیرا تابع ()predict. lm یک ماتریس با مقادیر (یا یک بردار در صورت عدم درخواست فواصل) برمی‌گرداند، نه یک لیست. توجه: اگر از یک تابع متفاوت استفاده می کنید (نه lm())، ممکن است لازم باشد مقدار را مشخص کنید. فراخوانی نهایی به ro() طبق معمول بسیار ساده است:

در این حالت، باید متغیر پاسخ را در پارامتر داده فراخوانی ارائه کنیم، زیرا تابع نیاز به استخراج مقادیر برای Holdout دارد.

کار مشابهی را می توان با استفاده از تابع alm() اما با یک مقدار مناسب انجام داد (ممکن است در غیر این صورت تابع شکست بخورد):

به عنوان مثال نهایی، مدل ARIMAX را برای داده های زیر در نظر می گیریم:

و بر این اساس تماس را اصلاح کنید:

با توجه به اینکه اکنون با ARIMA سروکار داریم، باید هم داده و هم h را مشخص کنیم. علاوه بر این، xreg نسبت به مثال قبلی متفاوت است، زیرا در حال حاضر نباید دارای متغیر پاسخ باشد.

طبق معمول، ما به تابع خود برای برگرداندن مقادیر پیش بینی شده خاص نیاز داریم:

و سپس تابع را فراخوانی می کنیم و نتایج را می گیریم:

به عنوان نکته جانبی، اگر از پکیج صاف برای R استفاده می کنید و می خواهید ارزیابی مبدا نورد را انجام دهید، به عنوان مثال، برای مدل ETSX با استفاده از تابع es()، فراخوانی را می توان به صورت زیر ساده کرد:

در اینجا از متغیر countf استفاده می‌کنیم که مشخص می‌کند باید هم از داخل نمونه و هم از holdout (نمونه کامل) استفاده کنیم، زیرا تابع es() به forecast() یا predict () متکی نیست و می‌تواند پیش‌بینی‌های داخلی تولید کند.

در نهایت، تمام مثال های ذکر شده در بالا را می توان به صورت موازی انجام داد که توسط پارامتر موازی راه اندازی می شود. توجه داشته باشید که این ممکن است برای مواردی مفید باشد که تعداد مبداها بسیار زیاد است و حجم نمونه بزرگ است. در غیر این صورت ممکن است کارایی کمتری نسبت به محاسبه سریال داشته باشد. اگر می‌خواهید هر کاری را به صورت موازی انجام دهید، یا به بسته doMC (لینوکس و مک او اس) یا doParallel (برای ویندوز) در R نیاز دارید. تعداد هسته‌های استفاده شده در این مورد برابر با تعداد هسته‌های CPU شما منهای است. یکی

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.