Узнайте, как классифицировать деятельность человека по данным акселерометра с помощью Keras и TensorFlow 2 на Python
TL; DR Узнайте, как классифицировать данные временных рядов от датчиков акселерометра с помощью LSTM в Керасе
Можно ли использовать данные временных рядов для распознавания активности пользователя по данным акселерометра? Ваш телефон / браслет / часы уже делают это. Насколько хорошо вы можете это сделать?
Мы будем использовать данные акселерометра, собранные от нескольких пользователей, чтобы построить двунаправленную модель LSTM и попытаться классифицировать действия пользователей. Вы можете развернуть / повторно использовать обученную модель на любом устройстве с акселерометром (а это практически любое интеллектуальное устройство).
Это план:
- Загрузить данные распознавания человеческой деятельности
- Построить модель LSTM для классификации
- Оцените модель
Запустите полную записную книжку в браузере
Данные о человеческой деятельности
Наши данные собираются в контролируемых лабораторных условиях. Предоставляется лабораторией 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 и временных рядов :)
Запустите полную записную книжку в браузере
использованная литература
- TensorFlow - прогнозирование временных рядов
- Понимание сетей LSTM
- WISDM: беспроводной интеллектуальный анализ данных с датчиков
Первоначально опубликовано на https://www.curiousily.com.