Берегись, Zillow, здесь идет Jestimate!

Использование машинного обучения для прогнозирования цен на жилье в Сан-Франциско

Как специалист в области недвижимости и обработки данных, я всегда восхищался Zestimate Zillow. В духе соревнования я разработал оценку Джима или Jestimate!

Оценки односемейных домов в Сан-Франциско на 2018 год

На следующей интерактивной карте показаны продажи домов в Сан-Франциско в 2018 году по районам. Щелкните район, а затем щелкните дом в таблице данных, чтобы увидеть результаты оценки по сравнению с фактической продажной ценой.

Нажмите здесь, чтобы увидеть результаты Сан-Франциско 2018!

Zestimate использует запатентованную формулу машинного обучения для оценки текущей рыночной стоимости дома. В сфере недвижимости агенты постоянно спорят с домовладельцами о рыночной стоимости их дома, например: «Вы говорите, что мой дом стоит 1 миллион долларов, но Зиллоу говорит, что мой дом стоит 1,2 миллиона долларов». Как вы думаете, какое число домовладелец предпочитает, когда речь идет о продаже собственности?

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

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

Имея это в виду, я хотел посмотреть, насколько хорошо я смогу создать механизм прогнозирования продаж домов на одну семью в Сан-Франциско. Может ли один человек, Mac и Colab победить Zillow? Следуйте и узнайте!

Несколько слов о коде

Весь код, данные и связанные файлы для проекта доступны на моем GitHub. Проект разделен на две записные книжки Colab. Один запускает модель линейной регрессии, а другой создает интерактивную карту с использованием сервера Bokeh на Heroku.

Цель и данные проекта

Цель проекта - прогнозировать цены на дома для одной семьи в Сан-Франциско в 2018 году лучше, чем базовый уровень, с непростой целью сопоставить или превзойти показатели Zillow.

Поскольку у меня есть лицензия на недвижимость, у меня есть доступ к системе MLS в Сан-Франциско, которую я использовал для загрузки данных о продажах домов на одну семью за 10 лет (2009–2018 гг.). Исходные данные включают 23 711 продаж за десять лет. К этим необработанным данным с помощью геокодирования были добавлены долгота, широта и высота (geocoding.geo.census.gov для широты / долготы, viewer.nationalmap.gov для высоты.)

Из необработанных данных были удалены следующие выбросы, составляющие 1,6% данных:

  1. Дома с 7+ ванными комнатами
  2. Дома с 8+ спальнями
  3. Дома с лотами более 10,000SF
  4. Дома с 14+ комнатами
  5. Дома с продажной ценой более 10 миллионов долларов

Важная часть данных, квадратные метры домов, была равна нулю примерно для 16% данных. Я попробовал модель, используя в качестве значения заполнения средний квадратный метр по спальням для всех домов на одну семью, а также удалив дома с нулевыми значениями. Хотя модель работала адекватно со значениями заливки, я решил удалить дома с нулевым значением, чтобы максимизировать производительность модели. Окончательный подсчет оставляет около 82% данных или 19 497 продаж домов.

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

Характеристики, которые сильно коррелируют с продажной ценой, включают широту, ванные комнаты, спальни, площадь дома, площадь участка и парковку. Это имеет смысл, поскольку в северной части Сан-Франциско самые дорогие дома (по широте), дома с большей площадью / кроватями / ванными комнатами будут стоить дороже, а парковка в Сан-Франциско стоит дороже.

Показатели

Поскольку линейная регрессия оказалась выбранной моделью (подробнее о выборе модели позже), ключевыми показателями являются средняя абсолютная ошибка (MAE) и R-Squared.

В качестве базового показателя MAE, использующая среднюю продажную цену для продаж 2018 года, составляет 684 458 долларов США. Другими словами, если я использую среднюю цену дома на одну семью в Сан-Франциско в 2018 году в качестве прогноза для каждого дома, средняя ошибка составит 684 458 долларов. Модель лучше сумеет это обыграть!

Я также хотел сравнить модель с результатами Zillow. Фактически они публикуют результаты точности для района метро Сан-Франциско (Zestimate metrics). Хотя результаты напрямую не сопоставимы с моими данными (район метро намного больше), они дают приблизительную цель для модели.

  1. Средняя ошибка - 3,6%
  2. Zestimate в пределах 5% от продажной цены - 62,7%
  3. Zestimate в пределах 10% от продажной цены - 86,1%
  4. Zestimate в пределах 20% от продажной цены - 97,6%

Протокол оценки

Протокол оценки разделит набор данных на обучающий набор с использованием данных за 2009–2016 годы, набор для проверки с использованием данных за 2017 год и окончательный тестовый набор с использованием данных за 2018 год.

  1. Поезд - 15 686 продаж домов с 2009 по 2016 год.
  2. Validate - продано 1932 дома в 2017 году.
  3. Тест - 1897 продаж домов в 2018 году.

Выбор модели

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

Разработка модели

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

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

Обработка данных

Ключ к оптимизации модели лежит в обработке данных!

Исключить функции

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

Даты и временные ряды

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

Для даты продажи необходим год, поскольку данные разделены по годам продажи. Это также подняло проблему использования временных рядов для прогнозирования цен. В отличие от акций с ежедневными ценами, продажа недвижимости может происходить раз в 5–10 лет. Чтобы использовать временной ряд, в модели необходимо использовать индекс цен, который учитывал бы повышение / снижение курса и любую сезонность. Этот подход был кратко опробован, но результаты были слабыми по сравнению с моей окончательной моделью. Годовой множитель цены показан ниже. Если вы купили дом в Сан-Франциско в 2009–2011 годах, его стоимость в среднем увеличилась вдвое к 2018 году!

В конечном итоге в окончательной модели использовался только год продажи.

Ноль и ноль

Нули и наны по широте, долготе, высоте, комнатам, ваннам, участкам квадратных футов и участкам акров были заполнены с использованием различных методов (см. Код).

Разработка функций

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

Категориальные данные были закодированы с использованием OrdinalEncoding, но несколько функций улучшили модель, подсчитав количество категориальных значений в функциях. Например, функция представлений содержала список всех потенциальных представлений от свойства, выбранного из списка из 25 типов представлений. Было высказано предположение, что собственность с большим количеством просмотров будет более ценной. Итак, функция подсчета просмотров была разработана для подсчета количества просмотров, записанных в функции просмотра. Такой же подход использовался для парковок и подъездных путей / тротуаров.

Однако ключевой инженерной особенностью оказалась сопоставимая функция продаж. Эта функция представляет собой оценочную стоимость, созданную путем моделирования того, как агент будет оценивать собственность. В приведенном ниже коде берутся данные о последних продажах трех ближайших объектов недвижимости аналогичного размера (сопоставимые продажи) и рассчитывается их средняя цена за квадратный фут, которая используется позже в модели для расчета сопоставимой цены продажи. Во избежание утечки данных сопоставимые продажи за 2018 год не использовались (максимальный год сопоставимых продаж - 2017).

nhoods = X[['sf', 'longitude', 'latitude']]
  
def neighbor_mean(sqft, source_latitude, source_longitude):
    
  source_latlong = source_latitude, source_longitude
  source_table = train[(train['sf'] >= (sqft * .85)) & (train['sf'] <= (sqft * 1.15))]
  target_table = pd.DataFrame(source_table, columns = ['sf', 'latitude', 'longitude', 'year_sold', 'sale_price']) 

  def get_distance(row):
      target_latlong = row['latitude'], row['longitude']
      return get_geodesic_distance(target_latlong, source_latlong).meters

  target_table['distance'] = target_table.apply(get_distance, axis=1)

  # Get the nearest 3 locations
  nearest_target_table = target_table.sort_values(['year_sold', 'distance'], ascending=[False, True])[1:4]
    
  new_mean = nearest_target_table['sale_price'].mean() / nearest_target_table['sf'].mean()
  if math.isnan(new_mean):
    new_mean = test['sale_price'].mean() / test['sf'].mean()

  return new_mean
  
nhoods['mean_hood_ppsf'] = X.apply(lambda x: neighbor_mean(x['sf'], x['latitude'], x['longitude']), axis=1)
nhoods = nhoods.reset_index()
nhoods = nhoods.rename(columns={'index': 'old_index'})

Новая матрица корреляции показывает результирующие отношения новых спроектированных и спроектированных функций.

Окончательные результаты

Наконец, модель была запущена по тестовым данным 2018 года. Модель имела тестовую MAE в размере 276 308 долларов и значение R-Squared 0,7981, что легко превзошло базовый уровень.

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

Гистограмма процентных ошибок предсказания Jestimate показывает распределение:

Важность функции с использованием значений Шепли

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

Медийная реклама

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

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

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

Статья изначально появилась на моем сайте GitHub Pages.

Следуйте за мной в Twitter @The_Jim_King

Это часть серии статей, посвященных данным о недвижимости Сан-Франциско

Источник данных о недвижимости в Сан-Франциско: San Francisco MLS, данные за 2009–2018 гг.