Используя простой метод статистического прогнозирования, чтобы открыть черный ящик фитнес-функций смарт-часов / смартфонов.

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

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

Копаем глубже

Как для этого собирается информация?

Чтобы лучше разобраться в этой проблеме, необходимо знать, что для этого можно использовать. Чтобы носимое устройство «понимало» текущее состояние своего пользователя, оно использует датчики. Датчики угловой скорости (гироскопы) и ускорения (акселерометр) являются наиболее распространенными для обнаружения движения и положения. Попробуем простыми методами воссоздать предсказатель положения тела!

Набор данных

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

  • Трехосное ускорение от акселерометра (общее ускорение) и расчетное ускорение тела.
  • Трехосная угловая скорость от гироскопа.
  • Вектор с 561 характеристикой с переменными временной и частотной области.
  • Ярлык активности.
  • Идентификатор субъекта, проводившего эксперимент.

Давайте посмотрим, как размещаются данные.

Загрузить данные через репозиторий просто, но это происходит в уже обработанном режиме. В папке набора данных уже есть подкаталоги, содержащие поезд (x_train имеет форму [7352, 561], а y_train имеет форму [7352, 1]) и тестовые разбиения для данных, отдельный файл .txt с индексированные значения для меток и файл .txt с индексированными значениями для столбцов в разделах поезд / тест. Для этой статьи и будущего анализа мы объединяем всю удаленную информацию, в результате чего получаем DataFrame в форме [10299, 562], который выглядит следующим образом:

Обратите внимание, что функции уже подготовлены в диапазоне [-1,1], как показано на следующем изображении:

Зная эти диапазоны значений, мы можем увидеть, как ведут себя столбцы функций (по крайней мере, некоторые из 562). Чтобы почувствовать это, мы взглянем на распределения для 8 случайно выбранных столбцов наших данных, построив их оценки плотности ядра (KDE).

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

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

Моделирование

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

Обратите внимание, что все значения по оси x «сжаты» в диапазоне [0,1] по оси y. Использование этого для метода регрессии позволяет нам сказать, что значение прогноза, установленное между этими диапазонами, является вероятностью того, что оно принадлежит определенному классу.

Зная, какая модель нам подходит, мы разделили данные на обучающие и проверочные наборы в соотношении 66/33, оставив обучающий набор с 6900 примерами из 561 функции (информация гироскопа и акселерометра) для обучающего набора и 3399 примеров такого же количества. экзогенных переменных для набора проверки. Поскольку классы кажутся немного несбалансированными, мы применяем стратифицированный метод разделения, который учитывает распределение классов при разделении наших данных. Пример кода, использованного для разделения, приведен ниже.

strat_shuf_split = StratifiedShuffleSplit(n_splits=1, 
                                          test_size=0.33, 
                                          random_state=19)
feature_cols = data.columns[:-2]
train_idx, test_idx = next(strat_shuf_split.split(data[feature_cols], data.Activity))
x_train = data.iloc[train_idx][feature_cols]
y_train = data.iloc[train_idx]['Activity']
x_test = data.iloc[test_idx][feature_cols]
y_test = data.iloc[test_idx]['Activity']

Примерка

Для простоты не было сделано никаких дополнительных инженерных работ для подготовки наших функций, поскольку они уже кажутся подходящими для прогнозирования. Любой дополнительный объем вычислений, используемый на этапе подготовки данных, может привести к более медленному прогнозированию при имплантации в носимое устройство. Зная это, следующим шагом будет подгонка модели логистической регрессии с использованием решателя LibLinear, выбор решателя объясняется тем фактом, что LibLinear имеет только O (n) сложность, в то время как другие варианты, такие как решатель LinearSVC в sklearn, имеют сложность O (n²). , нуждаясь по этой причине в использовании вычислительных ресурсов. Подгонка выполняется с помощью трех простых строк кода.

logistic = LogisticRegression(solver='liblinear')
fitted_lgstc = logistic.fit(x_train, y_train)
preds = fitted_lgstc.predict(x_test)

Оценка

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

Для проверки качества модели мы используем оценку F1 и матрицу неточностей (визуальный способ понимания прогнозов).

Оценка F1

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

Точность TP / (FP + TP) - это то, что измеряет, сколько из предсказанных значений для одного класса фактически из этого класса (не так надежно, как если бы модель предсказывала только один пример для класса, и это правильно, метрика будет оценена в 1).

Напомним, TP / (TP + FN) - это мера, которая сообщает нам, какая часть фактических истинных значений была предсказана как истинная, также не столь надежна из-за факта открытия ворот для смещенных моделей, один раз, если модель предсказывает все значения для один класс мы получаем значение отзыва, равное единице.

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

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

Матрица неточностей

Матрица неточностей визуально подтверждает то, что уже было известно по метрике f1. Модель получает все классы правильно большую часть времени, с небольшой путаницей, работая с классами 3 и 4, которые сидят и лежат.

Заключение

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

Код

Полный код, использованный в этом анализе, доступен здесь.

Источники





Https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones

Https://machinelearningmaster.com/how-to-model-human-activity-from-smartphone-data/

Цитаты

Давиде Ангита, Алессандро Гио, Лука Онето, Ксавьер Парра и Хорхе Л. Рейес-Ортис. Набор данных общественного достояния для распознавания человеческой деятельности с помощью смартфонов. 21-й Европейский симпозиум по искусственным нейронным сетям, вычислительному интеллекту и машинному обучению, ESANN 2013. Брюгге, Бельгия, 24–26 апреля 2013 г.