Узнайте, как классифицировать деятельность человека по данным акселерометра с помощью Keras и TensorFlow 2 на Python

TL; DR Узнайте, как классифицировать данные временных рядов от датчиков акселерометра с помощью LSTM в Керасе

Можно ли использовать данные временных рядов для распознавания активности пользователя по данным акселерометра? Ваш телефон / браслет / часы уже делают это. Насколько хорошо вы можете это сделать?

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

Это план:

  • Загрузить данные распознавания человеческой деятельности
  • Построить модель LSTM для классификации
  • Оцените модель

Запустите полную записную книжку в браузере

Полный проект на GitHub



Данные о человеческой деятельности

Наши данные собираются в контролируемых лабораторных условиях. Предоставляется лабораторией WISDM: WIreless Sensor Data Mining.

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

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

Давайте загрузим данные:

!gdown --id 152sWECukjvLerrVG2NUO8gtMFg83RKCF --output WISDM_ar_latest.tar.gz 
!tar -xvf WISDM_ar_latest.tar.gz

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

(1098203, 6)

Данные имеют следующие особенности:

  • user_id - уникальный идентификатор пользователя, выполняющего действие
  • activity - категория текущей активности
  • x_axis, y_axis, z_axis - данные акселерометра для каждой оси

Что мы можем узнать из данных?

Исследование

У нас есть шесть разных категорий. Посмотрим на их распределение:

Ходьба и бег трусцой очень распространены. Вы можете применить некоторые методы, чтобы сбалансировать набор данных.

У нас несколько пользователей. Сколько данных у нас на пользователя?

Большинство пользователей (кроме последних 3) имеют приличное количество записей.

Как выглядят разные виды деятельности? Возьмем первые 200 записей и посмотрим:

Сидеть хорошо, довольно расслабленно. Как насчет бега?

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

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

Предварительная обработка

Первое, что нам нужно сделать, это разделить данные на обучающие и тестовые наборы данных. Мы будем использовать данные от пользователей с id ниже или равным 30. Остальное будет для обучения:

Затем мы масштабируем значения данных акселерометра:

Обратите внимание, что мы подбираем скейлер только на обучающих данных. Как мы можем создавать последовательности? Мы просто немного изменим функцию create_dataset:

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

Вот как создавать последовательности:

Давайте посмотрим на форму новых последовательностей:

(22454, 200, 3) (22454, 1)

Мы значительно сократили объем обучающих и тестовых данных. Будем надеяться, что наша модель еще научится чему-нибудь полезному.

Последний шаг предварительной обработки - это кодирование категорий:

Готово с предварительной обработкой! Насколько хорошо наша модель будет распознавать действия пользователей?

Классификация человеческой деятельности

Начнем с простой двунаправленной модели LSTM. Вы можете попробовать и увеличить сложность. Обратите внимание, что модель относительно медленно обучается:

Фактический прогресс в обучении прост (помните, что нельзя перемешивать):

Насколько хороша наша модель?

Оценка

Вот как прошел тренировочный процесс:

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

[0.3619675412960649, 0.8790064]

~ 88% точность. Неплохо для быстрой и грязной модели. Давайте посмотрим на матрицу путаницы:

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

Заключение

Ты сделал это! Вы построили модель, которая распознает активность по 200 записям данных акселерометра. Ваша модель достигает точности ~ 88% на тестовых данных. Вот шаги, которые вы предприняли:

  • Загрузить данные распознавания человеческой деятельности
  • Построить модель LSTM для классификации
  • Оцените модель

Вы узнали, как построить двунаправленную модель LSTM и классифицировать данные временных рядов. Дальше будет еще больше удовольствия от LSTM и временных рядов :)

Запустите полную записную книжку в браузере

Полный проект на GitHub

использованная литература



Первоначально опубликовано на https://www.curiousily.com.