Python TensorFlow双向Bi-LSTM长短期记忆神经网络深度学习可视化用户传感器活动数据
全文链接:https://tecdat.cn/?p=36613
原文出处:拓端数据部落公众号
在本文中,我们旨在利用深度学习技术,特别是TensorFlow框架下的Keras库,对WISDM(无线传感器数据挖掘)数据集进行活动识别。WISDM数据集包含了从用户身上佩戴的加速度传感器收集的三轴加速度数据,这些数据被用于识别用户的日常活动,如走路、跑步、跳跃等。通过对这些数据的分析,我们可以为健康监测、人机交互等领域提供有价值的见解。
数据准备
首先,我们导入了必要的Python库,包括NumPy用于数值计算、TensorFlow用于深度学习建模、Pandas用于数据处理、Seaborn和Matplotlib用于数据可视化。为了确保实验的可重复性,我们设置了随机种子。
t64) df.dropna(axis=0, how='any', inplace=True)
数据探索
在数据准备阶段之后,我们对数据集进行了初步的探索。通过Seaborn库的countplot
函数,我们绘制了不同活动类型的频数分布图,以了解数据集中各种活动类型的分布情况。
sns.countplot(x = 'activity',
通过此图,我们可以直观地看到数据集中各种活动类型的分布情况,为后续的模型训练和评估提供有价值的参考。
为了直观地了解数据集中用户活动记录的分布情况,我们绘制了用户ID的频数分布图。通过Seaborn库的countplot
函数,我们观察到不同用户之间的活动记录数量存在差异。
order = df.user_id.value_counts().index); plt.title("Records per user");
for ax in axis:
ax.legend(loc='lower left', bbox_to_anchor=(1.0, 0.5))
此外,为了更深入地了解用户活动数据的特征,我们定义了一个名为plot_activity
的函数,用于绘制特定活动类型的三轴加速度数据图。通过这个函数,我们可以直观地比较不同活动类型在加速度数据上的差异。
plot_activity("Sitting", df);
数据分割与缩放
为了进行模型训练和验证,我们将数据集按照用户ID进行了分割,前30个用户的数据作为训练集,其余用户的数据作为测试集。接着,我们使用RobustScaler
对数据进行缩放,以减少不同特征之间的量纲影响,提高模型的训练效果。
在数据预处理和可视化之后,我们将构建深度学习模型,并使用训练集进行模型训练。通过调整模型架构和参数设置,我们旨在提高活动识别的准确性和效率。此外,我们还将使用测试集对模型进行评估,以验证其泛化能力。
scaler = scaler.fit(df_train[scale_columns])
print(X_train.shape, y_train.shape)
我们采用了一种基于双向长短期记忆(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激活函数,用于输出多分类结果。
在模型训练阶段,我们首先使用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,
plt.plot(history.history['val_loss'], label='test') plt.legend();
经过训练后,我们得到了一个能够准确识别用户活动的深度学习模型。通过查看训练过程中的损失函数值和准确率指标,我们可以发现模型在训练集和验证集上均取得了良好的性能。此外,我们还对测试集进行了评估,以验证模型的泛化能力。实验结果表明,该模型在用户活动识别任务中具有较高的准确性和稳定性。
模型评估与结果分析
在完成了模型的训练过程后,我们首先对模型进行了评估,以验证其在未见数据上的性能。通过使用Keras框架的evaluate
方法,我们计算了模型在测试集X_test
和对应标签y_test
上的性能表现。测试损失值和准确率分别为0.361
和0.87
,这显示了模型在测试集上具有良好的泛化能力。
evaluate(X_test,
为了更深入地了解模型的分类性能,我们进一步计算了模型的混淆矩阵。混淆矩阵是一种常用的评估分类模型性能的工具,它可以清晰地展示模型在各类别上的预测结果与实际结果的对比情况。首先,我们使用模型对测试集进行预测,得到预测结果y_pred
。
然后,我们定义了一个名为plot_cm
的函数,用于绘制混淆矩阵的可视化图像。该函数接受真实标签y_true
、预测标签y_pred
和类别名称class_names
作为输入,利用Seaborn库中的heatmap
函数绘制混淆矩阵,并通过调整图表的细节使其更加易于理解。
最后,我们调用plot_cm
函数,传入逆变换后的真实标签和预测标签,以及通过编码器enc
获取的类别名称,绘制混淆矩阵的可视化图像。
plot_cm( enc.inverse_transform(y_test),
通过混淆矩阵的可视化图像,我们可以清晰地看到模型在各类别上的预测表现,包括正确分类的样本数和错误分类的样本数。这有助于我们进一步分析模型的性能瓶颈,并指导后续的模型优化工作。