<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ivan Svetunkov, Автор в Open Forecasting</title>
	<atom:link href="https://openforecast.org/ru/author/config/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/ru/author/config/</link>
	<description>О том как смотреть в будущее</description>
	<lastBuildDate>Tue, 02 Aug 2022 12:27:23 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/cropped-usd-05-32x32.png&amp;nocache=1</url>
	<title>Ivan Svetunkov, Автор в Open Forecasting</title>
	<link>https://openforecast.org/ru/author/config/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Комплексное Экспоненциальное Сглаживание</title>
		<link>https://openforecast.org/ru/2022/08/02/kompleksnoe-eksponencialnoe-sglazhivanie/</link>
					<comments>https://openforecast.org/ru/2022/08/02/kompleksnoe-eksponencialnoe-sglazhivanie/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Tue, 02 Aug 2022 12:23:39 +0000</pubDate>
				<category><![CDATA[CES]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[статьи]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=3010</guid>

					<description><![CDATA[<p>Авторы: Ivan Svetunkov, Nikolaos Kourentzes, Keith Ord. Журнал: Naval Research Logistics Аннотация на английском: Exponential smoothing has been one of the most popular forecasting methods used to support various decisions in organisations, in activities such as inventory management, scheduling, revenue management and other areas. Although its relative simplicity and transparency have made it very attractive [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2022/08/02/kompleksnoe-eksponencialnoe-sglazhivanie/">Комплексное Экспоненциальное Сглаживание</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Авторы</strong>: Ivan Svetunkov, Nikolaos Kourentzes, Keith Ord.</p>
<p><strong>Журнал</strong>: Naval Research Logistics</p>
<p><strong>Аннотация на английском</strong>: Exponential smoothing has been one of the most popular forecasting methods used to support various decisions in organisations, in activities such as inventory management, scheduling, revenue management and other areas. Although its relative simplicity and transparency have made it very attractive for research and practice, identifying the underlying trend remains challenging with significant impact on the resulting accuracy. This has resulted in the development of various modifications of trend models, introducing a model selection problem. With the aim of addressing this problem, we propose the Complex Exponential Smoothing (CES), based on the theory of functions of complex variables. The basic CES approach involves only two parameters and does not require a model selection procedure. Despite these simplifications, CES proves to be competitive with, or even superior to existing methods. We show that CES has several advantages over conventional exponential smoothing models: it can model and forecast both stationary and non-stationary processes, and CES can capture both level and trend cases, as defined in the conventional exponential smoothing classification. CES is evaluated on several forecasting competition datasets, demonstrating better performance than established benchmarks. We conclude that CES has desirable features for time series modelling and opens new promising avenues for research.</p>
<p><a href="/wp-content/uploads/2022/07/Svetunkov-et-al.-2022-Complex-Exponential-Smoothing.pdf">Ссылка на черновую версию статьи</a>.</p>
<p>DOI: <a href="https://doi.org/10.1002/nav.22074" targe="blank">10.1002/nav.22074</a></p>
<p><a href="/en/2022/08/02/the-long-and-winding-road-the-story-of-complex-exponential-smoothing/">История статьи на английском</a>.</p>
<h2>Идея Комплексного Экспоненциального Сглаживания</h2>
<p>Одна из фундаментальных идей в прогнозировании &#8212; это декомпозиция временного ряда на несколько ненаблюдаемых компонент (описание этого процесса есть, например, <a href="http://<a href="https://openforecast.org/adam/tsComponents.html">&#171;>в моей монографии</a>). Обычно говорят, что временной ряд содержит компоненты уровня, тренда, сезонности, а так же ошибку. Это популярное разбиение на компоненты и используется, например, при построении <a href="https://openforecast.org/adam/ETSConventional.html">ETS</a>, внутри которой выбор подходящих компонент осуществляется <a href="https://openforecast.org/adam/ETSSelection.html">на основе информационных критериев</a>. Однако, не у всех временных рядов есть такое чёткое разделение на компоненты, да и само разделение можно считать условным. Например, ряд со слабым трендом на практике может быть не отличим от ряда с быстро меняющимся уровнем. Кроме того, в реальности всё немного сложнее, чем нам кажется и взаимодействие компонент может быть нелинейным.</p>
<p>Комплексное Экспоненциальное Сглаживание (КЭС) моделирует нелинейность во временных рядах и позволяет описывать структуру ряда по-другому. Вот как выглядит модель КЭС математически:<br />
\begin{equation} \label{eq:cesalgebraic}<br />
	\hat{y}_{t} + i \hat{e}_{t} = (\alpha_0 + i\alpha_1)(y_{t-1} + i e_{t-1}) + (1 &#8212; \alpha_0 + i &#8212; i\alpha_1)(\hat{y}_{t-1} + i \hat{e}_{t-1}) ,<br />
\end{equation}<br />
где \(y_t\) &#8212; это фактическое значение, \(e_t\) &#8212; это ошибка прогноза, \(\hat{y}_t\) &#8212; прогнозируемое значение на шаг вперёд, \(\hat{e}_t\) &#8212; это прокси прошлых ошибок, \(\alpha_0\) и \(\alpha_1\) &#8212; это постоянные сглаживания, а \(i\) &#8212; это мнимая единица, число удовлетворяющее уравнению \(i^2=-1\). Из-за использования комплексных переменных, модель позволяет распределять веса во времени нелинейным образом. Это становится более понятно, если в правую часть уравнения \eqref{eq:cesalgebraic} включить само же уравнение, затем повторить это и получить:<br />
\begin{equation} \label{eq:cesalgebraicExpanded}<br />
	\begin{aligned}<br />
		\hat{y}_{t} + i \hat{e}_{t} = &#038; (\alpha_0 + i\alpha_1)(y_{t-1} + i e_{t-1}) + \\<br />
					      &#038; (\alpha_0 + i\alpha_1) (1 &#8212; \alpha_0 + i &#8212; i\alpha_1) (y_{t-2} + i e_{t-2}) + \\<br />
					      &#038; (\alpha_0 + i\alpha_1) (1 &#8212; \alpha_0 + i &#8212; i\alpha_1)^2 (y_{t-3} + i e_{t-3}) + \\<br />
					      &#038; &#8230; + \\<br />
					      &#038; (\alpha_0 + i\alpha_1) (1 &#8212; \alpha_0 + i &#8212; i\alpha_1)^{t-2} (y_{1} + i e_{1}) + \\<br />
					      &#038; (1 &#8212; \alpha_0 + i &#8212; i\alpha_1)^{t-1} (\hat{y}_{1} + i \hat{e}_{1}) .<br />
	\end{aligned}<br />
\end{equation}<br />
Возведение комплексного числа \((1 &#8212; \alpha_0 + i &#8212; i\alpha_1)\) в степень в формуле выше позволяет распределять веса между наблюдениями нелинейным образом. Графически это может быть представлено следующим образом (синяя линия &#8212; веса для фактических значений, зелёная &#8212; для прогнозных ошибок):</p>
<div id="attachment_2978" style="width: 650px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2022/07/cspweights.png"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-2978" src="/wp-content/uploads/2022/07/cspweights-1024x410.png" alt="" width="640" height="256" class="size-large wp-image-2978" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cspweights-1024x410.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cspweights-300x120.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cspweights-768x307.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cspweights-1536x614.png&amp;nocache=1 1536w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cspweights-2048x819.png&amp;nocache=1 2048w" sizes="(max-width: 640px) 100vw, 640px" /></a><p id="caption-attachment-2978" class="wp-caption-text">Распределение весов между наблюдениями на комплексной и действительной плоскостях. Синяя линия &#8212; веса для фактических значений, зелёная &#8212; для прогнозных ошибок.</p></div>
<p>В зависимости от значение комплексной постоянной сглаживания \(\alpha_0 + i\alpha_1\), распределение весов будет иметь разный вид. Но оно не обязательно должно быть гармоническим как на рисунке выше, оно может и убывать по классической экспоненте (как у простого экспоненциального сглаживания ака метода Брауна). Именно это гибкое распределение весов даёт КЭС особенную гибкость и позволяет ему быть эффективно применимым как к стационарным, так и нестационарным данным без переключения между компонентами временного ряда.</p>
<p>В опубликованной статье, мы также обсуждаем сезонную модификацию КЭС, которая позволяет моделировать как аддитивную, так и мультипликативную сезонность. Я не привожу формулы и детальное объяснение в данной статье, рекомендую всех заинтересованных обратиться к <a href="/wp-content/uploads/2022/07/Svetunkov-et-al.-2022-Complex-Exponential-Smoothing.pdf">первоисточнику</a>.</p>
<h2>Пример в R</h2>
<p>В R, КЭС реализовано в функции <code>ces()</code> пакета <code>smooth</code>. В том же пакете есть функция <code>auto.ces()</code>, позволяющая автоматически выбирать между не сезонными и сезонными моделями КЭС на основе информационных критериев. Синтакс функций похож на синтекс <code>es()</code> и <code>adam()</code>. Вот пример применения функции:</p>
<pre class="decode">cesModel <- smooth::auto.ces(BJsales, holdout=TRUE, h=12)
cesModel</pre>
<pre>Time elapsed: 0.05 seconds
Model estimated: CES(n)
a0 + ia1: 1.9981+1.0034i
Initial values were produced using backcasting.

Loss function type: likelihood; Loss function value: 249.4613
Error standard deviation: 1.4914
Sample size: 138
Number of estimated parameters: 3
Number of degrees of freedom: 135
Information criteria:
     AIC     AICc      BIC     BICc 
504.9227 505.1018 513.7045 514.1457 

Forecast errors:
MPE: 0%; sCE: 0.7%; Asymmetry: -5%; MAPE: 0.4%
MASE: 0.857; sMAE: 0.4%; sMSE: 0%; rMAE: 0.329; rRMSE: 0.338</pre>
<p>Описание выше уже как-то обсуждалось <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">в одном из прошлых постов</a> на примере функции <code>es()</code>. Главное отличие между тем, что возвращают функции <code>es()</code> и <code>ces()</code> - это параметры. В данном случае, мы видим, что комплексная постоянная сглаживания \(\alpha_0 + i\alpha_1 = 1.9981 + i 1.0034\). Полученную модель можно использовать в прогнозировании, например, так:</p>
<pre class="decode">cesModel |> forecast(h=12, interval="p") |> plot()</pre>
<p>что даст такой график:</p>
<div id="attachment_3007" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cesForecast.png&amp;nocache=1"><img decoding="async" aria-describedby="caption-attachment-3007" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cesForecast-300x210.png&amp;nocache=1" alt="" width="300" height="210" class="size-medium wp-image-3007" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cesForecast-300x210.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cesForecast-768x538.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2022/07/cesForecast.png&amp;nocache=1 1000w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-3007" class="wp-caption-text">Прогноз КЭС для ряда продаж из книги Box & Jenkins.</p></div>
<p>Сама функция <code>ces()</code> не изменилась с момента окончания мною PhD в 2016 году, так что результаты, например, <a href="/en/2018/01/01/smooth-functions-in-2017/">вот этого</a> сравнения всё ещё актуальны. Модель не обязательно даёт самые точные прогнозы во всех случаях, но как, например, было показано в статье <a href="https://doi.org/10.1016/j.ijforecast.2019.01.006">Petropoulos & Svetunkov (2020)</a>, она привносит в комбинации то, чего не привносят другие модели. Всё из-за того, что КЭС позволяет хорошо вылавливать долгосрочные тенденции во временных рядах.</p>
<h2>Послесловие</h2>
<p>В качестве послесловия, я хотел бы выразить свои благодарности нескольким людям. Во-первых, это <a href="http://kourentzes.com/forecasting/">Никос Курентзес</a>, который поверил в мою модель в далёком 2012 году и поддерживал меня все эти годы без колебаний. Во-вторых, это <a href="https://scholar.google.com/citations?user=-0p44ukAAAAJ">Кит Орд</a>, который помог мне в некоторых выкладках и затем оказал серьёзную поддержку статье и помог придать ей ту форму, которая она имеет в конце концов. Ну, и, конечно же, я благодарен своему папе, <a href="https://sergey.svetunkov.ru/">Сергею Геннадьевичу Светунькову</a>, который направлял меня в моей исследовательской деятельности в самом её начале и верил в меня и мои исследования ещё тогда, когда никто о них ничего не подозревал.</p>
<p>Если вы хотите узнать больше про модель, вам придётся прочитать <a href="/wp-content/uploads/2022/07/Svetunkov-et-al.-2022-Complex-Exponential-Smoothing.pdf">статью на английском</a> (она также доступна <a href="https://doi.org/10.1002/nav.22074" targe="blank">онлайн</a> на сайте издателя) или же прочитать на английском <a href="/en/2022/08/02/the-long-and-winding-road-the-story-of-complex-exponential-smoothing/">историю статьи</a>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2022/08/02/kompleksnoe-eksponencialnoe-sglazhivanie/">Комплексное Экспоненциальное Сглаживание</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2022/08/02/kompleksnoe-eksponencialnoe-sglazhivanie/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>ISF2021: Как починить мультипликативные модели ETS</title>
		<link>https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/</link>
					<comments>https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 30 Jun 2021 12:09:46 +0000</pubDate>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[ISF]]></category>
		<category><![CDATA[конференции]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2664</guid>

					<description><![CDATA[<p>В этом году ISF (International Symposium on Forecasting) был виртуальной конференцией из-за пандемии. Наш центр устроил небольшое неофициальное собрание в полу-закрытом университете. Я презентовал из аудитории, а презентацию видели люди со всего мира, начиная с Австралии и Индонезии и заканчивая Европой (США ещё спали): В этой презентации я рассказал о том, что: Точечные прогнозы из [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/">ISF2021: Как починить мультипликативные модели ETS</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В этом году ISF (International Symposium on Forecasting) был виртуальной конференцией из-за пандемии. Наш центр устроил небольшое неофициальное собрание в полу-закрытом университете. Я презентовал из аудитории, а презентацию видели люди со всего мира, начиная с Австралии и Индонезии и заканчивая Европой (США ещё спали):</p>
<div id="attachment_2666" style="width: 235px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04.jpeg&amp;nocache=1"><img decoding="async" aria-describedby="caption-attachment-2666" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-225x300.jpeg&amp;nocache=1" alt="Презентация в хабе Ланкастера" width="225" height="300" class="size-medium wp-image-2666" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-225x300.jpeg&amp;nocache=1 225w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-768x1024.jpeg&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-1152x1536.jpeg&amp;nocache=1 1152w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04.jpeg&amp;nocache=1 1200w" sizes="(max-width: 225px) 100vw, 225px" /></a><p id="caption-attachment-2666" class="wp-caption-text">Презентация в хабе Ланкастера</p></div>
<p>В этой презентации я рассказал о том, что:</p>
<ol>
<li>Точечные прогнозы из мультипликативных ETS не соответствуют мат. ожиданию, что может быть проблемой в некоторых ситуациях;</li>
<li>Гамма, Логнормальное и Обратное Гауссовское распределения могут быть успешно использованы в мультипликативных ETS;</li>
<li>Всё это работает хорошо и даёт адекватные прогнозы&#8230;</li>
<li>&#8230;и уже доступно в функции adam() пакета smooth.</li>
</ol>
<p>Вот <a href="/wp-content/uploads/2021/06/2021-Svetunkov-ISF-ADAM-Multiplicative.pdf">слайды</a>. Видео запись презентации возможно будет доступно спустя несколько недель на Youtube канале IIF.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/">ISF2021: Как починить мультипликативные модели ETS</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Что делать с прерывистым спросом: современный взгляд на проблему</title>
		<link>https://openforecast.org/ru/2020/10/01/chto-delat-s-preryvistym-sprosom-sovremennyj-vzglyad-na-problemu-prezentaciya-na-konferencii/</link>
					<comments>https://openforecast.org/ru/2020/10/01/chto-delat-s-preryvistym-sprosom-sovremennyj-vzglyad-na-problemu-prezentaciya-na-konferencii/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Thu, 01 Oct 2020 10:09:13 +0000</pubDate>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[конференции]]></category>
		<category><![CDATA[презентация]]></category>
		<category><![CDATA[прерывистый спрос]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2541</guid>

					<description><![CDATA[<p>30 сентября я выступил на онлайн конференции &#171;Прогнозирование и Планирование 2020&#187; с докладом на тему &#171;Что делать с прерывистым спросом: современный взгляд на проблему&#187;, в котором я попытался крупными мазками обрисовать ситуацию в этой области. Это был мой первый опыт участия в онлайн конференции, но получилось, вроде бы, неплохо. Организаторы записывали все выступления, и видео [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/10/01/chto-delat-s-preryvistym-sprosom-sovremennyj-vzglyad-na-problemu-prezentaciya-na-konferencii/">Что делать с прерывистым спросом: современный взгляд на проблему</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>30 сентября я выступил на онлайн конференции &#171;<a href="https://forecasting-conference.ru/" rel="noopener noreferrer" target="_blank">Прогнозирование и Планирование 2020</a>&#187; с докладом на тему &#171;Что делать с прерывистым спросом: современный взгляд на проблему&#187;, в котором я попытался крупными мазками обрисовать ситуацию в этой области. Это был мой первый опыт участия в онлайн конференции, но получилось, вроде бы, неплохо. Организаторы записывали все выступления, и видео будут доступны через пару месяцев, как появится, я его выложу на сайт. Пока же выкладываю аннотацию к докладу и слайды. Вот они:</p>
<p><strong>Аннотация</strong>: Прерывистый спрос &#8212; это спрос, который происходит нерегулярно. Это означает, что некоторые наблюдения в данных могут содержать нули, просто из-за того, что продукт не покупают в определённые моменты времени. Прогнозирование прерывистого спроса сопряжено с разными сложностями, и стандартные методы могут быть просто не применимы к таким данным. В этой презентации мы обсудим, какие решения существуют для этой проблемы на данный момент, каковы их преимущества и недостатки, и постараемся ответить на вопрос &#171;Что же делать с прерывистым спросом?&#187;</p>
<p><a href="https://openforecast.org/wp-content/uploads/2020/10/2020-Svetunkov-Intermittent-Demand.pdf">Слайды</a>.</p>
<p>Видео:<br />
<iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/LYMySzHhtiQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/10/01/chto-delat-s-preryvistym-sprosom-sovremennyj-vzglyad-na-problemu-prezentaciya-na-konferencii/">Что делать с прерывистым спросом: современный взгляд на проблему</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2020/10/01/chto-delat-s-preryvistym-sprosom-sovremennyj-vzglyad-na-problemu-prezentaciya-na-konferencii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Точность прогнозных методов: а есть ли разница?</title>
		<link>https://openforecast.org/ru/2020/08/17/tochnost-prognoznyh-metodov-a-est-li-raznica/</link>
					<comments>https://openforecast.org/ru/2020/08/17/tochnost-prognoznyh-metodov-a-est-li-raznica/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 17 Aug 2020 16:04:56 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Оценка точности прогнозов]]></category>
		<category><![CDATA[Теория прогнозирования]]></category>
		<category><![CDATA[Прогнозные ошибки]]></category>
		<category><![CDATA[теория]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2513</guid>

					<description><![CDATA[<p>В предыдущих статьях мы обсудили, как измерять точность точечных и интервальных прогнозов в разных случаях. Теперь мы можем глубже взглянуть на эту проблему и разобраться, в какой именно степени разные методы отличаются друг от друга. Представим гипотетическую ситуацию, в которой мы имеем дело с четырьмя методами на 100 временных рядах, точность которых измеряется с помощью [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/08/17/tochnost-prognoznyh-metodov-a-est-li-raznica/">Точность прогнозных методов: а есть ли разница?</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В предыдущих статьях мы обсудили, как измерять точность <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">точечных</a> и <a href="/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">интервальных</a> прогнозов в разных случаях. Теперь мы можем глубже взглянуть на эту проблему и разобраться, в какой именно степени разные методы отличаются друг от друга. Представим гипотетическую ситуацию, в которой мы имеем дело с четырьмя методами на 100 временных рядах, точность которых измеряется с помощью RMSSE:</p>
<pre class="decode">smallCompetition <- matrix(NA, 100, 4, dimnames=list(NULL, paste0("Method",c(1:4))))
smallCompetition[,1] <- rnorm(100,1,0.35)
smallCompetition[,2] <- rnorm(100,1.2,0.2)
smallCompetition[,3] <- runif(100,0.5,1.5)
smallCompetition[,4] <- rlnorm(100,0,0.3)</pre>
<p>Мы можем сравнить среднюю и медианы в данном примере, чтобы понять, как они в целом себя ведут:</p>
<pre class="decode">overalResults <- matrix(c(colMeans(smallCompetition),apply(smallCompetition,2,median)),
                        4, 2, dimnames=list(colnames(smallCompetition),c("Mean","Median")))
round(overalResults,5)</pre>
<pre>          Mean   Median
Method1 0.99869 1.01157
Method2 1.18413 1.19839
Method3 1.00315 1.00768
Method4 1.08543 1.04730</pre>
<p>В этом искусственном примере, самым точным (в соответствии со средней RMSSE) оказался первый метод, в то время как самым неточным, оказался метод 2. Что касается медиан, то тут лидирует Метод 3. Однако разность в точность между методами 1, 3 и 4 не выглядит существенной, особенно в случае с медианами. Можем ли мы заключить, что метод 1 самый лучший и надо отдать ему предпочтение? Давайте взглянём на распределение ошибок:</p>
<pre class="decode">boxplot(overalResults)
points(colMeans(smallCompetition),col="red",pch=16)</pre>
<div id="attachment_2474" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionBoxplots.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2474" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionBoxplots-300x180.png&amp;nocache=1" alt="Ящичковая диаграмма по распределению прогнозных ошибок" width="300" height="180" class="size-medium wp-image-2474" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionBoxplots-300x180.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionBoxplots-768x461.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionBoxplots.png&amp;nocache=1 1000w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2474" class="wp-caption-text">Ящичковая диаграмма по распределению прогнозных ошибок</p></div>
<p>Эти диаграммы нам показывают, что распределение ошибок метода 2 немного смещено вверх, по сравнению с распределениями для остальных методов. При этом дисперсия ошибок во втором методе ниже, чем в остальных (это из-за того, что мы использовали <code>sd=0.2</code>, когда генерировали данные). Кроме того, по такой диаграмме тяжело однозначно заключить, что метод 1 лучше метода 3 или наоборот - их ящичковые диаграммы пересекаются и очень похожи. Ну, и последнее, метод 4 в целом кажется чуть-чуть хуже, но это возможно из-за нескольких выбросов (несколько рядов, в которых метод не сработал).</p>
<p>Это всё основные описательные статистики, которые мы обычно используем для анализа случайных величин. Они нам позволяют заключить, что методы 1 и 3 очень похожи в плане точности прогнозов, а метод 2 им уступает. Это так же находит отражение в средних и медианных ошибках, которые мы рассчитали ранее. Что же нам заключить по результатам такого анализа? Что выбрать? Метод 1 или метод 3?</p>
<p>Давайте не будем делать поспешных решений. Вспомним, что мы имеем дело с выборкой из временных рядов (100 штук). Это означает, что средняя / медианная точность методов может измениться, если в нашей выборке появится ещё несколько рядов (или если из неё выкинуть несколько). Если бы в нашем распоряжении были все временные ряды во вселенной, мы могли бы оценить наши методы на них (удачи<br />
и терпения в таком случае!) и прийти к каким-то более обоснованным выводам относительно их точности. Но мы имеем дело с выборкой, поэтому имеет смысл понять, является ли разница в точности методов статистически значимой или нет. Как это сделать?</p>
<p>Для начала, мы могли бы сравнить средние распределения ошибок с помощью какого-нибудь параметрического теста. Можно попробовать <a href="https://ru.wikipedia.org/wiki/F-%D1%82%D0%B5%D1%81%D1%82" rel="noopener noreferrer" target="_blank">F-тест</a> для того, чтобы понять, имеются ли какие бы то ни было различия в точности методов или нет. К сожалению, тест не скажет нам, какие именно методы оказались лучше, а какие хуже. Для этих целей можно использовать парный <a href="https://ru.wikipedia.org/wiki/T-%D0%BA%D1%80%D0%B8%D1%82%D0%B5%D1%80%D0%B8%D0%B9_%D0%A1%D1%82%D1%8C%D1%8E%D0%B4%D0%B5%D0%BD%D1%82%D0%B0" rel="noopener noreferrer" target="_blank">t-тест</a>, но он позволяет сравнить одновременно только два метода друг с другом. Как вариант, можно построить регрессию с фиктивными переменными, для каждого метода и на основе интервалов для полученных параметров понять, как точность в среднем отличается от метода к методу. Главная проблема во всём этом заключается в том, что эти подходы предполагают, что распределение средних ошибок нормальное. В случае с большими выборками (тысячи рядов), центральная предельная теорема может начать работать, и эта предпосылка будет иметь смысл. Но в случае с малыми выборками, она, скорее всего, будет нарушена, особенно учитывая то, что прогнозные ошибки обычно распределены асимметрично, с длинным правым хвостом.</p>
<p>Возможное решение проблемы в этой ситуации - непараметрические тесты. Мы можем сравнить медианы распределений, вместо средних. Медианы менее подвержены влиянию выбросов, так что даже в случае с асимметричным распределением на малых выборках, они будут вести себя более предсказуемо, чем средние. В этой ситуации можно провести <a href="https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D1%82%D0%B5%D1%80%D0%B8%D0%B9_%D0%A4%D1%80%D0%B8%D0%B4%D0%BC%D0%B0%D0%BD%D0%B0" rel="noopener noreferrer" target="_blank">тест Фридмана</a>, для того, чтобы понять, есть ли различия в медианах между методами (его можно считать непараметрическим аналогом F-теста). Для попарного сравнения можно использовать <a href="https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D1%82%D0%B5%D1%80%D0%B8%D0%B9_%D0%A3%D0%B8%D0%BB%D0%BA%D0%BE%D0%BA%D1%81%D0%BE%D0%BD%D0%B0" rel="noopener noreferrer" target="_blank">тест Уилкоксона</a> вместо t-теста, но он так же покажет нам только, отличаются ли друг от друга выбранные два метода или нет (а у нас их четыре).</p>
<p>Хорошо, что у нас есть тест Nemenyi (<a href="http://www.jmlr.org/papers/v7/demsar06a.html" rel="noopener noreferrer" target="_blank">Demšar, 2006</a>), который <a href="https://kourentzes.com/forecasting/2012/04/19/statistical-significance-of-forecasting-methods-an-empirical-evaluation-of-the-robustness-and-interpretability-of-the-mcb-anom-and-friedman-nemenyi-test/" rel="noopener noreferrer" target="_blank">эквивалентен тесту MCB</a> (<a href="https://doi.org/10.1016/j.ijforecast.2004.10.003" rel="noopener noreferrer" target="_blank">Koning et al., 2005</a>). Если не вдаваться в детали, то что делает тест, так это ранжирует точность методов для каждого временного ряда, а затем сравнивает средние величины. Средняя рангов соответствует медиане, так что тест фактически сравнивает медианы прогнозных ошибок. Далее строятся доверительные интервалы для каждого из средних рангов и сравниваются друг с другом. Если какие-то интервалы пересекаются, то разница между медианами этих методов не значима статистически. Существуют разные методы представления результатов этого теста, один из них реализован в функции <code>nemenyi()</code> из пакета <code>tsutils</code> для R. Функция поддерживает разные виды графиков (<a href="https://kourentzes.com/forecasting/2019/01/14/r-package-tsutils/" rel="noopener noreferrer" target="_blank">Никос Курентзес</a> обсуждал эту функцию в своём блоге), мне лично нравится стиль MCB:</p>
<pre class="decode">library(tsutils)
nemenyi(smallCompetition, plottype="mcb")</pre>
<div id="attachment_2473" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionMCB.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2473" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionMCB-300x180.png&amp;nocache=1" alt="Пример теста MCB" width="300" height="180" class="size-medium wp-image-2473" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionMCB-300x180.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionMCB-768x461.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionMCB.png&amp;nocache=1 1000w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2473" class="wp-caption-text">Тест MCB для сравнения медианных ошибок</p></div>
<p>По этому графику видно, что медианные ошибки методов 1, 3 и 4 не отличаются на 95% доверительном уровне (потому что их интервалы на графике пересекаются). При этом, как и ранее видно, что метод 3 лучше других (его медиана меньше всех), а метод 2 - хуже всех. Помимо этого, интервалы между методом 2 и методами 1 и 3 не пересекаются, так что можно заключить, что их медианные ошибки отличаются на 5% уровне остаточной вероятности. Что любопытно, интервалы второго и четвёртого методов пересекаются, так что между ними нет статистически значимой разницы. Тем не менее, мы можем заключить, что второй метод плохо работает на этих данных, а вот методы 1, 3 и 4 не сильно отличаются друг от друга. Эта ситуация может измениться, если у нас изменится выборка (например, добавится ещё сотня рядов) или увеличится число прогнозных методов.</p>
<p>Альтернативой тесту <code>nemenyi()</code>, дающей примерно такие же результаты, является построение регрессии с фиктивными переменными по рангам прогнозных ошибок. В этом случае мы получим коэффициенты модели и их доверительные интервалы, которые можно так же графически изобразить, как и в случае с Nemenyi / MCB. F-тест в таком случае покажет, отличается ли медианная ошибка хотя бы одного метода от всех остальных или нет (аналог теста Фридмана). Конечно же, статистически более правильным было бы построение порядковой логистической регрессии, но и такой простой метод с простой линейной регрессией даст необходимые результаты. К тому же, с ним значительно проще работать, чем с логистической моделью. Функция <code>rmcb()</code> из пакета <code>greybox</code> как раз реализует подобный подход. Преимущество этого метода по сравнению с <code>nemenyi()</code> заключается в скорости, особенно на больших выборках. Вот пример:</p>
<pre class="decode">library(greybox)
ourTest <- rmcb(smallCompetition,plottype="none")
ourTest
plot(ourTest,"mcb")</pre>
<pre>Regression for Multiple Comparison with the Best
The significance level is 5%
The number of observations is 100, the number of methods is 4
Significance test p-value: 0</pre>
<div id="attachment_2490" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionRMCB.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2490" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionRMCB-300x180.png&amp;nocache=1" alt="RMCB test example" width="300" height="180" class="size-medium wp-image-2490" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionRMCB-300x180.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionRMCB-768x461.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/07/smallCompetitionRMCB.png&amp;nocache=1 1000w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2490" class="wp-caption-text">RMCB test for medians of error measures for the small competition</p></div>
<p>Результаты теста аналогичны тому, что мы уже видели ранее: методы 3, 1 и 4 статистически не различимы в плане медианных RMSSE, а метод 2 оказался значительно менее точным, чем остальные. Главная разница между Nemenyi и регрессией по рангам заключается в том, как именно считаются критические значения в статистике: <code>nemenyi()</code> использует Стьюдентезированный размах, а <code>rmcb()</code> использует распределение Стьюдента (это два разных распределения). Первое более чувствительно к числу методов, которые сравниваются в тесте, чем второе. Однако, с увеличением выборки, результаты тестов будут приближаться друг к другу. Из-за этой разницы <code>rmcb()</code> утверждает, что медиана метод 4 значительно (статистически) ниже медианы метода 2 на 5% уровне остаточной вероятности. Я бы рекомендовал использовать этот метод на больших выборках.</p>
<p>Что касается выводов из всего вышенаписанного, судя по всему, хоть методы и ведут себя по-разному на наших условных данных, медианы некоторых из них не значительно отличаются друг от друга на 5% уровне (методы 3, 1 и 4). Для того, чтобы прийти к какому-то более точному выводы, нам следовало бы собрать больше данных и провести повторный анализ. Вполне возможно, что на выборке из 1000 рядов, разница между методами стала бы статистически значимой на 5% уровне, и мы смогли бы выявить явного лидера. Однако, в нашем случае для выбора наилучшего метода имеет смысл обратиться к другим важным факторам, таким как простота методов или время, требуемое на построение прогнозов. Как видим, статистические тесты могут помочь нам в принятии более взвешенное решение относительно того, какому прогнозному методу отдать предпочтение.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/08/17/tochnost-prognoznyh-metodov-a-est-li-raznica/">Точность прогнозных методов: а есть ли разница?</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2020/08/17/tochnost-prognoznyh-metodov-a-est-li-raznica/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Прогнозирование как самоцель</title>
		<link>https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/</link>
					<comments>https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 23 Mar 2020 22:24:19 +0000</pubDate>
				<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[Хайп]]></category>
		<category><![CDATA[бла-бла-бла]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2389</guid>

					<description><![CDATA[<p>Вы возможно слышали что-то о пандемии COVID-19 (последние новости из Великобритании: несколько часов назад правительство объявило о введении ограничений на перемещение людей в связи с виросом. Теперь можно только ходить в магазин за продуктами и то 1 раз в 3 дня). Число новостей, мемов и просто шума по этому поводу давно перевалило за разумный уровень. [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/">Прогнозирование как самоцель</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Вы возможно слышали что-то о пандемии COVID-19 (последние новости из Великобритании: несколько часов назад правительство объявило о введении ограничений на перемещение людей в связи с виросом. Теперь можно только ходить в магазин за продуктами и то 1 раз в 3 дня). Число новостей, мемов и просто шума по этому поводу давно перевалило за разумный уровень. Но что меня поражает больше всего, так это количество ненаучных статей на тему анализа и прогнозирования пандемии. Многие экономисты, аналитики, прогнозисты, специалисты в области машинного (и не очень) обучения, да и просто неравнодушные люди, кинулись проводить анализ и прогнозирование в этой области. Неожиданно все вокруг стали экспертами и могут с лёгкостью рассуждать о том, чего ждать, сколько случаев заражения будет на следующей наделе, сколько людей умрёт, сколько случаев заражения будет в США к 31 Марта 2021 года и так далее. Эти эксперты используют симуляции, экспоненциальное сглаживание, ARIMA, Байесовские методы, нейронные сети, экспертные методы и вообще всё, что знают для того, чтобы провести свою аналитику / построить прогнозы. У меня уже голова болит от всего этого шума, и я не считаю, что то, что делают эти люди &#8212; полезно и нужно. И вот почему.</p>
<h3>Почему?</h3>
<p>Во-первых, без знания конкретной предметной области, вся аналитика и всё прогнозирование просто сводятся к управжнениям по построению моделей. Это весело, но это не делает вас экспертами в этой области. Если вы считаете, что можно просто построить красочный график или отфильтровать шум и дать прогноз, для того, чтобы получить какой-то разумный результат, то вы серьёзно ошибаетесь. Любая аналитика должна делаться с учётом природной специфичности области, а не в вакууме. Не стоит просто так применять какую-нибудь ARIMA к ряду данных и считать, что вы сделали что-то полезное. Без понимания проблемы, это превращается просто в упражнения по работе в Excel / R / Python. Кстати, <a href="https://robjhyndman.com/hyndsight/forecasting-covid19/" rel="noopener noreferrer" target="_blank">Роб Хайндман написал по этой же теме пост</a> пару дней назад.</p>
<p>Во-вторых, мы на самом деле не знаем настоящую ситуацию. Данные, с которыми мы работаем, скорее всего, некорректные и неполные. Например, страны в эти дни перестают делать тесты всем подряд, боясь ещё большего распространения вируса. Но даже делая тесты, мы не можем точно сказать, сколько у нас заражённых на самом деле по многим разным причинам. Строя модели по неправильным данным, вы, конечно же, получите неправильные выводы. Есть одно исключение &#8212; это если вы используете специальные модели из данной области при поддержке экспертов (см. &#171;во-первых&#187; и ссылку на блог Роба).</p>
<p>В-третьих, все эти упражнения по анализу и прогнозированию совершенно не помогают в принятии каких-либо осмысленных решений. Они делаются чисто для любопытства, без особых целей. Например, какой-нибудь эксперт спрогнозировал, что число заразившихся вирусом во всём мире к 31 марта 2021 года будет от 53 до 530 миллионов человек. Ну, и что? Какое решение можно принять на основе такого прогноза? Никакое. Что могут сделать люди с этим прогнозом? Ничего. Это просто прогноз для самого себя (и возможно для самопиара). COVID-19 &#8212; это сейчас хайповая тема в аналитике, и можно заработать себе баллы и привлечь к себе внимание просто делая что-то в этой области. Но вклад в функционирование общества подобные аналитика и прогнозирование не вносят практически никакого.</p>
<h3>Что делать?</h3>
<p>Вместо того, чтобы делать подобные бессмысленные прогнозы, можно сфокусироваться, например, на том, чего ожидать в экономике из-за вируса. Карантин, само-изоляция и закрытие общественных пространств серьёзно бьют по экономике. К сожалению, судя по всему, эпидемию в отдельной взятой стране без этого не остановить. Перед нами встаёт делема: закрывать и вредить экономике или же не закрывать и вредить здоровью общества. В связи с этим можно попробовать найти ответы на следующие вопросы:</p>
<ul>
<li>Как вирус будет распространятся в разных сценариях (полное закрытие страны / частичное закрытие / никакого закрытия)?</li>
<li>Что будет с экономикой в этих сценариях?</li>
<li>Что произойдёт с бизнесом во время изоляции?</li>
<li>Как много компаний обанкротится из-за вируса?</li>
<li>Какие типы компаний обанкротятся первыми?</li>
<li>Как вся эта ситуация повлияет на цены на продукты?</li>
<li>Как много людей потеряет работу из-за удара по экономике?</li>
</ul>
<p>Ответы на эти и другие вопросы значительно более полезны и выжны. Они могут помочь принять решения прямо здесь и сейчас, пока не поздно. Скорее всего, всякие ARIMA и экспоненциальное сглаживание не помогут в ответах на эти вопросы. Судя по всему, нужно использовать экспертные методы, обращаясь за помощью к специалистам в области эпидемиологии и экономики.</p>
<p>Другой интересный пример &#8212; это панические покупки, которые уже повредили цепям поставок во многих странах. Люди неожиданно стали покупать в среднем на 200% больше, чем обычно. В связи с этим можно задать ряд вопросов, связанных с исследованием операций:</p>
<ul>
<li>Как цепь поставок отреагирует на это в краткосрочной перспективе?</li>
<li>Каков будет эффект этих панических покупок в долгосрочной перспективе?</li>
<li>Когда это закончится и когда спрос вернётся к своему нормальному уровню?</li>
<li>Что будет со спросом по окончанию паники?</li>
</ul>
<p>Ответы на эти вопросы тоже важны и помогают в принятии решений разным группам людей. Да, найти правильные ответы сложно, но они могут принести реальную пользу.</p>
<h3>Резюмируя</h3>
<p>Я не дам вам никаких прогнозов по COVID-19, просто потому что я не эксперт. Но я могу точно сказать, что по этому поводу слишком много хайпа, паники и шума. Мы (прогнозисты, экономисты, аналитик и пр.) должны помогать обществу, а не создавать ещё больше шума и паники. Поэтому, если вы хотите что-то поанализировать и попрогнозировать на тему COVID-19, а потом выложить это на всеобщее обозрение, подумайте по поводу того, как это поможет людям. Если не поможет, то просто не делайте этого.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/">Прогнозирование как самоцель</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>А что насчёт всех этих нулей? Измеряем точность прогнозов в случае прерывистого спроса</title>
		<link>https://openforecast.org/ru/2020/01/13/a-chto-naschjot-vseh-etih-nulej-izmeryaem-tochnost-prognozov-v-sluchae-preryvistogo-sprosa/</link>
					<comments>https://openforecast.org/ru/2020/01/13/a-chto-naschjot-vseh-etih-nulej-izmeryaem-tochnost-prognozov-v-sluchae-preryvistogo-sprosa/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 13 Jan 2020 20:06:34 +0000</pubDate>
				<category><![CDATA[Оценка точности прогнозов]]></category>
		<category><![CDATA[Теория прогнозирования]]></category>
		<category><![CDATA[прерывистый спрос]]></category>
		<category><![CDATA[Прогнозные ошибки]]></category>
		<category><![CDATA[теория]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2515</guid>

					<description><![CDATA[<p>В одной из предыдущих статей, мы обсудили, как измерить точность прогнозных методов в случае со стандартным спросом. Все эти MAE, RMSE, MASE, RMSSE, rMAE, rRMSE и прочие ошибки позволяют получить информацию о том, как методы себя проявили в среднем или в плане медианы. Мы так же обсудили, как измерять адекватность прогнозных интервалов, и должны быть [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/01/13/a-chto-naschjot-vseh-etih-nulej-izmeryaem-tochnost-prognozov-v-sluchae-preryvistogo-sprosa/">А что насчёт всех этих нулей? Измеряем точность прогнозов в случае прерывистого спроса</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">одной из предыдущих статей</a>, мы обсудили, как измерить точность прогнозных методов в случае со стандартным спросом. Все эти MAE, RMSE, MASE, RMSSE, rMAE, rRMSE и прочие ошибки позволяют получить информацию о том, как методы себя проявили в среднем или в плане медианы. Мы так же обсудили, как измерять <a href="/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">адекватность прогнозных интервалов</a>, и должны быть знакомы с такими понятиями, как размах, покрытие, MIS и pinball. Но всё это может стать абсолютно бесполезным, если мы имеем дело с прерывистым спросом, в котором может быть много нулей и мало информации. Поэтому имеет смысл обсудить тему измерения точности прогнозов в случае прерывистого спроса. Мы уже обсудили некоторые аспекты прерывистого спроса в статье про <a href="/2018/09/18/intermittent-state-space-intro/">прерывистое экспоненциальное сглаживание</a> какое-то время назад, и мы уже рассматривали некоторые примеры прерывистых временных рядов <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">в одной из предыдущих статей</a>. Здесь я постараюсь предоставить немного другой взгляд на проблему.</p>
<p>Прерывистый спрос &#8212; это спрос, который происходит не регулярно. Она означает, что в какие-то моменты времени мы будем регистрировать нули (никто не покупает продукт). Вот пример такого ряда:<br />
<div id="attachment_2279" style="width: 310px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2020/01/MAE-MSE-IntermittentExample.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2279" src="/wp-content/uploads/2020/01/MAE-MSE-IntermittentExample-300x175.png" alt="Пример ряда прерывистого спроса" width="300" height="175" class="size-medium wp-image-2279" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/01/MAE-MSE-IntermittentExample-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/01/MAE-MSE-IntermittentExample-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/01/MAE-MSE-IntermittentExample-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2020/01/MAE-MSE-IntermittentExample.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2279" class="wp-caption-text">Пример ряда прерывистого спроса</p></div>
<p>Как видим, в таком ряду имеется два источника случайности: случайность в размере спроса и случайность в появлении спроса. Обратите внимание, что сам спрос не обязательно должен быть целочисленным. Речь не идёт о моделях, основанных на дискретных распределениях (таких как Пуассоновское или Отрицательное Биномиальное). Речь идёт о том, что в общем случае прерывистый спрос может быть описан формулой:<br />
\begin{equation} \label{eq:general}<br />
	y_t = o_t z_t ,<br />
\end{equation}<br />
где \(y_t\) &#8212; это фактические наблюдения в момент времени \(t\), \(o_t\) &#8212; это бинарная переменная появления спроса, а \(z_t\) &#8212; это размер спроса. В то время как некоторые статистические модели не делают такого разделения, наиболее популярные методы прогнозирования основаны либо прямо либо косвенно на этой формуле.</p>
<p>Хоть в теории мы можем построить какую-нибудь сложную модель (например, <a href="https://doi.org/10.1016/j.ijpe.2013.01.009">на основе нейронных сетей</a>), обычно мы не можем точно спрогнозировать, когда именно продукт купят и в каком количестве. У нас скорее есть возможность сказать, сколько купят в среднем (точечный прогноз) или сколько купят в 95% случаев (прогнозный интервал). Но даже если мы построим такие прогнозы, следующий вопрос будет: &#171;И что же с этим делать?&#187;</p>
<p><strong>В случае с цепями поставок</strong>, типичное решение &#8212; это <em>сколько заказать или произвести единиц продукции</em>, учитывая то количество, которое уже у нас есть, спрос на продукт, который мы наблюдаем, и скорость доставки необходимого сырья / продукции контрагентами. В этом случае речь чаще всего идёт о величине <em>страховых запасов</em> &#8212; сколько единиц продукции нам нужно иметь на складе, чтобы удовлетворить спрос до тех пор, пока не доставят новую партию, да ещё так, чтобы полки в магазине не пустовали. Обычно эта величина рассчитывается как квантиль какого-нибудь распределения. Во многих случаях, на практике для этого используется Нормальное распределение, что, конечно же, в нашем случае совершенно не верно по многим причинам (начнём хотя бы с того, что оно предполагает, что спрос может быть отрицательным). Но не будем вдаваться в детали по этому поводу, попробуем понять, что такой процесс нам даёт в плане оценки точности прогнозов.</p>
<p>Страховые запасы обычно определяются исходя из <em>времени на выполнение заказа</em> (lead time). Например, если мы знаем, что следующую партию продукции нам привезут не раньше, чем через 2 недели, то нужно иметь такое количество продукции на складе, которое смогло бы удовлетворить спрос в течение этих двух недель, и не в среднем, а, скажем, в 95% или в 99% случаев (в зависимости от того, что решит компания). Как же получить величину страхового запаса? Тут как раз на сцену выходит наша <em>прогнозная модель</em>. Но фактически все рассуждения про страховой запас говорят нам о том, что нам нужен не просто точечный прогноз на каждый день, а скорее агрегированный за тот самый период доставки (например, две недели). Это первое важное отличие прогнозирования для управления запасами от прогнозирования для других целей (например, статья <a href="https://doi.org/10.1016/j.ijpe.2019.107597" rel="noopener noreferrer" target="_blank">Kourentzes et al., 2019</a> обсуждает похожую проблему).</p>
<p>Как видим, связь между фактическим наблюдаемым спросом и финальным решением о том, сколько нужно заказать, непростая. Это так же означает, что и все те прекрасные прогнозные ошибки, которые мы обсуждали в предыдущих статьях, могут и не дать нам необходимой информации о том, как именно модели себя ведут в этой ситуации. Модель может дать очень точный прогноз, но это не обязательно означает, что он будет автоматически транслироваться в более точный заказ для конкретной ситуации. Если в таких условиях нужно оценить точность прогнозной модели, то имеет смысл работать с кумулятивными значениями (за промежуток времени на выполнение заказа), а не просто наблюдаемыми в каждый момент времени. Математически это означает работу с:<br />
\begin{equation} \label{eq:demandOverTheLeadTime}<br />
	Y_{t+h} = \sum_{j=1}^h {y}_{t+j} ,<br />
\end{equation}<br />
где \(h\) &#8212; это время на выполнение заказа. На основе этого мы можем измерить среднюю точность модели, чтобы понять, как та себя ведёт в плане рабочих запасов. В случае с аддитивной моделью это сводится к расчёту:<br />
\begin{equation}<br />
\begin{aligned}<br />
	\text{E} \left(\sum_{j=1}^h {y}_{t+j} \right) = &#038; \text{E}\left(\sum_{j=1}^h (\hat{y}_{t+j}+e_{t+j})\right) = \\<br />
	&#038; \sum_{j=1}^h \text{E}(\hat{y}_{t+j}) + \sum_{j=1}^h \text{E}(e_{t+j}) = \sum_{j=1}^h \text{E}(\hat{y}_{t+j}).<br />
\end{aligned} \label{eq:workingStock}<br />
\end{equation}<br />
где \(\hat{y}_{t+j}\) &#8212; это точечный прогноз, сгенерированный моделью. В данном случае это значит, что мы можем дать точечный прогноз на \(h\) шагов вперёд и просто агрегировать его и сравнить с фактическими значениями \eqref{eq:demandOverTheLeadTime} за тот же период. Однако, если мы имеем дело с аддитивными моделями, то мы фактически подразумеваем, что спрос может быть и отрицательным, что во многих случаях имеет очень далёкое отношение к реальности, особенно в случае с прерывистым спросом. В таком случае нужна другая модель (например, с мультипликативными ошибками), а это означает, что формула \eqref{eq:workingStock} может быть и не применима. В таком случае, мы вынуждены прибегать к симуляциям: генерировать множество возможные траектории будущих значений, суммировать каждую из них, и затем рассчитывать среднюю.</p>
<p>Предположим, что мы смогли сгенерировать кумулятивный точечный прогноз. Как теперь оценить его точность? В этом случае мы можем использовать ошибки на основе RMSE (как мы уже обсуждали в <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">одной из предыдущих статей</a>), так как они минимизируются средними значениями. Для оценки точности модели в плане рабочих запасов можно воспользоваться формулой квадратической кумулятивной ошибки (Squared Cumulative Error):<br />
\begin{equation} \label{eq:workingStockRMSCE}<br />
	\text{SCE} = \left( \sum_{j=1}^h y_{t+j} -\sum_{j=1}^h \hat{y}_{t+j} \right)^2 .<br />
\end{equation}<br />
На основе неё можно рассчитать относительные или масштабированные ошибки, если нужно оценить точность моделей по выборке временных рядов. Всё, что мы обсуждали в <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">статье про точность прогнозов</a> применимо и в этом случае, если мы используем кумулятивные значения и ошибки на основе RMSE. Одна из проблем, которая может возникнуть при расчёте относительных ошибок &#8212; это использования метода Naive в качестве бенчмарка. На практике бывают ситуации, когда проверочная часть выборки содержит нули, и Naive прогнозирует, что будут нули просто по счастливому стечению обстоятельств. В таком случае мы получим деление на нуль, что сделает такую прогнозную ошибку как rRMSE бесполезной. Простое решение данной проблемы &#8212; использование средней по всему ряду вместо Naive.</p>
<p>Помимо стандартных прогнозных ошибок, есть и ориентированные на запасы, близкие по своей идее к SCE. Одна из таких называется &#171;Периоды-в-Запасе&#187; (&#171;Periods-In-Stock&#187; &#8212; PIS, <a href="https://doi.org/10.1016/j.ijpe.2010.07.013">Walstrom, 2010</a>):<br />
\begin{equation} \label{eq:workingStockPIS}<br />
	\text{PIS} = \sum_{j=1}^h \hat{y}_{t+j} -\sum_{j=1}^h y_{t+j} .<br />
\end{equation}<br />
Вы обратили внимание на то, что в ней идёт вычитание фактических значений из прогнозных, а не наоборот, как обычно принято в литературе по прогнозированию? Это сделано не просто так. Авторы специально поменяли местами эти составляющие, для того, чтобы PIS была ближе по смыслу к конкретным решениям в управлении запасами. Так, отрицательное значение PIS будет говорить об упущенных продажах, в то время как положительное будет указывать на избыточные запасы. Что нужно иметь в виду, так это то, что по тем же причинам, по которым агрегирование MAE или RMSE для разных продуктов не имеет смысл, мы не можем агрегировать PIS для яблок и груш. <a href="https://doi.org/10.1057/jors.2014.62" rel="noopener noreferrer" target="_blank">Petropoulos &#038; Kourentzes (2015)</a> предложили несколько модификаций для PIS, которые позволяют решать эту проблему.</p>
<p>Хорошо, мы разобрались более-менее с рабочими запасами. Однако хорошая точность в плане рабочих запасов не означает хорошую точность в плане страховых запасов. Поэтому надо разобраться, как оценивать точность во втором случае. Ближайшее, что мы можем получить для оценки страховых запасов &#8212; это оценка точности конкретного квантиля агрегированного (во времени) распределения. До нижней границы интервала в управлении запасами нам обычно нет дела, нам интересна верхняя. Поэтому в реальности нам нужно провести симуляции, используя модель (что-нибудь типа 1000 итераций различных вариантов развития событий), агрегировать каждую из полученных траекторий, после чего взять конкретный квантиль, соответствующий желаемому уровню страховых запасов (например, 95%). В некоторых конкретных случаях мы можем и не прибегать к симуляциям, но в таких случаях наши предположения могут сильно отличаться от реальности (например, нормальность распределения ошибок).</p>
<p>Ну, предположим, что мы рассчитали значение для нужного квантиля. Что дальше? Я бы рекомендовал использовать пинбольную функцию, <a href="/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">не забывая о её преимуществах и недостатках</a>. Мы так же можем рассчитать размах, покрытие и, если нам очень нужно что-то типа MIS, мы можем обратиться к квантильной величине (&#171;Quantile Score&#187; &#8212; QS, <a href="https://doi.org/10.1198/016214506000001437" rel="noopener noreferrer" target="_blank">Gneiting, 2007</a>), потому что мы имеем дело с одной границей, а не со стандартным интервалом:<br />
\begin{equation} \label{QS}<br />
	\text{QS} = \left(Y_{t+h} &#8212; U_{t+h} \right) \left(\mathbb{1} \left\{ Y_{t+h} \leq U_{t+h} \right\} -\alpha \right) ,<br />
\end{equation}<br />
где \(\alpha\) &#8212; это доверительная вероятность (например, 95% или 99%), \(U_{t+h}\) &#8212; это значение квантиля, а \(\mathbb{1}(\cdot)\) &#8212; это индикаторная функция, которая равна единице, если значение внутри верно и ноль в противоположной ситуации. Интерпретация QS аналогична интерпретации MIS: если фактическое значение лежит ниже границы, тогда финальное значение пенализируется меньше, чем в случае, если оно лежит выше (это определяется индикаторной функцией). QS всегда будет положительной и равной нулю только в утопической ситуации, когда все значения лежат прямо на границе \(U_{t+h}\). Главное различие между pinball и QS заключается в том, что первый пытается оценить, насколько точно измерен конкретный квантиль, а вторая пытается оценить одновременно размах и покрытие интервала. С этих позиций можно заключить, что QS несколько ближе к тому, что нас интересует в реальной жизни: мы хотим выбрать такой страховой запас, чтобы покрытие было близко к номинальному уровню (чтобы мы достигли номинального сервисного уровня), но при этом с наименьшим возможным размахом (чтобы мы не несли затраты на содержание излишков продукции). На основе QS можно рассчитать всё те же относительные или масштабированные ошибки, чтобы оценить, как модели себя показали на разных продуктах.</p>
<p>Ну, хорошо, более-менее разобрались с управлением запасами. А как там насчёт <strong>других областей, в которых встречается прерывистый спрос</strong>? В некоторых из них ситуация будет похожа на описанную выше, просто термины и конкретные решения будут немного другими. Но в других случаях, нас могут интересовать более классические вопросы. Например, в случае прогнозирования числа пациентов в госпитале, нам не нужны аккумулированные значения, так что мы можем работать с тем, сколько человек придёт в каждый конкретный час в следующие 12 часов. При этом среднее число пациентов может быть не таким полезным, как число в 95% и в 5% случаев, то есть в таком случае мы обращаемся к классическому прогнозному интервалу. Эти интервалы затем могут использоваться при принятии решений о том, сколько докторов и медсестёр должно быть в госпитале в ближайшие 12 часов, какое количество медикаментов должно быть в распоряжении и т.п. Обратите внимание, что сам прогнозный интервал не связан с конкретным решением (сколько шприцов иметь), но он может считаться своеобразным приближением к нему, если мы знаем, каким должно быть типичное количество персонала для конкретного числа пациентов. Ну, и, конечно же, это означает, что нам надо оценивать точность прогнозных интервалов, а не точечных прогнозов. Применительно к прерывистому спросу мы, возможно, опять столкнёмся с ситуацией, когда нам важнее понять, насколько точна верхняя граница интервала, так как нижняя будет, скорее всего, соответствовать нулю. Соответственно использование QS в этом контексте так же может иметь больший смысл, чем MIS.</p>
<p>Закончить эту несколько сумбурную статью хочется неожиданной рекомендацией: избегайте прерывистый спрос любой ценой. Прежде чем бросаться в моделирование с головой, подумайте, какие именно решения вы принимаете на основе прогнозов. Возможно, вам не нужны прогнозы на уровне дневных данных, так как все решения принимаются на недельном уровне (каждый понедельник мы решаем, сколько продукции заказать на неделю вперёд), и, если вы перейдёте к недельным данным, то никакой прерывистости уже не будет. А, возможно, никакого прогнозирования в вашей конкретной ситуации и не надо делать, просто потому что решения принимаются совершенно иначе на основе совсем других соображений. <strong>В любом случае, прежде чем бросаться в тёмный омут, подумайте на тему того, какие именно и как именно решения принимаются в вашей компании.</strong></p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/01/13/a-chto-naschjot-vseh-etih-nulej-izmeryaem-tochnost-prognozov-v-sluchae-preryvistogo-sprosa/">А что насчёт всех этих нулей? Измеряем точность прогнозов в случае прерывистого спроса</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2020/01/13/a-chto-naschjot-vseh-etih-nulej-izmeryaem-tochnost-prognozov-v-sluchae-preryvistogo-sprosa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>О том, как оценить адекватность прогнозных интервалов</title>
		<link>https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/</link>
					<comments>https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 18 Oct 2019 20:18:40 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Оценка точности прогнозов]]></category>
		<category><![CDATA[Теория прогнозирования]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[Прогнозные ошибки]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2235</guid>

					<description><![CDATA[<p>Введение Некоторые люди считают, что главная идея прогнозирования заключается в том, чтобы как можно более точно предсказать будущее. У меня для них плохие новости. На самом деле главная идея прогнозирования заключается в уменьшении неопределённости относительно будущего. Ведь, будущее не предопределено, мы никогда не знаем, что именно произойдёт, когда и как. Но с помощью методов прогнозирования [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">О том, как оценить адекватность прогнозных интервалов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Введение</h3>
<p>Некоторые люди считают, что главная идея прогнозирования заключается в том, чтобы как можно более точно предсказать будущее. У меня для них плохие новости. На самом деле главная идея прогнозирования заключается в уменьшении неопределённости относительно будущего. Ведь, будущее не предопределено, мы никогда не знаем, что именно произойдёт, когда и как. Но с помощью методов прогнозирования мы можем хотя бы сказать, чего не стоит ждать и очертить область, в которой, вероятно, событие произойдёт&#8230;</p>
<p>В принципе, любое событие, которое мы хотим рассмотреть с точки зрения прогнозирования, может быть представлено некой систематической составляющей \(\mu_t\), которую можно описать с помощью некоторой модели, а так же случайной компонентой \(\epsilon_t\). Последняя может и не быть случайной по природе, но будет считаться случайной для целей моделирования. А всё из-за того, что мы не можем, например, предсказать, пойдёт ли конкретный человек в поликлинику в определённый день или нет. Поэтому тот спрос (или с чем вы там работаете), который мы наблюдаем в виде конкретных величин, может быть грубо описан математически следующим образом:<br />
\begin{equation} \label{eq:demand}<br />
y_t = \mu_t + \epsilon_t,<br />
\end{equation}<br />
где \(y_t\) &#8212; это фактические значения спроса (есть и другие формулы для нелинейных моделей, но они не меняют суть дискуссии, поэтому пока тут мы будем говорить о простой линейной модели). Что же мы обычно делаем в прогнозировании? Мы пытаемся как можно точнее описать систематическую составляющую \(\mu_t\), пытаясь выловить структуру и каким-то образом так же получить представление о неопределённости \(\epsilon_t\) вокруг этой структуры. Когда речь заходит об ошибке \(\epsilon_t\), мы обычно можем только что-то сказать о том, как это величина распределена, и какие у неё параметры (например, математическое ожидание и дисперсия). </p>
<p>Поэтому, когда перед нами имеется какой-нибудь вот такой временной ряд:</p>
<p><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample.png&amp;nocache=1"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2202" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>то мы можем сказать, что средний уровень продаж составляет 1000 единиц, но так же, что вокруг этого уровня имеются некие случайные отклонения, характеризуемые каким-то СКО \(\sigma \approx 100 \). Суть прогнозирования сводится к тому, чтобы оценить как можно точнее \(\mu_t\) и \(\sigma\). Если нам удастся это сделать, то мы построим точечные прогнозы (синяя линия на графике) и прогнозный интервал шириной \(1-\alpha\) (скажем, 95-ти процентный, серая область на графике), который в идеальной ситуации будет накрывать \((1-\alpha) \times 100\)% наблюдений.</p>
<p>В реальности, мы никогда не знаем переменную \(\mu_t\), поэтому, в процессе построения модели мы можем либо переоценить её (&#171;underestimate&#187;, например, не включив сезонную компоненту), что приведёт к излишне высокой дисперсии и увеличенной ширине прогнозного интервала, либо недооценить её (&#171;overestimate&#187;, например, включив тренд, когда это ненужно), что приведёт к заниженной дисперсии и не реалистично узким прогнозным интервалам. Поэтому при выборе модели, мы пытаемся добраться как можно ближе к значениям \(\mu_t\) и \(\sigma\). </p>
<p>Когда речь заходит о непосредственном прогнозировании, мы обычно строим точечные прогнозы, которые соответствуют условной средней величине модели, призванной точно отразить будущие значения \(\mu_t\), а так же прогнозные интервалы, которые соответствуют определённым квантилям распределения и по идеи должны каким-то образом описать неопределённость случайной величины \(\epsilon_t\). На этом сайте уже была <a href="/2017/06/11/prediction-intervals/">статья на тему прогнозных интервалов</a>, а так же пару статей на тему <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">измерения точности точечных прогнозов</a>. В этой статье мы обсудим, как понять, правильно ли модель выловила эту самую неопределённость или нет.</p>
<h3>Интервальный оценки</h3>
<p>Рассмотрим следующий пример в R с использованием функций пакета smooth v2.5.4. Сгенерируем данные на основе модели ETS(A,N,A) с построим по этим данным несколько моделей:</p>
<pre class="decode">library(smooth)
x <- sim.es("ANA", obs=120, frequency=12, persistence=c(0.3,0.1), initial=c(1000), mean=0, sd=100)
modelUnderfit <- es(x$data, "ANN", silent=F, interval=T, holdout=T, h=24)
modelOverfit <- es(x$data, "AAA", silent=F, interval=T, holdout=T, h=24)
modelCorrect <- es(x$data, "ANA", silent=F, interval=T, holdout=T, h=24)
modelTrue <- es(x, silent=F, interval=T, holdout=T, h=24)</pre>
<div class="su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-spoiler-title" tabindex="0" role="button"><span class="su-spoiler-icon"></span>Четыре картинки с модельками</div><div class="su-spoiler-content su-u-clearfix su-u-trim">
<div id="attachment_2207" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2207" class="size-medium wp-image-2207" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2207" class="wp-caption-text">Модель, недооценивающая данные</p></div>
<div id="attachment_2206" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2206" class="size-medium wp-image-2206" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2206" class="wp-caption-text">Модель, переоценивающая данные</p></div>
<div id="attachment_2208" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2208" class="size-medium wp-image-2208" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2208" class="wp-caption-text">Правильная модель</p></div>
<div id="attachment_2204" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2204" class="size-medium wp-image-2204" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2204" class="wp-caption-text">Истинная модель</p></div>
</div></div>
<p>Сами данные демонстрируют меняющийся уровень ряда и изменяющуюся во времени сезонность. А четыре модели, которые мы использовали, это:</p>
<ol>
<li>ETS(A,N,N), которая недооценивает данные (underfitting) из-за отсутствия сезонной компоненты,</li>
<li>ETS(A,A,A), которая переоценивает данные (overfitting) из-за лишней компоненты (тренд),</li>
<li>ETS(A,N,A), которая правильно специфицирована, но параметры которой рассчитаны на основе выборки,</li>
<li>ETS(A,N,A) - истинная модель, с правильными параметрами.</li>
</ol>
<p>Все эти модели дают нам точечные прогнозы, точность которых можно оценить с помощью <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">каких-нибудь ошибок</a>:</p>
<pre class="decode">errorMeasures <- rbind(modelUnderfit$accuracy,
                       modelOverfit$accuracy,
                       modelCorrect$accuracy,
                       modelTrue$accuracy)[,c("sMAE","sMSE","sCE")]
rownames(errorMeasures) <- c("Model Underfit","Model Overfit","Model Correct","Model True")
errorMeasures*100</pre>
<pre>                    sMAE      sMSE       sCE
Model Underfit 45.134368 25.510527 -122.3740
Model Overfit  19.797382  5.026588 -449.8459
Model Correct   9.580048  1.327130 -149.7284
Model True      9.529042  1.318951 -139.8342</pre>
<p>Обратите внимание, что в нашем примере первая модель дала наименее точный прогноз из-за отсутствия сезонной компоненты, но при этом дала наименее смещённый прогноз (sCE=-122.3740), что могло произойти просто по счастливой случайности. Вторая модель оказалась точнее первой, потому что в ней есть необходимая компонента, но не такой точной, как правильная модель из-за наличия тренда, который продолжает нисходящую траекторию на проверочной выборке. Что касается последних двух моделей, то разница в их точности достаточно мала, но, судя по всему, истинная модель оказалась немного точнее модели, оцененной по выборке.</p>
<p>Что более важно, все эти модели дали разные интервальные прогнозы. Проблема в том, что графически их проанализировать затруднительно. Поэтому нам стоит оценить их точность с помощью каких-нибудь показателей. Например, <strong>Mean Interval Score</strong> (MIS), предложенной <a href="https://doi.org/10.1198/016214506000001437" target="_blank" rel="noopener noreferrer">Gneiting (2011)</a> и популяризованной во время <a href="https://www.mcompetitions.unic.ac.cy/m4/" target="_blank" rel="noopener noreferrer">M4 Competition</a>:<br />
\begin{equation} \label{MIS}<br />
\begin{matrix}<br />
\text{MIS} = & \frac{1}{h} \sum_{j=1}^h \left( (u_{t+j} -l_{t+j}) + \frac{2}{\alpha} (l_{t+j} -y_{t+j}) \mathbb{1}(y_{t+j} < l_{t+j}) \right. \\ &#038; \left. + \frac{2}{\alpha} (y_{t+j} -u_{t+j}) \mathbb{1}(y_{t+j} > u_{t+j}) \right) ,<br />
\end{matrix}<br />
\end{equation}<br />
где \(u_{t+j}\) - это верхняя граница, \(l_{t+j}\) - это нижняя граница  интервала, \(\alpha\) - это уровень значимости, а \(\mathbb{1}(\cdot)\) - это индикаторная функция, значение которой равно единице, в случае, если условие внутри неё верно, и нулю в противном случае. Идея MIS заключается в том, чтобы оценить размах интервала вместе с его охватом (сколько наблюдений было накрыто интервалом). Если фактические значения лежат вне интервала, то ошибка увеличивается пропорционально расстоянию до них с коэффициентом \(\frac{2}{\alpha}\). Кроме того, ширина интервала положительно влияет на значение индекса: чем шире интервал, тем больше значение MIS. Идеалистическая модель со значением MIS=0 должна содержать значения на границах интервал, причём \(u_{t+j}=l_{t+j}\), что означает, что будущее предопределено, никакой случайно составляющей нет. Конечно же, в реальности это просто невозможно.</p>
<p>Этот индекс доступен в пакете greybox для R:</p>
<pre class="decode">c(MIS(modelUnderfit$holdout,modelUnderfit$lower,modelUnderfit$upper,level=0.95),
  MIS(modelOverfit$holdout,modelOverfit$lower,modelOverfit$upper,level=0.95),
  MIS(modelCorrect$holdout,modelCorrect$lower,modelCorrect$upper,level=0.95),
  MIS(modelTrue$holdout,modelTrue$lower,modelTrue$upper,level=0.95))</pre>
<pre>[1] 1541.6667 1427.7527  431.7717  504.8203</pre>
<p>Полученные цифры сами по себе ничего нам не говорят, их надо сравнивать друг с другом. Как видим, первая модель показала себя хуже всех в плане прогнозных интервалов, в то время как правильная модель 3 настолько хороша, что даже уделала истинную модель 4 (это могло произойти по чистой случайности). </p>
<p>К сожалению, мы не можем сказать ничего больше по поводу интервалов на основе MIS. Поэтому для того, чтобы понять, что же именно произошло, мы можем обратиться к среднему размаху интервалов (range):<br />
\begin{equation} \label{range}<br />
\text{range} = \frac{1}{h} \sum_{j=1}^h (u_{t+j} -l_{t+j}) ,<br />
\end{equation}<br />
которая на человеческом языке означает среднюю фактической ширины интервалов с первого по h шагов вперёд. Вот как это рассчитать в R:</p>
<pre class="decode">c(mean(modelUnderfit$upper - modelUnderfit$lower),
  mean(modelOverfit$upper - modelOverfit$lower),
  mean(modelCorrect$upper - modelCorrect$lower),
  mean(modelTrue$upper - modelTrue$lower))</pre>
<pre>[1] 1541.6667  297.1488  431.7717  504.8203</pre>
<p>Глядя на эти цифры, становится понятно, что вторая модель (которая переоценивает данные) произвела самые узкие интервалы из четырёх моделей, и серьёзно недооценила неопределённость. Это привело к тому, что большая часть значений оказалась вне интервала. Заметьте так же, что ширина интервалов первой модели значительно больше ширины других интервалов. Это плохо, потому что принимать решения на их основе будет затруднительно (что-то типа "завтра мы продадим от 100 до 1600 единиц хлеба").</p>
<p>Что можно ещё сделать, так это рассчитать среднюю величину покрытия интервалами (coverage):<br />
\begin{equation} \label{coverage}<br />
\text{coverage} = \frac{1}{h} \sum_{j=1}^h \left( \mathbb{1}(y_{t+j} < l_{t+j}) \times \mathbb{1}(y_{t+j} > u_{t+j}) \right) ,<br />
\end{equation}<br />
что может быть сделано в R следующим образом:</p>
<pre class="decode">c(sum((modelUnderfit$holdout > modelUnderfit$lower & modelUnderfit$holdout < modelUnderfit$upper)) / length(modelUnderfit$holdout),
  sum((modelOverfit$holdout > modelOverfit$lower & modelOverfit$holdout < modelOverfit$upper)) / length(modelOverfit$holdout),
  sum((modelCorrect$holdout > modelCorrect$lower & modelCorrect$holdout < modelCorrect$upper)) / length(modelCorrect$holdout),
  sum((modelTrue$holdout > modelTrue$lower & modelTrue$holdout < modelTrue$upper)) / length(modelTrue$holdout))</pre>
<pre>[1] 1.0000000 0.5416667 1.0000000 1.0000000</pre>
<p>К сожалению, в нашем случае эта величина оказалось не очень полезной. Например, первая, третья и четвёртая модели содержат в своих интервалах 100% наблюдений, хотя должны бы содержать 95%. Что же касается второй модели, то она накрывает только 54.2% наблюдений, что, конечно же, тоже плохо. Тем не менее, глядя на размах и величину покрытия мы можем заключить, что проблема второй модели заключается в излишне узком интервале, проблема первой - в излишне широком, в то время как третья и четвёртая неплохо себя проявили в этом упражнении.</p>
<p>Если нам нужно получить ещё более подробную оценку точности интервалов, мы можем обратиться к <a href="/etextbook/forecasting_toolbox/estimation-simple-methods/">пинбольной функции</a> для каждой границы по отдельности (кажется, она была предложена <a href="https://doi.org/10.2307/1913643" target="_blank" rel="noopener noreferrer">Koenker & Basset, 1978</a>):<br />
\begin{equation} \label{pinball}<br />
\text{pinball} = (1 -\alpha) \sum_{y_{t+j} < b_{t+j}, j=1,\dots,h } |y_{t+j} -b_{t+j}| + \alpha \sum_{y_{t+j} \geq b_{t+j} , j=1,\dots,h } |y_{t+j} -b_{t+j}|,
\end{equation}
где \(b_{t+j}\) - это значение границы интервала (верхней или нижней). Пинбол, по идеи, должен показывать, насколько точно мы оценили конкретный квантиль распределения. Чем меньше его значение, тем ближе мы оказались к квантилю. Если он равен нулю, то мы идеально попали в соответствующий квантиль.

В нашем случае, мы строили 95% прогнозный интервал, что означает, что мы целились в 2.5% и 97.5% квантили. Пинбол можно рассчитать с помощью функции пакета greybox в R:


<pre class="decode">pinballValues <- cbind(c(pinball(modelUnderfit$holdout,modelUnderfit$lower,0.025),
                         pinball(modelOverfit$holdout,modelOverfit$lower,0.025),
                         pinball(modelCorrect$holdout,modelCorrect$lower,0.025),
                         pinball(modelTrue$holdout,modelTrue$lower,0.025)),
                       c(pinball(modelUnderfit$holdout,modelUnderfit$upper,0.975),
                         pinball(modelOverfit$holdout,modelOverfit$upper,0.975),
                         pinball(modelCorrect$holdout,modelCorrect$upper,0.975),
                         pinball(modelTrue$holdout,modelTrue$upper,0.975)))
rownames(pinballValues) <- c("Model Underfit","Model Overfit","Model Correct","Model True")
colnames(pinballValues) <- c("lower","upper")
pinballValues</pre>
<pre>                  lower    upper
Model Underfit 484.0630 440.9371
Model Overfit  168.4098 688.2418
Model Correct  155.9144 103.1486
Model True     176.0856 126.8066</pre>
<p>Мы вновь можем заметить, что сами по себе значения пинболов нам ни о чём не говорят - они должны сравниваться друг с другом. На основе этого сравнения можно заключить, что правильная модель 3 оказалась точнее как для 2.5%, так и для 97.5% квантилей. Она даже побила истинную модель в этом примере, что согласуется с нашими предыдущими наблюдениями. Впрочем, это пример на одном временном ряде, так что это не показательно.</p>
<p>Кроме того, мы видим, что первая модель оказалась хуже правильной модели в плане как верхней, так и нижней границ интервала. Это всё из-за того, что размах её интервалов оказался завышенным. Она смогла только побить вторую модель (с переоценкой) по 97.5% квантилю, а так она показала себя достаточно плохо.</p>
<p>Что касается второй модели, нижняя граница её интервала оказалась достаточно точной, но вот верхняя оказалась совсем никудышной. Это всё из-за тренда, который тянет прогнозы вниз.</p>
<p>Стоит отдельно заметить, что с пинболами работать достаточно затруднительно, так как для точной оценки квантилей требуются большие выборки. Например, для того, чтобы получить более-менее адекватное представление о том, как себя проявил 97.5% квантильный прогноз, в нашем распоряжении должно быть как минимум 40 наблюдений, чтобы 39 из них лежали ниже границы (\(\frac{39}{40} = 0.975\)). На самом деле, с квантилями вообще тяжело работать, потому что их не всегда можно точно определить. Для напоминания, математически квантиль определяется так:<br />
\begin{equation} \label{quantile}<br />
P \left(y_t < q_{\alpha} \right) = \alpha ,
\end{equation}
что на человеческом языке означает "вероятность того, что значение окажется ниже определённого \(\alpha\)-квантиля равна \(\alpha\)". Продолжая наш пример, если в нашем распоряжении всего лишь 20 наблюдений, мы можем хоть с какой-то точностью определить только \(\frac{19}{20} = 0.95\) квантиль. Всё, что находится между 95% и 100% в этом случае - это серая зона.

Последнее, что хотелось бы сказать по поводу всех этих индексов, это то, что они измеряются в оригинальных единицах (например, литры пива). Поэтому их нельзя агрегировать для разных временных рядов. Для того, чтобы получить правильное представление о точности интервалов, нам нужно как-то избавиться от единиц измерения. Мы можем, например, всё масштабировать с помощью средней величины (как <a href="https://doi.org/10.1057/jors.2014.62" target="_blank" rel="noopener noreferrer">Petropoulos & Kourentzes (2015)</a>), либо на основе средних разностей (как <a href="https://doi.org/10.1016/j.ijforecast.2006.03.001" target="_blank" rel="noopener noreferrer">Hyndman & Koehler (2006)</a>), либо на основе относительных значений (как similar to <a href="https://doi.org/10.1016/j.ijforecast.2012.09.002" target="_blank" rel="noopener noreferrer">Davydenko & Fildes (2013)</a>).</p>
<h3>Эксперимент в R</h3>
<p>Для того, чтобы понять, как ведут себя все эти индексы, попробуем провести эксперимент на выборке из 1000 рядов, сгенерированных таким же образом, как и наш пример до того. Вот пример скрипта для R:</p>
<div class="su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-spoiler-title" tabindex="0" role="button"><span class="su-spoiler-icon"></span>Кусок кода в R</div><div class="su-spoiler-content su-u-clearfix su-u-trim">
<pre class="decode">library(smooth)
# 4 models, 5 measures: MIS, Coverage, Range, Pinball L, Pinball U, 1000 iterations
errorMeasures <- array(NA, c(1000,4,5), dimnames=list(NULL, c("Model Underfit","Model Overfit","Model Correct","Model True"),
                                                      c("MIS","Range","Coverage","Lower","Upper")))

for(i in 1:1000){
    x <- sim.es("ANA", obs=120, frequency=12, persistence=c(0.3,0.1), initial=c(1000), mean=0, sd=100)
    
    modelUnderfit <- es(x$data, "ANN", silent=T, interval="p", holdout=T, h=24)
    modelOverfit <- es(x$data, "AAA", silent=T, interval="p", holdout=T, h=24)
    modelCorrect <- es(x$data, "ANA", silent=T, interval="p", holdout=T, h=24)
    modelTrue <- es(x, silent=T, interval=T, holdout=T, h=24)
    
    errorMeasures[i,,1] <- c(MIS(modelUnderfit$holdout,modelUnderfit$lower,modelUnderfit$upper,level=0.95),
                             MIS(modelOverfit$holdout,modelOverfit$lower,modelOverfit$upper,level=0.95),
                             MIS(modelCorrect$holdout,modelCorrect$lower,modelCorrect$upper,level=0.95),
                             MIS(modelTrue$holdout,modelTrue$lower,modelTrue$upper,level=0.95));
    
    errorMeasures[i,,2] <- c(mean(modelUnderfit$upper - modelUnderfit$lower),
                             mean(modelOverfit$upper - modelOverfit$lower),
                             mean(modelCorrect$upper - modelCorrect$lower),
                             mean(modelTrue$upper - modelTrue$lower));
    
    errorMeasures[i,,3] <- c(sum(modelUnderfit$holdout > modelUnderfit$lower & modelUnderfit$holdout < modelUnderfit$upper),
                             sum(modelOverfit$holdout > modelOverfit$lower & modelOverfit$holdout < modelOverfit$upper),
                             sum(modelCorrect$holdout > modelCorrect$lower & modelCorrect$holdout < modelCorrect$upper),
                             sum(modelTrue$holdout > modelTrue$lower & modelTrue$holdout < modelTrue$upper)) / length(modelUnderfit$holdout);
    
    errorMeasures[i,,4] <- c(pinball(modelUnderfit$holdout,modelUnderfit$lower,0.025),
                             pinball(modelOverfit$holdout,modelOverfit$lower,0.025),
                             pinball(modelCorrect$holdout,modelCorrect$lower,0.025),
                             pinball(modelTrue$holdout,modelTrue$lower,0.025));
    
    errorMeasures[i,,5] <- c(pinball(modelUnderfit$holdout,modelUnderfit$upper,0.975),
                             pinball(modelOverfit$holdout,modelOverfit$upper,0.975),
                             pinball(modelCorrect$holdout,modelCorrect$upper,0.975),
                             pinball(modelTrue$holdout,modelTrue$upper,0.975));
}</pre>
</div></div>
<p>Признаюсь, это не самый эффективный код, можно было бы его распараллелить, но посчитал, что для целей нашего эксперимента, можно и подождать минут десять.</p>
<p>Проблема, с которой мы теперь сталкиваемся, рассчитав все эти значения по выборке из 1000 рядов - это как раз единицы измерения. Простое решение - взять одну из моделей за эталон и рассчитать относительные индексы на основе неё. В качестве такой модели я возьму правильную модель 3 (обратите внимание, что покрытие, coverage, уже измеряется в относительных величинах, поэтому его ненужно модифицировать):</p>
<pre class="decode">errorMeasuresRelative <- errorMeasures
for(i in 1:4){
    errorMeasuresRelative[,i,c(1,2,4,5)] <- errorMeasures[,i,c(1,2,4,5)] / errorMeasures[,3,c(1,2,4,5)]
}</pre>
<p>Таким образом мы будем анализировать относительные размах, MIS и пинбол, которые можно аггрегировать как угодно, но лучше - с помощью средних геометрических:</p>
<pre class="decode">round(cbind(exp(apply(log(errorMeasuresRelative[,,-3]),c(2,3),mean)),
            apply(errorMeasuresRelative,c(2,3),mean)[,3,drop=FALSE]),3)</pre>
<pre>                 MIS Range Lower Upper Coverage
Model Underfit 2.091 2.251 2.122 2.133    0.958
Model Overfit  1.133 1.040 1.123 1.113    0.910
Model Correct  1.000 1.000 1.000 1.000    0.938
Model True     0.962 1.013 0.964 0.963    0.951</pre>
<p>Как видим, модель, которая недооценивает данные дала на 125.1% более широкие интервалы, чем правильная модель. У неё так же более высокие значения пинболов (на 112.2% и 113.3% выше соответственно), что означает, что она сильно промахнулась относительно 2.5% и 97.5% квантилей. Резюмируя, модель переоценила неопределённость из-за того, что в ней не оказалось необходимой сезонной компоненты. Однако, покрытие у неё оказалось очень близко к 95%, что говорит о том, что сам подход к построению интервалов оказался корректным.</p>
<p>Вторая модель, которая переоценила данные, обладает более широким размахом, чем правильная модель, но при этом покрывает меньше фактических наблюдений своими интервалами. В целом, хоть ситуация с этой моделью не такая критическая, как с первой, решения на основе её интервалов принимать не безопасно.</p>
<p>Истинная модель (последняя в таблице) произвела интервалы чуть шире, чем модель, оценённая по выборке, но при этом оказалась точнее в плане конкретных квантилей и покрыла 95.1% наблюдений, что практически неотличимо от номинального значения.</p>
<p>А что касается третьей модели, она оказалась лучше первых двух в плане MIS, размаха и пинбола, но при этом покрыла только 93.8% значений в выборке, что существенно ниже, чем 95%. Это всё из-за того, что мы оценивали параметры по выборке и того, как именно учитывается неопределённость в моделях ETS - подход <a href="https://www.springer.com/gp/book/9783540719168" rel="noopener noreferrer" target="_blank">Hyndman et al. (2008)</a> подразумевает, что параметры известны... Это одна из неизученных проблем в области ETS на данный момент.</p>
<p>Вообще же, могут быть и другие причины в том, почему правильная модель дала не самые точные интервалы, некоторые из которых мы уже <a href="/2017/06/11/prediction-intervals/">обсуждали в прошлом</a>. Но главная мысль данной статьи заключается в том, что, несмотря на то, как именно мы конструируем интервалы, несмотря на то, какие модели используем и как их выбираем, у нас есть специальные инструменты, которые могут позволить нам понять, насколько правильно мы смогли уловить неопределённость.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">О том, как оценить адекватность прогнозных интервалов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Как измерить точность прогнозов</title>
		<link>https://openforecast.org/ru/2019/08/25/kak-izmerit-tochnost-prognozov/</link>
					<comments>https://openforecast.org/ru/2019/08/25/kak-izmerit-tochnost-prognozov/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Sun, 25 Aug 2019 17:59:40 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Оценка точности прогнозов]]></category>
		<category><![CDATA[Теория прогнозирования]]></category>
		<category><![CDATA[Прогнозные ошибки]]></category>
		<category><![CDATA[теория]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2070</guid>

					<description><![CDATA[<p>Два года назад я написал статью на английском языке про прогнозные ошибки и о том, как можно и как ненужно измерять точность прогнозов. Переводить на русский я её не стал из-за нехватки времени и дублирования частей статьи вот этим постом на русскоязычной версии сайта. Но прошло время, моё понимание проблемы немного изменилось, и я решил [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/08/25/kak-izmerit-tochnost-prognozov/">Как измерить точность прогнозов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Два года назад я написал <a href="/en/2017/07/29/naughty-apes-and-the-quest-for-the-holy-grail/">статью на английском языке</a> про прогнозные ошибки и о том, как можно и как ненужно измерять точность прогнозов. Переводить на русский я её не стал из-за нехватки времени и дублирования частей статьи <a href="/etextbook/forecasting_toolbox/models_quality/">вот этим постом</a> на русскоязычной версии сайта. Но прошло время, моё понимание проблемы немного изменилось, и я решил написать продолжение статьи. В этот раз я решил перевести продолжение, так как в нём, как мне кажется, есть полезная информация.</p>
<h3>Введение</h3>
<p>Начнём с того, что в статистике есть понимание, что <a href="/etextbook/forecasting_toolbox/models_quality/">MSE</a> минимизируется средней величиной, в то время как <a href="/etextbook/forecasting_toolbox/models_quality/">MAE</a> минимизируется медианой. В сети Интернет можно найти много статей на эту тему. Вот, например, <a href="http://dx.doi.org/10.1080/00031305.1990.10475690" rel="noopener noreferrer" target="_blank">первая</a>, <a href="https://doi.org/10.1016/j.ijforecast.2015.12.004" rel="noopener noreferrer" target="_blank">вторая</a> и <a href="https://math.stackexchange.com/questions/2554243/understanding-the-mean-minimizes-the-mean-squared-error/2554276" rel="noopener noreferrer" target="_blank">третья</a>. Они на английском, но по-разному так или иначе объясняют эту идею. Но в связи с этим среди прогнозистов и статистиков иногда возникает недопонимание того, что можно делать, измеряя точность моделей, а чего нельзя.</p>
<p>Во-первых, некоторые аналитики считают, что подобное соотношение применимо только при оценке моделей. По какой-то причине они считают, что оценка точности на проверочной выборке разительно отличается от процесса построения модели. Однако при выборе модели на основе некой ошибки, мы так или иначе накладываем условия на сами прогнозы. Если один метод гарантирует меньшую MAE, чем другой на проверочной выборке, то это означает что его прогноз ближе к медиане данных.</p>
<p>Для того, чтобы лучше понять эту идею, возьмём пример с нулевым прогнозом. В случае с прерывистым спросом (когда спрос происходит не предсказуемо) нулевой прогноз будет наилучшим в соответствии с MAE, особенно, если нулей в данных больше 50%. Причина этого эффекта проста: если ваши данные содержат большое количество нулей, то самый простой и безопасный прогноз &#8212; это сказать, что мы ничего в будущем не продадим. Полезность такого прогноза сомнительна, но он будет достаточно точным. Именно поэтому <strong>ошибки на основе MAE нельзя использовать на данных прерывистого спроса</strong>.</p>
<div class="su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-spoiler-title" tabindex="0" role="button"><span class="su-spoiler-icon"></span>Не до конца понятно? Давайте объясню...</div><div class="su-spoiler-content su-u-clearfix su-u-trim">
Проясним эту идею на примере, используя R. Мы сгенерируем ряд данных из смеси нормального распределения и распределения Бернулли (с вероятностью \(p=0.4\)):</p>
<pre class="decode">x <- rnorm(150,30,10) * rbinom(150, 1, 0.4)</pre>
<p>Ряд будет выглядеть примерно так:</p>
<pre class="decode">plot.ts(x)</pre>
<div id="attachment_2169" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExample.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2169" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExample-300x175.png&amp;nocache=1" alt="" width="300" height="175" class="size-medium wp-image-2169" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExample-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExample-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExample-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExample.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2169" class="wp-caption-text">Пример условного ряда</p></div>
<p>Далее мы используем 100 наблюдений для построения прогнозов и 50 для сравнения их точности. Будем использовать два метода прогнозирования: простую среднюю по обучающей выборке и нулевой прогноз (который в нашем случае соответствует медиане). Они выглядят примерно так:</p>
<pre class="decode">plot.ts(x)
abline(h=mean(x[1:100]),col="blue", lwd=2)
abline(h=0,col="purple", lwd=2)
abline(v=100, col="red", lwd=2)</pre>
<div id="attachment_2170" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExampleForecast.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2170" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExampleForecast-300x175.png&amp;nocache=1" alt="" width="300" height="175" class="size-medium wp-image-2170" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExampleForecast-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExampleForecast-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExampleForecast-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MAE-MSE-IntermittentExampleForecast.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2170" class="wp-caption-text">Пример условного ряда и прогнозов по двум методам: синяя линия - простая средняя, фиолетовая линия - нулевой прогноз. Красная линия делит выборку на обучающую и проверочную части</p></div>
<p>Очевидно, что средняя дала более адекватный прогноз, чем метод с нулями. По крайней мере, точечный прогноз проходит более-менее в середине ряда и на основе него можно принимать какие-то решения (например, что в среднем мы продадим около 12 единиц в день). Нулевой же прогноз не несёт никакой ценности, так как мы даже не можем сказать, стоит ли продолжать продажи продукта. Что же нам скажут наши ошибки?</p>
<pre class="decode">errorMeasures <- matrix(c(mean(abs(x&#091;101:150&#093; - mean(x&#091;1:100&#093;))),
                          mean(abs(x&#091;101:150&#093; - 0)),
                          mean((x&#091;101:150&#093; - mean(x&#091;1:100&#093;))^2),
                          mean((x&#091;101:150&#093; - 0)^2)),
                        2,2,dimnames=list(c("Average","Zero"),c("MAE","MSE")))
errorMeasures</pre>
<pre>        MAE     MSE
Average 15.4360 264.9922
Zero    12.3995 418.4934</pre>
<p>Как видим, MAE рекомендует использовать нулевой прогноз (ошибка составила 12.3995 против 15.4360 в случае со средней), в то время как MSE рекомендует среднюю (264.9922 против 418.4934). Это простая иллюстрация тезиса, высказанного выше про средние и медианы.</div></div>
<p>Во-вторых, некоторые исследователи считают, что если модель оценена путём минимизации, например, MSE, то она может быть оценена только с помощью соответствующих ошибок на основе MSE. Это не совсем так. Да, скорее всего, ваша модель лучше себя покажет в том случае, если целевая функция при оценке соответствует целевой функции при тестировании модели на отдельной выборке (например, MSE и там, и там). Но это не означает, что мы не можем использовать ошибки на основе других функций. Выбор метрики должен быть мотивирован конкретными задачами (для чего мы делаем прогноз), а не тем, как мы оценивали модель. В идеале ваше конкретное управленческое решение должно быть согласовано с выбранной ошибкой. Например, при управлении запасами нам может быть важно знать, насколько модель позволяет точно сформировать страховой запас. В этом случае нам вообще могут быть нужны не ошибки на основе MAE или MSE, а более продвинутые эксперименты с симуляцией спроса.</p>
<p>В качестве промежуточных выводов отметим, что ошибки на основе MSE должны использоваться тогда, когда нам требуется идентифицировать метод, дающий наиболее точный средний прогноз, в то время, как ошибки на основе MAE должны использоваться для оценки медианы, вне зависимости от того, как модель была оценена.</p>
<p>Один из вопросов, который может возникнуть по прочтении всего этого: что же минимизируют <a href="/etextbook/forecasting_toolbox/models_quality/">MAPE и SMAPE</a>? Стефан Коласса и Мартин Роланд (<a href="https://foresight.forecasters.org/product/foresight-issue-23/" rel="noopener noreferrer" target="_blank">Stephan Kolassa and Martin Roland, 2011</a>) показали на простом примере, что минимум MAPE достигается смещённым прогнозом, а сам Стефан в своей статье (<a href="https://doi.org/10.1016/j.ijforecast.2015.12.004" rel="noopener noreferrer" target="_blank">Stephan Kolassa, 2016</a>) обратил внимание на то, что в случае с лог нормальным распределением случайной величины MAPE минимизируется модой. Однако до сих пор совершенно непонятно, что происходит в случае с SMAPE. Это ещё одна причина, по которой SMAPE лучше не использовать (остальные обсуждались в <a href="/etextbook/forecasting_toolbox/models_quality/">соответствующей статье</a>).</p>
<p>Мы уже знакомы с <a href="/etextbook/forecasting_toolbox/models_quality/">некоторыми видами ошибок</a>, поэтому здесь мы рассмотрим только масштабированную и относительную ошибки ("scaled" и "relative" соответственно).</p>
<h3>Масштабированные ошибки</h3>
<p>Эти ошибки могут быть достаточно информативными при сравнении моделей. Например, sMAE и sMSE (<a href="https://doi.org/10.1057/jors.2014.62" rel="noopener noreferrer" target="_blank">Petropoulos & Kourentzes, 2015</a>):<br />
\begin{equation} \label{eq:sMAE}<br />
	\text{sMAE} = \frac{\text{MAE}}{\bar{y}},<br />
\end{equation}<br />
\begin{equation} \label{eq:sMSE}<br />
	\text{sMSE} = \frac{\text{MSE}}{\bar{y}^2},<br />
\end{equation}<br />
где \(\bar{y}\) - это простая средняя по обучающей выборке. У этих ошибок достаточно простая интерпретация, сходная с MAPE: они показывают средний процент отклонения по отношению к средней величине по ряду данных. Преимуществом этих ошибок является то, что они одинаково относятся к ситуациям, когда фактические значения оказались выше или ниже прогноза. Однако они привязаны к уровню ряда, поэтому в случае с нестационарными рядами могут давать противоречивые результаты. Например, в случае с рядом на графике внизу слева ошибки будут достаточно информативными, так как средняя по ряду не будет сильно меняться, однако в случае с рядом на втором графике, средняя будет меняться, поэтому и значение ошибки может изменяться только из-за этого.</p>
<div id="attachment_2051" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MeasuresTSExample.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2051" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MeasuresTSExample-300x175.png&amp;nocache=1" alt="" width="300" height="175" class="size-medium wp-image-2051" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MeasuresTSExample-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MeasuresTSExample-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MeasuresTSExample-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/MeasuresTSExample.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2051" class="wp-caption-text">Пример двух рядов данных</p></div>
<p><a href="https://doi.org/10.1016/j.ijforecast.2006.03.001" rel="noopener noreferrer" target="_blank">Rob Hyndman и Anne Koehler (2006)</a> предложили MASE, ошибку у которой нет такой проблемы благодаря использованию первых разностей в знаменателе:<br />
\begin{equation} \label{eq:MASE}<br />
	\text{MASE} = \frac{\text{MAE}}{\frac{1}{T-1}\sum_{t=2}^{T}|y_t -y_{t-1}|}.<br />
\end{equation}<br />
Идея в этом случае достаточно простая: если ряд нестационарный, можно взять его разности, которые (скорее всего) будут стационарны. Поэтому знаменатель формулы получается более-менее фиксированным, что решает обозначенную выше проблему.</p>
<p>К сожалению, у MASE другая проблема - её очень сложно интерпретировать. Если, например, она равна 1.3, то это ничего не значит. Да, знаменатель \eqref{eq:MASE} можно интерпретировать как среднюю абсолютную одношаговую ошибку метода Naive на обучающей выборке, но это нисколько не помогает в интерпретации. Это ошибка может использоваться для исследовательских целей, но мне сложно представить её использование на практике.</p>
<p>Ну, и не стоит забывать о "MAE минимизируется медианами", что в очередной раз говорит нам о том, что ни MASE, ни sMAE не следует использовать в случае с прерывистым спросом.</p>
<h3>Относительные ошибки</h3>
<p>Что касается относительных ошибок, то они достаточно просты в работе и интерпретации. Всё, что нужно - это посчитать MAE или RMSE, или что бы то ни было ещё нескольких методов по рядам, затем разделить эти значения для каждого ряда на ошибки метода-бенчмарка. Считаются они по следующим формулам:<br />
\begin{equation} \label{eq:rMAE}<br />
	\text{rMAE} = \frac{\text{MAE}_a}{\text{MAE}_b},<br />
\end{equation}<br />
\begin{equation} \label{eq:rRMSE}<br />
	\text{rRMSE} = \frac{\text{RMSE}_a}{\text{RMSE}_b},<br />
\end{equation}<br />
где в числителе ошибки интересующего нас метода, а в знаменателе - ошибки бенчмарка. Зачастую в качестве метода "b" выступает метод Naive, который очень легко применить к данным. Учитывая то, что как числитель, так и знаменатель рассчитаны по одному и тому же ряду, по одной и той же его части, мы обходим проблемы с меняющимся уровнем ряда и масштабирования. К тому же, у этих ошибок простая интерпретация: если она больше 1, то наш метод оказался менее точным, чем бенчмарк, если же она меньше 1, то прогноз по нашему методу оказался точней прогноза бенчмарка. Кроме того, относительные ошибки хорошо согласуются с идеей "ценности прогноза" (Forecast Value), <a href="https://www.wiley.com/en-gb/The+Business+Forecasting+Deal:+Exposing+Myths,+Eliminating+Bad+Practices,+Providing+Practical+Solutions-p-9780470574430" rel="noopener noreferrer" target="_blank">разработанной</a> <a href="https://blogs.sas.com/content/author/mikegilliland/" rel="noopener noreferrer" target="_blank">Майком Гиллиландом из SAS</a>, которую можно, например, рассчитать так:<br />
\begin{equation} \label{eq:FV}<br />
	\text{FV} = 1-\text{rMAE} \cdot 100\%.<br />
\end{equation}<br />
Так что, например, rMAE = 0.96 означает, что наш метод увеличивает точность прогнозов на 4% по сравнению с бенчмарком (с точки зрения MAE).</p>
<p>Ну, и как заметили <a href="https://doi.org/10.1016/j.ijforecast.2012.09.002" rel="noopener noreferrer" target="_blank">Davydenko и Fildes (2013)</a>, если вы хотите получить агрегированную величину rMAE, то имеет смысл использовать геометрическую среднюю, а не арифметическую, так как мы имеем дело с отношением, а не с вычитанием. Кроме того, геометрическая средняя более робастна, чем арифметическая.</p>
<p>Главная же проблема относительных ошибок заключается в том, что если для какого-то ряда либо числитель, либо знаменатель оказывается равен нулю, то рассчитать агрегированную величину не удастся. Впрочем, это не так страшно, потому что мы всегда можем провести анализ распределения ошибок, не обязательно опираться только на одно число. К тому же, мы не часто встречаем эту проблему в реальности. Такое может наблюдаться, например, в случае с прерывистым спросом, когда в тестовой выборке сплошные нули, и Naive дал нулевой прогноз. Однако в случае с прерывистым спросом лучше не использовать Naive - он не информативен, простая средняя по ряду даст более полезную информацию. В любом случае, если вы столкнулись с подобной ситуацией, то имеет смысл просто исключить из рассмотрения ряды, в которых это произошло, потому что ситуация, в которой метод даёт прогноз с нулевой ошибкой означает, что вам ненужно строить прогноз по этому ряду.</p>
<p>Резюмируя всё вышенаписанное, я бы рекомендовал использовать относительные ошибки, держа в голове идею о том, что MAE минимизируется медианами, а MSE минимизируется средними. А для того, чтобы решить, что именно выбрать из этих двух, стоит задаться вопросом: что именно нам нужно измерить? В некоторых случаях может оказаться, что вам не интересны ни медиана, ни средняя, а вас интересуют квантили и верхняя граница прогнозного интервала... Но это уже совсем другая история.</p>
<h3>Примеры в R</h3>
<p>Для того, чтобы посмотреть, как можно работать с ошибками, мы рассмотрим простой пример с пакетом <span class="lang:r decode:true crayon-inline">smooth</span> v2.5.3 и несколькими рядами из базы M3.</p>
<p>Загрузим необходимые пакеты:</p>
<pre class="decode">library(smooth)
library(Mcomp)</pre>
<p>Возьмём подвыборку месячных рядов демографических данных (это всего 111 рядов - должно быть достаточно для примера):</p>
<pre class="decode">M3Subset <- subset(M3, 12, "demographic")</pre>
<p>Создадим массив для двух ошибок: rMAE и rRMSE (они будут рассчитаны на основе функции <span class="lang:r decode:true crayon-inline">measures()</span> из пакета <span class="lang:r decode:true crayon-inline">greybox</span>). Мы попробуем применить три модели: <a href="https://doi.org/10.13140/RG.2.1.3757.2562" rel="noopener noreferrer" target="_blank">CES</a>, <a href="/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/">ETS</a> с автоматическим выбором среди 30 моделей и ETS с выбором среди моделей с не мультипликативным трендом:</p>
<pre class="decode">errorMeasures <- array(NA, c(length(M3Subset),2,3),
                       dimnames=list(NULL, c("rMAE","rRMSE"),
                                     c("CES","ETS(Z,Z,Z)","ETS(Z,X,Z)")))</pre>
<p>Проведём расчёты в цикле, записывая значения ошибок. По умолчанию, в качестве бенчмарка в rMAE и rRMSE используется метод Naive.</p>
<pre class="decode">for(i in 1:length(M3Subset)){
    errorMeasures[i,,1] <- auto.ces(M3Subset[[i]])$accuracy[c("rMAE","rRMSE")]
    errorMeasures[i,,2] <- es(M3Subset[[i]])$accuracy[c("rMAE","rRMSE")]
    errorMeasures[i,,3] <- es(M3Subset[[i]],"ZXZ")$accuracy[c("rMAE","rRMSE")]
    cat(i); cat(", ")
}</pre>
<p>И проанализируем результаты. Начнём с ArMAE и ArRMSE:</p>
<pre class="decode">exp(apply(log(errorMeasures),c(2,3),mean))</pre>
<pre>      CES        ETS(Z,Z,Z) ETS(Z,X,Z)
rMAE  0.6339194  0.8798265  0.8540869
rRMSE 0.6430326  0.8843838  0.8584140</pre>
<p>Как видим, все модели в среднем показали себя лучше, чем Naive: ETS примерно на 12 - 16% лучше, чем Naive, а CES лучше более чем на 35%. Кроме того, CES оказалась точнее, чем оба варианта ETS как по rMAE, так и по rRMSE. Разница выглядит достаточно ощутимой. Но для более чёткого понимания ситуации, мы можем сменить бенчмарк в ошибках на ETS(Z,Z,Z):</p>
<pre class="decode">errorMeasuresZZZ <- errorMeasures
for(i in 1:3){
    errorMeasuresZZZ[,,i] <- errorMeasuresZZZ[,,i] / errorMeasures[,,"ETS(Z,Z,Z)"]
}

exp(apply(log(errorMeasuresZZZ),c(2,3),mean))</pre>
<pre>      CES        ETS(Z,Z,Z) ETS(Z,X,Z)
rMAE  0.7205050          1  0.9707448
rRMSE 0.7270968          1  0.9706352</pre>
<p>В этом случае мы можем сказать, что CES оказалась примерно на 28% точнее, чем ETS(Z,Z,Z). Кроме того, исключение мультипликативного тренда из рассмотрения повышает точность прогнозов примерно на 3% как для MAE, так и для RMSE.</p>
<p>Как я и писал ранее, мы можем не ограничиваться просто значениями, мы можем проанализировать распределение ошибок, что может дать нам дополнительную информацию о наших моделях. Самый простой вариант анализа - это <a href="/etextbook/forecasting_toolbox/data-analysis/">боксплот</a>:</p>
<pre class="decode">boxplot(errorMeasures[,1,])
abline(h=1, col="grey", lwd=2)
points(exp(apply(log(errorMeasures[,1,]),2,mean)),col="red",pch=16)</pre>
<div id="attachment_2100" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplot.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2100" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplot-300x175.png&amp;nocache=1" alt="" width="300" height="175" class="size-medium wp-image-2100" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplot-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplot-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplot-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplot.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2100" class="wp-caption-text">Boxplot of rMAE for a subset of time series from the M3</p></div>
<p>Учитывая то, что распределение ошибок не симметрично, проанализировать его оказывается иногда затруднительно. Тем не менее, мы можем заметить, что ящичковая диаграмма для CES расположена ниже диаграмм других моделей, что указывает на то, что CES оказывается точнее других моделей в подавляющем числе случаев. Серая горизонтальная линия на графике соответствует единице, то есть нашему бенчмарку, Naive. Как видим, в среднем модели оказались точнее, чем бенчмарк, хотя в некоторых случаях они себя проявили хуже (части ящичков лежат над прямой линией).</p>
<p>В некоторых случаях боксплот в логарифмах может дать более детальную информацию:</p>
<pre class="decode">boxplot(log(errorMeasures[,1,]))
abline(h=0, col="grey", lwd=2)
points(apply(log(errorMeasures[,1,]),2,mean),col="red",pch=16)</pre>
<div id="attachment_2101" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplotLog.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2101" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplotLog-300x175.png&amp;nocache=1" alt="" width="300" height="175" class="size-medium wp-image-2101" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplotLog-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplotLog-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplotLog-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/08/M3rMAEBoxplotLog.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2101" class="wp-caption-text">Boxplot of rMAE in logarithms for a subset of time series from the M3</p></div>
<p>Серая горизонтальная линия на графике опять соответствует Naive, но на этот раз в логарифмах (log(1)=0). В нашем случае эта диаграмма не привносит дополнительной информации, но в других случаях она может помочь в читаемости графика, так как логарифмирование может убрать влияние выбросом. Единственное, что обращает на себя внимание - это то, что первый, второй и третий квартели CES оказались ниже соответствующих квартилей ETS, но при этом есть ряд случаев, где CES оказалась менее точной (верхний ус и выбросы).</p>
<p>Существуют и другие методы анализа распределений, посмотрите, например, на то, как можно провести <a href="/etextbook/forecasting_toolbox/data-analysis/">графический</a> или <a href="/etextbook/forecasting_toolbox/data-analysis-stat/">статистический</a> анализ случайных величин. Можно так же провести какой-нибудь <a href="/etextbook/forecasting_toolbox/statistics-and-hypothesis/">статистический тест</a> (например, Nemenyi), для того, чтобы выяснить, значимы ли отличия между методами статистически. Однако всё это - материалы для будущих статей.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/08/25/kak-izmerit-tochnost-prognozov/">Как измерить точность прогнозов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2019/08/25/kak-izmerit-tochnost-prognozov/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>useR!2019, Тулуза, Франция</title>
		<link>https://openforecast.org/ru/2019/07/11/user-2019-tuluza-franciya/</link>
					<comments>https://openforecast.org/ru/2019/07/11/user-2019-tuluza-franciya/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Thu, 11 Jul 2019 19:25:36 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[презентация]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2190</guid>

					<description><![CDATA[<p>Salut mes amis! Сегодня я презентовал свой пакет для R smooth на конференции useR!2019 в Тулузе, Франция. Это достаточно любопытная конференция, посвящённая решению конкретных проблем. Люди здесь скорее презентуют конкретные функции из своих пакетов, нежели модели, которые лежат в их основе (как, например, на ISF). С одной стороны, у такого формата есть свои ограничения, но [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/07/11/user-2019-tuluza-franciya/">useR!2019, Тулуза, Франция</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Salut mes amis!</p>
<p>Сегодня я презентовал свой пакет для R <span class="lang:r decode:true crayon-inline">smooth</span> на конференции useR!2019 в Тулузе, Франция. Это достаточно любопытная конференция, посвящённая решению конкретных проблем. Люди здесь скорее презентуют конкретные функции из своих пакетов, нежели модели, которые лежат в их основе (как, например, на <a href="/tag/isf/">ISF</a>). С одной стороны, у такого формата есть свои ограничения, но с другой, это не так плохо, потому что, посещая конференцию можно узнать о том, какие решения существуют для вашей конкретной проблемы. Например, теперь я знаю, какие пакеты можно использовать для определения аномалий.</p>
<p>Моя презентация, кажется, прошла неплохо, хотя я и не чувствовал себя расковано из-за того, что меня приковали к микрофону и стойке с компьютером. Мою свободу ограничили, гады! :). Конечно, это было необходимо для того, чтобы записать видео презентации, но я бы предпочёл свободно бегать по аудитории и танцевать&#8230;</p>
<p>Слайды презентации можно скачать <a href="/wp-content/uploads/2019/07/2019-Svetunkov-smooth-useR.pdf">отсюда</a>.</p>
<p>ОБНОВЛЕНИЕ: Видео презентации теперь доступно на канале YouTube <a href="https://www.youtube.com/channel/UC_R5smHVXRYGhZYDJsnXTwg" rel="noopener noreferrer" target="_blank">R Consortium</a>:<br />
<iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/lPqofwegy2g" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/07/11/user-2019-tuluza-franciya/">useR!2019, Тулуза, Франция</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2019/07/11/user-2019-tuluza-franciya/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ISF 2019, Салоники, Греция</title>
		<link>https://openforecast.org/ru/2019/07/03/isf-2019/</link>
					<comments>https://openforecast.org/ru/2019/07/03/isf-2019/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 03 Jul 2019 09:12:25 +0000</pubDate>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[ISF]]></category>
		<category><![CDATA[конференции]]></category>
		<category><![CDATA[презентация]]></category>
		<category><![CDATA[прерывистый спрос]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1999</guid>

					<description><![CDATA[<p>В этот раз я презентовал спин-офф исследования на тему прерывистого спроса. Идея исследования в том, чтобы в случае с сезонным прерывистым спросом (часто встречающимся в розничной торговле, например, при продаже арбузов и дынь) использовать регрессии с смешанными моделями (например, логистическая + лог-нормальная регрессии). Результаты получаются интересные, но пока не окончательные, так как у меня мало [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/07/03/isf-2019/">ISF 2019, Салоники, Греция</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В этот раз я презентовал спин-офф исследования на тему прерывистого спроса. Идея исследования в том, чтобы в случае с сезонным прерывистым спросом (часто встречающимся в розничной торговле, например, при продаже арбузов и дынь) использовать регрессии с смешанными моделями (например, логистическая + лог-нормальная регрессии). Результаты получаются интересные, но пока не окончательные, так как у меня мало данных, и достать их не откуда (все компании-ритейлеры, с которыми я пока работал, жадины). Так что, если у вас есть, например, что-нибудь вот такое:<br />
<div id="attachment_2004" style="width: 310px" class="wp-caption alignnone"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/07/tomatoDataExport.jpg&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2004" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/07/tomatoDataExport-300x180.jpg&amp;nocache=1" alt="" width="300" height="180" class="size-medium wp-image-2004" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/07/tomatoDataExport-300x180.jpg&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/07/tomatoDataExport-768x461.jpg&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/07/tomatoDataExport-1024x614.jpg&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/07/tomatoDataExport.jpg&amp;nocache=1 2000w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2004" class="wp-caption-text">Продажи помидоров в магазине розничной торговли</p></div>
и вы хотите со мной поработать, пожалуйста, дайте знать.</p>
<p>В любом случае, <a href="/wp-content/uploads/2019/07/2019-ISF-Svetunkov-Mixture-Distribution.pdf">вот слайды моей презентации</a>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/07/03/isf-2019/">ISF 2019, Салоники, Греция</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2019/07/03/isf-2019/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
