人类活动识别是指将由专用安全带或智能手机记录的加速度计数据序列分类为已知的、定义明确的运动的问题。
这是一个具有挑战性的问题,因为每秒产生大量的观测数据,观测数据的时序性,以及缺乏将加速度计数据与已知运动关联起来的清晰方法。
解决该问题的传统方法是根据固定大小的窗口从时间序列数据中手工创建特征,并训练机器学习模型,例如决策树集成。困难在于这种特征工程需要该领域的深厚专业知识。
最近,循环神经网络和一维卷积神经网络(CNN)等深度学习方法已被证明在具有挑战性的活动识别任务中,在很少或没有数据特征工程的情况下,提供了最先进的结果。
在本教程中,您将了解一个用于时间序列分类的标准人类活动识别数据集,以及如何在建模前探索该数据集。
完成本教程后,您将了解:
- 如何加载和准备人类活动识别时间序列分类数据。
- 如何探索和可视化时间序列分类数据,以便为建模生成想法。
- 用于构建问题、准备数据、建模和评估人类活动识别模型的一系列方法。
通过我的新书《时间序列预测深度学习》开启您的项目,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。

标准人类活动识别问题简介
图片由 tgraham 提供,保留部分权利。
教程概述
本教程分为 8 个部分;它们是:
- 人类活动识别
- 问题描述
- 加载数据集
- 绘制单个受试者的轨迹
- 绘制总活动持续时间
- 绘制每个受试者的轨迹
- 绘制轨迹观测值的直方图
- 问题建模方法
人类活动识别
人类活动识别,简称 HAR,是根据传感器记录的人体运动轨迹预测其正在做什么的问题。
运动通常是室内日常活动,例如站立、坐着、跳跃和上下楼梯。传感器通常佩戴在受试者身上,例如智能手机或背心,并且通常记录三维(x、y、z)加速度计数据。
其理念是,一旦识别并知道了受试者的活动,智能计算机系统就可以提供帮助。
这是一个具有挑战性的问题,因为没有明确的分析方法可以将传感器数据以通用方式与特定动作关联起来。它在技术上具有挑战性,因为收集的传感器数据量大(例如,每秒数十或数百个观测值),以及在开发预测模型时传统上使用手工制作的特征和启发式方法。
最近,深度学习方法凭借其自动学习高阶特征的能力,在 HAR 问题上取得了成功。
基于传感器的活动识别旨在从大量低级传感器读数中获取关于人类活动的深层高级知识。传统的模式识别方法在过去几年中取得了巨大的进展。然而,这些方法通常严重依赖启发式手工特征提取,这可能会阻碍其泛化性能。[...] 最近,深度学习的最新进展使得自动执行高级特征提取成为可能,从而在许多领域取得了令人鼓舞的性能。
时间序列深度学习需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
问题描述
数据集“Activity Recognition from Single Chest-Mounted Accelerometer Data Set”由西班牙巴塞罗那大学的 Casale、Pujol 等人收集并提供。
可从 UCI 机器学习库免费获取
- 来自单胸佩戴式加速度计的活动识别数据集,UCI 机器学习库。
该数据集在他们 2011 年的论文“使用可穿戴设备从加速度计数据中识别人类活动”中被描述并用作序列分类模型的基础。
该数据集包含来自 15 个不同受试者的未校准加速度计数据,每个受试者执行 7 种活动。每个受试者都佩戴了定制开发的胸佩戴式加速度计,数据以 52Hz(每秒 52 次观测)的速度收集。

每个受试者佩戴的定制胸佩戴式系统的照片。
摘自《使用可穿戴设备从加速度计数据中识别人类活动》。
每位受试者都以连续的序列执行并记录了七项活动。
执行的具体活动是
- 1:在电脑前工作(workingPC)。
- 2:站立、行走和上下楼梯。
- 3:站立(standing)。
- 4:行走(walking)。
- 5:上下楼梯(stairs)。
- 6:边走边与人交谈。
- 7:站立时交谈(talking)。
该论文使用了数据的子集,特别是 14 个受试者和 5 项活动。目前尚不清楚为什么没有使用其他 2 项活动(2 和 6)。
数据收集自十四名测试人员,三名女性和十一名男性,年龄在 27 岁到 35 岁之间。[...] 收集的数据集包括 33 分钟的上下楼梯、82 分钟的行走、115 分钟的交谈、44 分钟的站立和 86 分钟的电脑工作。
——《使用可穿戴设备从加速度计数据中识别人类活动》,2011 年。
该论文的重点是开发数据的手工特征,以及开发机器学习算法。
数据被分割成一秒观测值(52 个)的窗口,窗口之间有 50% 的重叠。
我们使用 52 个样本(对应于 1 秒的加速度计数据)的窗口从数据中提取特征,窗口之间有 50% 的重叠。从每个窗口中,我们建议提取以下特征:窗口中加速度积分的均方根值,以及 Minmax 和的平均值。[...] 此外,为了完善特征集,我们添加了已被证明对人类活动识别有用的特征,例如:平均值、标准差、偏度、峰度、每个加速度计轴对之间的相关性(不包括幅值)、七级小波分解系数的能量。通过这种方式,我们获得了 319 维特征向量。
——《使用可穿戴设备从加速度计数据中识别人类活动》,2011 年。
一套机器学习模型通过 5 折交叉验证进行拟合和评估,并达到了 94% 的准确率。

在数据集上评估的随机森林混淆矩阵。
摘自《使用可穿戴设备从加速度计数据中识别人类活动》。
加载数据集
该数据集可以直接从 UCI 机器学习库下载。
将数据集解压缩到一个名为“HAR”的新目录中。
该目录包含一个 CSV 文件列表,每个受试者一个(1-15),以及一个 readme 文件。
每个文件包含 5 列:行号、x、y、z 加速度计读数和从 0 到 7 的类别号,其中类别 0 表示“无活动”,类别 1-7 对应于上一节中列出的活动。
例如,下面是文件“1.csv”的前 5 行
1 2 3 4 5 6 |
0,1502,2215,2153,1 1,1667,2072,2047,1 2,1611,1957,1906,1 3,1601,1939,1831,1 4,1643,1965,1879,1 ... |
首先,我们可以将每个文件加载为单个 NumPy 数组并删除第一列。
下面的 load_dataset() 函数将加载 HAR 目录中的所有 CSV 文件,删除第一列并返回一个包含 15 个 NumPy 数组的列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 为每个受试者加载序列,返回一个 numpy 数组列表 def load_dataset(prefix=''): subjects = list() directory = prefix + 'HAR/' for name in listdir(directory): filename = directory + '/' + name if not filename.endswith('.csv'): continue df = read_csv(filename, header=None) # 删除行号 values = df.values[:, 1:] subjects.append(values) return subjects |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 加载数据集 from os import listdir from pandas import read_csv # 为每个受试者加载序列,返回一个 numpy 数组列表 def load_dataset(prefix=''): subjects = list() directory = prefix + 'HAR/' for name in listdir(directory): filename = directory + '/' + name if not filename.endswith('.csv'): continue df = read_csv(filename, header=None) # 删除行号 values = df.values[:, 1:] subjects.append(values) return subjects # 加载 subjects = load_dataset() print('加载了 %d 个受试者' % len(subjects)) |
运行示例将加载所有数据并打印加载的受试者数量。
1 |
加载了 15 个受试者 |
注意,目录中的文件是按文件顺序导航的,这可能与受试者顺序不同,例如 10.csv 在文件顺序中位于 2.csv 之前。我相信这在本教程中无关紧要。
现在我们知道如何加载数据,我们可以通过一些可视化来探索它。
绘制单个受试者的轨迹
一个好的第一个可视化是绘制单个受试者的数据。
我们可以为给定受试者的每个变量创建一个图,包括 x、y 和 z 加速度计数据,以及相关的类值。
下面的函数 plot_subject() 将绘制给定受试者的数据。
1 2 3 4 5 6 7 8 |
# 绘制单个受试者的 x、y、z 加速度和活动 def plot_subject(subject): pyplot.figure() # 为每列创建一个图 for col in range(subject.shape[1]): pyplot.subplot(subject.shape[1], 1, col+1) pyplot.plot(subject[:,col]) pyplot.show() |
我们可以将此与上一节中的数据加载结合起来,并绘制第一个加载受试者的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# 绘制一个受试者 from os import listdir from pandas import read_csv from matplotlib import pyplot # 为每个受试者加载序列,返回一个 numpy 数组列表 def load_dataset(prefix=''): subjects = list() directory = prefix + 'HAR/' for name in listdir(directory): filename = directory + '/' + name if not filename.endswith('.csv'): continue df = read_csv(filename, header=None) # 删除行号 values = df.values[:, 1:] subjects.append(values) return subjects # 绘制单个受试者的 x、y、z 加速度和活动 def plot_subject(subject): pyplot.figure() # 为每列创建一个图 for col in range(subject.shape[1]): pyplot.subplot(subject.shape[1], 1, col+1) pyplot.plot(subject[:,col]) pyplot.show() # 加载 subjects = load_dataset() print('加载了 %d 个受试者' % len(subjects)) # 绘制单个受试者的活动 plot_subject(subjects[0]) |
运行示例为第一个加载的受试者的每个变量创建一个折线图。
我们可以看到序列开头的一些非常大的运动,这可能是一个异常值或异常行为,可以将其移除。
我们还可以看到受试者多次执行了某些动作。例如,仔细查看类变量图(底部图)表明受试者按以下顺序执行活动:1、2、0、3、0、4、3、5、3、6、7。请注意,活动 3 执行了两次。

第一个加载受试者的 x、y、z 和类别折线图。
我们可以重新运行此代码并绘制第二个加载的受试者(可能是 10.csv)。
1 2 3 |
... # 绘制单个受试者的活动 plot_subject(subjects[1]) |
运行示例会创建类似的图。
我们可以看到更多细节,这表明在之前的图中序列开始时看到的大异常值可能会掩盖该受试者轨迹中的值。
我们看到类似的活动序列,活动 3 再次出现两次。
我们还可以看到,有些活动执行的时间比其他活动长得多。这可能会影响模型区分活动的能力,例如,对于两个受试者来说,活动 3(站立)的数据量相对于其他执行的活动来说非常少。

第二个加载受试者的 x、y、z 和类别折线图。
绘制总活动持续时间
上一节提出了一个问题,即所有受试者中每项活动持续了多长时间或有多少观测值。
如果一项活动的数据比另一项活动多得多,这可能很重要,这表明代表性不足的活动可能更难建模。
我们可以通过按活动和受试者对所有观测值进行分组来研究这个问题,并绘制分布图。这将使我们了解每个受试者在活动轨迹中花费在每项活动上的时间。
首先,我们可以对每个受试者的活动进行分组。
我们可以通过为每个受试者创建一个字典,并按活动存储所有轨迹数据来做到这一点。下面的 group_by_activity() 函数将为每个受试者执行此分组。
1 2 3 4 |
# 返回一个字典列表,其中每个字典都包含每个活动的一个序列 def group_by_activity(subjects, activities): grouped = [{a:s[s[:,-1]==a] for a in activities} for s in subjects] return grouped |
接下来,我们可以计算每个受试者每项活动的总持续时间。
我们知道加速度计数据以 52Hz 的频率记录,因此我们可以将每项活动的每个轨迹的长度除以 52,以秒为单位汇总持续时间。
下面的函数 plot_durations() 将计算每个受试者每项活动的持续时间,并将结果绘制为箱线图。箱线图是一种有用的方式,可以总结每项活动的 15 个持续时间,因为它描述了持续时间的分布,而无需假设分布。
1 2 3 4 5 6 7 |
# 计算每个受试者每项活动的总持续时间(秒)并绘图 def plot_durations(grouped, activities): # 计算每个受试者每项活动的长度 freq = 52 durations = [[len(s[a])/freq for s in grouped] for a in activities] pyplot.boxplot(durations, labels=activities) pyplot.show() |
下面列出了绘制活动持续时间分布的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# 按活动划分的持续时间 from os import listdir from pandas import read_csv from matplotlib import pyplot # 为每个受试者加载序列,返回一个 numpy 数组列表 def load_dataset(prefix=''): subjects = list() directory = prefix + 'HAR/' for name in listdir(directory): filename = directory + '/' + name if not filename.endswith('.csv'): continue df = read_csv(filename, header=None) # 删除行号 values = df.values[:, 1:] subjects.append(values) return subjects # 返回一个字典列表,其中每个字典都包含每个活动的一个序列 def group_by_activity(subjects, activities): grouped = [{a:s[s[:,-1]==a] for a in activities} for s in subjects] return grouped # 计算每个受试者每项活动的总持续时间(秒)并绘图 def plot_durations(grouped, activities): # 计算每个受试者每项活动的长度 freq = 52 durations = [[len(s[a])/freq for s in grouped] for a in activities] pyplot.boxplot(durations, labels=activities) pyplot.show() # 加载 subjects = load_dataset() print('加载了 %d 个受试者' % len(subjects)) # 为每个受试者按活动分组轨迹 activities = [i for i in range(0,8)] grouped = group_by_activity(subjects, activities) # 绘制持续时间 plot_durations(grouped, activities) |
运行示例将绘制每个受试者活动持续时间的分布。
我们可以看到,活动 0(无活动)、2(站立、行走和上下楼梯)、5(上下楼梯)和 6(行走和交谈)的观测值相对较少。
这可能解释了为什么原始论文的实验中排除了活动 2 和 6。
我们还可以看到,每个受试者在活动 1(站立、行走和上下楼梯)和活动 7(站立时交谈)上花费了大量时间。这些活动可能被过度代表。准备模型数据时,对这些活动进行欠采样或对其他活动进行过采样可能会有好处。

每个受试者活动持续时间分布的箱线图
绘制每个受试者的轨迹
接下来,查看每个受试者的轨迹数据可能会很有趣。
一种方法是将单个受试者的所有轨迹绘制在单个图表上,然后将所有图表垂直对齐。这将允许对受试者之间以及受试者内部的轨迹进行比较。
下面的函数 plot_subjects() 将在单独的图上绘制 15 个受试者中的每个受试者的加速度计数据。x、y 和 z 数据的轨迹分别用橙色、绿色和蓝色表示。
1 2 3 4 5 6 7 8 9 10 |
# 绘制每个受试者的 x、y、z 加速度 def plot_subjects(subjects): pyplot.figure() # 为每个受试者创建一个图 for i in range(len(subjects)): pyplot.subplot(len(subjects), 1, i+1) # 绘制 x、y 和 z 的每个数据 for j in range(subjects[i].shape[1]-1): pyplot.plot(subjects[i][:,j]) pyplot.show() |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 绘制所有受试者的加速度计数据 from os import listdir from pandas import read_csv from matplotlib import pyplot # 为每个受试者加载序列,返回一个 numpy 数组列表 def load_dataset(prefix=''): subjects = list() directory = prefix + 'HAR/' for name in listdir(directory): filename = directory + '/' + name if not filename.endswith('.csv'): continue df = read_csv(filename, header=None) # 删除行号 values = df.values[:, 1:] subjects.append(values) return subjects # 绘制每个受试者的 x、y、z 加速度 def plot_subjects(subjects): pyplot.figure() # 为每个受试者创建一个图 for i in range(len(subjects)): pyplot.subplot(len(subjects), 1, i+1) # 绘制 x、y 和 z 的每个数据 for j in range(subjects[i].shape[1]-1): pyplot.plot(subjects[i][:,j]) pyplot.show() # 加载 subjects = load_dataset() print('加载了 %d 个受试者' % len(subjects)) # 绘制每个受试者的轨迹数据 plot_subjects(subjects) |
运行示例会创建一个包含 15 个图的图形。
我们正在关注轨迹的一般趋势,而不是具体趋势。
- 我们可以看到大量的橙色和绿色,以及很少的蓝色,这表明 z 数据在建模此问题时可能不太重要。
- 我们可以看到 x 和 y 轨迹在同一时间点有相似的轨迹数据变化,这表明可能只需要单个轴的数据即可拟合预测模型。
- 我们可以看到每个受试者在序列开始(前 60 秒)的轨迹中都有相同的巨大峰值,这可能与实验的启动有关。
- 我们可以看到受试者之间轨迹数据结构相似,尽管有些轨迹看起来比其他轨迹更不明显,例如比较第一个和第二个图的幅度。
每个受试者的完整轨迹长度可能不同,因此通过 x 轴进行直接比较可能不合理(例如,同时进行相似的活动)。无论如何,我们并不真正关心问题的这一方面。

所有 15 个受试者的加速度计轨迹数据折线图。
这些轨迹似乎具有相同的总体比例,但受试者之间的幅度差异表明,对数据进行按受试者重新缩放可能比跨受试者缩放更有意义。
这对于训练数据来说可能是有意义的,但对于测试受试者的数据缩放可能在方法论上具有挑战性。它将要求或假设在预测活动之前整个轨迹都可用。这对于模型的离线使用来说是可以的,但对于模型的在线使用则不行。这还表明,对于预校准的轨迹数据(例如以固定比例输入的数据),模型的在线使用可能更容易。
绘制轨迹观测值的直方图
上一节关于不同受试者之间可能存在显著不同尺度的问题,可能会给建模该数据集带来挑战。
我们可以通过绘制加速度计数据每个轴的观测值分布直方图来探索这一点。
与上一节一样,我们可以为每个受试者创建一个图,然后将所有受试者的图垂直对齐,并使用相同的 x 轴来帮助发现分布中的明显差异。
下面列出了用于绘制直方图而不是折线图的更新后的 plot_subjects() 函数。 hist() 函数用于为加速度计数据的每个轴创建直方图,并使用大量的 bin(100 个)来帮助在图中分散数据。所有子图也共享相同的 x 轴,以帮助进行比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 绘制每个受试者的 x、y、z 加速度 def plot_subjects(subjects): pyplot.figure() # 为每个受试者创建一个图 xaxis = None for i in range(len(subjects)): ax = pyplot.subplot(len(subjects), 1, i+1, sharex=xaxis) if i == 0: xaxis = ax # 绘制 x 数据的直方图 for j in range(subjects[i].shape[1]-1): pyplot.hist(subjects[i][:,j], bins=100) pyplot.show() |
完整的示例列在下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# 绘制所有受试者轨迹数据的直方图 from os import listdir from pandas import read_csv from matplotlib import pyplot # 为每个受试者加载序列,返回一个 numpy 数组列表 def load_dataset(prefix=''): subjects = list() directory = prefix + 'HAR/' for name in listdir(directory): filename = directory + '/' + name if not filename.endswith('.csv'): continue df = read_csv(filename, header=None) # 删除行号 values = df.values[:, 1:] subjects.append(values) return subjects # 绘制每个受试者的 x、y、z 加速度 def plot_subjects(subjects): pyplot.figure() # 为每个受试者创建一个图 xaxis = None for i in range(len(subjects)): ax = pyplot.subplot(len(subjects), 1, i+1, sharex=xaxis) if i == 0: xaxis = ax # 绘制 x 数据的直方图 for j in range(subjects[i].shape[1]-1): pyplot.hist(subjects[i][:,j], bins=100) pyplot.show() # 加载 subjects = load_dataset() print('加载了 %d 个受试者' % len(subjects)) # 绘制每个受试者的轨迹数据 plot_subjects(subjects) |
运行示例会创建一个包含 15 个图的单个图形,每个受试者一个图,每个图包含 3 个加速度计数据轴的 3 个直方图。
蓝色、橙色和绿色分别代表 x、y 和 z 轴。
此图表明加速度计每个轴的分布是高斯分布或非常接近高斯分布。这可能有助于沿着加速度计数据的每个轴进行简单的异常值检测和去除。
该图确实有助于显示受试者内部分布之间的关系以及受试者之间分布的差异。
在每个受试者中,x 轴(蓝色)和 z 轴(绿色)通常会聚集在左侧,而 y 轴数据(橙色)则单独位于右侧。y 轴的分布通常更尖锐,而 x 轴和 z 轴的分布更平坦。
在不同受试者之间,我们可以看到值通常聚集在 2,000 左右(无论单位是什么),尽管存在很大的分散。这种显著的分布差异确实表明,在执行任何跨受试者建模之前,至少需要对每个轴和每个受试者的数据进行标准化(转换为零均值和单位方差)。

每个受试者加速度计数据的直方图
问题建模方法
在本节中,我们将基于对数据集的上述探索,探讨该问题的一些数据准备和建模思想和方法。
这些可能有助于对特定数据集进行建模,也有助于解决人类活动识别甚至时间序列分类问题。
问题构建
有许多方法可以将数据构建为预测建模问题,尽管所有这些方法都围绕着时间序列分类的概念。
要考虑的两种主要方法是
- 按受试者:根据每个受试者的轨迹数据进行活动分类建模。
- 跨受试者:根据跨受试者的轨迹数据进行活动分类建模。
后者,跨受试者,更受欢迎,但如果目标是深入了解给定受试者,例如家庭中的个性化模型,前者也可能很有趣。
建模期间构建数据的两种主要方法包括:
- 分段活动:可以根据活动预先分段轨迹数据,并根据每个活动的整个轨迹或其特征训练模型。
- 滑动窗口:每个主体的连续轨迹被分割成滑动窗口,无论是否重叠,并将每个活动在窗口中的模式作为要预测的活动。
前一种方法在模型的实际使用方面可能不太现实,但可能是一个更容易建模的问题。后一种方法是原始论文中问题框架,其中使用50%重叠的1秒窗口。
除了使训练数据集的大小增加一倍,这可能对深度神经网络有利之外,我看不出这种重叠在问题框架中的益处。事实上,我预计这可能会导致模型过拟合。
数据准备
数据表明一些准备方案可能在建模过程中有所帮助
- 对加速度计观测值进行降采样到几分之一秒可能很有用,例如1/4、1/2、1、2秒。
- 截断原始数据的前60秒可能是明智的,因为它似乎与实验的启动有关,并且所有受试者都在该时间执行活动1(在电脑前工作)。
- 使用简单的异常值检测和移除方法,例如每个轴上偏离均值3到4倍标准差的值,可能会很有用。
- 也许移除观测值相对较少的活动会是明智的,或者会带来更公平的预测方法评估(例如活动0、2和6)。
- 也许通过在训练数据集中过采样代表性不足的活动或欠采样代表性过多的活动来重新平衡活动可能有助于建模。
- 尝试不同的窗口大小会很有趣(例如1、5、10、30秒),特别是与观测值的降采样结合使用时。
- 对于任何跨主体模型,几乎肯定需要对每个主体的数据进行标准化。在每个主体标准化之后对跨主体数据进行归一化也可能很有用。
如前一节所述,每个主体的数据标准化确实引入了方法论问题,但无论如何都可以使用,并将其解释为需要来自原始硬件系统的校准观测值。
问题建模
我建议使用神经网络来探索这个问题。
与论文中使用的特征工程和领域特定手工特征的方法不同,直接对原始数据进行建模(降采样或其他方式)将是有用且通用的。
首先,我建议使用随机森林或梯度提升机等稳健方法来发现性能基线。然后探索专门适用于时间序列分类问题的神经网络方法。
可能适用的两种神经网络架构类型是
- 卷积神经网络或CNN。
- 循环神经网络或RNN,特别是长短期记忆或LSTM。
第三种是两者的混合
- CNN LSTM。
CNN能够从输入序列中提取特征,例如加速度计输入数据的窗口。RNN,例如LSTM,能够直接从长序列输入数据中学习,并学习数据中的长期关系。
我预计序列数据中几乎没有因果关系,除了每个受试者看起来都在执行相同的模拟动作序列,这是我们不想学习的。天真地讲,这可能表明CNN更适合根据观察到的加速度计数据序列预测活动。
一维CNN已广泛用于此类问题,每个加速度计数据轴有一个通道。一个好的简单起点是直接在序列数据窗口上拟合CNN模型。这是一种2014年题为“使用移动传感器的卷积神经网络进行人类活动识别”的论文中描述的方法,并通过下面引自该论文的图示得到了更清晰的说明。

用于人类活动识别的一维CNN架构示例
摘自“使用移动传感器的卷积神经网络进行人类活动识别”。
可以使用CNN LSTM,其中CNN学习观测子序列的表示,然后LSTM学习这些子序列。
例如,CNN可以提取一秒的加速度计数据,然后可以重复30秒,为LSTM提供30个时间步的CNN解释数据。
我预计这三种方法都可能对这个问题以及类似问题很有趣。
模型评估
我不认为窗口重叠会有用,事实上,如果在交叉验证期间训练和测试数据集中都存在部分轨迹数据,可能会导致轻微的误导性结果。尽管如此,它会增加训练数据量。
我认为重要的是,在将数据暴露给模型时,要保持观测值的时间顺序。对于给定主体,来自单个活动的多个窗口可能看起来相似,并且对窗口进行随机洗牌和分离以训练和测试数据可能会导致误导性结果。
我不建议使用原始论文中使用的随机洗牌k折交叉验证。我预计这会导致乐观的结果,将来自15个主体所有轨迹的1秒数据窗口混合在一起进行训练和测试。
也许对这些数据中的模型进行公平评估的方法是按主体使用留一法交叉验证(LOOCV)。这意味着模型在最初14个主体上拟合,并在第15个主体的所有窗口上进行评估。这个过程会重复,让每个主体都有机会用作保留测试数据集。
按主体对数据集进行分割,避免了模型评估过程中与单个窗口时间顺序相关的任何问题,因为所有窗口都保证是新的/未见过的数据。
如果您探索这些建模想法中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 使用加速度计进行活动识别的综合研究, 2018
- 基于传感器的活动识别深度学习:一项调查, 2017.
- 使用可穿戴设备通过加速度计数据进行人类活动识别, 2011.
- 使用移动传感器的卷积神经网络进行人类活动识别, 2014.
API
- sklearn.preprocessing.StandardScaler API
- sklearn.preprocessing.MinMaxScaler API
- keras.utils.to_categorical API
- Keras 卷积层
文章
- 活动识别,维基百科
- 来自单胸佩戴式加速度计的活动识别数据集,UCI 机器学习库。
总结
在本教程中,您了解了一个用于时间序列分类的标准人类活动识别数据集。
具体来说,你学到了:
- 如何加载和准备人类活动识别时间序列分类数据。
- 如何探索和可视化时间序列分类数据,以便为建模生成想法。
- 用于构建问题、准备数据、建模和评估人类活动识别模型的一系列方法。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
如何创建自定义动作识别数据集?
抱歉,我没有好的建议。
是否有后续帖子包含最终模型和结果?
我确实有这个数据集的一系列示例,我没有提出一个最佳或最终模型,而是将它们用作如何探索不同模型类型的示例。
更多信息在这里
https://machinelearning.org.cn/?s=activity+recognition&post_type=post&submit=Search
“对每个主体的数据进行标准化对于任何跨主体模型几乎都是必需的。在每个主体标准化之后对跨主体数据进行归一化也可能很有用。”
你的意思是对整个数据集吗?在将其拆分为训练集和验证集之前?我以为我们只将这些技术应用于训练集,并使用获得的值(均值、标准差等)来归一化其余集合。对吗?
这与训练/测试分割无关,它指的是数据来源,例如“主体”。
对于这个数据集,我们有大约1983869个观测值,具有X轴、Y轴、Z轴和标签这4个特征。
我这样做对吗?
什么对?
我的数据集有1983869个观测值和4个特征,这正确吗????
抱歉,我不明白。什么正确?
你好,谁能指导我如何将加速度计观测值降采样到几分之一秒,例如1/4、1/2、1、2秒。
你到底遇到了什么问题?
也许这会有帮助。
https://machinelearning.org.cn/resample-interpolate-time-series-data-python/
你找到解决办法了吗?
如何对信号进行降采样?如何为降采样的信号创建标签?
也许这会给你一些想法
https://machinelearning.org.cn/resample-interpolate-time-series-data-python/
如果我有来自身体不同关节的3个不同加速度计的数据怎么办?我应该将每个加速度计的x、y和z作为CNN的输入吗?我应该怎么做?
是的,它们可以是单独的输入特征。
你好,
我想进行留一法主题
我有一个CSV文件,由6个主体使用加速度计和陀螺仪传感器执行6项活动生成
每个主体执行每项活动10分钟(步行10分钟,站立10分钟等),采样率为50Hz
在每项活动结束时,我导出一个CSV文件,其中包含30000行和7列(活动、accx、accy、accz、gyrx、gyry、gyrz)
因此,对于一个人,在六项活动之后,我将CSV文件连接起来,现在我有一个包含180000行和7列(活动、accx、accy、accz、gyrx、gyry、gyrz)的CSV文件
所有主体都完成了这个过程
当我组合这6个主体时,我最终得到一个巨大的CSV文件,其中包含1,080,000行和7列(活动、accx、accy、accz、gyrx、gyry、gyrz)
我找不到如何使用这个数据集执行留一法主题
sklearn中没有方法
你能给我一些建议吗?
我应该为每个主题设置一个ID列吗?
然后如何在python中实现这一点?
本教程可能会有所帮助
https://machinelearning.org.cn/cnn-models-for-human-activity-recognition-time-series-classification/
谢谢Jason。本教程对我没有帮助,但我能够执行一个for循环。程序是这样的:
1. 在Jupyter notebook中加载六个不同的csv文件,从而创建6个不同的数据框
2. 将这6个csv文件连接成一个最终文件,并加载到notebook中
3. 对最终的csv文件使用滑动窗口
4. 滑动后我得到X.shape, y.shape ((10299, 200, 6), (10299,))
5. 使用这个循环
df_list = [df1, df2, df3, df4, df5, df6]
for i in range(6)
train = pd.concat(df_list[0:i] + df_list[i+1:])
test = df_list[i]
6. 将步骤4中的x,y与步骤5中的train和test对齐
7. 使用一个LSTM模型
8. 拟合模型
history =model.fit(train,test,
batch_size=32,
epochs=100
你觉得怎么样?
我该如何将其部署到网络应用上?比如我保存了模型,我需要获取输入并从中预测值,你能帮我吗?
好问题,这会有帮助
https://machinelearning.org.cn/faq/single-faq/how-do-i-deploy-my-python-file-as-an-application
你好,Jason
如果我们在使用神经网络之前想做一些特征选择(例如ANOVA f-检验),我们该怎么做?
在将原始数据分割成窗口之前还是之后?
提前感谢
您应该在训练集上执行选择,然后将选择应用于测试集和验证集。
你好 Jason,期待听到你关于以下问题的看法:
我有一个用于日常生活活动的多传感器数据集。它包含来自10名志愿者的数据,每人执行9项活动。每位志愿者身体佩戴6个传感器,记录的数据类型为四元数、加速度和角速度。对于每位志愿者,我总共有7个csv文件,即每个传感器一个,一个用于注释。现在我想将7名志愿者的数据分成训练集和验证集,其余3名用于测试。对于7名志愿者,我总共有近49个csv文件。将这些文件分成训练集和验证集所需的正确方法是什么?我可以找到很多关于单个csv文件的信息,但关于大量文件的信息很少。谢谢
也许您可以根据您的问题调整一些HAR示例,并比较不同方法的结果,以便发现哪种方法对您的特定数据集效果好或最好。
我希望基于从“起立行走测试 (TUG)”中获得的未分段和未标记数据进行人类活动识别。在此测试中,参与者基本上按以下顺序执行活动(坐下、站立、行走、转身并返回坐下)。
数据集包含x、y、z加速度计和力敏电阻传感器数据,所有这些数据都从鞋垫设备记录。
请问,您认为解决这个问题的最佳方法是什么?
你好,Clinton…以下资源可能对你有用
https://machinelearning.org.cn/evaluate-machine-learning-algorithms-for-human-activity-recognition/