Прогнозируйте фиксированную цену в Сингапуре с помощью машинного обучения

Сингапур пятый год подряд признается одной из самых дорогих стран по версии журнала The Economist Intelligence Unit. В одном из самых дорогих городов мира проживание составляет очень большую часть расходов.

Чтобы предоставить доступное жилье для населения в целом в Сингапуре, правительство Сингапура предлагает несколько вариантов государственного жилья в Сингапуре, более известных как HDB Flat.

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

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

Обзор

Статья разбита на несколько разделов. Ниже приводится обзор рассматриваемых мной разделов:

  1. Визуализируйте данные
  2. Создание функции
  3. Разделение поездов / тестов
  4. Эксперимент
  5. Создать модель машинного обучения
  6. Ансамбль
  7. Метрики
  8. Результаты
  9. Вывод

Без лишних слов, давайте погрузимся в суть дела и посмотрим, как самому создать фиксированный прогноз цены!

Визуализируйте данные

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

Ниже приведены доступные столбцы в этих данных:

'month', 'town', 'flat_type', 'block', 'street_name', 'storey_range', 'floor_area_sqm', 'flat_model', 'lease_commence_date', 'resale_price'

Цена перепродажи будет целевой меткой в ​​этом проекте, а остальные столбцы будут формировать нашу матрицу характеристик. Давайте продолжим и построим какой-нибудь график.

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

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

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

Еще одна важная визуализация, которая поможет нам понять наши особенности, - это корреляционная матрица:

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

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

Создание функции

Возможности, доступные в этом наборе данных, довольно малы. Но ничто не мешает нам создавать больше!

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

Некоторые функции, которые, я думаю, будут полезны:

  1. Направление. В этом наборе данных указан город, в котором расположена квартира. Как мы могли бы улучшить эту функцию? Я создаю новую функцию, которая отображает город в одном из направлений / регионов, перечисленных ниже:
"NORTH_EAST","EAST""WEST","NORTH","CENTRAL"

2. Номер комнаты и номер туалета. Основываясь на указанном типе квартиры, я проверяю на веб-сайте HDB количество комнат и туалетов и создаю еще две новые функции.

3. Этаж. Характеристики диапазона этажей, представленные в данных, представлены в строковом формате: от 4 до 6, от 7 до 9, что я считаю неоптимальным, потому что, если ваши характеристики являются порядковыми, вы должны преобразовать функцию в число.

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

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

# Example, :
4 To 6 - The generator output: 4 or 5 or 6
7 TO 9 - The generator output: 7 or 8 or 9

4. Год и месяц продаж. Месяц, изначально указанный в наборе данных, имеет следующий формат: 2018–4, поэтому разделение их на «год» и «месяц» позволит модели выбрать порядковый номер. отношение.

Насколько эффективны вновь созданные функции для повышения производительности нашей модели? Я проведу несколько экспериментов и проведу некоторое сравнение с базовой моделью. Я расскажу об этом в следующем разделе Результаты.

Разделение поездов / тестов

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

  1. Распределение поезда и тестового набора должно быть одинаковым. Плохой пример поезда и тестового набора будет: все квартиры в наборе поездов из восточного региона, а плоские в тестовом наборе все из западного региона. Ясно, что модель, которую обучают в таких условиях, не будет очень эффективной.
  2. Распределение набора тестов и данных в реальной жизни должно быть одинаковым. Набор тестов служит надежной оценкой, позволяющей узнать, насколько хорошо ваша система будет работать перед развертыванием в производственной среде. Если ваш набор тестов не отражает того, каким будет распределение реальных данных, то результаты, которые вы получите от набора тестов, не дадут вам особой уверенности. Велика вероятность того, что ваша система будет плохо работать в производственной среде.

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

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

Эксперимент

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

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

MLflow

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

  1. Отслеживание MLflow. Помогите вам отслеживать параметры, результаты, показатели экспериментов и сравнивать их с помощью интерактивного интерфейса.
  2. Проект MLflow s - Помогите упаковать ваш код для воспроизводимого запуска через Docker и Conda.
  3. Модели MLflow. Помогите упаковать модель, чтобы вы могли легко поделиться ею с другими.

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

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

Используйте меньший размер выборки для эксперимента

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

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

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

Зачем мы это делаем? Когда мы разрабатываем наши модели или добавляем новые функции, мы хотим получать быструю обратную связь от всех действий, которые мы делаем. Ожидание 5–10 минут, чтобы поэкспериментировать с чем-то одним, не будет продуктивным. Следовательно, имея меньший размер выборки, вы можете быстрее проводить эксперименты, получать отзывы и вносить изменения.

Насколько малым должен быть размер выборки? Полезные правила - он должен быть небольшим, но достаточно представительным, чтобы помочь вам провести эксперимент менее чем за 20 секунд и получить хорошую приблизительную оценку результатов.

Создайте нашу модель машинного обучения

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

elasticnet = make_pipeline(RobustScaler(), ElasticNet(alpha =0.00001, random_state=1))
svm = make_pipeline(RobustScaler(),SVR(C=140))
lasso = make_pipeline(RobustScaler(), Lasso(alpha =0.0005, random_state=1))
GBoost = GradientBoostingRegressor(loss='huber',min_samples_split=10,n_estimators=200)
experiment_description = [
   'Add in sale year and sales month feature',
   'Add more data from 2015'
]
run_experiment([elasticnet,svm,lasso,GBoost],experiment_description)

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

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

Ансамбль

Это очень полезный метод машинного обучения для повышения точности вашей общей модели. Он создает набор различных классификаторов (например: random forest, elasticnet, xgboost) и объединяет результаты этих классификаторов для улучшения результата.

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

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

Штабелирование

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

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

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

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

Метрики

Пора увидеть результаты! Но сначала нам нужно понять, что такое метрики, прежде чем анализировать результат.

Метрики, которые мы здесь используем, - это среднеквадратическая логарифмическая ошибка (RMSLE). Я считаю, что большинство из вас слышали и уже узнали о среднеквадратичной ошибке (RMSE) раньше. Разница между этими двумя показателями заключается в том, что мы применяем журнал для целевого значения и прогнозируемого значения перед вычислением среднеквадратичного значения. См. Уравнения ниже:

Почему мы используем RMSLE вместо RMSE? Делая журнал, мы смотрим только на относительную разницу / процентную разницу между реальным и прогнозируемым значением.

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

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

Результаты

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

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

Размер данных, который мы используем для проведения всех этих экспериментов, представляет собой лишь очень маленькое подмножество данных. Мы можем провести полный эксперимент (используя все данные поезда) и сравнить «Самую базовую модель» - Модель A и «Модель со всеми дополнительными функциями» - Модель B , чтобы убедиться, что создание нашей функции действительно полезно. См. Результаты ниже:

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

Я хотел бы выделить лучшую из этих двух моделей - классификатор стекирования. Классификатор суммирования модели B имеет показатель потерь на 15% ниже, чем модель A, что является удивительным улучшением.

Вывод

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

Помимо кода машинного обучения, я также создал веб-приложение для прогнозирования в реальном времени.

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

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



Ant Financial Singapore расширяется и активно нанимает Java-разработчиков и инженеров по обеспечению качества.

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

В настоящее время эти роли распространяются на кандидатов из Сингапура, Китая или Юго-Восточной Азии.

Если вы заинтересованы в создании платежного продукта, который обслуживает более 20 миллионов пользователей, не стесняйтесь присылать свое резюме по адресу [email protected] или вы можете связаться со мной через LinkedIn, чтобы узнать больше. Спасибо!