CoderCastrov logo
CoderCastrov
Машинное обучение

Определение справедливой цены подержанного автомобиля с использованием методов Data Science

Определение справедливой цены подержанного автомобиля с использованием методов Data Science
просмотров
12 мин чтение
#Машинное обучение

Вся история использования методов DS для расчета справедливой цены подержанного автомобиля.

Введение

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

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

Так что есть много, о чем нужно подумать, и вопрос, с которым я столкнулся здесь, был: "Возможно ли, что использование методов Data Science (сбор и очистка данных, обучение моделей машинного обучения и т. д.) может сэкономить ваше время и умственные усилия в мучительном процессе принятия решений?"

Я открыл ноутбук, создал новый проект и включил таймер.


Этап 1. Сбор данных

Без вдавания в подробности: мне удалось собрать набор данных, содержащий около 40 000 объявлений о продаже автомобилей с 35 признаками (в основном категориальными) за два дня. Сбор данных сам по себе не вызвал больших проблем, но структурирование его в организованном виде заняло некоторое время. Я использовал Python, Requests, Pandas, NumPy, SciPy и т. д.

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

Этап 2. Общий обзор и работа с некорректными данными

Первоначальный анализ данных быстро выявил подозрительные образцы с показателем одометра в 8 миллионов километров, двигателями объемом 10 литров для хэтчбеков, гибридными дизельными автомобилями за 600 долларов и т. д. Я потратил примерно 6 часов на написание скриптов для обнаружения и обработки этих проблем.

Визуализация данных (я использовал MatPlotlib и Seaborn) дала мне хорошее представление о общей ситуации на рынке.

Большинство автомобилей довольно сильно использованы, среднее значение показателя одометра составляет 250 000 километров, и это много! Я также заметил, что люди предпочитают присваивать красивые числа показателю одометра, такие как 250 000 км, 300 000 км, 350 000 км и т. д. У некоторых автомобилей показатель одометра составляет один миллион километров, и это не имеет много смысла, если посмотреть на распределение значений. Я предполагаю, что один миллион километров больше похож на утверждение "Этот автомобиль много видел, точное количество километров на нем я честно не знаю".

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

Также, чем старше автомобиль, тем выше его показатель одометра в целом, и это разумно.

Для построения диаграммы рассеяния price_usd я ограничил максимальную цену автомобиля примерно до 50 000 долларов и удалил несколько выбросов с показателем одометра на уровне миллиона километров.

Фактически, автомобили, цена которых ниже 50 000 долларов, составляют 99,9% каталога, поэтому диаграмма рассеяния дает хорошее представление о тенденции ценообразования.

Что касается возраста автомобиля: большинство автомобилей использовалось некоторое время, среднее значение показателя year_produced составляет 2002 год. Я считаю, что распределение года выпуска (изображено ниже) сильно повлияло на политику в отношении таможенных пошлин на импорт автомобилей из-за рубежа.

Распределение автомобилей в каталоге по году их производства.

Распределение цен (price_usd будет целевым значением в этом проекте во время обучения модели) сильно скошено вправо, со средней и медианной ценой соответственно 7 275 и 4 900 долларов.

распределение цен

Некоторые признаки, такие как up_counter (количество раз, когда объявление было продвинуто вручную), вообще не отражают параметры автомобиля, но поскольку эти данные были доступны, я решил включить их в проект. Распределение было настолько скошено, что единственным способом правильно построить его было использование логарифмической шкалы.

распределение метрики up_counter

Распределение популярности брендов не было для меня сюрпризом, с самой популярной моделью в каталоге - VW Passat, легендарным источником транспорта в Беларуси.

Я также использовал Tableau, чтобы получить более красивое визуальное представление доли рынка производителя и средней цены для каждого бренда.

Форма распределения number_of_photos, которые имеют автомобили, похожа на распределение price_usd (распределение скошено вправо).

Распределение количества фотографий, которыми обладают автомобили в каталоге

Возможно, чем выше цена автомобиля, тем больше фотографий?

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

Некоторые признаки, такие как drivetrain, были просто интересны для исследования. На гистограмме ниже вы можете увидеть, как процент заднеприводных автомобилей уменьшился за последние 30 лет.

Гистограмма, иллюстрирующая переход от заднего привода к переднему и полному приводу в последние годы

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

Матрица корреляции для всего набора данных

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

Этап 3. Обучение модели

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

Чтобы получить максимальные результаты с минимальными усилиями, я использовал CatBoost** **(библиотека градиентного бустинга на деревьях решений с полной поддержкой категориальных признаков, разработанная и опубликованная компанией Yandex). Я уже потратил слишком много времени на проект, поэтому я просто подал данные в модель, настроил скорость обучения, глубину деревьев и количество деревьев в ансамбле, обучил несколько моделей и начал изучать принятие решений модели с помощью SHAP (разработано Скоттом Лундбергом и др.). Общее затраченное время: 4 часа.

Интересный факт: во время начальной фазы исследования предсказаний я был разочарован результатами модели, начал изучать ошибки и обнаружил, что столбец с ценой в моем наборе данных был неправильно разобран, некоторые цены были в долларах США, а некоторые в национальной валюте Беларуси: BYN. Я исправил код парсера, собрал данные снова, затем выполнил очистку, инженерию признаков и анализ данных и начал обучать модели с гораздо лучшими результатами.

Чтобы обучить и оценить первую модель, я отфильтровал автомобили с ценой выше 30 000 долларов (во время фазы исследования я обнаружил, что эти образцы требуют отдельной модели).

Этап 4. Оценка модели

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

График, иллюстрирующий обучение модели: количество деревьев на оси X и MAE $ на оси Y

Первая приемлемая модель CatBoost дала мне приблизительно $1,000 MAE (средняя абсолютная ошибка), что составляет 15% от среднего значения _price_usd _целевой переменной. Чтобы быть точным по оценке:

Лучшая оценка MAE на валидации: $1019.18 на итерации 6413 с std $12.84

Я также использовал параметр early_stopping, чтобы прекратить дальнейшее обучение, когда оценка на валидации перестает улучшаться. Не пытаясь улучшить модель каким-либо образом, я перешел к анализу предсказаний.

Распределение ошибок

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

Двумерная гистограмма для истинных и предсказанных значений. Вы можете заметить плотную область ниже порога $3000

Иерархия значений SHAP (показаны только 20 лучших признаков) для признаков в наборе данных мне не показалась удивительной, за исключением низкого положения признака _odometer_value. Вы можете найти хорошее объяснение непараметрической интерпретации модели в статьях, например, здесь.

Summary_plot для 20 лучших признаков

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

Признак _state оказался интересным: подавляющее большинство автомобилей являются "owned", но есть небольшой процент "new" автомобилей (они дорогие) и несколько "emergency" автомобилей, которые повреждены.

Проблема с поврежденными автомобилями очевидна: столбец является булевым, и нет степени этого "аварийного состояния" (об этом позже).

Этап 5. Изучение отдельных предсказаний с использованием предметных знаний и выявление ограничений модели

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

Пример 0: Volkswagen T5 Caravelle, 2009 год, механическая коробка передач, 287 000 км, дизель. Указанная цена - 13 600 долларов. Предсказание модели ниже на 1 200 долларов (средняя абсолютная ошибка модели составляет около 1 000 долларов, поэтому это довольно типичный случай).

Prediction interpretation (force_plot) for T5 Caravelle

Можно видеть, что марка Volkswagen и тип кузова "минивэн" вносят свой вклад в увеличение предсказанной цены для данного примера.

Prediction interpretation (decision_plot) for T5 Caravelle

С использованием SHAP мы можем построить интерпретацию принятия решений модели с помощью функциональности "decision plot".

Decision plot были недавно добавлены в библиотеку и предоставляют еще более подробное представление внутренней работы модели.

Основное преимущество decision plot по сравнению с force plot заключается в том, что они могут наглядно показать большее количество признаков.

Подробнее о таких графиках можно прочитать здесь.

Пример 1: Mercedes-Benz E270, 2000 год, механическая коробка передач, 465 000 км, дизель. Указанная цена - 4 999 долларов. Предсказание модели выше на 198 долларов. Это не плохо вовсе!

Prediction interpretation for E270 Mercedes

Пример 2: Jeep Grand Cherokee, 2007 год, автоматическая коробка передач, 166 000 км, дизель. Указанная цена - 14 500 долларов. Предсказание модели ниже на 2 796 долларов. Плохое предсказание, на первый взгляд, но модель была размещена в каталоге уже 498 дней! Кажется, что цена для этого конкретного примера была установлена слишком высоко. Он также размещен в самом бедном регионе страны, где автомобили в целом дешевле и размещаются на более длительный срок.

Prediction interpretation for Jeep Grand Cherokee

Пример 3: VW Passat, 2012 год, автоматическая коробка передач, 102 000 км, бензин. Указанная цена - 11 499 долларов. Предсказание модели ниже на 64 доллара.

Prediction interpretation for VW Passat

Пример 4: VAZ 2107 (русская машина), 1987 год, механическая коробка передач, 120 000 км, бензин. Указанная цена - 399 долларов. Предсказание модели выше на 34 доллара. Это пример из нижнего ценового диапазона.

Prediction interpretation for VAZ 2107

Мы видим, как практически все значения признаков этого примера отрицательно влияют на предсказанную цену.

Пример 5: VW Passat, 1992 год, механическая коробка передач, 398 000 км, бензин. Указанная цена - 750 долларов. Предсказание модели выше на 721 доллар (почти в два раза выше указанной стоимости)! Почему?

Prediction interpretation for emergency VW Passat Actual image of the “emergency” VW Passat sample

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

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

Я закончу этот выборку примеров с роскошным BMW 3-серии.

Пример 6: BMW 316, 1994 год, механическая коробка передач, 320 000 км, бензин. Указанная цена - 1 650 долларов. Предсказание модели выше на 55 долларов. Мы ясно видим, что принадлежность к роскошной марке придает некоторые баллы данному примеру.

Prediction interpretation for BMW 316

Я потратил примерно 3 часа на изучение предсказаний модели и ручное исследование примеров.

Технический вывод

У меня получилась примерно ошибка в размере 1000 долларов с использованием CatBoost Regressor на всем наборе данных. Но я также попробовал использовать тот же подход для отдельных моделей и сразу же сократил ошибку в два раза до 500 долларов. Я считаю, что производительность модели будет еще лучше, если мы разделим набор данных на поднаборы на основе функции "year_produced" и обучим несколько моделей на этих поднаборах.

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

В целом я считаю, что обученная мной модель работает достаточно хорошо, но есть большое пространство для дальнейшего улучшения.

Что касается использованных технологий в этом проекте: CatBoost, по-видимому, является идеальным выбором, потому что он обеспечивает отличную поддержку категориальных признаков "из коробки". Обучение с использованием 5-кратной перекрестной проверки заняло около 13 минут на MacBook pro 2019 года, но если бы у меня были миллионы образцов в наборе данных, это не было бы проблемой, потому что CatBoost поддерживает обучение на GPU. Он также имеет очень быстрое время предсказания, что помогает при переходе моделей в производство.

Общий вывод

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

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

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

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


Спасибо за чтение, надеюсь, вам понравилась эта статья, вы можете проверить мои кернелы и набор данных. Если у вас есть какие-либо отзывы, вы можете связаться со мной через LinkedIn.