5.机器学习sklearn-----分类实例运动状态

1.背景介绍

• 可穿戴式设备的流行,让我们可以更便利地使用传感器获取人体的各项数据, 甚至生理数据。

• 当传感器采集到大量数据后,我们就可以通过对数据进行分析和建模,通过 各项特征的数值进行用户状态的判断,根据用户所处的状态提供给用户更加 精准、便利的服务。

2.数据介绍

收集了来自 A,B,C,D,E 5位用户的可穿戴设备上的传感器数据, 每位用户的数据集包含一个特征文件(a.feature)和一个标签文件 (a.label)。

特征文件中每一行对应一个时刻的所有传感器数值,标签文件中每行记录了 和特征文件中对应时刻的标记过的用户姿态,两个文件的行数相同,相同行 之间互相对应。

特征文件共包含41列特征,数据内容如下图:


特征文件的各项特征具体如下表所示:


在传感器1对应的13列数据特征中,包含:1项温度数据、3项一型三轴加速 度数据、3项二型三轴加速度数据、3项三轴陀螺仪数据和3项三轴磁场数据。



人体的温度数据可以反映当前活动的剧烈程度,一般在静止状态时,体温趋 于稳定在36.5度上下;当温度高于37度时,可能是进行短时间的剧烈运动,比 如跑步和骑行。

在数据中有两个型号的加速度传感器,可以通过互相印证的方式,保证数据 的完整性和准确性。通过加速度传感器对应的三个数值,可以知道空间中x、y、 z三个轴上对应的加速度,而空间上的加速度和用户的姿态有密切的关系,比如 用户向上起跳时,z轴上的加速度会激增。

陀螺仪是角运动检测的常用仪器,可以判断出用户佩戴传感器时的身体角度 是水平、倾斜还是垂直。直观地,通过这些数值都是推断姿态的重要指标。

磁场传感器可以检测用户周围的磁场强度和数值大小,这些数据可以帮助我 们理解用户所处的环境。比如在一个办公场所,用户座位附近的磁场是大体上固 定的,当磁场发生改变时,我们可以推断用户的位置和场景发生了变化。


标签文件内容如图所示,每一行代表与特征文件中对应行的用户姿态类别。 总共有0-24共25种身体姿态,如,无活动状态,坐态、跑态等。标签文件作为 训练集的标准参考准则,可以进行特征的监督学习。


3.任务介绍

1.假设现在出现了一个新用户,但我们只有传感器采集的数据,那么该如何得到 这个新用户的姿态呢?

2.又或者对同一用户如果传感器采集了新的数据,怎么样根据新的数据判断当前 用户处于什么样的姿态呢?

4.算法流程

          1.需要从特征文件和标签文件中将所有数据加载到内存 中,由于存在缺失值,此步骤还需要进行简单的数据预处理。

          2.创建对应的分类器,并使用训练数据进行训练。

          3.利用测试集预测,通过使用真实值和预测值的比对, 计算模型整体的准确率和召回率,来评测模型。

                                                  

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import numpy as np
import pandas as pd
#导入预处理模块
from sklearn.preprocessing import Imputer
#导入自动生成训练集和测试集的模块train_test_split
from sklearn.model_selection import  train_test_split
#导入预测结果评估模块classification_report
from sklearn.metrics import classification_report
#sklearn库中依次导入三个分类器模
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import  GaussianNB

#数据导入函数,参数时特征文件的列表feature_paths和标签 文件的列表label_paths
def load_dataset(feature_path,label_paths):
    #读取疼正文件列表和标签文件列表中的内容,规定后返回

    #定义feature数组变量,列数量和特征维度一致为41
    feature = np.ndarray(shape=(0, 41))
    #定义空的标签变量,列数量与标签维度一致为1
    label = np.ndarray(shape=(0, 1))
    for file in feature_path:
        #使用逗号分隔符读取特征数据,将问号替换标记为缺失值,文件中不包含表头
        #使用pandas库的read_table函数读取一个特征文件的内容,
        # 其中指定分隔符为逗号、缺失值为问号且 文件不包含表头行。
        df =pd.read_table(file, delimiter=',',na_values='?',header=None)
        #使用平均值补全缺失值,然后将数据进行补全
        imp =Imputer(missing_values='NaN',strategy='mean',axis=0)
        imp.fit(df)
        df =imp.transform(df)
        #将新读入的数据合并到特征集中
        feature=np.concatenate((feature,df))
    for file in label_paths:
        #读取标签数据,文件中不包含表头
        df=pd.read_table(file,header=None)
        #将新读入的数据合并到标签集合中
        label =np.concatenate((label,df))
    #将标签规整为一维向量
    label=np.ravel(label)
    return feature,label
if __name__ == '__main__':
    #设置数据路径
    featurePaths = ['A.feature', 'B.feature', 'C.feature', 'D.feature', 'E.feature']
    labelPaths = ['A.label', 'B.label', 'C.label', 'D.label', 'E.label']
    load_dataset(featurePaths[:4],labelPaths[:4])

    #将前4个数据作为训练集读入
    x_train,y_train =load_dataset(featurePaths[:4],labelPaths[:4])
    #将最后一个作为测试集读入
    x_test,y_test =load_dataset(featurePaths[4:],labelPaths[4:])
    #使用全量数据作为训练集,借助train_text_split函数将数据打乱
    x_train,x_,y_train,y_ =train_test_split(x_train,y_train,test_size=0.0)

    # 使用默认参数创建K近邻分类器,并将训练集x_trainy_train送入fit()函数进行训练,
    # 训练后的分类 器保存到变量knn中。
    print("Start training knn")
    knn = KNeighborsClassifier().fit(x_train,y_train)
    print("Training done!")
    answer_knn = knn.predict(x_test)
    print("Prediction done")
    #使用默认参数创建决策树分类器dt,并将训练集x_trainy_train送入fit()函数进行训练。
    # 训练后的分 类器保存到变量dt    print("Start training DT")
    dt=DecisionTreeClassifier().fit(x_train,y_train)
    print("Training done!")
    answer_dt=dt.predict(x_test)
    print("Prediction done")
    #使用默认参数创建贝叶斯分类器,并将训练集x_trainy_train送入fit()
    #函数进行训练。训练后的分类器保存到变量gnb    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 classifiction report for knn:")
    print(classification_report(y_test,answer_knn))

    print("\n\nThe classifiction report for dt:")
    print(classification_report(y_test, answer_dt))

    print("\n\nThe classifiction report for gnb:")
    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 classifiction report for knn:
             precision    recall  f1-score   support

        0.0       0.56      0.60      0.58    102341
        1.0       0.92      0.93      0.93     23699
        2.0       0.94      0.78      0.85     26864
        3.0       0.83      0.82      0.82     22132
        4.0       0.85      0.88      0.87     32033
        5.0       0.39      0.21      0.27     24646
        6.0       0.77      0.89      0.82     24577
        7.0       0.80      0.95      0.87     26271
       12.0       0.32      0.33      0.33     14281
       13.0       0.16      0.22      0.19     12727
       16.0       0.90      0.67      0.77     24445
       17.0       0.89      0.96      0.92     33034
       24.0       0.00      0.00      0.00      7733

avg / total       0.69      0.69      0.68    374783



The classifiction report for dt:
             precision    recall  f1-score   support

        0.0       0.57      0.74      0.64    102341
        1.0       0.66      0.96      0.78     23699
        2.0       0.83      0.86      0.84     26864
        3.0       0.93      0.74      0.83     22132
        4.0       0.74      0.96      0.83     32033
        5.0       0.77      0.84      0.80     24646
        6.0       0.88      0.65      0.75     24577
        7.0       0.61      0.15      0.24     26271
       12.0       0.59      0.63      0.61     14281
       13.0       0.63      0.47      0.54     12727
       16.0       0.57      0.07      0.13     24445
       17.0       0.86      0.85      0.86     33034
       24.0       0.37      0.33      0.35      7733

avg / total       0.69      0.69      0.66    374783



The classifiction report for gnb:
             precision    recall  f1-score   support

        0.0       0.62      0.81      0.70    102341
        1.0       0.97      0.91      0.94     23699
        2.0       1.00      0.65      0.79     26864
        3.0       0.60      0.66      0.63     22132
        4.0       0.91      0.77      0.83     32033
        5.0       1.00      0.00      0.00     24646
        6.0       0.87      0.72      0.79     24577
        7.0       0.31      0.47      0.37     26271
       12.0       0.52      0.59      0.55     14281
       13.0       0.61      0.50      0.55     12727
       16.0       0.89      0.72      0.79     24445
       17.0       0.75      0.91      0.82     33034
       24.0       0.59      0.24      0.34      7733

avg / total       0.74      0.68      0.67    374783

猜你喜欢

转载自blog.csdn.net/bxg1065283526/article/details/80038008