В этом руководстве мы будем работать с набором данных Residential Building, который содержит информацию о стоимости строительства, ценах продажи, переменных проекта и экономических переменных, соответствующих жилым квартирам на одну семью в Тегеране, Иран.

Итак, давайте начнем.

Импорт библиотек и данных

Сначала мы импортируем все необходимые библиотеки.

Далее мы загрузим данные жилого дома в фрейм данных и отделим цели от объектов.

  • цель (Y1): продажная цена дома.
  • цель (Y2): фактическая стоимость строительства

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

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

Как видно, в этом наборе данных нет пропущенных значений. Однако мы можем заметить, что наш фрейм данных имеет 107 функций, что довольно много. При таком большом количестве признаков мы можем легко заметить, что некоторые признаки коррелируют друг с другом. В моделях машинного обучения, если между столбцами наблюдается сильная корреляция (выше 0,8 или ниже -0,8), один из столбцов часто удаляют, так как это не улучшает модель и не приносит в нее дополнительной информации. Это может улучшить скорость модели, уменьшить размерность и т. д.

Визуальное исследование данных и разработка функций

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

Как видно из верхнего рисунка, V-2 (Общая площадь) сильно коррелирует с V-3 (Площадь участка) и V-5 (Предварительно сметная стоимость строительства на основе цен на начало проекта) и V- 8 (Цена единицы в начале проекта), поэтому мы должны отказаться от одной из этих функций. Теперь давайте посмотрим на экономические переменные и индексы во временном лаге 1.

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

Теперь мы сократили количество признаков со 107 до 36. Хорошая работа, но давайте продолжим исследование, так как количество измерений все еще довольно велико. Теперь проверим, есть ли какая-либо связь в разных временных лагах тех столбцов, которые мы сохранили.

Как видно из верхних графиков, существует чрезвычайно сильная корреляция между всеми переменными в разных лаг-фазах V-27 (фондовый индекс) и V-29 (цена золота за унцию). В этом случае мы удалим эти переменные из последних четырех лаг-фаз, оставив только одну для дальнейшего анализа. Мы также опустим V-14.1, так как он коррелирует с V-14. Такая же картина наблюдалась для колонн V-20, V-20.1 и V-20.2, V-28 и V-28.4.

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

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

Следующим шагом будет стандартизация наших данных. Для этого воспользуемся функцией StandardScaler из sklearn.

Моделирование данных

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

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

До сих пор наилучшая производительность была получена с ElasticNet. Давайте теперь попробуем найти оптимальный гиперпараметр альфа для наших моделей Lasso, Ridge и ElasticNet. Для этого мы создадим функцию get_model_with_alpha.

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

Вывод

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