Python TensorFlow双向Bi-LSTM长短期记忆神经网络深度学习可视化用户传感器活动数据

在本文中,我们旨在利用深度学习技术,特别是TensorFlow框架下的Keras库,对WISDM(无线传感器数据挖掘)数据集进行活动识别。

由Kaizong Ye,Coin Ge撰写

WISDM数据集包含了从用户身上佩戴的加速度传感器收集的三轴加速度数据,这些数据被用于识别用户的日常活动,如走路、跑步、跳跃等。


通过对这些数据的分析,我们可以为健康监测、人机交互等领域提供有价值的见解。


!pip install gdown !pip install tensorflow-gpu
image.png

数据准备

首先,我们导入了必要的Python库,包括NumPy用于数值计算、TensorFlow用于深度学习建模、Pandas用于数据处理、Seaborn和Matplotlib用于数据可视化。为了确保实验的可重复性,我们设置了随机种子。


df = pd.read_c, how='any', inplace=True)

image.png

数据探索

在数据准备阶段之后,我们对数据集进行了初步的探索。通过Seaborn库的countplot函数,我们绘制了不同活动类型的频数分布图,以了解数据集中各种活动类型的分布情况。


视频

LSTM神经网络架构和原理及其在Python中的预测应用

探索见解

去bilibili观看

探索更多视频


视频

LSTM模型原理及其进行股票收盘价的时间序列预测讲解

探索见解

去bilibili观看

探索更多视频


视频

【视频讲解】LSTM模型在中文文本评论情感分析预测应用附代码数据

探索见解

去bilibili观看

探索更多视频


sns.countplot(x = 'activity',
下载 (6)_1_1719822232.5531096.jpg

通过此图,我们可以直观地看到数据集中各种活动类型的分布情况,为后续的模型训练和评估提供有价值的参考。

为了直观地了解数据集中用户活动记录的分布情况,我们绘制了用户ID的频数分布图。通过Seaborn库的countplot函数,我们观察到不同用户之间的活动记录数量存在差异。


order = df.user_id.value_counts().index); plt.title("Records per user");
下载 (7).translated.jpg
for ax in axis: ax.legend(loc='lower left', bbox_to_anchor=(1.0, 0.5))

此外,为了更深入地了解用户活动数据的特征,我们定义了一个名为plot_activity的函数,用于绘制特定活动类型的三轴加速度数据图。通过这个函数,我们可以直观地比较不同活动类型在加速度数据上的差异。

plot_activity("Sitting", df);
image.png
image.png

数据分割与缩放

为了进行模型训练和验证,我们将数据集按照用户ID进行了分割,前30个用户的数据作为训练集,其余用户的数据作为测试集。接着,我们使用RobustScaler对数据进行缩放,以减少不同特征之间的量纲影响,提高模型的训练效果。

在数据预处理和可视化之后,我们将构建深度学习模型,并使用训练集进行模型训练。通过调整模型架构和参数设置,我们旨在提高活动识别的准确性和效率。此外,我们还将使用测试集对模型进行评估,以验证其泛化能力。

scaler = scaler.fit(df_train[scale_columns]) print(X_train.shape, y_train.shape)
image.png

我们采用了一种基于双向长短期记忆(Bi-LSTM)的深度学习模型,通过预处理数据、构建模型、训练与评估等步骤,实现了对用户日常活动的准确分类。

在数据预处理阶段,我们设计了一个名为create_dataset的函数,用于从原始数据中提取时间序列样本及其对应的标签。该函数接受四个参数:输入数据X、标签数据y、时间步长time_steps和步长step。通过遍历输入数据,该函数以固定的步长截取时间序列样本,并使用scipy.stats.mode函数计算每个样本时间段内出现频率最高的活动标签作为该样本的标签。

在本研究中,我们设定时间步长TIME_STEPS为200,步长STEP为40。利用create_dataset函数,我们从训练集df_train中提取了训练数据X_train和对应的标签y_train,从测试集df_test中提取了测试数据X_test和对应的标签y_test

模型构建与训练

在模型构建阶段,我们采用了一个基于双向长短期记忆(Bi-LSTM)的深度学习模型。该模型包含以下组件:一个双向LSTM层,用于捕捉时间序列数据中的双向依赖关系;一个Dropout层,用于防止过拟合;两个全连接层(Dense层),其中第一个使用ReLU激活函数,第二个使用Softmax激活函数,用于输出多分类结果。


Chemicals-and-capital-markets-1536x1536.jpg

【视频】LSTM模型原理及其进行股票收盘价的时间序列预测讲解|附数据代码

阅读文章


在模型训练阶段,我们首先使用One-Hot编码对标签数据进行处理,以便模型能够处理多分类任务。然后,我们将预处理后的训练数据X_train和标签y_train输入到模型中,并使用Adam优化器和分类交叉熵损失函数进行训练。我们设定了20个训练周期(epochs),每个周期内的批处理大小(batch size)为64,并使用10%的数据作为验证集进行模型性能的监控。

X_train, y_train, epochs=20, batch_size=64, validation_split=0.1,


随时关注您喜欢的主题


image.png
plt.plot(history.history['val_loss'], label='test') plt.legend();
image.png

经过训练后,我们得到了一个能够准确识别用户活动的深度学习模型。通过查看训练过程中的损失函数值和准确率指标,我们可以发现模型在训练集和验证集上均取得了良好的性能。此外,我们还对测试集进行了评估,以验证模型的泛化能力。实验结果表明,该模型在用户活动识别任务中具有较高的准确性和稳定性。

模型评估与结果分析

在完成了模型的训练过程后,我们首先对模型进行了评估,以验证其在未见数据上的性能。通过使用Keras框架的evaluate方法,我们计算了模型在测试集X_test和对应标签y_test上的性能表现。测试损失值和准确率分别为0.3610.87,这显示了模型在测试集上具有良好的泛化能力。

evaluate(X_test,
image.png

为了更深入地了解模型的分类性能,我们进一步计算了模型的混淆矩阵。混淆矩阵是一种常用的评估分类模型性能的工具,它可以清晰地展示模型在各类别上的预测结果与实际结果的对比情况。首先,我们使用模型对测试集进行预测,得到预测结果y_pred

然后,我们定义了一个名为plot_cm的函数,用于绘制混淆矩阵的可视化图像。该函数接受真实标签y_true、预测标签y_pred和类别名称class_names作为输入,利用Seaborn库中的heatmap函数绘制混淆矩阵,并通过调整图表的细节使其更加易于理解。

最后,我们调用plot_cm函数,传入逆变换后的真实标签和预测标签,以及通过编码器enc获取的类别名称,绘制混淆矩阵的可视化图像。

plot_cm( enc.inverse_transform(y_test),

image.png 通过混淆矩阵的可视化图像,我们可以清晰地看到模型在各类别上的预测表现,包括正确分类的样本数和错误分类的样本数。这有助于我们进一步分析模型的性能瓶颈,并指导后续的模型优化工作。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds