Русский
Русский
English
Статистика
Реклама

Геоданные

Перевод Использование геолокационных данных в машинном обучении основные методы

29.04.2021 16:13:12 | Автор: admin
Геолокационные данные могут применяться в различных сценарияхГеолокационные данные могут применяться в различных сценариях

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


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

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

Данные о предметной области приложения (включают основную информацию о местоположении)

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

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

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

Спутниковые изображенияСпутниковые изображения

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

Геопространственные данные (используются как дополнение к информации о местоположении)

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

С помощью геопространственных данных фиксируются основные географические атрибуты местоположения.

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

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

Форматы геопространственных данных

Таких стандартных форматов может быть несколько. В них хранятся геометрические данные и другие описательные атрибуты географических объектов. Например, в таких данных могут храниться координаты дорожных маршрутов с указанием типа и ширины дорожного покрытия, данные об ограничениях скорости на участках дороги, типе дороги (городская улица, автострада и пр.).

Самые часто используемые форматы:

  • Векторный формат (самый древний и самый распространённый стандарт. Файл в векторном формате фактически представляет собой набор файлов: в одном файле хранятся геометрические данные, в другом специальные атрибуты данных и т. п.).

  • GeoPackage (более новый стандарт, набирающий популярность. Данные хранятся в одном небольшом по размеру файле, реализованном в виде контейнера базы данных SQLLite).

  • GeoJSON (использует стандартный текстовый формат JSON).

Геометрические геоданные хранятся в виде векторных объектов:

  • точка: например местоположения зданий, домов, ресторанов, стоянок такси;

  • ломаная: например улицы, реки, железные дороги;

  • полигон: определяет зоны, например регионы, районы, озера, штаты, страны;

  • мультиполигон: набор полигонов.

В геоинформационных данных используются структуры данных Точка, Ломаная, Полигон и пр.В геоинформационных данных используются структуры данных Точка, Ломаная, Полигон и пр.

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

  • дуга: аналогично ломаной;

  • узел: точка пересечения различных дуг или полигонов;

  • вершины: излом ломаной.

Географические объекты представляют географические особенности и отношения между ними Географические объекты представляют географические особенности и отношения между ними

Они используют структуры данных, определяющие связь между такими объектами, например:

  • Какие объекты находятся рядом друг с другом?

  • Какие дуги соединяются друг с другом?

  • Какие объекты находятся внутри других полигонов?

Загрузка геоданных

К счастью, нам не нужно вникать в тонкости структуры таких форматов и работать с низкоуровневыми структурами данных.

Мы можем использовать замечательную Python-библиотеку GeoPandas, максимально упрощающую выполнение задачи. GeoPandas представляет собой надстройку библиотеки Pandas, поэтому в ней сохранены все её мощные функции.

Она работает с объектами GeoDataFrame и GeoSeries, представляющими собой "пространственно ориентированные" версии объектов DataFrame и Series в Pandas. В надстройке реализуется ряд дополнительных методов и атрибутов, которые можно использовать для работы с геоданными в DataFrame.

GeoDataFrame это обычный объект в Pandas DataFrame с дополнительным "геометрическим" столбцом в каждой строке, в который заносятся данные о местоположении.

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

import geopandas as gpd# Load the Shape map of New York City as a GeoDataFrameshape_df = gpd.read_file(shape_data_dir/'ny.shp')

Предварительная обработка геоданных (базовые системы координат)

Геоданные содержат координаты (x, y) географических мест, как правило, в виде значений широты и долготы. Однако, как ни странно, сами по себе эти координаты не могут быть привязаны к физическому местоположению.

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

Базовая система координат привязывает координаты широты/долготы к реальной точке на ЗемлеБазовая система координат привязывает координаты широты/долготы к реальной точке на Земле

Нам сейчас просто важно понять, что, поскольку Земля не является идеальной сферой, идеальных универсальных базовых систем координат просто не существует. Систем CRS множество, и каждая оптимизирована под конкретные цели или различные участки Земли.

Предварительная обработка геоданных (картографические проекции)

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

Картографическая проекция выводит изображение 3D-сферы на 2D-поверхностьКартографическая проекция выводит изображение 3D-сферы на 2D-поверхность

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

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

Визуализация

В Geopandas реализована довольно мощная встроенная функциональность прорисовки. Кроме того, для визуализации геоданных можно использовать другие отличные библиотеки Python, например Folium и Plotly.

Загрузите данные приложения в Pandas Dataframe.

Переведите данные в GeoDataFrame посредством преобразования информации о местоположении в её геометрический формат.

import pandas as pdimport geopandas as gpdfrom shapely.geometry import Point# Load your application data with Pandasapp_df = pd.read_csv(app_data_dir/'app.csv')# Convert it to a GeoDataFrame by transforming the Latitude/Longitude coordinates loc_crs = {'init': 'epsg:4326'}loc_geom = [Point(xy) for xy in zip(app_df['longitude'], app_df['latitude'])]geo_df = gpd.GeoDataFrame(app_df, crs=loc_crs, geometry=loc_geom)# Plot the GeoDataFramegeo_df.plot()

Затем выведите изображение GeoDataFrame.

Изображение данных о местоположенииИзображение данных о местоположении

Сами по себе точки данных не несут осмысленного контекста. Поскольку эти точки представляют собой места в Нью-Йорке, вы должны наложить их на базовую карту Нью-Йорка (которую мы загрузили из Shapefile), и только тогда такой набор точек приобретёт значимость.

Базовая карта Нью-ЙоркаБазовая карта Нью-Йорка
import matplotlib.pyplot as pltfig, ax = plt.subplots(figsize=(10,10))# Plot the base mapshape_df.plot(ax=ax, color='lightgrey', zorder=1)# Overlay the data locationsgeo_df.plot(ax=ax, alpha=0.5, zorder=2)
Для получения контекста наложите данные о местоположении на базовую картуДля получения контекста наложите данные о местоположении на базовую карту

Добавление функциональных возможностей

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

Геокодирование и обратное геокодирование

Геокодирование это способ привязки адреса, записанного в текстовом виде (например адреса дома, который вы собираетесь оценить), к координатам (широте/долготе). И, наоборот, обратное геокодирование позволяет сопоставить с координатами адрес (по улице, городу, штату и почтовому индексу). Такую функциональность обеспечивает Geopy популярная Python-библиотека.

Расстояние между двумя точками

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

  • эвклидово расстояние простое расстояние по прямой между координатами (x, y) двух точек. Это расстояние измеряется на плоской 2D-поверхности;

  • геодезическое расстояние измеряется на сферической Земле, то есть на трёхмерной поверхности. Например, кратчайшим расстоянием будет расстояние между двумя точками на сфере. Расстояние Haversine это примерно то же, что и дуга большого круга, но для его расчёта используется формула Haversine;

  • манхэттенское расстояние применяется к городским местоположениям, в которых улицы образуют кварталы. Используется для расчёта фактического расстояния (например при вождении или пешей прогулке) между двумя точками вдоль городских улиц. Такой расчёт более логичен, чем расчёт расстояния по прямой. Название расстояния происходит от района Манхэттен в Нью-Йорке, заполненного кварталами квадратной формы с дорогами, идущими параллельно друг другу и пересекающимися под прямым углом. Однако на практике, хотя улицы и пролегают прямо, их направление не всегда в точности ориентировано на север, юг, восток или запад. Это обстоятельство учитывается: рассчитывается скорректированное расстояние с учётом угла поворота карты улиц города.

Манхэттенское расстояниеМанхэттенское расстояние

Определение направления из одной точки к другой

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

Направление между Кейптауном и МельбурномНаправление между Кейптауном и Мельбурном

Расстояние от точки до ломаной

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

Локализация

Кроме точек на карте имеются регионы. Возможно, вам захочется узнать, находится ли точка в определённом регионе.

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

Перекрытие регионов

Перекрытие появляется при пересечении или объединении двух регионов. Например, перекрывает ли зона наводнения (или лесная зона) границы округа или штата.

Географическая кластеризация

Помогает группировать места в географические кластеры, которые могут не совпадать с существующими географическими границами страны или штата.

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

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

Встраивание географических областей

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

Модели машинного обучения

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

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

Обратите внимание, что значения широты/долготы часто могут использоваться в чистом виде с древовидными моделями, такими как Random Forest или Gradient Boost, не требующими нормализации данных. Другие модели, например нейросетевые, обычно требуют нормализации значений координат.

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

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

OpenStreetMap часть заключительная наполняем иерархию адреса

20.11.2020 16:08:20 | Автор: admin

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

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

Подготовка

Экспериментировать буду на Саранске, вернее, на его городском округе вырезав его прямоугольником, с таким охватом: нижняя граница (45 54), верхняя (45.5 54.3). Вырезку из дампа сохраняю в формате pbf, потому, что следующий инструмент работают именно с ним:

osmconvert -b=45,54,45.5,54.3 RU-local.o5m -o=SaranskGO.pbf

Теперь вся идея в том, чтобы всем зданиям с адресом дописать в теги в каком населённом пункте они находятся. Вычислено это будет по вхождению геометрии дома в контур населённого пункта. Для это нам понадобится плагин OsmAreaTag для osmosis (более детальное описание плагина от автора). Скомпилированную версию плагина автор выложил тут. Сам osmosis можно забрать с гитхаба. Это Java приложение, так что понятно, без чего оно не будет работать.

Установка плагина

Чтобы osmosis увидел плагин osmareatag он должен располагаться в папке plugins текущего каталога, что несколько не удобно. Поэтому его можно разместить в домашнем каталоге пользователя, для windows это будет c:\Users\<Пользователь>\.openstreetmap\osmosis\plugins либо в c:\Users\<Пользователь>\AppData\Roaming\openstreetmap\osmosis\plugins. Туда и распаковываем содержимое архива плагина, папка osmareatag-1.3.zip должна лежать в папке plugins.

Настройка правил

Тут расскажу немного теории о том как с этим плагином работать. Вот пример базового файла конфига:

<?xml version="1.0" encoding="UTF-8"?><tag-processing>    <area id="national-boundary" cache-file="national-boundary.idx">    <match type="relation">      <tag k="boundary" v="administrative"/>      <tag k="admin_level" v="2"/>    </match>  </area>  <transform>    <name>Country</name>    <match>      <tag k="building" v=".*"/>      <tag k="addr:housenumber" v=".*"/>      <inside area="national-boundary"/>    </match>    <output>      <add-tag k="addr:country" v="${ISO3166-1}" context-area="national-boundary"/>    </output>  </transform></tag-processing>

Первое это задаём области с которыми будем работать. У тега area есть атрибут id, где задаётся имя, чтобы в дальнейшем взаимодействовать с этим контуром. Далее в match указываем, какую геометрию выбрать из OSM, чтобы построить контур. В данном примере это отношения границ второго уровня, т.е. границы государств. Атрибут cache-file позволяет сохранить контур в файл и в дальнейшем использовать его не строя его из данных OSM заново. Во-первых построить контур страны это долго, а во-вторых в данных его может и не быть вовсе, если у нас вырезан например только отдельный регион. Если файл уже был создан, контур будет доступен для проверки вхождения в него объектов.

Второе это трансформация объекта, тег transform. В теге match описываем какие объекты нас интересуют, а именно: здания с адресом и тег inside для проверки на вхождение в контур, где в атрибуте area указываем с каким контуром осуществляется проверка.

И если все условия выполняются, то в output описываем, что нужно делать, а именно добавим к объекту, прошедшему проверку, тег с адресом страны, значение которого возьмём из контура national-boundary ключа ISO3166-1. Если добавляемый тег уже задан, то он заменяться не будет.

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

Наш код для дополнения адреса названием населённого пункта будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?><tag-processing>  <area id="place">    <match>      <tag k="place" v="city|town|village|hamlet|isolated_dwelling|allotments"/>    </match>  </area>  <transform>    <name>Place</name>    <match>      <tag k="building" v=".*"/>      <tag k="addr:housenumber" v=".*"/>      <inside area="place"/>    </match>    <output>      <add-tag k="addr:city-auto" v="${name}" context-area="place"/>    </output>  </transform></tag-processing>

Я специально назвал добавляемый тег addr:city-auto, чтобы посмотреть его отличия с тем, как он вручную внесён в OSM. Так же я будут сохранять в формате osm-xml, чтобы глазами увидеть добавленный тег. Команда будет выглядит так:

call osmosis-0.48.3\bin\osmosis.bat --read-pbf SaranskGO.pbf --lp --tag-area-content file=tag-building-addr-place.xml --write-xml SaranskGO.place.osm

tag-building-addr-place.xml - это как раз тот файл с правилами преобразования данных, представленный выше.

Анализ результатов

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

  <way id="103738775" version="2" timestamp="2019-09-20T18:28:15Z" uid="10124028" user="MarinaAR" changeset="74731679">    <nd ref="1197639591"/>    <nd ref="1197639690"/>    <nd ref="1197639206"/>    <nd ref="1197639237"/>    <nd ref="1197639591"/>    <tag k="building" v="yes"/>    <tag k="addr:city" v="саранак"/>    <tag k="addr:street" v="улица Лодыгина"/>    <tag k="addr:housenumber" v="5"/>    <tag k="addr:city-auto" v="Саранск"/>  </way>

Но давайте воспользуемся мощностями ГИС, а не текстового редактора. Чтобы увидеть это на карте, как и в первой части, конвертируем всё в точки, фильтруем только здания с адресами и сохраняем в CSV, чтобы затем добавить эти данные в QGIS. И хотя он понимает нативные форматы OSM, для этого нужно создавать файл привязки тегов OSM к атрибутам в ГИС, т.к. по-умолчанию адреса там не отображаются. Поэтому мне всё же удобней с текстовым CSV.

Рис.1 addr:city не совпадает с addr:city-autoРис.1 addr:city не совпадает с addr:city-auto

Видно, что целые посёлки обозначают не верно. Это и просто мусор в названии населённого пункта. Это и путаница города Саранск и одноимённого муниципального образования, в которое входят несколько населённых пунктов. Или наоборот в место названия посёлка вписывают туда название сельского поселения. На территории самого города видно несколько десятков точек, где допущены опечатки в названии. Как я и говорил раньше: оставьте это дело машинам, там где можно ошибиться, человек обязательно ошибётся.

Сейчас присвоили название только населённого пункта. Так же по аналогии можно сделать и для привязки к поселениям и регионам стран.

Подробнее..
Категории: Openstreetmap , Геоданные

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru