Сквозной Data Science проект регрессионной модели для прогнозирования цен на автомобили.

Проект

  • Язык программирования: Python
  • Алгоритм: контролируемое обучение, регрессия случайного леса
  • Цель: Моей целью в этом проекте было создание модели для оценки цен на автомобили в Бразилии. Эта модель была развернута в веб-приложении, созданном с помощью Streamlit, что могло, например, помочь магазину оценить цены на автомобили, которые они собирались купить.

Набор данных

Этот набор данных был собран из Интернета в августе 2021 года. Он содержит следующие переменные:

  • Автомобиль: производитель и модель автомобиля.
  • Описание: Описание двигателя, топлива, коробки передач.
  • Автоматический: двоичная переменная с «Y», если переключение происходит автоматически, и «N», если переключение осуществляется вручную («джойстик»).
  • Год: год выпуска / модельный год.
  • Км: пробег в километрах.
  • Местоположение: Город - Штат
  • Рекламодатель: тип рекламодателя (физическое лицо, магазин или представительство).
  • Цена: целевая переменная. Цена в бразильских реалах.

Форматирование набора данных

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

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

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

Затем я поискал недостающие значения, но, к счастью, их не было, что помогло мне перейти к типам данных. Быстрый df.dtypes показал мне, что необходимы некоторые изменения, особенно для того, чтобы числа читались как числа.

EDA: исследовательский анализ данных

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

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

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

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

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

Далее идет двухвариантная визуализация (две переменные), в основном изучающая корреляции и то, как переменные соотносятся с целью (ценой).

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

С другой стороны, производитель, двигатель, тип автомобиля, топливо - эти переменные уже представляли интерес для создания модели.

Подготовка данных для моделирования

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

999 999 км были преобразованы в NA, и новые значения были введены с использованием библиотеки missingpy. Убедитесь, что распределение данных осталось прежним.

Тестирование моделей

Как и в любом другом проекте Data Science, будет создано множество моделей, поэтому мы сможем достичь окончательной модели, которая будет достаточно хорошей. Вот что здесь произошло. Я начал с фиктивной модели со средним значением от sklearn в качестве эталона и посмотрел, насколько я могу улучшить это.

Затем я создал модель с statsmodels со всеми переменными, потому что мне было интересно посмотреть, как будет выглядеть P-значение для переменных. Что ж, это не дало мне многого, поскольку модель вернула все P-значения, действительно близкие к 0, показывая, что на самом деле модель не игнорировала никакую переменную.

Поэтому я решил попробовать это с помощью SelectKBest от sklearn, и понимание было намного лучше. Я узнал, что те переменные, которые мне показались интересными во время визуализаций, были такими же, как и здесь, в топ-20 для этой модели: двигатель, тип автомобиля, некоторые марки, топливо. Кусочки начали щелкать.

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

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

Результаты постоянно улучшались, но лучшее, что я получил до сих пор, было 78% R² и $ 37 000 RMSE. Все еще слишком высоко.

Тестирование других вариантов

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

Еще я знал, что это влияет на то, что у меня было много категориальных переменных. Несмотря на One Hot Encoding, классической линейной модели было недостаточно для объяснения всех этих различий. Мне нужен был более сложный алгоритм или больший набор данных, или другие числовые переменные с лучшей корреляцией с целевой переменной.

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

Результат был действительно хорош. Я достиг 95% R², а RMSE упал до 21 000 долларов. См. Прогресс результатов.

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

Развертывание модели

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

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

Вы можете взаимодействовать с моделью по этой ссылке.

Перед тем, как ты уйдешь

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

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

Мы прошли следующие шаги:

  • Сбор данных: я собрал данные из Интернета, чтобы создать этот набор данных с 1352 наблюдениями. Данные собраны в августе 2021 г.
  • Очистка данных. Я очистил, проанализировал и отформатировал данные, чтобы подготовить их к моделированию.
  • Исследовательский анализ данных: я провел описательный статистический анализ, одномерный и двумерный анализ, чтобы понять набор данных.
  • Визуализация данных: построено несколько графиков (столбцы, прямоугольные диаграммы, диаграммы рассеяния и т. д.).
  • Ввод данных: я ввел данные с помощью предсказания машинного обучения с произвольным лесом из библиотеки missingpy.
  • Выбросы: я выявил и удалил выбросы, чтобы модель лучше работала.
  • Тестирование, перекрестная проверка и подгонка. В этом проекте 5 моделей, и они улучшались на каждой итерации, достигая 95% объясненной дисперсии (R-Squared) после разработки функций, перекрестной проверки и сетки. поиск.
  • Проект завершается веб-приложением, созданным с помощью Streamlit и развернутым.

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