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

Вступление

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

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

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

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

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

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

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

Этап 2. Взгляд на общую картину и работу с неверными данными

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

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

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

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

Кроме того, чем старше автомобиль, тем выше его odometer_value в целом, и это разумно.

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

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

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

Распределение цен (price_usd будет целевым значением в этом проекте во время обучения модели) сильно смещено вправо: средняя и медианная цена составляет 7275 и 4900 долларов соответственно.

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

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

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

Форма распределения number_of_photos автомобилей аналогична распределению price_usd (распределение смещено вправо).

Может, чем выше цена на машину, тем больше фото?

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

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

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

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

Этап 3. Модельное обучение

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

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

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

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

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

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

Первая достойная модель CatBoost позволила мне получить MAE примерно в 1000 долларов (средняя абсолютная ошибка), что составляет 15% от среднего целевого значения price_usd. Если быть точным по подсчету очков:

Best validation MAE score: $1019.18 on iteration 6413 with std $12.84

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

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

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

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

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

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

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

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

Образец 0: VW T5 Caravelle, 2009 г., механическая коробка передач, 287 000 км, дизель. Объявленная цена 13 600 долларов США. Прогноз ниже на 1200 долларов (MAE для модели составляет около 1000 долларов, так что это довольно типичный случай).

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

Используя SHAP, мы можем построить интерпретацию принятия решений еще лучше, используя функцию графика решений.

Графики принятия решений были недавно добавлены в библиотеку и обеспечивают еще более подробное представление о внутренней работе модели.

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

Подробнее об этом типе участков можно прочитать здесь.

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

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

Образец 3: VW Passat, 2012 г., АКПП, 102 000 км, бензин. Объявленная цена 11 499 долларов США. Прогноз ниже на 64 доллара.

Образец 4: ВАЗ 2107 (российский автомобиль), 1987 г., КПП, 120 000 км, бензин. Объявленная цена составляет $ 399 . Прогноз на 34 доллара выше. Это из нижнего ценового диапазона.

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

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

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

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

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

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

Я потратил примерно 3 часа на изучение прогнозов модели и ручное изучение образцов.

Техническое заключение

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

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

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

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

Общий вывод

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

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

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

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

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