О машинном обучении (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 теги из текста описания с использованием машинного обучения. Эта статья предназначена только для того, чтобы показать, как мы можем упростить некоторые из наших рутинных / сложных задач с помощью нового подхода (без реализации большого количества кода).
Спасибо за внимание.
Удачного кодирования!