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

Автоматическое предсказание цены с нуля! Часть 1: Обзор

Автоматическое предсказание цены с нуля! Часть 1: Обзор
просмотров
7 мин чтение
#Машинное обучение

Создание набора данных из веба. Подготовка и моделирование набора данных.

Предположим, вы хотите продать свою машину. Если у вас есть данные, то существует множество алгоритмов для предсказания цены, включая k-ближайших соседей, линейную регрессию, ограниченные регрессии, такие как ridge, и деревья решений. Открытые версии этих алгоритмов доступны в scikit-learn.

Но что делать, если у нас нет данных? В нашей истории у нас нет доступа к закрытому API или базе данных. И нет бюджета на сторонние данные.

Возможно, мы можем загрузить данные о машинах из общедоступного API. Но многие API не могут быть использованы общественностью. Например, Edmunds прекратил использование своего открытого API для автомобилей в 2017 году и ограничил доступ только для своих деловых партнеров. Что делать?

Существует другой путь вперед: создать набор данных с помощью парсинга веб-страниц. Мы разовьем нашу находчивость, будучи самодостаточными!



Постановка ситуации

Цель бизнеса - предсказать цену, запрошенную продавцом¹. Сначала нам нужно понять общую картину. Как будет использоваться предсказание цены? Можно ли использовать существующее решение? Как измеряется успех? Есть ли доступные эксперты в данной области? Хороший проект будет иметь высокую жизнеспособность и высокую ценность.

Изучите литературу, чтобы понять, как другие решали эту задачу, и определите ключевые функции. Например, интуитивно мы знаем, что возраст автомобиля и пробег являются важными. 2018 год Ford Fusion с пробегом 10 тыс. миль будет стоить дороже, чем 2010 год Ford Fusion с пробегом 90 тыс. миль.

Нам нужно найти некоторые данные. Давайте извлечем данные с веб-сайта, выделим соответствующие функции и создадим аккуратный набор данных. Аккуратный² набор данных - это таблица, где каждая функция формирует столбец, а каждое наблюдение формирует строку. Кроме того, каждое значение имеет свою собственную ячейку.

Почему одно значение на ячейку? На этой картинке показано объявление о продаже Ford Mustang, сохраненное в формате JSON. Год и модель переплетены в заголовке. Аналогично, значение одометра, 147000, находится внутри “AttribDictionary: {“4”: “<span>odometer: <b>**147000**</b></span>. Очевидно, что эти предикторы должны быть разделены, чтобы моделировать их отношение к цене.

Данные о Ford Mustang, полученные в формате JSON

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

Работа с данными, как Мэтт Дэймон в фильме "Марсианин"

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

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

На сайте CraigsList есть дублирующиеся объявления о продаже автомобилей. Дилеры могут размещать одну и ту же машину на продажу несколько раз. Это приводит к "утечке" данных. Вот в чем проблема: с дубликатами одна и та же машина может находиться как в обучающем наборе данных, так и в нашем "невидимом" тестовом наборе данных. Мы обучаем модель на машине из обучающего набора данных, а затем предсказываем туже самую машину в тестовом наборе данных. Таким образом, производительность модели на тестовом наборе данных завышена. Мы снизили обобщающую способность модели, подгоняя ее под запрещенные данные тестового набора данных, а не под отдельно выделенные обучающие данные.

"Крайне важно тщательно исследовать и понять собранные нами сырые данные."

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

Некоторые цены... ну, просто сложные. Лучшая модель предсказала цену б/у автомобиля Ford F-250 2019 года в размере 58 тысяч долларов. Это было с точностью до 500 долларов от цены в отчете о VIN от третьей стороны. Но цена на CraigsList составляла 75 тысяч долларов. Таким образом, модель ошиблась на целых 17 тысяч долларов.

Функция 'Body' обведена зеленым кружком.

Что произошло? F-250 был модифицирован с помощью модного комплекта подвески (называемого "Lifted", "Superlift" и "lift" в одном и том же объявлении). Нам нужно сильное извлечение текстовых признаков, чтобы моделировать этот сигнал, не затопляя нашу модель шумом. В наборе данных есть много тысяч уникальных токенов (токенизация - это разделение последовательности символов на слова)! Каждый токен представляет собой столбец, измерение.

Оказывается, что матрица текстовых признаков из "Body" (со всеми остальными признаками опущенными) может предсказывать цены на Ford с погрешностью +/- 4 500 долларов по средней абсолютной ошибке (MAE). Само по себе это неплохо, но другие признаки более понятны и дешевле моделировать! В этом проекте мы будем работать с 10 признаками вместо 10 000 признаков.


Вернемся к общей картины.

Каковы ключевые этапы проекта? Наши сырые данные, как показано на изображении JSON выше, должны быть в аккуратном и последовательном формате. Данные должны быть поняты, очищены и визуализированы. Необходимо создать новые и эффективные признаки. Данные могут быть агрегированы, закодированы, преобразованы и масштабированы для эффективного моделирования. Мы будем обучать различные алгоритмы для определения наиболее перспективных алгоритмов для этого набора данных.

Можем ли мы оценить цену этого автомобиля? Какие признаки важны?

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

График для достижения великого

Запланируйте каждый этап с определенным сроком. Избегайте слишком сложных этапов. Разбейте сложные этапы на более мелкие и достижимые этапы, установив для каждого срок выполнения.

Gantt charts show project timelines visually including concurrent milestones. This timeline is made-up — an achievable timeline will depend on your skill set.

Иногда соблазнительно не составлять график. Но проекты без четкого графика затягиваются. Здесь вы являетесь собственным менеджером проекта, определяющим график и ресурсы. Удовлетворение достигнутыми этапами и взгляд на все, что вы узнали и достигли, является приятным!

Train stations succeed and fail on their schedules.

Но что, если график неверный? Просто обновите его соответствующим образом. График полезен, потому что он обеспечивает организацию и дисциплину. Он является преградой для бесконечного долгого обдумывания одной вещи. Застряли? Просмотрите этап и оцените, стоит ли обойти эту проблему, вернуться к ней позже, "позвонить другу" или пропустить ее. Неточный график гораздо лучше, чем отсутствие графика!

Знания, навыки и способности проекта (KSAs)

Знание автомобильной отрасли помогает - легче распознавать проблемы и задавать правильные вопросы. Проблема с дублирующимися объявлениями? Выглядят ли значения одометра разумно? Если вы не знаете, какое значение одометра у двухлетней машины, небольшое исследование улучшит вашу интуицию!

Требуются технические навыки. Опыт программирования на Python, структуры данных Pandas, язык запросов XML Path и инструменты scikit-learn сделают каждую часть проекта проще. Используемые навыки включают парсинг веб-сайтов с использованием scrapy на Python, десериализацию списков JSON, запросы с использованием регулярных выражений, продвинутое заполнение значений, предварительную обработку данных, создание новых признаков, настройку гиперпараметров LightGBM, анализ остатков и обнаружение выбросов.

Yes, I drew this myself with a Sharpie.

Наконец, проект по прогнозированию цены автомобиля требует решительности и внимания к деталям - даже для более опытных программистов. Почему? Вот реальный пример. При поиске с использованием регулярных выражений удаление пробела может привести к неправильным результатам признаков и затруднить интерпретацию модели. Поэтому оставайтесь сосредоточенными и делайте перерывы, чтобы прояснить свои мысли, когда застреваете. Записывайте идеи и проблемы в список "To Do" на бумаге. Зачеркивайте их, когда они выполнены. Наслаждайтесь тем, что вы достигли.

В Части 2: Сбор и очистка данных мы объясним, как собрать и подготовить исходные данные. Вперед!


_Я приветствую обратную связь! Лучший способ связаться со мной - оставить комментарий. Лично связаться со мной можно на LinkedIn: _http://www.linkedin.com/in/justinmackie

Примечания:

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

[2] Х. Уикхэм и Г. Гролемунд, R для анализа данных, 2017.