Иван Приморский – Нейросети для прогнозирования продаж в розничном магазине (страница 3)
Третий, и очень важный слой – это внешние факторы. Про них у нас еще будет отдельная глава, но на этапе сбора данных о них нужно помнить. Погода, праздники, начало учебного года, ремонт дороги возле магазина – все это влияет на продажи. Если вы не скормите нейросети информацию о том, что 8 марта был праздник, она решит, что продажи цветов взлетели до небес просто так, по неизвестной причине, и будет безуспешно пытаться найти эту закономерность в следующий вторник.
Обучение модели: от студента до профессора
Итак, ингредиенты собраны. Что теперь? Теперь начинается самое интересное – процесс обучения модели. Это не похоже на то, как вы включаете новый пылесос. Это больше похоже на то, как вы учите студента-первокурсника разбираться в вашем ассортименте.
Сначала мы даем модели данные за прошлый период, например, за два года. Но мы не говорим ей: «Смотри, вот данные, учись». Мы делаем хитрее. Мы даем ей данные, скажем, за первые полтора года, и говорим: «А теперь, используя эти данные, предскажи, что было в следующие полгода». Мы-то с вами знаем, что на самом деле было в эти полгода, у нас есть реальные цифры продаж. Модель делает свой прогноз, а мы сравниваем его с реальностью. Видим, где она ошиблась, и подкручиваем настройки.
Этот процесс называется обучение с учителем. Мы выступаем в роли строгого, но справедливого преподавателя. Модель делает кучу ошибок на первых порах. Она может решить, что самый важный фактор – это день недели, и игнорировать праздники. Или, наоборот, начать паниковать из-за каждого небольшого изменения цены. Мы терпеливо показываем ей на ошибки и заставляем переучиваться.
Весь этот процесс происходит не один раз. Модель прогоняет данные через себя сотни и тысячи раз, каждый раз чуть-чуть меняя свои внутренние связи между нейронами. Это как спортсмен, который тысячу раз бьет по мячу, чтобы его тело запомнило правильное движение. Постепенно, от итерации к итерации, ее прогнозы становятся все точнее и точнее.
И вот наступает момент, когда мы говорим: «Стоп, достаточно. Ты научилась». Это значит, что на тестовых данных (тех самых вторых полугодиях) модель показывает приемлемую ошибку. Она больше не пытается угадать каждый чих, а поймала основные тренды и закономерности. Теперь её можно выпускать в свободное плавание и давать ей реальные данные для прогноза на завтра или на следующую неделю.
Конечно, на этом обучение не заканчивается. Как и любой профессионал, нейросеть должна постоянно повышать квалификацию. Но об этом мы поговорим ближе к концу книги.
А сейчас просто запомните главное: качество прогноза на 80% зависит от того, что вы положили на вход. Поэтому, прежде чем бросаться в объятия искусственного интеллекта, наведите порядок в своих данных. Оглянитесь на свой магазин, на свои Excel-таблицы. Есть ли там все, что нужно? Не прячутся ли там скелеты в шкафу в виде неучтенных списаний или праздничных дней, отмеченных как «обычная среда»? Подумайте об этом.
Очистка данных: как превратить хаос в золото
Представьте, что вы решили испечь идеальный яблочный пирог. У вас есть роскошная духовка, дорогой миксер и самый лучший рецепт от известного шеф-повара. Но вместо отборных яблок, муки высшего сорта и свежих яиц, в вашем холодильнике лежат гнилые фрукты, прогорклая мука и яйца с истекшим сроком годности. Испортит ли это пирог? Ещё как. Он будет не просто невкусным, его, скорее всего, даже в рот не захочется взять.
Точно так же работают и нейросети, о которых мы с вами говорили в прошлой главе. Мы можем подобрать самую совершенную архитектуру нейросети, потратить часы на её настройку, но если на вход мы подадим некачественные данные, то на выходе получим ту самую гнилую выпечку. В мире аналитики это называется GIGO – «Garbage In, Garbage Out». И сегодня мы научимся отделять зерна от плевел, а точнее, превращать тот самый хаос, который творится в данных любого магазина, в чистое золото.
Тишина в эфире или почему тишина это плохо
Когда мы говорим о данных из розничного магазина, мы часто представляем себе идеальные таблицы: аккуратные колонки с датами, ровные строчки с продажами, никаких ошибок. Но те, кто хоть раз выгружал отчет из кассовой системы или 1С, знают, что реальность далека от идеала. Данные – это живой, дышащий организм, и у него, как у человека, есть свои болезни. Одна из самых распространенных болезней – пропуски.
Представьте себе тишину в эфире радио. Вдруг диджей замолкает на минуту. Слушатели начинают нервничать: что случилось? Техника сломалась? Война началась? В данных тоже бывает такая тишина. Например, понедельник продажи были, вторник были, а в среду – ноль. Пустота. Что это может значить? Вариантов масса: магазин действительно не работал из-за аварии, в системе произошел сбой и чеки не зарегистрировались, или, что бывает чаще всего, просто забыли выгрузить данные. Нейросеть, увидев этот ноль, решит, что в эту среду никто ничего не покупал, и в следующую среду, на основе этого опыта, тоже спрогнозирует ноль. А это катастрофа для закупок.
Поэтому наша задача – найти эти «островки тишины» и восстановить справедливость. Как? Например, можно заполнить пропуск средним значением между вторником и четвергом. Или, если мы знаем, что в прошлые среды продажи были примерно на одном уровне, взять среднее арифметическое за предыдущие периоды. Важно не просто замазать дыру, а понять, откуда она взялась, и принять осознанное решение. Иногда пропуск – это не ошибка, а действительно выходной. В таком случае нейросеть нужно будет отдельно обучить учитывать такие дни.
Духи и селедка или когда соседи мешают жить
Вторая проблема, с которой мы сталкиваемся, – это «шум». Если пропуски – это тишина, то шум – это неразбериха, когда в эфире одновременно играют сто песен. В нашем случае шум возникает, когда одни данные накладываются на другие или когда появляются аномалии, которые не отражают реальную картину спроса.
Приведу пример из жизни. Представьте отдел парфюмерии в крупном супермаркете. Рядом с ним расположен отдел кулинарии, где продают селедку. В базе данных мы видим, что в пятницу вечером продажи дорогого французского одеколона взлетели до небес. Нейросеть, не будь дура, проанализирует это и скажет: «Ого! По пятницам одеколон продается в три раза лучше! Надо заказывать больше к следующей пятнице». Но если бы наш анализ данных был более тщательным, мы бы поняли, что продажи одеколона выросли не потому, что все вдруг решили стать французскими денди, а потому, что кассирша по ошибке пробила чек за селедку на кассе парфюмерного отдела. Это и есть шум – данные, которые вводят нашу модель в заблуждение.
Таких аномалий может быть масса. Например, возвраты товара. Если покупатель сдал обратно утюг, система покажет отрицательную продажу. Для нейросети это сигнал, что в этот день кто-то «купил» минус один утюг. Чтобы такого не происходило, нам нужно отфильтровывать возвраты или обрабатывать их отдельно, не смешивая с обычными продажами. Или, скажем, разовая крупная оптовая закупка соседнего кафе в вашем маленьком магазинчике у дома. Она выбьется из общего графика жирной точкой, создав иллюзию ажиотажного спроса, хотя на самом деле это просто случайность. Такие выбросы тоже нужно аккуратно «приземлять», чтобы они не искажали общую картину.
Когда дата хочет быть красивой
Мы подобрались к, пожалуй, самой творческой части очистки – приведению данных к единому формату. Нейросети, как и люди, любят порядок и предсказуемость. Они не выносят, когда одни и те же вещи называются по-разному.
Вспомните, как в вашей учетной системе называется, скажем, молоко. «Молоко 3,2% Простоквашино 1л», «Простоквашино молоко 3.2% литр», «Молоко Простоквашино 3.2 пакет 1 л». Для вас, как для человека, понятно, что это один и тот же товар. Но для нейросети это три абсолютно разных продукта, потому что она видит просто набор символов. Она начнет прогнозировать продажи для «Молоко 3,2% Простоквашино 1л» отдельно, для «Простоквашино молоко 3.2% литр» отдельно и так далее. В итоге прогноз будет смазанным и неточным, потому что данные раздроблены.
Нам нужно объединить это в единый, чистый и понятный идентификатор. То же самое касается дат и времени. Где-то дата записана как «2024-03-15», где-то как «15.03.24», а где-то и вовсе как «15 марта 2024». Мы должны привести все к одному стандарту. Чаще всего используют формат ГГГГ-ММ-ДД, так как он позволяет легко сортировать данные по датам. И не забывайте про время! Если ваш магазин работает круглосуточно, важно понимать, где заканчиваются продажи одного дня и начинаются другого.
Главный секрет золотоискателя
Очистка данных – это занятие, которое на первый взгляд кажется скучной рутиной. Многие новички пренебрегают этим этапом, им хочется поскорее запустить крутую нейросеть и получить магический прогноз. И это самая распространенная и дорогостоящая ошибка. Можно потратить недели на настройку алгоритмов и не получить никакого результата только потому, что на вход подали «грязную» картошку.
Поэтому запомните главный секрет: в мире анализа данных 80% времени занимает именно подготовка и очистка, и только 20% – построение моделей и их настройка. И это нормально. Это не скучная работа, а самая настоящая алхимия, где вы из груды мусора, ошибок и несостыковок выплавляете чистое золото, которое и станет основой для прибыли вашего магазина. Так что в следующий раз, когда будете смотреть на скучную таблицу в Excel, вспомните этот разговор. Не ругайте её за хаос. Улыбнитесь и скажите: «Ну что, красавица, давай-ка я причешу тебя, и ты покажешь, на что способна». Поверьте, нейросеть скажет вам за это спасибо, а ваш склад перестанет задыхаться от излишков или пустовать в самый неподходящий момент.