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

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

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

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

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

1) Как мне получить данные?

С данными (высокого качества) чем больше, тем лучше. Машинное обучение - это особая область статистики, в которой мы применяем компьютерные алгоритмы к очень очень большим наборам данных. После того, как вы определились с вопросами, на которые хотите получить ответы (следует ли мне арендовать? Следует ли покупать? Следует ли мне переехать в другой город?), Вы можете начать поиск веб-сайтов, которые будут содержать данные, необходимые для ответа на них.

В моем случае я хотел найти квартиру в Амстердаме по хорошей цене. Поэтому я искал сайты аренды в городе Амстердам. Все просто, правда? Однако всегда проверяйте их условия обслуживания и robots.txt, чтобы убедиться, что вам разрешено с уважением очистить их данные. (мы поговорим о том, что это означает позже в руководстве). Для этого проекта я буду использовать сайт аренды в Амстердаме Pararius.

Найдите страницу со списком, с которой хотите получить данные. Нажмите «Проверить», чтобы узнать больше о структуре данных на их веб-сайте. После щелчка на боковой панели отобразится хранилище HTML, в котором находятся данные. В следующем примере данные, которые мне нужны, в основном находятся внутри поля ‹li class = search-list__item search-list__item - листинг› это означает, что я буду ссылаться на эти данные, используя эту информацию позже в коде. На данный момент нам не нужно указывать, хотим ли мы цену, местонахождение, почтовые индексы… мы хотим знать только «коробку», в которой находятся все эти данные.

2) Время соскабливать!

Теперь приступим к написанию кода! Как и в случае любого веб-скрейпинга, мы начнем с отправки запросов на веб-сайт, который мы выбрали ранее, чтобы они могли предоставить нам нужные данные.

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

Если вас особенно интересует, как работают запросы и заголовки, вы также можете делать запросы с полностью рандомизированными заголовками. Это не обязательно для большинства веб-сайтов (и не должно нарушать их TOS), но если вы хотите добавить безопасность и анонимность в свой код, это мое решение для (насколько это возможно) анонимных заголовков:

После очистки всех желаемых страниц вы можете запустить:

len(houses)

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

3) У нас есть данные, но я ничего не понимаю?

После того, как вы собрали все данные, вам следует выполнить несколько команд печати, чтобы убедиться, что все работает:

print (ответ) будет напечатан, если запрос был успешным (т.е. мы не были заблокированы сайтом)

len (house) напечатает, сколько домашних объявлений вы успешно обработали.

print (house_data [1]) напечатает второй скопированный вами рекламный блок в формате HTML. Я всегда предпочитаю смотреть на второй, потому что первый может содержать заголовки и запутанные биты для следующей части нашего анализа: очистки данных.

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

Когда я выполняю print (house_data [1]), я получаю это в моей лаборатории Jupyter:

Хорошо, пока не убегайте от этого урока. Здесь вы видите красивый HTML-скрипт, который был скопирован с вашего веб-сайта со списком объявлений! Посмотрите дальше:

Мы действительно можем узнать там несколько вещей! Квартира в этом рекламном блоке, кажется, находится на 1078 RA Амстердам, она стоит 1500 евро в месяц и составляет 60 м²! Для очистки данных нам нужно найти эту информацию в супе HTML и записать, где они расположены (точно так же, как мы это делали ранее с веб-сайтом!)

Например: чтобы получить цену, вам нужно найти ‹span class =isting-search-item__price› и получить нужное местоположение: ‹div class =isting-search-item__location›. Вы должны сделать то же самое со всей информацией, необходимой для анализа. Однако простой поиск HTML-тега и класса может вернуть больше информации, чем вам хотелось бы. Обязательно попробуйте добавить [0], [1], [2],…, чтобы проверить, какой параметр даст вам именно ту строку, которую вы ищете.

Часто, даже после нахождения нужной строки, будут появляться лишние символы, которые вы хотите удалить из фрейма данных, например буквы в цене аренды или пробелы в почтовом индексе. Ознакомьтесь с удивительным тестером регулярных выражений (https://regex101.com/), чтобы узнать, как решить проблему с помощью str.replace (). Несколько примеров:

  • для удаления нецифровых символов:
df["column name"].str.replace("\d","")
  • для удаления цифровых символов:
df["column name"].str.replace("\D","")
  • чтобы удалить слово «новый»:
df["column name"].str.replace("new","")

Вот так выглядит наш фрейм данных после очистки:

4) Реальный государственный рынок

Важно не только иметь данные, но и уметь их использовать. Что важно для арендаторов? Что может повлиять на стоимость аренды? В зависимости от данных, которые вы скопировали ранее, вам могут быть доступны следующие переменные:

  • Размер поверхности
  • Кол-во спален
  • Если квартира продается с мебелью (бинарная)
  • Если цена включает коммунальные платежи (бинарный)
  • Расстояние до центра города
  • Модность района
  • Агентство по аренде (бинарный)
  • Временные и долгосрочные контракты. (двоичный)

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

5) Расстояние от центра города: геолокация

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

Но как вы дифференцируете это влияние на стоимость аренды? Геолокация! В этом уроке мы будем использовать Nominatim. Мы будем использовать это, чтобы получить координаты каждой квартиры в нашем наборе данных, а затем сравнить их с (желательной) точкой в ​​городе.

Вот код:

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

Следует отметить, что столбцы точка, местоположение и высота будут удалены. Точка нужна только для получения точек широты и долготы, а высота не нужна, поскольку мы исследуем дома в Нидерландах! (Но это интересный фактор, который следует учитывать, например, если вы живете в Швейцарии).

Давайте посчитаем расстояние: к настоящему моменту вы должны были выбрать точку в своем городе, чтобы рассчитать расстояние между квартирами и этой конкретной точкой. Для Амстердама я выбрал центральную станцию ​​Amsterdam Centraal со следующими координатами (центральная точка):

После выбора моей точки и получения ее координат (также на Nominatim) вы создадите два столбца с широтой (52,370216) и долготой (4,895168) этой точки.

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

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

6) Визуализация тенденций рынка аренды

Теперь, когда у нас есть геолокация всех квартир в нашем наборе данных, мы можем дополнительно визуализировать, как их цены на аренду расположены географически, и выявить любые тенденции, которые могут иметь отношение к нашему анализу. Мы сделаем это с помощью Google Maps с gmaps пакета для Jupyter:

conda install gmaps ## to install the google maps package

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

С помощью приведенного ниже простого кода мы можем запросить интерактивные карты Google на Jupyter Notebook (иногда это не работает правильно с JupyterLab) и вывести слой тепловой карты, который сообщит нам, где самые высокие арендные ставки в городе.

У нас должно получиться красивое географическое представление цен на аренду в Амстердаме:

Анализ тепловой карты. Как и ожидалось, большая часть более высоких цен на аренду сосредоточена вокруг центра города, в частности Де Валлен, а также вокруг внешних кварталов, таких как Де Пейп и вокруг городского парка Вонделпарк, где сосредоточено элитное жилье. В дальнейших районах Ньив-Вест, Зюйдуст, Иджбург и Ноорд, по-видимому, более низкие цены на аренду, представленные в зеленый. Расположение, похоже, сильно влияет на стоимость аренды, но это определенно не единственный фактор.

Для получения дополнительных примеров и руководств по gmaps щелкните здесь.

Мы также должны посмотреть, как переменные в нашем фрейме данных связаны с ценами на жилье. Это код для проверки взаимосвязи между ценой на жилье и площадью:

import matplotlib.pyplot as plt
plt.figure()
plt.scatter(amsmodel1['surface'],amsmodel1['house_price'], s=20, edgecolor="black",c="darkorange", label="surface")
plt.xlabel("Surface Area")
plt.ylabel("House Price")
plt.title("Surface Area vs. House Price")
plt.legend()
plt.show()

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

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

Это код для проверки взаимосвязи между ценами на дом и количеством спален:

import matplotlib.pyplot as plt
plt.figure()
plt.scatter(amsmodel1['bedrooms'],amsmodel1['house_price'], s=20, edgecolor="black",c="darkorange", label="bedrooms")
plt.xlabel("Bedrooms")
plt.ylabel("House Price")
plt.title("Bedrooms vs. House Price")
plt.legend()
plt.show()

В чем-то похожий вывод о площади: чем больше в доме спален, тем выше должна быть стоимость аренды. Однако это тоже не единственный фактор, ведь есть 5-комнатные квартиры всего за 3000 долларов в месяц и до 10000 долларов.

Если вы сейчас посмотрите на свой фрейм данных, вы заметите множество столбцов, которые были «ступенчатыми» столбцами, чтобы получить больше информации о домах. Мы можем удалить все эти столбцы, поскольку мы больше не будем их использовать.

del df5['address']
del df5['address2']
del df5['altitude']
del df5['latitude']
del df5['longitude']
del df5['point']
del df5['lat2']
del df5['lon2']
del df5['coord1']
del df5['coord2']
del df5['location']

Мультиколлинеарность

Если бы мы запускали несколько линейных регрессий (или варианты одной), нам пришлось бы проверять независимые переменные с высокой корреляцией друг с другом. Один из способов сделать это - использовать корреляционную матрицу:

Как видно из корреляционной матрицы ниже, есть две независимые переменные, которые демонстрируют некоторую мультиколлинеарность (r ›0,7): спальни и площадь. Это имеет смысл, поскольку чем больше дом, тем больше в нем спален.

Один из способов решить эту проблему - объединить две переменные в одну, например создать новую переменную для площади каждой спальни:

amsmodel1['surface_per_bedroom'] = amsmodel1['surface']/amsmodel1['bedrooms']

После удаления переменных поверхности и спален вот как выглядит наша корреляционная матрица:

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

В каждой точке дерева решений алгоритм сделает наилучшее разбиение, которое будет более точно предсказывать целевую переменную, независимо от того, как независимые переменные коррелируют с другими. Кроме того, для регрессионных моделей цель состоит в том, чтобы понять влияние конкретной переменной, тогда как в машинном обучении нас гораздо больше интересует предсказательная сила модели. Если вы хотите узнать больше об этом, вот отличное обсуждение на эту тему: «https://stats.stackexchange.com/questions/168622/why-is-multicollinearity-not-checked-in-modern-statistics- машинное обучение"

7) Модное окружение: использование Yelp API

В каждом большом городе несколько районов кажутся очень популярными (и, следовательно, с исключительно высокой арендной платой), даже если они не расположены близко к центру города или не обязательно населены большими квартирами. Примером, который можно найти на тепловой карте Google Maps, может быть De Pijp, который находится за пределами кольца Амстердама и в основном предлагает небольшие и неремонтированные квартиры, но имеет более высокую арендную плату, чем апартаменты на правая сторона Центрального вокзала.

Как количественно измерить влияние популярности?

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

"Вот где жизнь города!"

«Вот где все крутые бары и рестораны».

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

Вам нужно будет зарегистрироваться для использования Yelp API и заменить мой api_key вашим, а также заменить location на город, который вы анализируете. Также возможно построить второй внешний цикл для получения данных из разных городов. Если у вас есть фрейм данных со столбцом город, вы можете преобразовать этот столбец в список и повторять запросы по этому списку!

После сбора данных из Yelp нам нужно сопоставить их с данными об аренде, которые у нас уже есть. Вот как это сделать:

После сопоставления данных yelp с нашим фреймом данных, удаления всех пустых строк и проверки количества имеющихся столбцов, фрейм данных выглядит так:

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

Приведенный ниже график разброса кода зависит от цен на жилье:

import matplotlib.pyplot as plt
plt.figure()
plt.scatter(amsmodel1['yelp_ratings'],amsmodel1['house_price'], s=20, edgecolor="black",c="darkorange", label = "yelp")
plt.xlabel("Yelp Ratings")
plt.ylabel("House Price")
plt.title("Yelp Ratings vs. House Price")
plt.legend()
plt.show()

Следующий график разброса кода показывает цены на жилье по сравнению с ценами на жилье:

import matplotlib.pyplot as plt
plt.figure()
plt.scatter(amsmodel1['yelp_prices'],amsmodel1['house_price'], s=20, edgecolor="black",c="darkorange", label="yelp")
plt.xlabel("Yelp Prices")
plt.ylabel("House Price")
plt.title("Yelp Prices vs. House Price")
plt.legend()
plt.show()

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

9) фиктивные переменные

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

Вот быстрое (но отличное) объяснение фиктивных переменных и того, что они делают: https://medium.com/@brian.collins0409/dummy-variables-done-right-588f58596aea

Вот код:

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

Наиболее распространенное эмпирическое правило состоит в том, что у нас должно быть не менее 5 точек обучающих данных для каждой функции в нашем наборе данных. В этом проекте у нас есть:

training data set = 3376*80% 
ration training points/features = 2700.8/327 = 8.26

который (к счастью) передает наши 5 обучающих данных правилу соотношения функций!

На этом этапе наш фрейм данных должен выглядеть так:

У нас есть 3376 строк, 327 столбцов и данные о ценах на дома, количестве спален, площади, удаленности от центра города, средних ценах и рейтингах их районов, фиктивных переменных для почтовых индексов и фиктивных переменных для агентств по аренде.

9) Случайный лес

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

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

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

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

Средняя точность 94,75% - это неплохо, но можно ли повысить эффективность модели? Мы можем попробовать различные настройки гиперпараметров, чтобы, возможно, повысить точность на несколько процентных пунктов:

Настройка гиперпараметров

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

В Sklearn есть замечательная функция RandomizedSearchCV, которая проверяет различные параметры и рекомендует, какие параметры могут обеспечить максимальную точность результатов модели.

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

И мы поместили регрессор случайного леса в RandomizedSearchCV, и он выполняет поиск по 100 комбинациям 3 раза и возвращает лучшие параметры.

Это результаты для лучших параметров, которые мы получаем для этой модели:

{'n_estimators': 400,
 'min_samples_split': 2,
 'min_samples_leaf': 1,
 'max_features': 'sqrt',
 'max_depth': None,
 'bootstrap': False}

Мы возвращаемся к исходному коду и включаем следующие параметры:

Повышение точности до 98,30%!

10) Дерево решений и важность функций

Если вы откроете изображение tree.png, вы должны получить что-то вроде этого:

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

Гистограмма важности функции - это опция sklearn, которая немного более эффективна для понимания результатов алгоритма. Во-первых, мы определяем, что хотели бы видеть только те функции, которые определяют более 0,5% результатов наших прогнозов, и мы также создадим список этих функций.

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

list_of_index = [0,1,2,3,4,24,97,249,280,308]

Далее нам нужно получить столбцы и метки столбцов:

И, наконец, это код для гистограммы matplotlib:

Это итоговый график:

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

Что, если анализировать стоимость аренды домов за квадратный метр, а не абсолютные цены? Добавив следующий код в процесс непосредственно перед алгоритмом:

и снова запустив Random Forest, мы получим следующие результаты:

При средней точности 98,309% измерение цены на квадратный метр немного увеличивает точность модели по сравнению с 98,30%, которые мы получили ранее. Список функций также меняется:

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

11) Прогнозы

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

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

Вот как делать прогнозы с помощью обученной модели:

Приведенный выше прогноз относится к квартире с 1 спальней, площадью 45 кв. Метров, с почтовым индексом 1018, которую арендует государственное агентство недвижимости JLG Real Estate. Мы можем запросить кадры данных yelp_prices и yelp_ratings из соответствующего почтового индекса 1018, чтобы указать их в прогнозе.

Для этой конкретной квартиры прогнозируемая арендная плата составляет 1530 долларов, что чрезвычайно близко к реальной арендной цене, выплачиваемой за квартиру (1538 долларов), хотя в модели никогда не было этой точки данных, а квартира не фигурировал в списках более года.

12) Заключение

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

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

использованная литература

Алгоритм веб-сканирования: https://towardsdatascience.com/looking-for-a-house-build-a-web-scraper-to-help-you-5ab25badc83e

Визуализация случайного леса: https://towardsdatascience.com/how-to-visualize-a-decision-tree-from-a-random-forest-in-python-using-scikit-learn-38ad2d75f21c

Настройка гиперпараметров: https://towardsdatascience.com/hyperparameter-tuning-the-random-forest-in-python-using-scikit-learn-28d2aa77dd74