Можем ли мы предсказать цену Dream House в Эймсе, штат Айова, с помощью машинного обучения?

Каждый человек хоть раз или даже не раз в жизни мечтает о доме, который он может назвать домом своей мечты. Каждый дом уникален, как и мы, люди. Возникает вопрос: как мы можем использовать имеющиеся у нас данные о доме, чтобы предсказать цену дома нашей мечты? В этом проекте мы пытаемся предсказать цены на жилье в Эймсе, штат Айова, в надежде, что это поможет будущему покупателю приобрести дом своей мечты. Мы собрали этот набор данных Эймса, штат Айова, на конкурсе Kaggle. Этот набор данных был первоначально составлен Дином Де Коком для использования в обучении науке о данных. Стек технологий, который мы собираемся использовать, основан на Python. Наиболее часто используемые библиотеки: pandas, numpy, matplotlib, seaborn, sklearn и т. д.

Ключом к решению проблемы является стратегический, структурированный подход к поиску решений. Итак, первое, что я сделал, это подготовил план. Вот шаги высокого уровня, которые я выполнил:

Исследование и анализ данных

  • Чтобы проверить поведение отдельной функции по отношению к целевой переменной
  • Чтобы понять любые выбросы в наборе данных
  • Чтобы понять мультиколлинеарность в наборе данных
  • Чтобы понять асимметрию и эксцесс среди отдельных функций в наборе данных

Очистка данных

  • Проанализируйте тип данных для каждой функции. При необходимости измените тип данных соответствующим образом
  • Обработка пропущенных значений/вменение/фиктивизация

Фильтрация данных

  • Удаление любых выбросов, если это необходимо
  • Ручное удаление любых функций, которые вообще не имеют смысла в наборе данных

Преобразование данных

  • Новые функции могут быть созданы путем понимания поведения
  • Несколько функций могут быть объединены в одну

Разработка функций/выбор функций/масштабирование функций

  • Запустите несколько моделей (лассо, гребень, PCA), чтобы выполнить выбор объектов как в исходном наборе данных объектов, так и в наборе данных с преобразованными объектами.

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

Выполните CV (перекрестную проверку) и оптимизацию параметров оптимизацию моделей.

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

Давайте разберем каждый шаг по порядку.

Исследование и анализ данных

Какую функцию я должен проанализировать в первую очередь? Как мне его выбрать? Это были вопросы, которые первыми приходят мне в голову. Я решил начать анализ с целевой переменной. Имея инженерное образование, я подошел к этому с точки зрения реверс-инжиниринга. Я проанализировал и обнаружил, что средняя цена продажи в Эймсе, штат Айова, составляла около 180 тысяч долларов США. Этот набор данных был за период с 2006 по 2010 год. Это включает рецессию 2008 года. Неудивительно, что в 2008 и 2009 годах произошло падение цен по сравнению с другими годами. Кроме того, я обнаружил правильную асимметрию в данных о ценах продажи, что также объясняет то же самое. Чтобы справиться с правильной асимметрией, мы узнали, что можем применять преобразования журнала для создания нормализованного набора данных. Эта нормализация важна для правильной реализации модели ML.

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

Now lets create scatter plot for these highly correlated features to understand any outliers or behavior of these features

Очистка данных и вменение отсутствующих значений

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

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

Есть много категориальных функций, таких как PoolQC, забор и т. д., где пропущенное значение имеет значение. Это означает, что в этом доме нет ни бассейна, ни забора в этом доме соответственно. Следовательно, мы вручную жестко закодировали отсутствующие значения в «Нет» в качестве категориального значения, а затем позже преобразовали эти категориальные признаки в числовой признак, назначив порядковые номера каждому значению. Пример снимка показан ниже:

Захватите снимок кода импутации категориального признака здесь

Для вменения многих числовых признаков мы использовали средние и модовые значения в соответствии с соответствующим анализом. Ниже приведен пример снимка для того же самого.

Захватите снимок кода вменения числового признака здесь

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

Ниже приведены различные способы выполнения этой задачи:

- Кодирование функций для порядковых категориальных функций

- Решение: либо выполните ручное кодирование, либо используйте sklearn labelEncoding.

- Кодирование признаков для номинальных категориальных признаков

- Решение: лучший способ сделать это, используя метод горячего кодирования sklearn или функцию get_dummies.

- Кодирование признаков для дискретных числовых признаков

- Решение: обычно кодирование не требуется

- Кодирование функций для непрерывных числовых функций

  • Решение: обычно кодирование не требуется

Фильтрация данных

Проводя тщательный анализ набора данных, я понял, что есть несколько функций, которые не имеют никакого смысла или не влияют на прогноз целевой переменной. Следовательно, я исключаю функцию «Утилиты», поскольку около 95% наблюдений имеют одинаковое значение. Затем я опускаю «LotFrontage», так как в наборе данных было много отсутствующих значений, и для этой функции сложно сделать правильное вменение.

Разработка функций/выбор функций/масштабирование функций

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

Масштабирование функций – это следующая большая задача, которую необходимо выполнить. В sklearn у нас есть различные методы, такие как MinMaxScaler, minmax_scale, MaxAbsScaler, StandardScaler, RobustScaler, Normalizer, QuantileTransformer, PowerTransformer. Для получения дополнительной информации см. документацию.

Это обычно хорошо известно для масштабирования данных, т. е. нормализации и стандартизации. Нормализация масштабирует все числовые переменные в диапазоне [0,1]. Таким образом, выбросы могут быть потеряны. С другой стороны, стандартизация преобразует данные, чтобы они имели нулевое среднее значение и единичную дисперсию.

Масштабирование признаков помогает градиентному спуску сходиться быстрее, тем самым сокращая время обучения. Нет необходимости стандартизировать целевую переменную. Однако из-за наличия выбросов мы будем использовать RobustScaler sklearn, поскольку выбросы не влияют на него.

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

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

В процессе изучения машинного обучения я изучил множество моделей, и каждая модель имеет свой способ обработки набора данных. Первое, что я сделал, это загрузил пакет sklearn и несколько моделей из этого пакета, а именно Lasso, Ridge, ElasticNet, GradientBoostRegressor и из пакета XGBoost XGBRegressor. Ниже приведен снимок кода инициализации модели с использованием параметров по умолчанию.

Теперь самая важная задача возникает, когда мы запускаем эти модели ML и видим производительность, получая оценку. Именно тогда вся работа, которую мы проделали до сих пор, окупается. Здесь, согласно стандартам Kaggle, оценка рассчитывается на основе RMSE (среднеквадратичная ошибка). Чтобы выполнить это и рассчитать RMSE, нам нужно обучить и протестировать набор данных. Мы не можем использовать тестовый набор данных прямо сейчас, так как наши модели не доработаны. Нам нужно разделить наш обучающий набор данных на 2 части, чтобы выполнить настройку модели. Я использовал функциональность sklearn train_test_split, чтобы разделить модель в соотношении 70–30. Сначала мы подогнали модель к этим 70% набора данных поезда, а затем выполнили прогноз для оставшихся 30% набора данных. Затем мы рассчитали RMSE, как показано ниже:

Эти модели показывают существенные различия с точки зрения оценки RMSE. Кроме того, эти модели не имеют тонкой настройки. Давайте воспользуемся методом перекрестной проверки, чтобы улучшить производительность модели. Кросс-валидация (CV)разделяет данные на k-кратные и гарантирует, что каждый из них в какой-то момент используется в качестве тестового набора. Это улучшает общую производительность модели. Ниже приведен снимок экрана с оценкой моделей после k-кратной перекрестной проверки.

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

Последнее, что нам нужно сделать, — это использовать эти лучше всего настроенные модели гиперпараметров и запустить их на тестовом наборе данных, предоставленном Kaggle.

Ниже приведен скриншот нескольких записей из нашего CSV-файла прогноза.

Давайте построим гистограмму выходных данных из тестового набора данных. Здесь я построю гистограмму.

Будущие работы и уроки

Это был мой первый проект ML. Это дало мне хорошее понимание того, как решать различные задачи в любом проекте. Я подумал о нескольких улучшениях, над которыми я все еще могу работать над этим проектом. Например, я могу выполнить несколько методов преобразования данных в наборе данных. Поскольку многие функции по-прежнему привносят мультиколлинеарность в модели. другой метод, над которым я могу работать, — это вменение данных и удаление выбросов. Поскольку это эпоха рецессии в США, мы можем добавить несколько дополнительных функций и увидеть общее влияние. Я также не смог выбрать лучшие гипернастроенные параметры для XGB и GB из-за вычислительных ограничений. Как мы все знаем, каждый проект никогда не может быть завершен, и всегда будет возможность для улучшений. Вот как работает инженерное мышление, и я буду продолжать его улучшать.