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

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

Поскольку нам не сообщают адрес, будет сложно проанализировать местоположение объявления относительно самых популярных направлений в Остине. Вместо этого рассмотрите отношение (:Review)-[:REVIEWS]->(:Listing). В моем предыдущем посте я ограничил свой набор данных, чтобы он включал только списки, по которым был хотя бы один отзыв. Я сделал это, чтобы исключить новые для рынка списки с потенциально ненадежными ценами, и это значительно улучшило соответствие моей модели. А теперь давайте углубимся и воспользуемся количеством отзывов объявления в дополнение к количеству номеров, чтобы спрогнозировать цену за ночь.

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

Некоторая предыстория

Прежде чем мы вернемся к рынку аренды в Остине, я рассмотрю важные детали множественной линейной регрессии. Помните, что в простой линейной регрессии мы хотим предсказать значение зависимой переменной «y», используя значение одной независимой переменной. , «x». Разница в том, что при множественной линейной регрессии мы используем несколько независимых переменных (x1, x2,…, xp) для прогнозирования y вместо простого один.

Визуальное понимание множественной линейной регрессии немного сложнее и зависит от количества независимых переменных (p). Если p = 1, это всего лишь пример простой линейной регрессии, а точки данных (x1, y) лежат в стандартной двумерной системе координат (с x и ось Y). Линейная регрессия находит линию через точки, которые наилучшим образом «соответствуют» данным.

Если p = 2, эти (x1, x2, y) точки данных лежат в трехмерной системе координат (с x, y, и z оси), и множественная линейная регрессия находит плоскость, которая наилучшим образом соответствует точкам данных.

Для большего количества независимых переменных визуальное понимание более абстрактно. Для независимых переменных p точки данных (x1, x2, x3…, xp, y) существуют в p + 1 -мерном пространстве. . Что действительно важно, так это то, что линейная модель (которая является p -мерной) может быть представлена ​​коэффициентами p + 1 β0 , β1,…, βp, так что y аппроксимируется уравнением y = β0 + β1*x1 + β2*x2 + … + βp*xp.

Осторожно!

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

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

Множественные LR в действии

Хорошо, давайте рассмотрим набор запросов, которые создают модель множественной линейной регрессии в Neo4j.

Настраивать

Скачайте и установите jar-файл из последней версии линейной регрессии. Запустите :play http://guides.neo4j.com/listings из браузера Neo4j и следуйте запросам импорта, чтобы создать график списка краткосрочной аренды Уилла. Обратитесь к моему предыдущему посту за более подробным руководством по установке в g процедур линейной регрессии и импорта набора данных об аренде Остина.

Разделение данных обучения и тестирования

После того, как вы импортировали набор данных и установили процедуры, мы разбиваем набор данных на образец 75:25 (обучение: тестирование). Давайте строим на основе последней модели, использованной в прошлый раз, и снова будем рассматривать только листинги с хотя бы одним обзором. Обозначьте 75% символом :Train.

MATCH (list:Listing)-[:IN_NEIGHBORHOOD]->(:Neighborhood {neighborhood_id:'78704'}) 
WHERE exists(list.bedrooms) 
  AND exists(list.bathrooms)
  AND exists(list.price) 
  AND (:Review)-[:REVIEWS]->(list)
WITH regression.linear.split(collect(id(list)), 0.75) AS trainingIDs
MATCH (list:Listing) WHERE id(list) in trainingIDs 
SET list:Train

И добавьте метку :Test к оставшимся 25%.

MATCH (list:Listing)-[n:IN_NEIGHBORHOOD]->(hood:Neighborhood {neighborhood_id:'78704'})
WHERE exists(list.bedrooms) 
  AND exists(list.bathrooms)
  AND exists(list.price) 
  AND (:Review)-[:REVIEWS]->(list) 
  AND NOT list:Train 
SET list:Test

Количественная оценка корреляции

Если вы хотите узнать корреляцию Пирсона между независимыми переменными, используйте функцию regression.linear.correlation(List<Double> first, List<Double> second). Один из List<Double> входов этой функции содержит агрегированные данные о «количестве обзоров» из многих списков, и каждое «количество обзоров» рассчитывается путем агрегирования отношений из каждого листинга. Мы не можем выполнить два уровня агрегирования (collect(count(r))) в одном запросе. Следовательно, мы должны выполнить два запроса.

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

MATCH (:Review)-[r:REVIEWS]->(list) 
WHERE list:Train OR list:Test
WITH list, count(r) AS num_reviews
SET list.num_reviews = num_reviews

Затем соберите данные (num_reviews, rooms) по всем объявлениям и вычислите корреляцию.

MATCH (list) 
WHERE list:Test OR list:Train
WITH collect(list.num_reviews) as reviews, 
     collect(list.bedrooms + list.bathrooms) as rooms
RETURN regression.linear.correlation(reviews, rooms)

Коэффициенты корреляции Пирсона находятся в диапазоне [-1, 1], где 0 означает отсутствие корреляции, 1 идеальная положительная корреляция и -1 полная отрицательная корреляция. Количество отзывов и количество номеров имеют корреляцию -0,125, что указывает на очень слабую отрицательную корреляцию. OLS - приемлемый метод для этой небольшой корреляции, поэтому мы можем двигаться дальше с моделью. Подробнее об интерпретации коэффициентов корреляции.

Инициализировать модель

Мы вызываем ту же процедуру create, но теперь наша структура модели 'Multiple' вместо 'Simple', а количество независимых переменных 2 вместо 1.

CALL regression.linear.create(
          'mlr rental prices', 'Multiple', true, 2)

Добавить данные для обучения

Добавьте известные данные в том же формате, что и при простой линейной регрессии. Просто добавьте еще одну запись (количество отзывов) в список независимых переменных.

MATCH (list:Train)
WHERE NOT list:Seen 
CALL regression.linear.add(
          'mlr rental prices', 
          [list.bedrooms + list.bathrooms, list.num_reviews], 
          list.price) 
SET list:Seen RETURN count(list)

Обучите модель

Мы должны обучить модель так, чтобы параметры линии (βi), коэффициент детерминации (R²) и т. Д. Рассчитывались до принятия данных тестирования или выполнения прогнозов. Если вы забудете этот шаг, а затем попытаетесь добавить данные тестирования или сделать прогнозы, ваша модель сначала будет автоматически обучена.

CALL regression.linear.train('mlr rental prices')

Обратите внимание, что после вызова процедуры train вы все равно можете добавить дополнительные данные для обучения. Вам просто нужно еще раз позвонить train перед тестированием новой модели!

Добавить данные тестирования

Анализируйте производительность модели на невидимых данных. Помните, что при добавлении тестовых данных требуется дополнительный параметр 'test' в качестве входных данных для процедуры regression.linear.add.

MATCH (list:Test) 
WHERE NOT list:Seen
CALL regression.linear.add(
          'mlr rental prices', 
          [list.bedrooms + list.bathrooms, list.num_reviews], 
          list.price, 
          'test') 
SET list:Seen 
RETURN count(list)

Протестируйте модель

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

CALL regression.linear.test('mlr rental prices')

Вы также можете вернуть информацию о модели в любое время, вызвав info процедуру.

CALL regression.linear.info('mlr rental prices') 

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

Обычно мы ищем значения R² больше 0,6, но значения, близкие к 1, указывают на лучшее линейное соответствие. Здесь тренировка скорректирована R² = 0,517, а тестирование скорректировано
R² = 0,556. В прошлый раз наши значения R² составляли 0,500 и 0,559 для обучения и тестирования соответственно. Модель, созданная с помощью множественной линейной регрессии, работает немного лучше, чем простая регрессионная модель, использованная в прошлый раз, на данных обучения и примерно так же на данных тестирования. Сможете ли вы найти лучшие независимые переменные и улучшить мою работу?

Шаг назад

В Neo4j мы с коллегами сейчас сталкиваемся с вопросом: Как машинное обучение и искусственный интеллект вписываются в графические базы данных? На этот вопрос есть несколько ответов, ни один из них не является «правильным». В моем предыдущем посте я продемонстрировал, как можно построить простую модель машинного обучения на данных в графике, чтобы избежать экспорта в другое программное обеспечение. В этом посте раскрылся еще один интересный аспект: возможность создавать модели с данными, хранящимися внутренне в структуре графа. Мы смогли легко получить данные о «количестве отзывов», подсчитав количество (:Review)-[:REVIEWS]->(:Listing) отношений в каждом листинге. В связи с этим графические базы данных увеличивают типы данных, к которым мы можем легко получить доступ для построения моделей машинного обучения.

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

Резюме

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

  • Укажите тип модели “Multiple” в течение regression.linear.create
  • Укажите количество независимых переменных в течение regression.linear.create
  • Нет regression.linear.remove метода для тестирования или обучения данных
  • Вы не можете скопировать данные обучения из одной модели в другую с regression.linear.copy
  • Вы должны обучить модель с помощью вызова regression.linear.train перед тестированием, анализом или прогнозированием.
  • Посмотрите на adjusted R², чтобы более точно сравнивать модели с разным количеством независимых переменных.
  • regression.linear.data возвращает параметры модели, не ее байтовую [] сериализацию. Следовательно, вы не можете использовать regression.linear.load. (Я бы хотел это исправить)

Это экспериментальный проект, поэтому я очень благодарен за любые отзывы. Ознакомьтесь с процедурой репозиторий и обратитесь в LinkedIn или @ML_auren.

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