<?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>Архивы Прогнозные ошибки - Open Forecasting</title>
	<atom:link href="https://openforecast.org/ru/tag/errors-ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/ru/tag/errors-ru/</link>
	<description>О том как смотреть в будущее</description>
	<lastBuildDate>Wed, 30 Sep 2020 09:46:51 +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>Архивы Прогнозные ошибки - Open Forecasting</title>
	<link>https://openforecast.org/ru/tag/errors-ru/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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="(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 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="(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 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="(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/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>
	</channel>
</rss>
