Обеспечение гибкого выбора данных с помощью API SiaSearch

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

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

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

Использование SiaSearch API для балансировки наборов данных

Чтобы проиллюстрировать, как работать с SiaSearch API и SDK, мы проведем вас, например, через простой процесс идентификации данных для обучения и тестирования модели. Предположим пока, что инженеры AV выявили проблемы в модуле обнаружения объектов при смене полосы движения. Поэтому они хотят улучшить свои модели, чтобы решить эту проблему и выяснить, можно ли добавить новые данные к существующим обучающим и тестовым наборам. В этом случае SiaSearch можно использовать для просмотра ранее немаркированных данных и выявления дополнительных изменений полосы движения.

В этом посте мы проиллюстрируем следующие функции:

  • Запросы к большому базовому набору данных для конкретных ситуаций
  • Проведение визуальной проверки данных
  • Создание подмножеств данных и сравнение базового содержимого данных
  • Экспорт данных в общий формат

Далее мы расскажем, как работать с нашим API и Python SDK. Обратите внимание, что в этом сообщении может быть показана только часть функций. Если вы заинтересованы в получении полного доступа к SiaSearch и его API, свяжитесь с нами по адресу [email protected] или зарегистрируйтесь здесь.

Аутентификация с помощью API
Первым шагом является использование учетных данных для входа в SiaSearch.

>>> from siasearch import auth
>>> sia = auth(username='foo', password='bar', "https://some-endpoint.com")
>>> sia
Siasearch object with user `foo` connected to `https://some-endpoint.com`

Запросы требуемых данных
Запросы могут быть созданы с помощью SQL-подобного DSL (предметно-ориентированного языка). В нашем простом примере, где мы хотим найти изменения полос в нашем собственном наборе данных «mxa», запрос выглядит следующим образом:

>>> results = sia.query("dataset_name = 'mxa' AND is_lane_change = 'True'")
>>> len(results.segments)
56

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

Результаты также можно получить в виде фрейма данных Pandas.

>>> results.df_segments.head()

Проверка результатов

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

Самый простой способ визуально проверить результаты запроса - получить к ним доступ в веб-интерфейсе SiaSearch. Предоставляет вам обзор всех сегментов и позволяет более подробно изучить отдельный сегмент.

Этого можно добиться с помощью следующей команды:

>>> results.url()
https://demo.sia-search.com/search?query=dataset_name+=+%27mxa%27+AND+is_lane_change+=+%27True%27&submit=true

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

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

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

>>> switching_point = int(len(results.segments) *2/3)
>>> for seg in results.segments[:switching_point]:
...     seg.add_tag("lane_change_train")
>>> for seg in results.segments[switching_point:]:
...     seg.add_tag("lane_change_test")

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

>>> sia.get_all_tags()
['lane_change_test', 'lane_change_train']

Или просто верните все сегменты, принадлежащие определенному тегу:

>>> tag_results = sia.get_results_from_tag('lane_change_test')
>>> tag_results.segments[0]
<Segment(drive_id='mxa_drive_0052', start_timestamp='2020-02-06 15:04:47.400000+00:00', , dataset_name='mxa', tag='lane_change_test')>

Доступ к дополнительным метаданным

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

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

>>> meta_results = results.segments[0].get_raw_values(["forward_velocity", "precip_type", "tag_road_type"])
>>> meta_results.head()

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

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

>>> m = Map(center=compute_gps_center(results), zoom=7)
>>> add_segments_to_map(
...     m, 
...     sia.get_results_from_tag('lane_change_train').segments,
...     color="blue"
... )
>>> add_segments_to_map(
...     m, 
...     sia.get_results_from_tag('lane_change_test').segments, 
...     color="red"
... )
>>> m.save("my_map.html", title="My Map")

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

Экспорт

Последним шагом является экспорт результатов в формат, который вы можете использовать для импорта в вашу модель или конвейер проверки.

Самый простой способ добиться этого - получить доступ к базовому DataFrame Panda, который предоставляет на выбор множество форматов экспорта. См. Официальный документ Panda для всех доступных форматов экспорта.

В качестве примера:

>>> df_results = results.df_segments
>>> df_results.to_csv(“out.csv”)
>>> df_results.to_parquet(“out.parquet”)

В будущих версиях мы предоставим больше настраиваемых форматов, недоступных напрямую из интерфейса Pandas, таких как файлы GeoJSON, KML и MAT.

Как показано на предыдущих шагах, SiaSearch API и Python SDK позволяют пользователю легко взаимодействовать с крупномасштабными неструктурированными данными. Громоздкие задачи инженерии данных абстрагируются, что позволяет пользователю сосредоточиться на важной задаче анализа данных и определения необходимых наборов данных для обучения, тестирования и проверки.

В настоящее время SiaSearch находится в стадии публичной бета-версии, и мы постоянно добавляем новые функции и пользователей в нашу программу раннего доступа. Если вы поделитесь некоторыми из проблем, о которых мы говорили, или просто хотите попробовать SiaSearch, не стесняйтесь и свяжитесь с нами по адресу [email protected] или посетите наш веб-сайт в разделе siasearch.io!