О машинном обучении (ML) есть много разговоров и материалов. Но многие разработчики не используют его из-за отсутствия конкретных примеров того, как они могут использовать его в своих целях. ML - это «глубокий океан» мощных технологий, алгоритмов и инструментов; но как не потеряться в этом и понять практические аспекты этого для вашего проекта - этой статьей я постараюсь помочь разработчику познакомиться с ним на том или ином способе использования ML.

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

Допустим, у нас есть проект с геоданными (координатами), который работает с широким кругом поставщиков. Поставщики предоставляют свои данные для проекта для одних и тех же городов - в моем проекте у меня есть предложения по недвижимости от разных поставщиков. Для каждого предложения поставщик указывает координаты и город предложения. Но иногда разные поставщики предоставляют разные координаты (широта, долгота) и даже названия одних и тех же городов. Итак, у меня возникла проблема отображения таких городов (например, предложение места Rome от Поставщика 1 совпадает с городом District Rome от Поставщика 2).
Визуально и в нашей таблице SQL мы имеем что-то вроде этого:

Как видите, у нас есть два предложения (два зеленых значка на карте). Один поставщик предоставляет предложение города Пескара, другой - города Монтесильвано. Но, как мы видим, они в одном городе; и мы хотим установить для этого предложения «более точный» город - Монтесильвано.

Приготовим:

1-й шаг - экспорт данных из sql в csv:

  • Нам нужно сделать sql-запрос только с нужными нам полями:

  • Мы получили много данных (в примере итальянских городов) и экспортируем их в csv init_offers_table.csv.

2-й шаг - кластеризация машинного обучения. Подготовить данные:

Я буду использовать Jupiter NoteBook, python и его библиотеки ML (Pandas - для работы с данными; Matplotlib - для встроенной графики; Seabor - для визуализации; Sklearn - для соответствующего алгоритма ML ) за задачу.

Прежде всего, нам нужно подготовить данные (кстати, как по мне, правильная подготовка данных - это самая важная часть для алгоритмов машинного обучения - нам нужно подготовить только релевантные и значимые данные) . В нашем Jupyter NoteBook мы делаем:

Как видите, мы:

  • библиотеки импорта (`% matplotlib inline` мы используем для визуализации в Jupyter NoteBook)
  • импортировать библиотеку MeanShift из кластера Sklearn (это мощный инструмент для кластеризации. Этот инструмент подходит для нашей задачи, потому что мы хотим кластеризовать точки - в нашем случае города - которые близко друг к другу)
  • с помощью transFunc и в цикле for мы просто подготавливаем / очищаем наши импортированные из sql / csv данные.

3-й шаг - кластеризация машинного обучения. Применить алгоритм:

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

Как видишь:

  • мы очищаем нашу таблицу от city_id, region_id, country_id, id столбцов - поскольку они не участвуют в кластеризации (нам просто нужны координаты - широта, долгота)
  • Мы решаем кластеризовать точки / города на расстоянии 1-2 км. Конечно, некоторые города намного больше - не возникнет проблем с тем, чтобы объединить такие «маленькие города» нашим языком программирования после того, как ML подготовит кластеризацию, и мы сможем получить id / hash городов и т. Д. Из google geo api (I Об этом напишу ниже).
  • Последняя строка подготавливает визуализацию морского дна для нашего результата. Итак, визуально я получил следующий результат (как вы можете видеть, он повторяет контур страны Италии на карте):

  • кластерные города будут объединены по полю target.
  • Вот и все. Нам просто нужно сделать некоторую подготовку к экспорту его обратно в нашу базу данных SQL (в моем случае файл ml_cities.csv):

  • Еще раз - последние два изображения выше посвящены только подготовке данных для экспорта в SQL.

4-й шаг - экспорт кластерных данных обратно в SQL:

Мы экспортируем данные, полученные после 3-го шага, в ml_cities таблицу

  • После экспорта в SQL мы можем проверить наши предложения (от Пескары и Монтесильвано), чтобы убедиться, что они были сгруппированы в одном городе (технически - они должны одинаковые target):

  • Как видите, изначально у них были (и все еще есть) разные city_id, но теперь у них обоих одна и та же цель, с помощью которой мы можем объединить их в один город. Это будет на следующем этапе.

Шаг 5 - Объединение городов:

Итак, у нас есть города, объединенные по цели, а что дальше?

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

  • Теперь для кластерных городов, которые у нас есть (target), мы можем легко получить город, которому они принадлежат. В моем случае мы можем использовать Google Geocode Api (поскольку мы объединяем города - нам не нужно делать много запросов для каждого предложения - чтобы получить его город по широте , lng; мы просто можем получить города для города, которому принадлежат предложения). Например, для Монтесильвано укажите город:

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

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

Спасибо за внимание.
Удачного кодирования!