Сага о том, как в стартапе машинное обучение внедряли

Расскажу, как выглядел процесс внедрения и какие сложности возникли.

Всем привет, это Данила Тривайло, сооснователь сервиса для поиска квартир themeters.ru.

Сегодня речь пойдет о моем знакомстве с машинным обучением. Вообще с этим понятием я столкнулся много лет назад, помню, что тогда меня это просто поразило. Знаете, это было что-то магическое из фильмов фантастики.

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

Эта статья вообще не имеет никакого отношения к науке: я просто часто слышу запрос от разных компаний на то, чтобы внедрить машинное обучение у себя. Но как это сделать? С чего начать? Как оно вообще работает? По крайней мере у меня был миллион вопросов, и по факту все оказалось совсем иначе, чем я себе это представлял. Эта статья — взгляд предпринимателя-непрограммиста на все, что происходило со мной в процессе внедрения ML у нас.

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

Когда мы начинали themeters.ru, нашей стартовой идеей было сделать сервис, который позволяет найти самые выгодные квартиры с точки зрения покупки и дальнейшей сдачи в аренду. Тут возникает вопрос.

Что есть итоговая доходность квартиры от сдачи в аренду?

Сага о том, как в стартапе машинное обучение внедряли

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

Но, как говорится, слона надо есть по частям (интересно, кто-то вообще ел слона?), поэтому мы решили начать с одной переменной: научиться определять потенциальную цену квартиры при сдаче в аренду.

В голову приходит сразу несколько вариантов решения.

Например, использовать средние значения. Скажем, по району. Мол, если в этом районе квартиры стоят в аренде 1000 рублей за 1 кв.м., просто будем брать и умножать площадь на цену. Но «средняя температура по больнице» дает на выходе очень большую ошибку: как минимум в районе могут быть совершенно разные дома, а значит, и цена за 1 кв.м. может существенно разниться.

Давайте возьмем среднее значение в конкретном доме? Можно сделать и так, но тут опять проблема — на стоимость влияет площадь, этаж, ремонт в квартире.

Хорошо, давайте возьмем исторические цены. То есть есть дом, в доме этаж, на этаже однокомнатная квартира. Посмотрим, за сколько она сдавалась, и будем считать, что это и есть справедливая цена. Но тут опять сложность: в моменте в Москве сдается около 10 000 квартир. При том, что всего в Москве около 50 тысяч жилых адресов (надо учесть, что иногда, например, в новостройках, сдается не одна квартира, а несколько). А нам нужно, чтобы у нас были данные по каждому этажу и еще по каждому числу комнат. В общем, данных таких нет.

К тому же как быть с новостройками? По ним нет никакой истории, и тебе не на что опереться.

Изучаем зверя

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

https://vas3k.ru/blog/machine_learning/
https://vas3k.ru/blog/machine_learning/

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

Теперь второй момент. Если в решении задачи используется алгоритм, работающий по принципу "Если — То», это не относится к области машинного обучения. Пример линейного алгоритма:

  • Если доставка за МКАД, то цена 500 рублей, если внутри МКАД, то 300;
  • Если пешком до метро идти меньше 10 минут, давайте прибавим к цене 5%, если больше 10 минут — вычтем 5%.

Иными словами — все, где можно использовать простую математическую формулу. Это важно, потому что огромное количество задач можно решить очень эффективно, не используя машинное обучение! Но конкретно в нашем случае без ML не обойтись. Поэтому я начал подбираться к задачке поближе и изучать, что нам нужно, чтобы по каждой квартире получить качественный прогноз по аренде.

Да будет битва!

В самом начале я был абсолютно уверен, что ИИ — это что-то очень умное, и процесс будет выглядеть буквально так. Я возьму все базы, таблички, исторические данные (то есть все файлы, которые у нас есть), свалю их в этот котел под названием ИИ, а он мне начнет мастерски выплевывать результаты. При этом чем больше данных, тем выше у него будет точность. Программисты, конечно, поржали надо мной, потому что все выглядит чуть иначе.

Шаг 1. Определить подход

А их в машинном обучении существует множество. Речь про линейную регрессию, логическую регрессию, LDA, KNN, метод деревьев, LQV, бустинг, SVM и другие умные штуки, которые позволяют находить решения в сложных задачах. На самом деле вам как заказчику не так важно глубоко разбираться в этом вопросе, потому что это прямая обязанность data scientist-специалиста. С одной важной оговоркой.

Подбор оптимального алгоритма МЛ — это путь проб и ошибок. Тут нет 100%-ных вариантов. Да, конечно, есть методы, которые хорошо зарекомендовали себя для решения определенных задач. Но в итоге надо пробовать, перебирать, экспериментировать, и тогда вы точно найдете инструмент, который работает лучше всего.

На текущий момент в THE METERS мы используем алгоритмы далеко не только для того, чтобы предсказать цену квартир. Сейчас мы также анализируем фотографии — само изображение, ремонт, отдельный алгоритм оценивает все факторы в совокупности: фото, описание, параметры объекта. Еще у нас есть свой алгоритм ранжирования, который сортирует квартиры, показывая наверху самые интересные варианты. Также мы анализируем весь текст, определяя квартиры с нюансами (залоговые, под арестом, после пожара) и так далее.

И создание каждого из этих алгоритмов — это путь проб и ошибок. Чтобы вы понимали: когда мы делали алгоритм по оценке ремонта, мы перебрали 214 комбинаций! Выбрав в итоге ту, что давала лучшие результаты. Поэтому не ждите результата сразу и будьте готовы, что понадобится время.

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

<p>Хочу немного нагнать важности, поэтому вставлю сюда фото с надписями на китайском. Ну, я думаю, что на китайском.</p>

Хочу немного нагнать важности, поэтому вставлю сюда фото с надписями на китайском. Ну, я думаю, что на китайском.

Шаг 2. Определить критерии эффективности

Следующий важный момент — это понять, каким образом вы будете оценивать результаты. Как понять, что алгоритм А справляется с задачей лучше, чем алгоритм Б? То же самое касается и подрядчиков. Вот вы нашли специалиста по МЛ: он весь такой классный, крутой, вы не знаете и половины слов, которые он использует. Как понять, насколько он хорош?

Крутой Датасайнтист
Крутой Датасайнтист

Для этого вам нужны датасеты.

Датасет (data set) — это заранее подготовленный набор данных, который требуется для обучения/проверки модели. Это могут быть таблицы, фото, видео — все зависит от того, с чем именно работает ваш алгоритм. Для нас датасет — это данные по квартирам с рынка аренды (параметры квартир и фактические цены их аренды).

В итоге у нас появилось 3 датасета.

  • Рабочий датасет. Это основной массив данных, который использовался для обучения алгоритма. По сути, это была большая таблица, где строки — это квартиры, а столбцы — их параметры.
  • Тестовый датасет. Это небольшой кусок из рабочего датасета, который изымается оттуда (не копируется). Он используется для того, чтобы разработчик мог сам себя проверять. Так, он может убирать «из квартир» цену аренды и отдавать данные алгоритму, чтобы тот спрогнозировал цену. А дальше он может сверить фактическое значение аренды с тем, которое спрогнозировал алгоритм.

Чтобы было проще работать с результатом, для себя мы определили одно главное значение: SMAPE.

SMAPE — это Симметричное среднее абсолютное процентное отклонение. Звучит умно, но на самом деле ничего сложного. Допустим, в тестовом датасете 1000 строк. Каждая строка = 1 квартира. У первой квартиры цена аренды — 50 000 рублей, а алгоритм предсказал 100 000 рублей. Значит, процентное отклонение по первой строке составляет 100%.

SMAPE — это результирующий сводный параметр, который показывает, насколько алгоритм в среднем ошибся в своем прогнозе. Типа получили 50% — значит, алгоритм в среднем выдает ошибку +/- в половину цены.

  • Валидационный сет. По сути, это аналог тестового датасета (определенное количество случайно выбранных строк изымается из рабочего датасета, чтобы алгоритм не видел этих квартир и не работал с ними), за исключением того, что «ключи» (фактическое значение цены аренды у квартир) не выдаются разработчику. То есть его задача — обучить алгоритм, прогнать через тестовый датасет, посчитать SMAPE. После чего он прогоняет валидационный датасет и отдает результаты нам. SMAPE по валидационному датасету он посчитать не может, т.к. «ключей» у него нет. А мы уже в свою очередь считаем SMAPE сами и понимаем, насколько совпадают результаты валидационного и тестового датасета.

Поскольку я не разбираюсь в том, как именно обучать алгоритмы, какие там технологии используются и т.д., для меня такая конфигурация была огромным спасением. То есть в итоге все сводилось к следующему. Вот есть кандидат, который готов сделать нам алгоритм. Мы говорим ему: «Дружище, вот тебе основной датасет, вот тестовый, вот валидационный. Там есть все параметры по квартирам, сам выбирай, что тебе нужно. Наш текущий SMAPE — 15%».

Дальше можно опустить все умные разговоры, рассуждения и прочие формальности. От специалиста нужно получить обратно SMAPE по его тестовому датасету и валидационный тест с результатами. Это и будет показатель того, насколько получилось успешно справиться с задачей.

Шаг 3. Готовим датасет мечты

Как я писал, в начале было представление, что ИИ сам там все разрулит. Но оказалось не так.

Первое: для обучения модели нужно качественно подготовить и систематизировать данные. Допустим, у вас есть параметр квартиры: ближайшая станция метро. Ваша задача — привести все станции к одному виду: нельзя дать алгоритму «м. Фили», «метро Фили», «Фили» и т.д. Если у вас дробные числа, то нужно определиться с типом разделителя — будут это точки или запятые.

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

Второй момент — это полнота данных. Чем больше будет параметров в начале и чем у бОльшего числа строк эти параметры будут заполнены, тем лучше. И на первый взгляд это кажется одним из маленьких пунктиков, но в итоге это одна из самых сложных задач в процессе построения точного алгоритма. Посудите сами: для каждой квартиры надо учесть этаж, площадь, число комнат, высоту потолков, планировку, вид из окна, расстояние до центра, расстояние до метро… Не буду вас мучить — совокупно таких параметров около 100 штук. То есть для нашей задачи нужно получить 10-50 тысяч строк с квартирами, где по каждой есть информация по всем этим аспектам.

Но и это не все. Если часть информации можно получить из открытых источников, справочников и т.д., то есть некоторые параметры, которые ты просто так не найдешь. Например, мы все понимаем, что на цену квартиры влияет уровень инфраструктуры вокруг этого дома. Но где мне взять этот показатель для всего датасета?

Сага о том, как в стартапе машинное обучение внедряли

Третий момент — это достаточное число строк. Глобально — чем больше, тем лучше. Из нашего опыта: минимальное число — это 1000 элементов/строк/фото. Лучше, чтобы речь шла о десятках тысяч.

Число строк в валидационном датасете — тоже очень важный параметр. Если вы сделаете очень маленькое число строк, «лжедатасайнтист» может пройтись по нему и поставить результаты вручную.

Четвертый момент — сбалансированность и равномерность данных. Если речь идет про квартиры, это значит, что в датасетах должны быть разные площади, комнатности, цены, локации и т.д. Если вы загрузите туда кучу «трешек», не надо удивляться, что он будет плохо считать цену студий, и так далее. Сюда же нужно отнести «выбросы» — это объекты с аномальными нерыночными параметрами. Например, квартира под залогом, под арестом, после потопа, который случился после пожара, которая сдается на 1 неделю и находится в подвале. Если вы дадите такой объект алгоритму и при этом у вас не будет параметров, которые указывают на аномальность (а будут обычные значения типа площади, этажа и т.д.), алгоритм просто не сможет понять, какой из этого нужно сделать вывод.

И, наконец, пятый момент — это сами эталонные значения. Если у вас стоит задача научить нейронку отличать котиков от собачек, тут нет проблемы, так как мы все знаем, кто как выглядит. Но когда нужно научить алгоритм прогнозировать цену аренды, встает вопрос — а что такое вообще эталонная цена? Цена, которая есть в объявлениях на площадках? Не факт, ведь она может быть и завышенной, и заниженной. Ходить по знакомым и спрашивать, за сколько они снимают/сдают квартиру? Не очень понятно, через сколько вы получите датасет нормального объема. Взять все квартиры за последние 10 лет, чтобы, так сказать, навалиться на задачу «массой», тоже не получится — ведь цены меняются и то, что было 10 лет назад на рынке, нельзя использовать в качестве эталона сегодня. В общем, определить эталонные значения в нашем случае оказалось тем еще геморроем.

Хэппи энд

После того, как вы проделали все эти процедуры, остается только пробовать, пробовать и еще раз пробовать.

В нашем случае первый алгоритм дал SMAPE на уровне 70% (типа если квартира стоит 50 тыс. рублей, алгоритм давал оценку в районе 15-75 тыс.). Не очень точно, мягко говоря:)) Дальше было много проб и ошибок, разные специалисты, разные технологии. Итоговый результат получился на уровне 12%, что считаю очень неплохим результатом.

Сага о том, как в стартапе машинное обучение внедряли

Какие я могу сделать выводы:

  • ИИ до сих пор для меня какое-то чудо. Всегда хотел прикоснуться к этой технологии, и очень рад, что такой шанс появился.

  • В итоге больше параметров для модели — не значит лучше. Есть отдельные матметоды, которые помогают определить, как и насколько каждый параметр влияет на целевую метрику.

  • ИИ нужен далеко не везде. Кучу задач можно решить без него намного эффективней, проще и дешевле.

  • Не надо ждать быстрого результата.


Надеюсь, что мой опыт будет кому-то полезен, вы внедрите МЛ у себя и сделаете наш мир еще чуточку эффективней;)

У меня есть несколько тем для статей на примете. Какую было бы интересней всего разобрать?
Как организовать процесс подбора персонала, не имея в штате HR.
Как мы обучали алгоритм определять уровень ремонта?
Выгорание и психическое здоровье. Какие делал ошибки и как его не допустить.
Другое (напишите в комментах).
Все интересно

Другие статьи автора

2424
15 комментариев

Интересно но конкретики нет. Какие данные использовали для проверки точности? Часть базы цен из объявлений?

Внутренность алгоритма получается "черный ящик", т.е. нельзя сказать почему по квартире было вынесено именно такое решение. Тогда как осуществляется контроль того что алгоритм не сбоит на отдельных квартирах? Или просто принято что в 10% случаев результату верить не стоит?

И зачем сразу машинное обучение, линейные умные алгоритмы тут могут дать хороший, прогнозируемый результат.

1

Артем, привет!

По поводу проверки - да, брали объявления, и сильно их чистили - обрезали выбросы с краев, проходили по ключам, по сроку размещения и тд.

"Черный ящик" - отчасти, есть возможность делать визуализацию, где ты видишь, как каждый параметр внес вклад в стоимость.

"В 10% случаев результату верить не стоит?" - алгоритм в любом случае будет где-то ошибаться, так как он работает не со всеми факторами, а с какой-то частью. Но не то, что "верить не стоит" - скорее "в 10% случаем погрешность может быть больше".

"И зачем сразу машинное обучение, линейные умные алгоритмы тут могут дать хороший, прогнозируемый результат." - прогнозируемый - да, хороший - в нашем кейсе не сработало:)

1

Smape 12% означает, что черный ящик в среднем отклонится от цены рынка на 12%.
Это не процент прогнозов, не укладывающихся в ограничение по качеству. Тут вообще нет нормативного отклонения от факта, при котором прогноз необходимо считать неудовлетворительным.
П.с. линейные алгоритмы это так себе. Часть факторов не количественные, шкалы взаимосвязаны, это кошмар всё в явном виде приводить. Если бы они что-то реально давали, то такая скоринговая система была бы уже доступна. 

Много написал а потом удалил все

Можно узнать, чье api вы используете для отображения блока «рядом есть»?

Добрый день! Используем свой алгоритм. 

С расчётом времени до метро видимо есть проблемы https://themeters.ru/objects/6144a87e9b7c9e0011076a20
Написано что Хорошево 11 мин., Мнёвники 16 мин и оба пешком, а на самом деле до Народного ополчения 15 минут пешком, до Хорошево 20 минут пешком, а на машине ближе до Полежаевской и Народного ополчения.
До Мнёвники пешком 40 минут, на машине 10.
И это не единичный случай.

А где фильтр времени в пути до центра? Первое что я хотел отфильтровать