Прогнозирование объемов продаж групп товаров (отчет)

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
м (Математическое описание)
(Варианты или модификации)
Строка 124: Строка 124:
=== Варианты или модификации ===
=== Варианты или модификации ===
 +
''' Ширина окна при усреднении '''
 +
 +
Вышеприведенный алгоритм использует усреднение два раза — при вычислении <tex>D_w(i)</tex> и
 +
<tex>S_{vj}(I_k)</tex>. Длина окна, которая при этом используется, не обязана совпадать — в общем случае <tex>v \neq w</tex>. Этому можно дать простое объяснение: покупатели могут изменять предпочтения в пределах
 +
группы товаров медленнее или, наоборот, быстрее, чем меняется суммарный спрос на товары из группы.
 +
Обе длины <tex>v</tex> и <tex>w</tex> лучше всего определить с помощью скользящего контроля.
 +
 +
''' Дискретное количество товаров '''
 +
 +
В случае, если <tex>x_{ij}(t)</tex> целые (и такими должны быть прогнозы <tex>\hat{y}_{ij}</tex>),
 +
алгоритм требует модификации. Существует несколько способов добиться целых значений <tex>\hat{y}_{ij}</tex>:
 +
 +
*Округлять полученные на последнем шаге алгоритма прогнозы.
 +
*Случайно распределять <tex>[S_{vj}(I_k)]</tex> товаров в соответствии с вероятностями <tex>D_w(i)</tex>.
 +
*Частичная рандомизация:
 +
 +
1. Из <tex>[S_{vj}(I_k)]</tex> товаров определенную часть распределить детерминированно по формуле
 +
 +
<center>
 +
<tex>\hat{y}_{ij}^{fix} = \lfloor \alpha [S_{vj}(I_k)] D_w(i) \rfloor,</tex>
 +
</center>
 +
 +
где <tex>0 \leq \alpha \leq 1</tex>.
 +
 +
2. Подсчитать оставшееся количество товаров:
 +
 +
<center>
 +
<tex>S^{\prime}(I_k) = [S_{vj}(I_k)] - \sum_{i \in I_k} \hat{y}_{ij}^{fix}.</tex>
 +
</center>
 +
 +
3. Пересчитать распределение товаров:
 +
 +
<center>
 +
<tex>D^{\prime}(i) = \frac{[S_{vj}(I_k)] D_w(i) - \hat{y}_{ij}^{fix}}{S^{\prime}(I_k)}.</tex>
 +
</center>
 +
 +
4. Распределить оставшиеся товары случайно согласно вероятностям <tex>D^{\prime}(i)</tex>.
 +
 +
В частности, при <tex>\alpha = 0</tex> этот метод совпадает с предыдущим.
 +
 +
*Полностью детерминированный вариант предыдущего метода:
 +
 +
1. Распределить максимально возможное количество товаров согласно вероятностям <tex>D_w(i)</tex>
 +
 +
<center>
 +
<tex>\hat{y}_{ij}^{fix} = \lfloor [S_{vj}(I_k)] D_w(i) \rfloor.</tex>
 +
</center>
 +
 +
2. Подсчитать оставшееся количество товаров:
 +
 +
<center>
 +
<tex>S^{\prime}(I_k) = [S_{vj}(I_k)] - \sum_{i \in I_k} \hat{y}_{ij}^{fix}.</tex>
 +
</center>
 +
 +
3. Пересчитать распределение товаров:
 +
 +
<center>
 +
<tex>D^{\prime}(i) = \frac{[S_{vj}(I_k)] D_w(i) - \hat{y}_{ij}^{fix}}{S^{\prime}(I_k)}.</tex>
 +
</center>
 +
 +
4. Оставшиеся товары распределить по одному среди типов товаров с максимальными вероятностями <tex>D^{\prime}(i)</tex>.
 +
 +
Заметим, что алгоритм корректен, так как в любом случае <tex>S^{\prime}(I_k) \leq |I_k|</tex>.
 +
 +
''' Оценки качества '''
 +
 +
Как отмечено ранее, для оценки качества предлагается использовать сумму модулей или квадратов отклонений прогноза от дейсвительных продаж. Однако эти функционалы качества отдают предпочтение прогнозам с меньшими количествами продаж, так как верхняя грань обоих функционалов зависит от суммарных прогнозируемых продаж:
 +
 +
<center>
 +
<tex>Q_{m}(Y, \hat{Y}) = \sum_{i,j}|y_{ij}-\hat{y}_{ij}| \leq Q_m^{max} = \sum_{i, j}y_{ij} + \sum_{i, j}\hat{y}_{ij},</tex>
 +
 +
<tex>Q_{s}(Y, \hat{Y}) = \sum_{i,j}(y_{ij}-\hat{y}_{ij})^2 \leq Q_{s}^{max} =\sum_{i, j}y_{ij}^2 + \sum_{i, j}\hat{y}_{ij}^2.</tex>
 +
</center>
 +
 +
Таким образом, лучше в качестве функционалов использовать соотношения:
 +
 +
<center>
 +
<tex>Q_{rm}(Y, \hat{Y}) = \frac{|y_{ij}-\hat{y}_{ij}|}{\sum_{i, j}y_{ij} + \sum_{i, j}\hat{y}_{ij}},</tex>
 +
 +
<tex>Q_{rs}(Y, \hat{Y}) = \frac{(y_{ij}-\hat{y}_{ij})^2}{\sum_{i, j}y_{ij}^2 + \sum_{i, j}\hat{y}_{ij}^2}.</tex>
 +
</center>
 +
 +
Разумеется, даже при таком подходе совершенно не учитывается взаимозаменяемость родственных
 +
товаров и т.п., что выходит за рамки сформулированной задачи.
 +
 +
''' Кластеризация магазинов '''
 +
 +
Исходный алгоритм был сформулирован в предположении, что распределение товаров одинаково во
 +
всех магазинах. В более общем случае магазины разбиваются на кластеры, исходя из выборочных
 +
значений распределения товаров. Модифицированный таким образом алгоритм будет иметь следующий вид:
 +
 +
1. Найти все группы нижнего уровня --- разбиение множества <tex>I</tex> на непересекающиеся подмножества <tex>I_k \subset I</tex>.
 +
 +
2. Для каждого магазина <tex>j</tex> вычислить распределение товаров <tex>D_{uj}(i)</tex>:
 +
 +
<center>
 +
<tex>\forall {i \in I_k}\ D_{uj}(i) = \frac{s_{ij}(u)}{\sum_{i \in I_k} s_{ij}(u)}.</tex>
 +
</center>
 +
 +
Используемая длина окна <tex>u</tex> в общем случае отличается от <tex>v</tex> и <tex>w</tex> — большие значения <tex>u</tex> обеспечивают большую статистическую надежность (особенно при небольшом спросе на товары). С другой стороны, при слишком больших длинах не учитывается изменение распределения с временем. Оптимальное
 +
<tex>u</tex> находится с помощью скользящего контроля.
 +
 +
3. Вычислить расстояние между всеми парами распределений <tex>D_{uj}</tex> и <tex>D_{ul}</tex>. В качестве метрики можно использовать евклидово расстояние
 +
 +
<center>
 +
<tex>\rho (D_{uj}, D_{ul})=\sum_i (D_{uj}(i)-D_{ul}(i))^2.</tex>
 +
</center>
 +
 +
4. Исходя из расстояний, разбить магазины на <tex>K</tex> кластеров. Оптимальное <tex>K</tex> также находится с помощью скользящего контроля. Заметим, что при <tex>K=1</tex> алгоритм превращается в алгоритм группового учета, а при <tex>K=|J|</tex> — в базовый алгоритм.
 +
 +
5. Для каждого из кластеров применить шаги 2-7 алгоритма группового учета.
== Описание системы ==
== Описание системы ==

Версия 18:25, 16 февраля 2010

Введение в проект

Описание проекта

Цель проекта

Цель проекта — прогнозирование еженедельных покупок товаров. Горизонт прогнозирования — одна неделя.

Обоснование проекта

Полученные результаты могут быть использованы для планирования закупок товаров магазинами.

Описание данных

Дан региональный классификатор магазинов, товарный классификатор, ряды продаж по SKU (stock keeping unit), информация о дефиците товара, список праздничных дней, разметка промо-акций для каждого товара и розничные цены на товары.

Критерии качества

Используется скользящий контроль — прогноз закупок товаров, сделанный исходя из данных на некотором начальном временном интервале, сравнивается с реальными продажами. Критерием качества служит сумма модулей отклонений прогноза от реальной величины закупок либо сумма квадратов отклонений.

Требования к проекту

Сумма модулей (либо квадратов) отклонений для разработанного алгоритма должен быть меньше, чем для базового алгоритма — скользящего среднего за предыдущий месяц.

Выполнимость проекта

Прогнозирование покупок товаров в празничные дни и во время промо-акций является отдельной задачей и в данном проекте не рассматривается.

Используемые методы

Предполагается, что товары могут быть агрегированы в группы, исходя из их цены и «близости» по товарному классификатору. Затем может быть осуществлен прогноз для получившихся групп товаров и «разбрасывание» результатов прогнозирования по отдельным товарам из групп.

Постановка задачи

Заданы временные ряды продаж товаров x_{ij}(t) \in R — продажи i-ого товара в j-ом магазине за день t (i \in I, I — множество товаров; j \in J, J — множество магазинов; t \in N — натуральное число), причем значения продаж известны при t_0 \leq t \leq t_1. Также задан товарный классификатор, исходя из которого товары разбиваются на группы, образующие иерархическую стуктуру (например, какой-то товар может входить в группу «ЖК-телевизоры 15"», которая входит в «ЖК-телевизоры 10" - 17"» и далее в «ЖК-телевизоры», «Телевизоры» и «Бытовую технику»). Требуется для всех товаров и всех магазинов спрогнозировать продажи за неделю, следующую после t_1, то есть значение величины

y_{ij} = \sum_{t=t_1+1}^{t_1+7}x_{ij}(t).

Для оценки качества прогнозов будем использовать скользящий контроль, помещая в обучающую выборку значения x_{ij}(t) при t \in [t_0, t_{max}], t_{max} < t_1. Как функционал качества будем использовать

Q_{m}(Y, \hat{Y}) = \sum_{i, j}|y_{ij}-\hat{y}_{ij}|

или

Q_{s}(Y, \hat{Y}) = \sum_{i, j}(y_{ij}-\hat{y}_{ij})^2.

Описание алгоритмов

Обзор литературы

Базовые предположения

Будем предполагать, что вероятности продажи товаров из одной группы нижнего уровня (т.е. группы, в которую входят только товары, а не другие группы) во всех магазинах имеют одинаковое распределение. Таким образом, оценив это распределение, а также суммарные продажи всех товаров из группы нижнего уровня в некотором магазине (например, с помощью скользящего среднего), можно будет спрогнозировать продажи отдельных товаров точнее, чем используя базовый алгоритм (скользящее среднее по каждому товару). Также предполагается, что прогноз можно делать по отдельности для каждого из магазинов.

Математическое описание

Базовый алгоритм

Выбранный базовый алгоритм — скользящее среднее по каждому товару за предыдущий месяц:

\hat{y}_{ij}^0 = \frac{7}{w} s_{ij}(w),

где w=30 — ширина окна,

s_{ij}(w)=\sum_{t = t_1-w+1}^{t_1}x_{ij}(t).

Алгоритм группового учета

1. Найти все группы нижнего уровня — разбиение множества I на непересекающиеся подмножества I_k \subset I.

2. Для всех групп нижнего уровня I_k повторять шаги 3-4:

3. Найти суммарные продажи товаров из I_k во всех магазинах:

S_{w} = \sum_{i \in I_k}\sum_{j \in J}s_{ij}(w).

4. Определить доли продаж отдельных товаров из группы:

D_w(i) =\frac{1}{S_w} \sum_{j \in J}s_{ij}(w).

5. Повторять для всех j \in J и всех групп нижнего уровня I_k шаги 6-7:

6. Вычислить по методу скользящего среднего прогноз продаж товаров из I_k в магазине j на следующую неделю:

S_{vj}(I_k) = \frac{7}{v} \sum_{i \in I_k}s_{ij}(v).

7. Распределить предсказанное число товаров согласно величинам D_w(i):

\hat{y}_{ij} = S_{vj}(I_k) D_w(i).

Варианты или модификации

Ширина окна при усреднении

Вышеприведенный алгоритм использует усреднение два раза — при вычислении D_w(i) и S_{vj}(I_k). Длина окна, которая при этом используется, не обязана совпадать — в общем случае v \neq w. Этому можно дать простое объяснение: покупатели могут изменять предпочтения в пределах группы товаров медленнее или, наоборот, быстрее, чем меняется суммарный спрос на товары из группы. Обе длины v и w лучше всего определить с помощью скользящего контроля.

Дискретное количество товаров

В случае, если x_{ij}(t) целые (и такими должны быть прогнозы \hat{y}_{ij}), алгоритм требует модификации. Существует несколько способов добиться целых значений \hat{y}_{ij}:

  • Округлять полученные на последнем шаге алгоритма прогнозы.
  • Случайно распределять [S_{vj}(I_k)] товаров в соответствии с вероятностями D_w(i).
  • Частичная рандомизация:

1. Из [S_{vj}(I_k)] товаров определенную часть распределить детерминированно по формуле

\hat{y}_{ij}^{fix} = \lfloor \alpha [S_{vj}(I_k)] D_w(i) \rfloor,

где 0 \leq \alpha \leq 1.

2. Подсчитать оставшееся количество товаров:

S^{\prime}(I_k) = [S_{vj}(I_k)] - \sum_{i \in I_k} \hat{y}_{ij}^{fix}.

3. Пересчитать распределение товаров:

D^{\prime}(i) = \frac{[S_{vj}(I_k)] D_w(i) - \hat{y}_{ij}^{fix}}{S^{\prime}(I_k)}.

4. Распределить оставшиеся товары случайно согласно вероятностям D^{\prime}(i).

В частности, при \alpha = 0 этот метод совпадает с предыдущим.

  • Полностью детерминированный вариант предыдущего метода:

1. Распределить максимально возможное количество товаров согласно вероятностям D_w(i)

\hat{y}_{ij}^{fix} = \lfloor [S_{vj}(I_k)] D_w(i) \rfloor.

2. Подсчитать оставшееся количество товаров:

S^{\prime}(I_k) = [S_{vj}(I_k)] - \sum_{i \in I_k} \hat{y}_{ij}^{fix}.

3. Пересчитать распределение товаров:

D^{\prime}(i) = \frac{[S_{vj}(I_k)] D_w(i) - \hat{y}_{ij}^{fix}}{S^{\prime}(I_k)}.

4. Оставшиеся товары распределить по одному среди типов товаров с максимальными вероятностями D^{\prime}(i).

Заметим, что алгоритм корректен, так как в любом случае S^{\prime}(I_k) \leq |I_k|.

Оценки качества

Как отмечено ранее, для оценки качества предлагается использовать сумму модулей или квадратов отклонений прогноза от дейсвительных продаж. Однако эти функционалы качества отдают предпочтение прогнозам с меньшими количествами продаж, так как верхняя грань обоих функционалов зависит от суммарных прогнозируемых продаж:

Q_{m}(Y, \hat{Y}) = \sum_{i,j}|y_{ij}-\hat{y}_{ij}| \leq Q_m^{max} = \sum_{i, j}y_{ij} + \sum_{i, j}\hat{y}_{ij},

Q_{s}(Y, \hat{Y}) = \sum_{i,j}(y_{ij}-\hat{y}_{ij})^2 \leq Q_{s}^{max} =\sum_{i, j}y_{ij}^2 + \sum_{i, j}\hat{y}_{ij}^2.

Таким образом, лучше в качестве функционалов использовать соотношения:

Q_{rm}(Y, \hat{Y}) = \frac{|y_{ij}-\hat{y}_{ij}|}{\sum_{i, j}y_{ij} + \sum_{i, j}\hat{y}_{ij}},

Q_{rs}(Y, \hat{Y}) = \frac{(y_{ij}-\hat{y}_{ij})^2}{\sum_{i, j}y_{ij}^2 + \sum_{i, j}\hat{y}_{ij}^2}.

Разумеется, даже при таком подходе совершенно не учитывается взаимозаменяемость родственных товаров и т.п., что выходит за рамки сформулированной задачи.

Кластеризация магазинов

Исходный алгоритм был сформулирован в предположении, что распределение товаров одинаково во всех магазинах. В более общем случае магазины разбиваются на кластеры, исходя из выборочных значений распределения товаров. Модифицированный таким образом алгоритм будет иметь следующий вид:

1. Найти все группы нижнего уровня --- разбиение множества I на непересекающиеся подмножества I_k \subset I.

2. Для каждого магазина j вычислить распределение товаров D_{uj}(i):

\forall {i \in I_k}\ D_{uj}(i) = \frac{s_{ij}(u)}{\sum_{i \in I_k} s_{ij}(u)}.

Используемая длина окна u в общем случае отличается от v и w — большие значения u обеспечивают большую статистическую надежность (особенно при небольшом спросе на товары). С другой стороны, при слишком больших длинах не учитывается изменение распределения с временем. Оптимальное u находится с помощью скользящего контроля.

3. Вычислить расстояние между всеми парами распределений D_{uj} и D_{ul}. В качестве метрики можно использовать евклидово расстояние

\rho (D_{uj}, D_{ul})=\sum_i (D_{uj}(i)-D_{ul}(i))^2.

4. Исходя из расстояний, разбить магазины на K кластеров. Оптимальное K также находится с помощью скользящего контроля. Заметим, что при K=1 алгоритм превращается в алгоритм группового учета, а при K=|J| — в базовый алгоритм.

5. Для каждого из кластеров применить шаги 2-7 алгоритма группового учета.

Описание системы

  • Ссылка на файл system.docs
  • Ссылка на файлы системы

Отчет о вычислительных экспериментах

Визуальный анализ работы алгоритма

Анализ качества работы алгоритма

Анализ зависимости работы алгоритма от параметров

Отчет о полученных результатах

Список литературы

Данная статья является непроверенным учебным заданием.
Студент: Участник:Алексей Островский
Преподаватель: Участник:В.В. Стрижов
Срок: 15 декабря 2009

До указанного срока статья не должна редактироваться другими участниками проекта MachineLearning.ru. По его окончании любой участник вправе исправить данную статью по своему усмотрению и удалить данное предупреждение, выводимое с помощью шаблона {{Задание}}.

См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе.


Личные инструменты