利用运动手环数据预测身体姿态

本文介绍了如何利用运动手环的传感器数据,通过K-近邻、决策树和朴素贝叶斯等机器学习模型,对用户的不同身体姿态进行分类,以识别新用户的状态或更新后数据的对应姿态类别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

运动手环作为一种可穿戴式设备,已经受到越来越多的人的欢迎,运动手环中的传感器能获取各项数据,如佩戴者是移动还是静止,周围的磁场强度、温度,佩戴者的心跳脉搏、血压等。
本实例收集了 A、B、C、D、E 5 位用户运动手环上的传感器数据,每位用户的数据集包含一个特征文件(a.feature)和一个标签文件(a.label)。其中,特征文件中的每一行对应某一个时刻的所有传感器数值,标签文件中每行记录了和特征文件中对应时刻的标记过的用户姿态,两个文件的行数相同,相同行之间相互对应。在特征文件 a.feature 中共有41 列特征属性,这 41 列特征属性的含义如表所示。
在这里插入图片描述
标签文件中只有一列数据,取值为 0~24,每一行代表与特征文件中对应行的用户姿态类别,共有 25 种身体姿态。例如,0 表示无活动状态,1 表示坐态,2 表示有位移地慢跑,3 表示快速跑,4 表示无位移跑(在跑步机上跑),5 表示就餐等。标签文件作为训练集的标准参考准则,可以进行特征的分类,因此这是一个有 25 个类别的分类问题。

  1. 任务描述
    假设现在出现了一个新用户,运动手环通过传感器采集了他的运动数据,那么该如何得到这个新用户的状态呢?又或者对同一用户如果传感器采集了新的数据,怎样根据新的数据判断当前用户处于什么状态呢?
    在明确这是一个分类问题的前提下,可以选定某种分类模型,通过训练数据进行模型学习,然后对每个测试样本给出对应的分类结果。机器学习的分类模型众多,本实例中将分别使用 K-近邻、决策树和朴素贝叶斯 3 种分类模型来实现分类任务。
  2. 编程思路
    实现分类任务的具体编程思路如下:
    (1)在当前程序目录下创建 A、B、C、D、E 5 个文件夹,分别存放 5 个用户的特征数据文件和标签数据文件。例如文件夹 A 下存放 A.feature 和 A.label 两个文件。
    (2)使用 Pandas 库的 read_csv()函数读取每个文件的内容,在该函数中指定分隔符为逗号,缺失值为问号且文件不包含表头行。将该函数放到循环语句中,就能依次读取所有文件的内容了。
    (3)从特征文件和标签文件中将所有数据加载到内存中,由于存在缺失值,此步骤还需要进行简单的缺失值处理。具体步骤如下:
    ①编写数据导入函数 load_datasets(),设置传入两个参数,分别是特征文件的列表feature_paths 和标签文件的列表 label_paths。定义 feature 数组变量,列数量和特征维度一致为 41;定义空的标签变量,列数量与标签维度一致为 1。
    ②使用 Pandas 库的 read_csv()函数读取一个特征文件,其中指定分隔符为逗号,缺失值为问号且文件不包含表头行。使用 Imputer()函数,通过设定 strategy 参数为’mean’,使用平均值对缺失数据进行补全。fit()函数用于训练预处理器,transform()函数用于生成预处理结果。将预处理后的数据加入特征属性集中并依次遍历完所有特征文件。
    ③处理标签文件与处理特征文件相似,首先使用 Pandas 库的 read_csv()函数读取一个标签文件,其中指定分隔符为逗号且文件不包含表头行。由于标签文件没有缺失值,因此直接将读取的新数据加入 label 集合中,依次遍历完所有标签文件,得到标签集合 label。最后将特征集合 feature 与标签集合 label 合并。
    (4)划分训练集和测试集。首先使用 train_test_split()函数,通过设置测试集比例test_size 为 0.1 将数据随机打乱,便于后续分类器的初始化和训练。设置数据路径 feature_paths 和 label_paths。使用 Python 的分片方法将数据路径中的前 4 个值(即用户 A、B、C、D 的数据)作为训练集和参数传入 load_dataset()函数中,得到训练集合的特征 x_train 和训练集的标签 y_train。将最后一个值(即用户 E 的数据)对应的数据作为测试集送入 load_dataset()函数中,得到测试集合的特征 x_test 和测试集的标签y_test。
    (5)依次创建 K-近邻、决策树、朴素贝叶斯对应的分类器,并使用训练数据进行训练。分别使用默认的参数创建 K-近邻分类器 knn、决策树分类器 dt 和高斯贝叶斯分类器gnb,并将训练集 x_train 和 y_train 送入 fit()函数进行训练,训练后的分类器分别保存到变量 knn、dt 和 gnb 中。
    (6)使用测试集 x_test 进行分类器预测并得到分类结果。通过对真实标签值和预测值的比对,计算出模型整体的准确率和召回率,以此来评测模型效果。

数据集

点击此处下载本项目数据集

代码展示

# 导入必要的库
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split 
from sklearn.metrics import classification_report
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from tqdm import tqdm
# 加载数据集
def load_datasets(feature_paths, label_paths):
    feature = np.ndarray(shape=(0, 41))
    label = np.ndarray(shape=(0, 1))
    for file in feature_paths:
        df = pd.read_csv(file, delimiter=',', na_values='?', header=None)
        imp = SimpleImputer(missing_values=np.nan, strategy='mean')
        imp.fit(df)
        df = imp.transform(df)
        feature = np.concatenate((feature, df))
    for file in label_paths:
        df = pd.read_csv(file, header=None)
        label = np.concatenate((label, df))
    label = np.ravel(label)
    return feature, label
# 数据路径
featurePaths = ['A/A.feature', 'B/B.feature', 'C/C.feature', 'D/D.feature', 'E/E.feature']
labelPaths = ['A/A.label', 'B/B.label', 'C/C.label', 'D/D.label', 'E/E.label']
# 读入数据
x_train, y_train = load_datasets(featurePaths[:5], labelPaths[:5])
x_, y_ = load_datasets(featurePaths[5:], labelPaths[5:])
x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size = 1000)
# 训练并输出
print('Start training knn')
knn = KNeighborsClassifier().fit(x_train, y_train)
print('Training done')
answer_knn = knn.predict(x_test)
print('Prediction done')
print('Start training DT')
dt = DecisionTreeClassifier().fit(x_train, y_train)
print('Training done')
answer_dt = dt.predict(x_test)
print('Prediction done')
print('Start training Bayes')
gnb = GaussianNB().fit(x_train, y_train)
print('Training done')
answer_gnb = gnb.predict(x_test)
print('Prediction done')
print('\n\nThe classification report for knn:')
print(classification_report(y_test, answer_knn))
print('\n\nThe classification report for DT:')
print(classification_report(y_test, answer_dt))
print('\n\nThe classification report for Bayes:')
print(classification_report(y_test, answer_gnb))

输出结果

Start training knn
Training done
Prediction done
Start training DT
Training done
Prediction done
Start training Bayes
Training done
Prediction done


The classification report for knn:
              precision    recall  f1-score   support

         0.0       1.00      0.99      1.00       312
         1.0       1.00      1.00      1.00        73
         2.0       1.00      1.00      1.00        74
         3.0       0.99      1.00      0.99        68
         4.0       1.00      1.00      1.00        74
         5.0       1.00      1.00      1.00        41
         6.0       1.00      1.00      1.00        48
         7.0       1.00      1.00      1.00        54
        12.0       0.97      1.00      0.99        36
        13.0       0.98      0.98      0.98        41
        16.0       1.00      1.00      1.00        71
        17.0       1.00      1.00      1.00        88
        24.0       1.00      1.00      1.00        20

    accuracy                           1.00      1000
   macro avg       0.99      1.00      1.00      1000
weighted avg       1.00      1.00      1.00      1000



The classification report for DT:
              precision    recall  f1-score   support

         0.0       1.00      1.00      1.00       312
         1.0       1.00      1.00      1.00        73
         2.0       1.00      1.00      1.00        74
         3.0       1.00      0.99      0.99        68
         4.0       1.00      1.00      1.00        74
         5.0       1.00      1.00      1.00        41
         6.0       1.00      1.00      1.00        48
         7.0       0.98      1.00      0.99        54
        12.0       1.00      1.00      1.00        36
        13.0       1.00      1.00      1.00        41
        16.0       1.00      1.00      1.00        71
        17.0       1.00      1.00      1.00        88
        24.0       1.00      1.00      1.00        20

    accuracy                           1.00      1000
   macro avg       1.00      1.00      1.00      1000
weighted avg       1.00      1.00      1.00      1000



The classification report for Bayes:
              precision    recall  f1-score   support

         0.0       0.71      0.70      0.70       312
         1.0       1.00      0.97      0.99        73
         2.0       0.89      0.89      0.89        74
         3.0       0.84      0.90      0.87        68
         4.0       0.85      0.85      0.85        74
         5.0       0.90      0.88      0.89        41
         6.0       0.79      0.94      0.86        48
         7.0       0.77      0.63      0.69        54
        12.0       0.33      0.36      0.34        36
        13.0       0.69      0.61      0.65        41
        16.0       0.83      0.70      0.76        71
        17.0       0.70      0.89      0.78        88
        24.0       0.80      0.60      0.69        20

    accuracy                           0.77      1000
   macro avg       0.78      0.76      0.77      1000
weighted avg       0.77      0.77      0.77      1000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值