Как дата саентист ищет первый автомобиль

31 July 2020

Вот не так далёк уж тот момент, когда будет покупать первый автомобиль. Вопрос довольно сложный, ведь автомобиль - это дорогая покупка, но необходимая ввиду возможного увеличения семейства в будущем. Да, я предполагаю, что автомобиль будет семейным. Но сразу же покупать себе "тот самый" нет смысла. Кажется, что на первое время лучше взять что-то недорогое, что будет не жалко поцарапать и т.д. Искать я планировал через авто.ру. Сайт хороший, да и многое можно узнать об автомобиле(данные об авариях, число владельцев, отзывы на модель). Однако, был такой параметр, который меня смутил. А именно, что какие-то автомобили помечаются как выгодные. А насколько они на самом деле выгодны - неизвестно.

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

Любая задача машинного обучения начинается с данных и их подготовки.

Как дата саентист ищет первый автомобиль

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

Я принял решение не переходить по ссылкам внутрь объявление, а пользоваться лишь той информацией, что видна в поисковой выдаче(на авто.ру). Кажется, что для простой модели тут достаточно данных: марка машины, пробег, год, мощность, трансмиссия, форм-фактор корпуса и стоимость. Как и многие современные сайты, авто.ру был написан с помощью каких-нибудь JS frameworks, что отсекает возможность парсинга через связку "requests + beautifulsoup4". В таких случаях как правило пользуются Selenium. Благодаря нему можно эмулировать присутствие человека в браузере и совершать такие действие как навигация по странице, клики и заполнение полей. Выглядит это примерно так:

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

После того, когда я научился искать объявления нужных мне автомобилей, я конкретизировал список:

не нужно обращать внимание на комментарии
не нужно обращать внимание на комментарии

Получился датасет 11809 объявлений. Как я уже упоминал, то все объявления содержат мощность, объём двигателя и тип привода. Кроме одного, где случайно попался электрический Ford Focus и сломал мне обработку признаков.

вот такой получился итоговый датасет.
вот такой получился итоговый датасет.

Краткий анализ:

Как дата саентист ищет первый автомобиль

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

Задача реашется очень просто - возьмём стандартную метрику RMSE. Поделим данные(10% на валидационный датасет) и обучаем классический градиентный бустинг. У данного пакета градиентного бустинга не так много параметров. Исходя из моего опыта, я выбрал learning rate поменьше, деревьев побольше и глубину 5. Обучается всё хорошо.

Как дата саентист ищет первый автомобиль

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

В случае симметричных деревьев на одинаковом уровне выбираются одинаковые признаки для уточнения датасета
В случае симметричных деревьев на одинаковом уровне выбираются одинаковые признаки для уточнения датасета

Немного поиграв с визуализацией, а именно спросив себя, правда ли цвет влияет на стоимость автомобиля, я нашёл ответ.

Больше всего выделяется жёлтый. Привет объявлениям такси с 200тыс км пробега.
Больше всего выделяется жёлтый. Привет объявлениям такси с 200тыс км пробега.

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

Как дата саентист ищет первый автомобиль

Как мне кажется, идея получилась достаточно интересная. Для какого-то ориентировочного представления о цене - вещь отличная. Конечно, модель можно улучшать перейдя по каждому обвляению, добавив параметр - как давно продаётся, число владельцев, число аварий, комплектацию... Однако я уже доволен тем, что получилось. Возможно добавлю на GitHub если кому-нибудь будет интересно)