Кейс 1. Оценка стоимости квартиры по параметрам

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

Мы попробуем решить задачу двумя способами: сначала"чистым" PHP, чтобы было видно всю математику, а затем с помощью готовой библиотеки.

Суть кейса

Есть квартира, описанная набором числовых параметров. По этим параметрам нужно оценить её стоимость.

Мы используем следующие признаки (можно и больше, но для этого примера ограничимся только нижеуказанными):

  • площадь квартиры в квадратных метрах

  • этаж

  • расстояние до центра города в километрах

  • возраст дома в годах

Цель – предсказать цену квартиры в рублях.

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

Почему это хороший кейс

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

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

В-третьих, этот кейс позволяет интерпретировать веса модели. Например:

"+$1000 за каждый дополнительный квадратный метр" или "−$500 за каждый километр от центра". Для бизнеса это огромный плюс по сравнению с "чёрным ящиком".

Формализация задачи

Каждая квартира описывается вектором признаков:

x=(x1,x2,x3,x4)\mathbf{x} = (x_1, x_2, x_3, x_4)

Где:

  • x1x_1 – площадь

  • x2x_2 – этаж

  • x3x_3 – расстояние до центра

  • x4x_4 – возраст дома

Модель линейной регрессии имеет вид:

y^=w1x1+w2x2+w3x3+w4x4+b\hat{y} = w_1 x_1 + w_2 x_2 + w_3 x_3 + w_4 x_4 + b

Здесь y^\hat{y} – предсказанная цена квартиры.

Реализация на чистом PHP

Начнём с варианта без библиотек. Это полезно не для продакшена, а для понимания.

Мы будем использовать градиентный спуск, матрицу признаков XX размером N×4N \times 4 и вектор весов ww длины 4. Bias добавим как дополнительный признак со значением 1.

Подготовка данных

Теперь каждый объект – это вектор из пяти элементов, где последний отвечает за bias.

Вспомогательные функции

Эта функция вычисляет скалярное произведение двух векторов. Функция перемножает соответствующие элементы массивов $a и $b и возвращает сумму этих произведений.

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

Обучение модели

Обучение линейной модели методом градиентного спуска. Используется функция потерь MSE (Mean Squared Error). На каждой эпохе вычисляются градиенты по всем весам и веса обновляются в направлении уменьшения ошибки.

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

Предсказание цены

Плюсы и минусы подхода

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

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

Реализация с библиотекой RubixML

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

circle-info

В отличие от самописной реализации, ML-библиотеки, такие как RubixML, предоставляют готовые и хорошо протестированные алгоритмы, включающие нормализацию признаков, этапы предобработки данных и численно устойчивые методы обучения. В production-окружении такие модели, как правило, оказываются более стабильными, воспроизводимыми и точными по сравнению с упрощённой реализацией линейной регрессии "с нуля".

Интерпретация весов

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

Выводы по кейсу

Этот кейс показывает, что машинное обучение – это не обязательно сложные модели и GPU. Часто достаточно простой линейной регрессии, чтобы получить полезный, объяснимый и применимый результат.

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

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

circle-info

Чтобы самостоятельно протестировать этот код, установите примеры из официального репозитория GitHubarrow-up-right или воспользуйтесь онлайн-демонстрациейarrow-up-right для его запуска.

Last updated